Initial commit

This commit is contained in:
Jude Melton-Houghton 2021-09-24 10:30:37 -04:00
commit 3828c22946
8 changed files with 306 additions and 0 deletions

5
.luacheckrc Normal file
View File

@ -0,0 +1,5 @@
std = "min"
read_globals = {"minetest", "vector"}
globals = {"large_slugs"}
ignore = {"21/_.*"}
max_line_length = 80

23
api.lua Normal file
View File

@ -0,0 +1,23 @@
large_slugs.registered_slugs = {}
function large_slugs.register_slug(name, def)
minetest.register_node(name, {
description = def.description,
drawtype = "signlike",
tiles = {def.texture},
inventory_image = def.texture,
selection_box = {
type = "wallmounted",
wall_top = {-8/16, 8/16, -8/16, 8/16, 7/16, 8/16},
wall_bottom = {-8/16, -8/16, -8/16, 8/16, -7/16, 8/16},
wall_side = {-8/16, -8/16, -8/16, -7/16, 8/16, 8/16},
},
sunlight_propagates = true,
paramtype = "light",
paramtype2 = "wallmounted",
groups = {large_slug = 1, dig_immediate = 3, attached_node = 1},
walkable = false,
floodable = true,
})
large_slugs.registered_slugs[name] = def
end

125
behavior.lua Normal file
View File

