summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthe lemons <citrons@mondecitronne.com>2022-02-11 01:16:51 -0600
committerthe lemons <citrons@mondecitronne.com>2022-02-11 01:16:51 -0600
commit5acf21ded22dcbdb4ce3c02515a1982503e5cea3 (patch)
tree2a7b50362537691a944ae022a86afa163e1a3efd
parent79bdf4672eef3699406616f536c47261bf24335d (diff)
nonfunctional tree codetree
-rw-r--r--mods/vzxv_trees/init.lua96
-rw-r--r--mods/vzxv_worldgen/init.lua2
2 files changed, 92 insertions, 6 deletions
diff --git a/mods/vzxv_trees/init.lua b/mods/vzxv_trees/init.lua
index 5e60b9b..336465e 100644
--- a/mods/vzxv_trees/init.lua
+++ b/mods/vzxv_trees/init.lua
@@ -1,17 +1,101 @@
-vzxv.mundane_block("vzxv_trees:seed","Tree seed","moistdirt")
+vzxv.mundane_block("vzxv_trees:seed","Dirt","moistdirt")
vzxv.mundane_block("vzxv_trees:root","Tree root",{"vzxvmoistdirt.png^vzxvroot.png"})
-vzxv.mundane_block("vzxv_trees:coreroot","Tree root",{"vzxvmoistdirt.png^vzxvroot.png"})
+vzxv.mundane_block("vzxv_trees:core","Tree root",{"vzxvmoistdirt.png^vzxvroot.png"})
vzxv.mundane_block("vzxv_trees:trunk","Tree trunk", {
"vzxvlog.png","vzxvlog.png","vzxvbark.png"
})
+local function traverse(pos, callback)
+ local traversed = {}
+ local depth = 0
+ local function t(pos)
+ depth = depth + 1
+ if depth > 500 then return end
+
+ local strpos = ('%s,%s,%s'):format(pos.x,pos.y,pos.z)
+ if traversed[strpos] then
+ return
+ else
+ traversed[strpos] = true
+ end
+
+ local node = minetest.get_node(pos)
+ if callback(pos, node) then
+ t{pos.x + 1, pos.y , pos.z }
+ t{pos.x - 1, pos.y , pos.z }
+ t{pos.x , pos.y + 1, pos.z }
+ t{pos.x , pos.y - 1, pos.z }
+ t{pos.x , pos.y , pos.z + 1}
+ t{pos.x , pos.y , pos.z - 1}
+ end
+ end
+ return t(pos)
+end
+
+local function update_tree(core_pos)
+ local core_meta = minetest.get_meta(core_pos)
+ local core = core_meta:to_table()
+ if not core or not core.live then
+ print "warning: attempt to update nonexistent tree"
+ return
+ end
+
+ local height = 0
+ while 1 do
+ local pos = {core_pos.x,core_pos.y+height+1,core_pos.z}
+ local node = minetest.get_node(pos)
+ if node.name == "vzxv_trees:trunk"
+ and minetest.get_meta(pos):contains "live" then
+ height = height + 1
+ else break end
+ end
+
+ if height == 0 then
+ -- die
+ minetest.set_node(core_pos,{name="vzxv_tree:root"})
+ return
+ end
+
+ local root_budget = 0
+ if core.prev_mass then
+ if math.log(core.prev_mass * 10) < (core.prev_mass / 5) + height * 2 then
+ root_budget = 5
+ elseif math.random(50) then
+ end
+ end
+
+ local root_mass = 0
+ traverse(pos, function(pos, node)
+ if node.name == "vzxv:root"
+ and minetest.get_meta(pos):contains "live" then
+ root_mass = root_mass + 1
+ return true
+ end
+ end)
+ core.prev = root_mass
+
+ local energy_generated = math.log(root_mass * 10)
+ local energy_cost = (root_mass / 5) + height * 2
+ core.energy = core.energy + energy_generated - energy_cost
+
+ core_meta:from_table(core)
+end
+
function vzxv.generate_tree(pos)
- minetest.set_node(pos,{name="vzxv:moistdirt"})
- local height = math.random(16,32)
- for i=1, height do
- local node = minetest.get_node({x=pos.x,y=pos.y+i,z=pos.z})
+ local core_pos = {x=pos.x,y=pos.y-1,z=pos.z}
+ minetest.set_node(core_pos,{name="vzxv_trees:core"})
+ local core = minetest.get_meta(core_pos)
+
+ local height = math.random(8,20)
+ for i=0, height do
+ local p = {x=pos.x,y=pos.y+i,z=pos.z}
+ local node = minetest.get_node(p)
if node.name ~= "air" and node.name ~= "ignore" then return end
minetest.set_node({x=pos.x,y=pos.y+i,z=pos.z},{name="vzxv_trees:trunk"})
+ minetest.get_meta(p):set_int("live", 1)
end
+
+ core:from_table {energy=height*10,live=1}
end
+
diff --git a/mods/vzxv_worldgen/init.lua b/mods/vzxv_worldgen/init.lua
index 65dd85d..2d1f70f 100644
--- a/mods/vzxv_worldgen/init.lua
+++ b/mods/vzxv_worldgen/init.lua
@@ -14,6 +14,8 @@ local water_level = 14
local trees_tbg = {}
-- chunks
minetest.register_on_generated(function(minp,maxp,seed)
+ math.randomseed(seed)
+
local voxmn, vmin, vmax = minetest.get_mapgen_object("voxelmanip")
local va = VoxelArea:new{MinEdge=vmin,MaxEdge=vmax}