From 5acf21ded22dcbdb4ce3c02515a1982503e5cea3 Mon Sep 17 00:00:00 2001 From: the lemons Date: Fri, 11 Feb 2022 01:16:51 -0600 Subject: nonfunctional tree code --- mods/vzxv_trees/init.lua | 96 ++++++++++++++++++++++++++++++++++++++++++--- mods/vzxv_worldgen/init.lua | 2 + 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} -- cgit v1.2.3