working islands, broken tunnels, a couple utility fns, working grass and
flower growth acceleratorsmaster
parent
6bb52d62c6
commit
9791ae335f
15
init.lua
15
init.lua
|
@ -1,6 +1,7 @@
|
|||
|
||||
potions = {
|
||||
geodes = {},
|
||||
utils = {},
|
||||
}
|
||||
|
||||
local potions_players = {}
|
||||
|
@ -19,6 +20,9 @@ dofile(modpath.."/hotsprings.lua")
|
|||
dofile(modpath.."/structures/ziggurat.lua")
|
||||
dofile(modpath.."/structures/coffer_dam.lua")
|
||||
dofile(modpath.."/structures/bridge.lua")
|
||||
dofile(modpath.."/structures/tunnel.lua")
|
||||
dofile(modpath.."/structures/island.lua")
|
||||
dofile(modpath.."/util/spiral.lua")
|
||||
|
||||
-- core
|
||||
dofile(modpath.."/minetunnels.lua")
|
||||
|
@ -26,6 +30,10 @@ dofile(modpath.."/beanstalk.lua")
|
|||
dofile(modpath.."/enchanting.lua")
|
||||
dofile(modpath.."/alchemy.lua")
|
||||
|
||||
--spells
|
||||
dofile(modpath.."/spells/plant_growth.lua")
|
||||
|
||||
|
||||
-- pure mapgen
|
||||
dofile(modpath.."/rocks.lua")
|
||||
|
||||
|
@ -54,8 +62,6 @@ potions/magic
|
|||
each move takes a time meta value along for cooling
|
||||
conjure a meteor
|
||||
freeze/thaw an area
|
||||
conjure a coffer dam
|
||||
conjure an island
|
||||
conjure a floatland
|
||||
conjure butterflies or fireflies
|
||||
a spell with two areas that sucks life-force from one area and vents it to another
|
||||
|
@ -67,6 +73,9 @@ potions/magic
|
|||
effectively change biome
|
||||
clone object
|
||||
nodes that explode when you dig them
|
||||
grow a big hollow bubble from the ground
|
||||
create a space of air
|
||||
emergent jungle tree with ladder inthe core up to a treehouse
|
||||
|
||||
|
||||
[engine]
|
||||
|
@ -375,7 +384,7 @@ end
|
|||
|
||||
local function update_all_manna()
|
||||
for _,p in pairs(potions_players) do
|
||||
update_player_manna(p, 20)
|
||||
update_player_manna(p, 20) -- HACK manna regenerates quickly for debugging
|
||||
end
|
||||
|
||||
minetest.after(1, update_all_manna)
|
||||
|
|
|
@ -0,0 +1,115 @@
|
|||
|
||||
|
||||
minetest.register_node("potions:grass_growth_accel", {
|
||||
description = "Grass Growth Accelerator",
|
||||
inventory_image = "default_grass.png",
|
||||
tiles = {"default_grass.png"},
|
||||
groups = {cracky=3,},
|
||||
})
|
||||
|
||||
|
||||
|
||||
local function random_pos(pos, dist)
|
||||
local p = {
|
||||
x=pos.x + math.random(-dist, dist),
|
||||
y=pos.y + 4,
|
||||
z=pos.z + math.random(-dist, dist),
|
||||
}
|
||||
|
||||
while p.y > pos.y - dist do
|
||||
local n = minetest.get_node(p)
|
||||
if n.name ~= "air" and n.name ~= "ignore" then
|
||||
if n.name == "default:water_source" or n.name == "default:water_flowing" then
|
||||
return nil
|
||||
end
|
||||
|
||||
return p
|
||||
end
|
||||
|
||||
p.y = p.y - 1
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = "potions:grass_growth_accel",
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos)
|
||||
local p = random_pos(pos, 10)
|
||||
if not p then return end
|
||||
|
||||
local b = minetest.get_node(p)
|
||||
if b.name == "default:dirt" or b.name == "default:dirt_with_dry_grass" then
|
||||
minetest.set_node(p, {name="default:dirt_with_grass"})
|
||||
elseif b.name == "default:dirt_with_grass" then
|
||||
p.y = p.y + 1
|
||||
|
||||
local n = minetest.get_node(p)
|
||||
if n.name == "air" then
|
||||
minetest.set_node(p, {name="default:grass_1"})
|
||||
end
|
||||
elseif b.name == "default:grass_1" then
|
||||
minetest.set_node(p, {name="default:grass_2"})
|
||||
elseif b.name == "default:grass_2" then
|
||||
minetest.set_node(p, {name="default:grass_3"})
|
||||
elseif b.name == "default:grass_3" then
|
||||
minetest.set_node(p, {name="default:grass_4"})
|
||||
elseif b.name == "default:grass_4" then
|
||||
minetest.set_node(p, {name="default:grass_5"})
|
||||
elseif b.name == "default:grass_5" then
|
||||
return
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
minetest.register_node("potions:flower_growth_accel", {
|
||||
description = "Flower Growth Accelerator",
|
||||
inventory_image = "default_grass.png^flowers_rose.png",
|
||||
tiles = {"default_grass.png^flowers_rose.png"},
|
||||
groups = {cracky=3,},
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = "potions:flower_growth_accel",
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos)
|
||||
local p = random_pos(pos, 10)
|
||||
if not p then return end
|
||||
|
||||
local b = minetest.get_node(p)
|
||||
if b.name == "default:dirt" then
|
||||
minetest.set_node(p, {name="default:dirt_with_grass"})
|
||||
else
|
||||
if b.name == "default:dirt_with_grass" then
|
||||
p.y = p.y + 1
|
||||
|
||||
local n = minetest.get_node(p)
|
||||
if n.name == "air" then
|
||||
local f = flowers.datas[math.random(#flowers.datas)]
|
||||
minetest.set_node(p, {name="flowers:"..f[1]})
|
||||
end
|
||||
else
|
||||
local def = minetest.registered_nodes[b.name]
|
||||
if def.groups.grass then
|
||||
local f = flowers.datas[math.random(#flowers.datas)]
|
||||
minetest.set_node(p, {name="flowers:"..f[1]})
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
-- TODO: mushroom accelerator
|
||||
-- max lifetime for these nodes
|
|
@ -0,0 +1,136 @@
|
|||
|
||||
|
||||
|
||||
local function dist3(a, b)
|
||||
local x = a.x - b.x
|
||||
local y = a.y - b.y
|
||||
local z = a.z - b.z
|
||||
return math.sqrt(x*x + y*y + z*z)
|
||||
end
|
||||
|
||||
local function dist2(a, b)
|
||||
local x = a.x - b.x
|
||||
local z = a.z - b.z
|
||||
return math.sqrt(x*x + z*z)
|
||||
end
|
||||
|
||||
|
||||
local function make_island(pos, size)
|
||||
-- dir.y = 0
|
||||
|
||||
pos.y = pos.y - 3
|
||||
|
||||
|
||||
local r = size
|
||||
|
||||
local r2 = math.ceil(r+1)
|
||||
local top_nodes = {}
|
||||
|
||||
-- foundation
|
||||
for x = pos.x-r2,pos.x+r2,1 do
|
||||
for y = -r2,0,1 do
|
||||
for z = pos.z-r2,pos.z+r2,1 do
|
||||
local p = {x=x, y=pos.y+y, z=z}
|
||||
local p_squash = {x=x, y=pos.y + (y*2), z=z}
|
||||
local d = dist3(p_squash, pos)
|
||||
|
||||
d = d + math.random() * .5
|
||||
|
||||
local dd = d - r
|
||||
|
||||
if dd < 1 then
|
||||
if y == 0 then
|
||||
table.insert(top_nodes, p)
|
||||
end
|
||||
|
||||
local n = minetest.get_node(p)
|
||||
if n.name == "default:water_source" or n.name == "default:water_flowing" then
|
||||
minetest.set_node(p, {name = "default:coral_skeleton"})
|
||||
end
|
||||
elseif dd < 1.8 and math.random(8) == 1 then
|
||||
if math.random(2) == 1 then
|
||||
minetest.set_node(p, {name = "default:coral_brown"})
|
||||
else
|
||||
minetest.set_node(p, {name = "default:coral_orange"})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- sand
|
||||
for _,p in ipairs(top_nodes) do
|
||||
p.y = p.y + 1
|
||||
|
||||
minetest.set_node(p, {name="default:sand"})
|
||||
|
||||
local d = dist2(pos, p) + math.random() * .9
|
||||
if d / r < .5 then
|
||||
p.y = p.y + 1
|
||||
minetest.set_node(p, {name="default:dirt_with_grass"})
|
||||
|
||||
if math.random(5) == 1 then
|
||||
p.y = p.y + 1
|
||||
minetest.set_node(p, {name="default:grass_1"})
|
||||
end
|
||||
elseif math.random(8) == 1 then
|
||||
p.y = p.y + 1
|
||||
minetest.set_node(p, {name="default:marram_grass_1"})
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
-- add a tree
|
||||
if size > 15 then
|
||||
default.grow_new_emergent_jungle_tree({x=pos.x, y=pos.y+2, z=pos.z})
|
||||
elseif size > 10 then
|
||||
default.grow_new_jungle_tree({x=pos.x, y=pos.y+2, z=pos.z})
|
||||
elseif size > 7 then
|
||||
default.grow_new_aspen_tree({x=pos.x, y=pos.y+2, z=pos.z})
|
||||
elseif size > 3 then
|
||||
default.grow_new_apple_tree({x=pos.x, y=pos.y+2, z=pos.z})
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
minetest.register_craftitem("potions:island_seed", {
|
||||
description = "Island Seed",
|
||||
inventory_image = "default_brick.png",
|
||||
groups = {cracky=3,},
|
||||
liquids_pointable=true,
|
||||
|
||||
on_use = function(itemstack, player, pointed_thing)
|
||||
|
||||
|
||||
|
||||
|
||||
local pos = pointed_thing.above
|
||||
if not pos then
|
||||
return
|
||||
end
|
||||
|
||||
pos.y = pos.y + 1
|
||||
|
||||
-- local below = {x=pos.x, y=pos.y-1, z=pos.z}
|
||||
-- local n = minetest.get_node(below)
|
||||
-- if n.name == "air" or n.name == "ignore" then
|
||||
-- return
|
||||
-- end
|
||||
|
||||
-- local newname = get_temp_node(n.name)
|
||||
|
||||
potions.use_manna(player, 20)
|
||||
|
||||
make_island(pos, 4)
|
||||
-- get player yaw, calc direction
|
||||
|
||||
-- itemstack:take_item()
|
||||
return itemstack
|
||||
end,
|
||||
})
|
|
@ -0,0 +1,105 @@
|
|||
|
||||
|
||||
local function make_tunnel(pos, radius, length, dir)
|
||||
-- dir.y = 0
|
||||
local ndir = vector.normalize(dir)
|
||||
local cross = vector.normalize({x=-dir.z, y=0, z=dir.x})
|
||||
|
||||
local wlow = math.ceil(width / 2)
|
||||
local whigh = math.floor(width / 2)
|
||||
local exp = 2
|
||||
-- local off = math.sin(math.pi/(exp*exp)) * height
|
||||
|
||||
for l = 0,length do
|
||||
|
||||
-- local y = -off + math.sin(math.pi/(exp*exp) + ((l / length) * math.pi / exp) ) * height
|
||||
|
||||
|
||||
local p = {x = pos.x+l*ndir.x, y=pos.y+l*ndir.y, z=pos.z+l*ndir.z}
|
||||
|
||||
-- local param2 = 0
|
||||
-- if math.floor(y + .5) ~= math.floor(y) then
|
||||
-- p.y = p.y - 1
|
||||
-- param2 = 20
|
||||
-- end
|
||||
print(dump(p))
|
||||
minetest.set_node(p, {name="air"})
|
||||
|
||||
|
||||
for h = -radius,radius do
|
||||
for w = -radius,radius do
|
||||
if math.sqrt(h*h + w*w) <= radius then
|
||||
local p2 = vector.add(p, vector.multiply(cross, w))
|
||||
p2.y = p2.y + h
|
||||
minetest.set_node(
|
||||
p2,
|
||||
{name="air"})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
minetest.register_craftitem("potions:tunnel_seed", {
|
||||
description = "Tunnel Seed",
|
||||
inventory_image = "default_sandstone_brick.png",
|
||||
groups = {cracky=3,},
|
||||
liquids_pointable=true,
|
||||
|
||||
on_use = function(itemstack, player, pointed_thing)
|
||||
|
||||
local pos = player:get_pos()
|
||||
if not pos then
|
||||
return
|
||||
end
|
||||
|
||||
pos.y = pos.y + 1
|
||||
|
||||
-- local below = {x=pos.x, y=pos.y-1, z=pos.z}
|
||||
-- local n = minetest.get_node(below)
|
||||
-- if n.name == "air" or n.name == "ignore" then
|
||||
-- return
|
||||
-- end
|
||||
|
||||
-- local newname = get_temp_node(n.name)
|
||||
|
||||
local th = player:get_look_horizontal()
|
||||
local thv = player:get_look_vertical()
|
||||
local dir = vector.normalize({
|
||||
x = -math.sin(th),
|
||||
y = math.sin(thv),
|
||||
z = math.cos(th),
|
||||
})
|
||||
|
||||
local pos2 = vector.add(pos, vector.multiply(dir, potions.get_manna(player)))
|
||||
|
||||
|
||||
-- local b, pos3 = minetest.line_of_sight(pos, pos2)
|
||||
-- if b == false then
|
||||
-- pos2 = pos3
|
||||
-- end
|
||||
|
||||
local dist = 20 -- vector.distance(pos, pos2)
|
||||
|
||||
dist = potions.use_manna(player, dist)
|
||||
|
||||
if dist < 2 then
|
||||
return
|
||||
end
|
||||
|
||||
print(dump(dir))
|
||||
|
||||
-- minetest.set_node(pos, {name="air"})
|
||||
make_tunnel(pos, 4, 5, 30, dir)
|
||||
-- get player yaw, calc direction
|
||||
|
||||
-- itemstack:take_item()
|
||||
return itemstack
|
||||
end,
|
||||
})
|
|
@ -0,0 +1,168 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
potions.utils.spawn_in = function(nodes, height, node, delay, nmax)
|
||||
|
||||
local h = 0
|
||||
local i = 1
|
||||
|
||||
local function go()
|
||||
for n = 1,nmax do
|
||||
|
||||
if i > #nodes then
|
||||
i = 1
|
||||
h = h + 1
|
||||
if h > height then
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local p = nodes[i]
|
||||
|
||||
minetest.set_node({x=p.x, y=p.y+h, z=p.z}, {name=node})
|
||||
|
||||
i = i + 1
|
||||
end
|
||||
|
||||
minetest.after(delay, go)
|
||||
end
|
||||
|
||||
go()
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
potions.utils.stairs = function(start, dir, height, stair_node, space_above, fill_node)
|
||||
|
||||
local adv = {x=0, z=0}
|
||||
|
||||
local param2 = minetest.dir_to_facedir(dir)
|
||||
|
||||
for h = 0,height-1 do
|
||||
local p = {x=start.x+adv.x, y=start.y+h, z=start.z+adv.z}
|
||||
minetest.set_node(p, {name=stair_node, param2=param2})
|
||||
|
||||
|
||||
if fill_node then
|
||||
while p.y > start.y do
|
||||
p.y = p.y - 1
|
||||
minetest.set_node(p, {name=fill_node})
|
||||
end
|
||||
end
|
||||
|
||||
p.y = start.y + h + 1
|
||||
for i = 1,space_above do
|
||||
minetest.set_node(p, {name="air"})
|
||||
p.y = p.y + 1
|
||||
end
|
||||
|
||||
|
||||
adv.x = adv.x + dir.x
|
||||
adv.z = adv.z + dir.z
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
potions.utils.disc_cheap = function(pos, radius)
|
||||
local r = math.ceil(radius)
|
||||
local out = {}
|
||||
|
||||
for x = -r,r do
|
||||
for z = -r,r do
|
||||
if radius >= math.sqrt(x*x + z*z) then
|
||||
table.insert(out, {x=pos.x+x, y=pos.y, z=pos.z+z})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return out
|
||||
end
|
||||
|
||||
|
||||
-- the nodes are not in consecutive order
|
||||
potions.utils.circle_cheap = function(pos, radius)
|
||||
|
||||
local r = radius
|
||||
local r2f = math.floor(r * math.sin(math.pi/4) + .5)
|
||||
local r2c = math.floor(r * math.sin(math.pi/4) + .5)
|
||||
|
||||
local out = {}
|
||||
|
||||
for x = -r2f,r2c,1 do
|
||||
local z = math.sqrt(r*r - x*x)
|
||||
|
||||
table.insert(out, {x=pos.x+x, y=pos.y, z=pos.z+z})
|
||||
table.insert(out, {x=pos.x+x, y=pos.y, z=pos.z-z})
|
||||
-- minetest.set_node({x=pos.x+x, y=pos.y, z=pos.z+z}, {name=node})
|
||||
-- minetest.set_node({x=pos.x+x, y=pos.y, z=pos.z-z}, {name=node})
|
||||
end
|
||||
|
||||
|
||||
for z = -r2f,r2c,1 do
|
||||
local x = math.sqrt(r*r - z*z)
|
||||
|
||||
table.insert(out, {x=pos.x+x, y=pos.y, z=pos.z+z})
|
||||
table.insert(out, {x=pos.x-x, y=pos.y, z=pos.z+z})
|
||||
-- minetest.set_node({x=pos.x+x, y=pos.y+1, z=pos.z+z}, {name=node})
|
||||
-- minetest.set_node({x=pos.x-x, y=pos.y+1, z=pos.z+z}, {name=node})
|
||||
end
|
||||
|
||||
return out
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
minetest.register_craftitem("potions:spiral_test", {
|
||||
description = "Spiral Seed",
|
||||
inventory_image = "default_brick.png",
|
||||
groups = {cracky=3,},
|
||||
liquids_pointable=true,
|
||||
|
||||
on_use = function(itemstack, player, pointed_thing)
|
||||
|
||||
local pos = pointed_thing.above
|
||||
if not pos then
|
||||
return
|
||||
end
|
||||
|
||||
pos.y = pos.y + 1
|
||||
|
||||
local nodes = potions.utils.circle_cheap(pos, 7)
|
||||
|
||||
|
||||
local disc = potions.utils.disc_cheap({x=pos.x, y=pos.y+0, z=pos.z}, 6.8)
|
||||
minetest.bulk_set_node(disc, {name="default:wood"})
|
||||
local disc = potions.utils.disc_cheap({x=pos.x, y=pos.y+5, z=pos.z}, 6.8)
|
||||
minetest.bulk_set_node(disc, {name="default:wood"})
|
||||
local disc = potions.utils.disc_cheap({x=pos.x, y=pos.y+10, z=pos.z}, 6.8)
|
||||
minetest.bulk_set_node(disc, {name="default:wood"})
|
||||
|
||||
pos.y = pos.y + 1
|
||||
potions.utils.stairs(pos, {x=-1, z=0}, 5, "stairs:stair_cobble", 3, "default:tree")
|
||||
pos.y = pos.y - 1
|
||||
|
||||
|
||||
potions.utils.spawn_in(nodes, 10, "default:dirt", .5, 6)
|
||||
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue