make leaves growth use an increasing ABM.

this also means that leaves now grow slower.
This commit is contained in:
trans_soup 2023-10-19 15:23:07 +02:00
parent 0dffde9363
commit 1282fda837

View file

@ -7,19 +7,28 @@ local leaves = modname .. ":leaves"
local leaves_growing = modname .. ":leaves_growing" local leaves_growing = modname .. ":leaves_growing"
local leaves_alive = modname .. ":leaves_alive" local leaves_alive = modname .. ":leaves_alive"
-- END OF NODE NAMES
local max_grow_distance = 2 local max_grow_distance = 2
local leaves_grow_cost = 250
-- TODO: turn this into an increasing ABM. blockgame.register_increasing_abm({
blockgame.register_abm({ id = modname .. ":grow_leaves",
label = "grow leaves", label = "grow leaves",
nodenames = {leaves_growing}, nodenames = {leaves_growing},
neighbors = {log_alive, leaves_growing, leaves_alive}, neighbors = {log_alive, leaves_growing, leaves_alive},
interval = 15, interval = 15,
chance = 8, chance = 8,
action = function (pos, node) rate = function (pos, node, data)
-- TODO: account for nearby nodes? e.g. grow slower if there are more leaves nearby.
return data.value + math.random(1, 99)
end,
check = function (pos, node, data)
return data.value >= leaves_grow_cost
end,
action = function (pos, node, data)
-- TODO: give leaves energy over time, that they spend when creating new leaves. -- TODO: give leaves energy over time, that they spend when creating new leaves.
-- this requires the API to add support for increasing ABM `action`:s to modify `data`.
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local distance = meta:get_int("leaf_distance") or 1 local distance = meta:get_int("leaf_distance") or 1
if distance >= max_grow_distance then return end if distance >= max_grow_distance then return end
@ -28,6 +37,7 @@ blockgame.register_abm({
for _, target in pairs(sides) do for _, target in pairs(sides) do
if blockgame.chance(2) then if blockgame.chance(2) then
blockgame.attempt_place(target, {name = leaves_growing}) blockgame.attempt_place(target, {name = leaves_growing})
-- TODO: find lowest possible leaf distance by checking all 4 sides?
minetest.get_meta(target):set_int("leaf_distance", distance + 1) minetest.get_meta(target):set_int("leaf_distance", distance + 1)
end end
end end