Compare commits

...

3 Commits

Author SHA1 Message Date
Aleksey Chubukov
940592395d tree test 2023-05-11 02:39:08 +03:00
Aleksey Chubukov
6c384cbc26 day 03-19: add horrible tree growth 2023-03-20 00:47:19 +03:00
Aleksey Chubukov
d1c1c3bfac day 03-18: add leaves, leaf growing
* added simple leaf growing, leave occupy free adjacent space next to
  growng trunks
* addded leaves node
2023-03-19 00:48:40 +03:00
36 changed files with 235 additions and 56 deletions

View File

@ -5,11 +5,12 @@ globals = {
"minetest",
"ebiometrees",
"eaction"
"ebiome"
}
read_globals = {
string = {fields = {"split"}},
table = {fields = {"copy", "getn"}},
table = {fields = {"copy", "getn", "shuffle"}},
-- Builtin
"vector", "ItemStack",

6
mods/ebiome/api.lua Normal file
View File

@ -0,0 +1,6 @@
function ebiome.register_biome(name, data)
if not data.type or data.type == "simple"
then
minetest.register_biome(name, data)
end
end

View File

@ -1,5 +0,0 @@
ebiome = {
blocktypes = {
stone = "eterrain:rock"
}
}

View File

@ -1,2 +1,3 @@
dofile(minetest.get_modpath("ebiome") .. "/biomes/grasslands.lua")
ebiome = {}
dofile(minetest.get_modpath("ebiome") .. "/api.lua")

View File

@ -1,3 +1,2 @@
depends = ebiometrees
description = biome mod
name = ebiome

16
mods/ebiometrees/api.lua Normal file
View File

@ -0,0 +1,16 @@
ebiometrees.registered_trees = {}
function ebiometrees.register_tree(name, data)
ebiometrees.registered_trees[name] = data
ebiometrees.register_subnodes(name)
end
function ebiometrees.register_subnodes(tree_name)
local modname = tree_name:match("([^:]*):")
local basename = tree_name:match(":([^:]+)")
local data = ebiometrees.registered_trees[tree_name]
ebiometrees.register_tree_sapling(modname, basename, data)
ebiometrees.register_tree_sprout(modname, basename, data)
ebiometrees.register_tree_leaves(modname, basename, data)
ebiometrees.register_tree_trunks(modname, basename, data)
end

View File

@ -1,2 +1,12 @@
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)
}
dofile(minetest.get_modpath("ebiometrees").."/sapling.lua")
dofile(minetest.get_modpath("ebiometrees").."/tree.lua")
dofile(minetest.get_modpath("ebiometrees").."/api.lua")

View File

@ -1,28 +1,86 @@
ebiometrees = {}
function ebiometrees.get_sapling_grower(sprout_name)
local function rooter(pos)
minetest.set_node(pos, {name=sprout_name})
function ebiometrees.grow_closure(nextstage)
local function growtree(pos)
minetest.set_node(pos, {name=nextstage})
end
return rooter
return growtree
end
function ebiometrees.get_sprout_grower(trunk_name, apex_name)
local function grower(pos)
minetest.set_node(pos, {name=trunk_name})
local upper = {x=pos.x, y=pos.y+1, z=pos.z}
minetest.set_node(upper, {name=apex_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)
corner1 = pos:add({x=-1, y=-1, z=-1}):add(candidate_dir:multiply(2))
corner2 = pos:add({x= 1, y= 1, z= 1}):add(candidate_dir:multiply(2))
local spacious, _ = minetest.find_nodes_in_area(
corner1, corner2, "group:treetrunk"
)
minetest.chat_send_all(dump2(spacious))
minetest.chat_send_all(#spacious)
if node and node.name == leaves_name and #spacious == 0
then
return candidate
end
end
end
return grower
return where_to_grow_trunk
end
function ebiometrees.root_sapling(pos)
minetest.set_node(pos, {name="ebiome:oak_sprout"})
return false
function ebiometrees.grow_trunk_closure(trunk_terminal_name, grow_preferences, leaves_name, grow_limit)
local function grow_trunk(pos)
local meta = minetest.get_meta(pos)
if meta:get_int("ebiometrees:distance") > grow_limit
then
return
end
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})
local newmeta = minetest.get_meta(there)
newmeta:set_int("ebiometrees:distance", meta:get_int("ebiometrees:distance")+1)
end
end
return grow_trunk
end
function ebiometrees.set_rooting_sapling(itemstack, placer, pointed_thing)
itemstack = minetest.item_place(itemstack, placer, pointed_thing)
minetest.get_node_timer(pointed_thing.above):start(3)
return itemstack
function ebiometrees.grow_leaves_closure(leaves_name)
local function grow_leaves(pos)
local free_node = minetest.find_node_near(pos, 1, "air")
if free_node
then
minetest.set_node(free_node, {name=leaves_name})
end
return true
end
return grow_leaves
end
function ebiometrees.tree_grower(leaves_name, grow_preferences, terminal_name, nextstage, age_max, grow_limit)
local grow_trunk = ebiometrees.grow_trunk_closure(terminal_name, grow_preferences, leaves_name, grow_limit)
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