@ -0,0 +1,125 @@
local MOVE_INTERVAL =
tonumber(minetest.settings:get("large_slugs_move_interval")) or 5
local MOVE_CHANCE =
tonumber(minetest.settings:get("large_slugs_move_chance")) or 5
local BIRTH_INTERVAL =
tonumber(minetest.settings:get("large_slugs_birth_interval")) or 10
local BIRTH_CHANCE =
tonumber(minetest.settings:get("large_slugs_birth_chance")) or 10
local BIRTH_SPACE =
tonumber(minetest.settings:get("large_slugs_birth_space")) or 11
local WALLMOUNT_TO_PERP_WALLMOUNTS = {}
WALLMOUNT_TO_PERP_WALLMOUNTS[0] = {4, 2, 5, 3}
WALLMOUNT_TO_PERP_WALLMOUNTS[2] = {4, 0, 5, 1}
WALLMOUNT_TO_PERP_WALLMOUNTS[4] = {2, 0, 3, 1}
WALLMOUNT_TO_PERP_WALLMOUNTS[1] = WALLMOUNT_TO_PERP_WALLMOUNTS[0]
WALLMOUNT_TO_PERP_WALLMOUNTS[3] = WALLMOUNT_TO_PERP_WALLMOUNTS[2]
WALLMOUNT_TO_PERP_WALLMOUNTS[5] = WALLMOUNT_TO_PERP_WALLMOUNTS[4]
local WALLMOUNT_TO_OPP_WALLMOUNT = {
[0] = 1, [1] = 0, [2] = 3, [3] = 2, [4] = 5, [5] = 4,
}
local function get_move_options(pos, node, include_here)
local ground_nodes = large_slugs.registered_slugs[node.name].ground
local wallmount = node.param2 % 6
local dir = minetest.wallmounted_to_dir(wallmount)
local rotate_opts = include_here and {}
local shift_opts = {}
local rotate_shift_opts = {}
local perp_wallmounts = WALLMOUNT_TO_PERP_WALLMOUNTS[wallmount]
for _, perp_wallmount in ipairs(perp_wallmounts) do
local perp_dir = minetest.wallmounted_to_dir(perp_wallmount)
local check_pos = vector.add(pos, perp_dir)
local check_node = minetest.get_node(check_pos)
if include_here and ground_nodes[check_node.name] then
rotate_opts[#rotate_opts + 1] = perp_wallmount
elseif check_node.name == "air" then
local shift_pos = check_pos
check_pos = vector.add(check_pos, dir)
check_node = minetest.get_node(check_pos)
if ground_nodes[check_node.name] then
shift_opts[#shift_opts + 1] = shift_pos
elseif check_node.name == "air" then
rotate_shift_opts[#rotate_shift_opts + 1] = {
WALLMOUNT_TO_OPP_WALLMOUNT[
perp_wallmount],
check_pos,
}
end
end
end
return rotate_opts, shift_opts, rotate_shift_opts
end
local function move_slug(pos, node)
local rotate_opts, shift_opts, rotate_shift_opts =
get_move_options(pos, node, true)
local n_rotate_opts = #rotate_opts
local n_shift_opts = #shift_opts
local n_rotate_shift_opts = #rotate_shift_opts
local n_opts = n_rotate_opts + n_shift_opts + n_rotate_shift_opts
if n_opts < 1 then return end
local choice = math.random(n_opts)
if choice <= n_rotate_opts then
local chosen_wallmount = rotate_opts[choice]
node.param2 = node.param2 - node.param2 % 8 + chosen_wallmount
minetest.swap_node(pos, node)
elseif choice <= n_rotate_opts + n_shift_opts then
local chosen_pos = shift_opts[choice - n_rotate_opts]
minetest.remove_node(pos)
minetest.set_node(chosen_pos, node)
else
local chosen =
rotate_shift_opts[choice - n_rotate_opts - n_shift_opts]
minetest.remove_node(pos)
node.param2 = node.param2 - node.param2 % 8 + chosen[1]
minetest.set_node(chosen[2], node)
end
end
local function birth_slug(pos, node)
if minetest.find_node_near(pos, BIRTH_SPACE, node.name) then return end
local _rotate_opts, shift_opts, rotate_shift_opts =
get_move_options(pos, node, false)
local n_shift_opts = #shift_opts
local n_rotate_shift_opts = #rotate_shift_opts
local n_opts = n_shift_opts + n_rotate_shift_opts
if n_opts < 1 then return end
local choice = math.random(n_opts)
if choice <= n_shift_opts then
local chosen_pos = shift_opts[choice]
minetest.set_node(chosen_pos, node)
else
local chosen = rotate_shift_opts[choice - n_shift_opts]
node.param2 = node.param2 - node.param2 % 8 + chosen[1]
minetest.set_node(chosen[2], node)
end
end
minetest.register_abm({
label = "Slugs moving",
nodenames = "group:large_slug",
interval = MOVE_INTERVAL,
chance = MOVE_CHANCE,
catch_up = false,
action = move_slug,
})
minetest.register_abm({
label = "Slugs birthing",
nodenames = "group:large_slug",
interval = BIRTH_INTERVAL,
chance = BIRTH_CHANCE,
catch_up = false,
action = birth_slug,
})

7
init.lua Normal file
View File

@ -0,0 +1,7 @@
large_slugs = {}
local modpath = minetest.get_modpath(minetest.get_current_modname())
dofile(modpath.."/api.lua")
dofile(modpath.."/behavior.lua")
dofile(modpath.."/slugs.lua")
dofile(modpath.."/mapgen.lua")

83
mapgen.lua Normal file
View File

@ -0,0 +1,83 @@
print("MAPGEN")
local function noise_params(ratio, seed)
return {
offset = 0,
scale = ratio,
spread = {x = 32, y = 32, z = 32},
seed = seed,
octaves = 1,
persistence = 1,
lacunarity = 1,
flags = "absvalue",
}
end
minetest.register_decoration({
name = "large_slugs:grass_slug",
deco_type = "simple",
place_on = {"default:dirt_with_grass"},
fill_ratio = 0.01,
y_max = 200,
y_min = 0,
decoration = "large_slugs:grass_slug",
param2 = 1,
})
minetest.register_decoration({
name = "large_slugs:pine_slug",
deco_type = "simple",
place_on = {"default:dirt_with_coniferous_litter"},
fill_ratio = 0.01,
y_max = 250,
y_min = 0,
decoration = "large_slugs:pine_slug",
param2 = 1,
})
minetest.register_decoration({
name = "large_slugs:rainforest_slug",
deco_type = "simple",
place_on = {"default:dirt_with_rainforest_litter"},
fill_ratio = 0.01,
y_max = 200,
y_min = 0,
decoration = "large_slugs:rainforest_slug",
param2 = 1,
})
minetest.register_decoration({
name = "large_slugs:cave_slug",
deco_type = "simple",
place_on = {"default:stone"},
fill_ratio = 0.012,
flags = "all_floors",
y_max = -32,
y_min = -31000,
decoration = "large_slugs:cave_slug",
param2 = 1,
})
minetest.register_decoration({
name = "large_slugs:iron_slug",
deco_type = "simple",
place_on = {"default:stone"},
fill_ratio = 0.005,
flags = "all_floors",
y_max = -128,
y_min = -31000,
decoration = "large_slugs:iron_slug",
param2 = 1,
})
minetest.register_decoration({
name = "large_slugs:mese_slug",
deco_type = "simple",
place_on = {"default:stone"},
fill_ratio = 0.001,
flags = "all_floors",
y_max = -512,
y_min = -31000,
decoration = "large_slugs:mese_slug",
param2 = 1,
})

2
mod.conf Normal file
View File

@ -0,0 +1,2 @@
name = large_slugs
depends = default

61
slugs.lua Normal file
View File

@ -0,0 +1,61 @@
large_slugs.register_slug("large_slugs:grass_slug", {
description = "Grass Slug",
texture = "large_slugs_slug.png^[multiply:#696533",
ground = {
["default:dirt"] = true,
["default:dirt_with_grass"] = true,
},
})
large_slugs.register_slug("large_slugs:pine_slug", {
description = "Pine Slug",
texture = "large_slugs_slug.png^[multiply:#444220",
ground = {
["default:dirt"] = true,
["default:dirt_with_coniferous_litter"] = true,
["default:pine_tree"] = true,
},
})
large_slugs.register_slug("large_slugs:rainforest_slug", {
description = "Rainforest Slug",
texture = "large_slugs_slug.png^[multiply:#B5AC44",
ground = {
["default:dirt"] = true,
["default:dirt_with_rainforest_litter"] = true,
["default:jungletree"] = true,
},
})
large_slugs.register_slug("large_slugs:cave_slug", {
description = "Cave Slug",
texture = "large_slugs_slug.png^[multiply:#555343",
ground = {
["default:stone"] = true,
["default:cobble"] = true,
["default:mossycobble"] = true,
["default:stone_with_coal"] = true,
},
})
large_slugs.register_slug("large_slugs:iron_slug", {
description = "Iron Slug",
texture = "large_slugs_slug.png^[multiply:#A0661E",
ground = {
["default:stone"] = true,
["default:cobble"] = true,
["default:mossycobble"] = true,
["default:stone_with_iron"] = true,
},
})
large_slugs.register_slug("large_slugs:mese_slug", {
description = "Mese Slug",
texture = "large_slugs_slug.png^[multiply:#FFEB00",
ground = {
["default:stone"] = true,
["default:cobble"] = true,
["default:mossycobble"] = true,
["default:stone_with_mese"] = true,
},
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B