day 03-19: add horrible tree growth
This commit is contained in:
		
							parent
							
								
									d1c1c3bfac
								
							
						
					
					
						commit
						6c384cbc26
					
				| @ -9,7 +9,7 @@ globals = { | |||||||
| 
 | 
 | ||||||
| read_globals = { | read_globals = { | ||||||
|     string = {fields = {"split"}}, |     string = {fields = {"split"}}, | ||||||
|     table = {fields = {"copy", "getn"}}, |     table = {fields = {"copy", "getn", "shuffle"}}, | ||||||
| 
 | 
 | ||||||
|     -- Builtin |     -- Builtin | ||||||
|     "vector", "ItemStack", |     "vector", "ItemStack", | ||||||
|  | |||||||
| @ -1,8 +1,13 @@ | |||||||
| ebiometrees = {} | ebiometrees = {} | ||||||
|  | ebiometrees.directions = { | ||||||
|  |   up     = vector.new( 0,  1,  0), | ||||||
|  |   down   = vector.new( 0, -1,  0), | ||||||
|  |   north  = vector.new( 0,  0,  1), | ||||||
|  |   east   = vector.new( 1,  0,  0), | ||||||
|  |   south  = vector.new( 0,  0, -1), | ||||||
|  |   west   = vector.new(-1,  0,  0) | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| function ebiometrees.is_leaves_can_grow_here(pos) |  | ||||||
|   return false |  | ||||||
| end |  | ||||||
| 
 | 
 | ||||||
| function ebiometrees.grow_closure(nextstage) | function ebiometrees.grow_closure(nextstage) | ||||||
|   local function growtree(pos) |   local function growtree(pos) | ||||||
| @ -11,7 +16,38 @@ function ebiometrees.grow_closure(nextstage) | |||||||
|   return growtree |   return growtree | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function ebiometrees.leaves_grower(leaves_name) | function ebiometrees.where_to_grow_trunk_closure(grow_preferences, leaves_name) | ||||||
|  |   local function where_to_grow_trunk(pos) | ||||||
|  |     for _, directions in ipairs(grow_preferences) | ||||||
|  |     do | ||||||
|  |       table.shuffle(directions) | ||||||
|  |       local candidate_dir = directions[1] | ||||||
|  |       local candidate = vector.copy(pos):add(candidate_dir) | ||||||
|  |       local node = minetest.get_node_or_nil(candidate) | ||||||
|  |       if node and node.name == leaves_name | ||||||
|  |       then | ||||||
|  |         return candidate | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |   return where_to_grow_trunk | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function ebiometrees.grow_trunk_closure(trunk_terminal_name, grow_preferences, leaves_name) | ||||||
|  |   local function grow_trunk(pos) | ||||||
|  |     local where = ebiometrees.where_to_grow_trunk_closure( | ||||||
|  |       grow_preferences, leaves_name | ||||||
|  |     ) | ||||||
|  |     local there = where(pos) | ||||||
|  |     if there | ||||||
|  |     then | ||||||
|  |       minetest.set_node(there, {name=trunk_terminal_name}) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |   return grow_trunk | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function ebiometrees.grow_leaves_closure(leaves_name) | ||||||
|   local function grow_leaves(pos) |   local function grow_leaves(pos) | ||||||
|     local free_node = minetest.find_node_near(pos, 1, "air") |     local free_node = minetest.find_node_near(pos, 1, "air") | ||||||
|     if free_node |     if free_node | ||||||
| @ -23,6 +59,27 @@ function ebiometrees.leaves_grower(leaves_name) | |||||||
|   return grow_leaves |   return grow_leaves | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | function ebiometrees.tree_grower(leaves_name, grow_preferences, terminal_name, nextstage, age_max) | ||||||
|  |   local grow_trunk =  ebiometrees.grow_trunk_closure(terminal_name, grow_preferences, leaves_name) | ||||||
|  |   local grow_leaves = ebiometrees.grow_leaves_closure(leaves_name) | ||||||
|  |   local function grow_tree(pos) | ||||||
|  |     local meta = minetest.get_meta(pos) | ||||||
|  |     meta:set_int("ebiometrees:age", meta:get_int("ebiometrees:age")+1) | ||||||
|  |     grow_trunk(pos) | ||||||
|  |     grow_leaves(pos) | ||||||
|  |     if nextstage | ||||||
|  |     then | ||||||
|  |       if meta:get_int("ebiometrees:age") > age_max | ||||||
|  |       then | ||||||
|  |         minetest.set_node(pos, {name=nextstage}) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |     return true | ||||||
|  |   end | ||||||
|  |   return grow_tree | ||||||
|  | end | ||||||
|  | 
 | ||||||
| function ebiometrees.root_sapling(pos) | function ebiometrees.root_sapling(pos) | ||||||
|   minetest.set_node(pos, {name="ebiome:oak_sprout"}) |   minetest.set_node(pos, {name="ebiome:oak_sprout"}) | ||||||
|   return false |   return false | ||||||
|  | |||||||
| @ -1,5 +1,8 @@ | |||||||
| local function growth_timer(pos) | local function growth_timer(pos) | ||||||
|   minetest.get_node_timer(pos):start(3) |   minetest.get_node_timer(pos):start(3) | ||||||
|  |   local meta = minetest.get_meta(pos) | ||||||
|  |   meta:set_int("ebiometrees:age", 0) | ||||||
|  |   meta:mark_as_private("ebiometrees:age") | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -61,6 +64,7 @@ function ebiometrees.register_tree(modname, basename, data) | |||||||
|   -- registers corresponding trunk nodes |   -- registers corresponding trunk nodes | ||||||
|   local trunk_groups = table.copy(data.groups) |   local trunk_groups = table.copy(data.groups) | ||||||
|   trunk_groups.choppy = 2 -- TODO: customizations |   trunk_groups.choppy = 2 -- TODO: customizations | ||||||
|  |   trunk_groups.treetrunk = 1 | ||||||
|   local trunk_types = {"growing", "normal"} |   local trunk_types = {"growing", "normal"} | ||||||
|   local trunk_subtypes = {"terminal", "straight", "corner", |   local trunk_subtypes = {"terminal", "straight", "corner", | ||||||
|     "tjunction", "t2junction", "xjunction", |     "tjunction", "t2junction", "xjunction", | ||||||
| @ -137,8 +141,21 @@ function ebiometrees.register_tree(modname, basename, data) | |||||||
|       } |       } | ||||||
|       if trunk_type == "growing" |       if trunk_type == "growing" | ||||||
|         then |         then | ||||||
|           nodespec.on_timer = ebiometrees.leaves_grower( |           nodespec.on_timer = ebiometrees.tree_grower( | ||||||
|             modname..":"..basename.."_leaves") |             modname..":"..basename.."_leaves", | ||||||
|  |             { | ||||||
|  |               {ebiometrees.directions.up}, | ||||||
|  |               { | ||||||
|  |                 ebiometrees.directions.north, | ||||||
|  |                 ebiometrees.directions.east, | ||||||
|  |                 ebiometrees.directions.south, | ||||||
|  |                 ebiometrees.directions.west | ||||||
|  |               } | ||||||
|  |             }, | ||||||
|  |             modname..":"..basename.."_trunk_growing_terminal", | ||||||
|  |             modname..":"..basename.."_trunk_normal_"..trunk_subtype, | ||||||
|  |             20 | ||||||
|  |           ) | ||||||
|       end |       end | ||||||
|       minetest.register_node( |       minetest.register_node( | ||||||
|         modname..":"..basename.."_trunk_"..trunk_type.."_"..trunk_subtype, |         modname..":"..basename.."_trunk_"..trunk_type.."_"..trunk_subtype, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user