View File

@ -0,0 +1,40 @@
package.path = "../?.lua;" .. package.path
_G.ebiometrees = {}
require("api")
require("tree")
require("sapling")
registries={}
function _G.ebiometrees.register_tree_trunks(m, n, d)
registries.trunks = m..":"..n
end
function _G.ebiometrees.register_tree_sprout(m, n, d)
registries.sprout = m..":"..n
end
function _G.ebiometrees.register_tree_leaves(m, n, d)
registries.leaves = m..":"..n
end
function _G.ebiometrees.register_tree_sapling(m, n, d)
registries.sapling = m..":"..n
end
testtree = {
groups = { foo = 1}
}
describe("Trees", function()
it("can register tree", function()
assert.is_nil(ebiometrees.registered_trees["test:tree"])
ebiometrees.register_tree("test:tree", testtree)
assert.is_not_nil(ebiometrees.registered_trees["test:tree"])
end)
it("attempts to register sapling", function()
assert.is_equal("test:tree", registries.sapling)
end)
end)

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

View File

@ -1,33 +1,58 @@
local function growth_timer(pos)
minetest.get_node_timer(pos):start(3)
local meta = minetest.get_meta(pos)
meta:mark_as_private("ebiometrees:age")
meta:set_int("ebiometrees:age", 0)
end
function ebiometrees.register_tree_leaves(modname, basename, data)
local S = minetest.get_translator(modname)
local leaves_groups = table.copy(data.groups)
leaves_groups.leaves = 1
leaves_groups.leafdecay = 3
leaves_groups.snappy = 3
minetest.register_node(modname..":"..basename.."_leaves", {
description = S(data.description.." leaves"),
drawtype = "allfaces_optional",
waving = 1,
tiles = { modname.."_"..basename.."_leaves.png" },
special_tiles = { modname.."_"..basename.."_leaves_simple.png" },
paramtype = "light",
is_ground_content = false,
groups = leaves_groups
})
end
local S = minetest.get_translator("ebiometrees")
function ebiometrees.register_tree(modname, basename, data)
function ebiometrees.register_tree_sapling(modname, basename, data)
-- register saplings
local sapling_name = modname..":"..basename.."_sapling"
local sprout_name = modname..":"..basename.."_sprout"
local S = minetest.get_translator(modname)
local sapling_groups = table.copy(data.groups)
local sprout_groups = table.copy(data.groups)
sapling_groups.sapling = 1
sapling_groups.snappy = 2
sapling_groups.dig_immediate = 3
sprout_groups.sapling = 1
sprout_groups.snappy = 2
minetest.register_node(sapling_name, {
minetest.register_node(modname..":"..basename.."_sapling", {
description = S(data.description.." sapling"),
drawtype = "plantlike",
tiles = { modname.."_"..basename.."_sapling.png"},
paramtype = "light",
on_timer = ebiometrees.get_sapling_grower(sprout_name),
on_timer = ebiometrees.grow_closure(
modname..":"..basename.."_sprout"
),
sunlight_propagates = true,
walkable = false,
groups = sapling_groups,
on_construct = growth_timer
})
minetest.register_node(sprout_name, {
end
function ebiometrees.register_tree_sprout(modname, basename, data)
-- register tree leaves
local S = minetest.get_translator(modname)
local sprout_groups = table.copy(data.groups)
sprout_groups.sapling = 1
sprout_groups.snappy = 2
minetest.register_node(modname..":"..basename.."_sprout", {
description = S(data.description.." sprout"),
drawtype = "plantlike",
visual_scale = 1.4,
@ -35,15 +60,20 @@ function ebiometrees.register_tree(modname, basename, data)
paramtype = "light",
sunlight_propagates = true,
walkable = false,
on_timer = ebiometrees.get_sprout_grower(
modname..":"..basename.."_trunk_growing_straight",
modname..":"..basename.."_trunk_growing_terminal"),
on_timer = ebiometrees.grow_closure(
modname..":"..basename.."_trunk_growing_terminal"
),
groups = sprout_groups,
on_construct = growth_timer
})
-- registers tree and corresponding nodes
end
function ebiometrees.register_tree_trunks(modname, basename, data)
local S = minetest.get_translator(modname)
-- registers corresponding trunk nodes
local trunk_groups = table.copy(data.groups)
trunk_groups.choppy = 2 -- TODO: customizations
trunk_groups.treetrunk = 1
local trunk_types = {"growing", "normal"}
local trunk_subtypes = {"terminal", "straight", "corner",
"tjunction", "t2junction", "xjunction",
@ -54,7 +84,7 @@ function ebiometrees.register_tree(modname, basename, data)
local texture_basename = modname.."_"..basename.."_trunk_"..trunk_type.."_"
local subtype_tiles = {
terminal = {
texture_basename.."terminal.png",
texture_basename.."top.png",
texture_basename.."slice.png",
texture_basename.."terminal.png"
},
@ -109,19 +139,37 @@ function ebiometrees.register_tree(modname, basename, data)
}
for _, trunk_subtype in ipairs(trunk_subtypes)
do
minetest.register_node(
modname..":"..basename.."_trunk_"..trunk_type.."_"..trunk_subtype, {
local nodespec = {
description = S(data.description.." "..trunk_type.." "..trunk_subtype),
groups = trunk_groups,
tiles = subtype_tiles[trunk_subtype],
paramtype2 = "facedir",
is_ground_content = false,
on_place = minetest.rotate_node,
on_timer = function(pos)
return true
end,
on_construct = growth_timer
})
}
if trunk_type == "growing"
then
nodespec.on_timer = ebiometrees.tree_grower(
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,
10
)
end
minetest.register_node(
modname..":"..basename.."_trunk_"..trunk_type.."_"..trunk_subtype,
nodespec)
end
end
end

View File

@ -1,4 +1,4 @@
local S = minetest.get_translator("ebiome")
local S = minetest.get_translator("electric_biomes")
minetest.register_biome({
name = "grasslands",
node_top = "mapgen_topsoil",
@ -10,13 +10,13 @@ minetest.register_biome({
heat_point = 50,
humidity_point = 50,
})
ebiometrees.register_tree("ebiome", "oak",{
ebiometrees.register_tree("electric_biomes:oak",{
description = "Oak",
groups = {flammable = 2}
})
minetest.register_node("ebiome:grass", {
minetest.register_node("electric_biomes:grass", {
description = S("Grass"),
tiles = {"ebiome_grass.png"},
tiles = {"electric_biomes_grass.png"},
drawtype = "plantlike",
visual_scale = 1.4,
waving = 1,
@ -29,8 +29,8 @@ minetest.register_node("ebiome:grass", {
fuel = 1
},
})
minetest.register_alias("grass", "ebiome:grass")
minetest.register_alias("grassplant", "ebiome:grass")
minetest.register_alias("grass", "electric_biomes:grass")
minetest.register_alias("grassplant", "electric_biomes:grass")
minetest.register_decoration({
deco_type = "simple",
@ -40,7 +40,7 @@ minetest.register_decoration({
biomes = {"grasslands"},
y_max = 200,
y_min = 1,
decoration = "ebiome:grass",
decoration = "electric_biomes:grass",
})

View File

@ -0,0 +1,2 @@
dofile(minetest.get_modpath("electric_biomes") .. "/biomes/grasslands.lua")

View File

@ -0,0 +1,3 @@
depends = ebiome, ebiometrees
description = electric game biomes
name = electric_biomes

View File

Before

Width:  |  Height:  |  Size: 914 B

After

Width:  |  Height:  |  Size: 914 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

View File

Before

Width:  |  Height:  |  Size: 661 B

After

Width:  |  Height:  |  Size: 661 B

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 929 B

After

Width:  |  Height:  |  Size: 929 B

View File

Before

Width:  |  Height:  |  Size: 841 B

After

Width:  |  Height:  |  Size: 841 B

View File

Before

Width:  |  Height:  |  Size: 745 B

After

Width:  |  Height:  |  Size: 745 B

View File

Before

Width:  |  Height:  |  Size: 907 B

After

Width:  |  Height:  |  Size: 907 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 936 B

View File

Before

Width:  |  Height:  |  Size: 808 B

After

Width:  |  Height:  |  Size: 808 B

View File

Before

Width:  |  Height:  |  Size: 699 B

After

Width:  |  Height:  |  Size: 699 B

View File

Before

Width:  |  Height:  |  Size: 737 B

After

Width:  |  Height:  |  Size: 737 B

View File

Before

Width:  |  Height:  |  Size: 753 B

After

Width:  |  Height:  |  Size: 753 B

View File

Before

Width:  |  Height:  |  Size: 797 B

After

Width:  |  Height:  |  Size: 797 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

View File

Before

Width:  |  Height:  |  Size: 847 B

After

Width:  |  Height:  |  Size: 847 B