diff --git a/abms.lua b/abms.lua index 810c323..a999e49 100644 --- a/abms.lua +++ b/abms.lua @@ -12,6 +12,24 @@ minetest.register_globalstep(function(dtime) return end + local pos + for k, v in pairs(minetest.luaentities) do + if not v.fortress_check then + pos = v.object:getpos() + if fun_caves.is_fortress(pos) and v.hp_max and v.object and v.health and v.damage then + local factor = 1.5 + (pos.y / -3100) + v.hp_max = math.floor(v.hp_max * factor) + v.damage = math.floor(v.damage * factor) + print("Promoting "..v.name..": "..v.hp_max.." at "..pos.x..","..pos.y..","..pos.z) + v.object:set_hp(v.hp_max) + v.health = v.hp_max + v.fortress_check = true + check_for_death(v) + --print(dump(v.damage)) + end + end + end + for id, player in pairs(minetest.get_connected_players()) do minp = vector.subtract(player:getpos(), 0.5) maxp = vector.add(player:getpos(), 0.5) diff --git a/fortress.lua b/fortress.lua index d525022..da3ab06 100644 --- a/fortress.lua +++ b/fortress.lua @@ -9,6 +9,9 @@ fun_caves.fortress = function(node, data, area, minp, maxp, level) local n = 16 local walls = {} local a, b, c, i, j, u, v, x, y, z, ivm, set, dox, doz + local floor = node('fun_caves:dungeon_floor_1') + local outer_wall = node('fun_caves:dungeon_wall_2') + local inner_wall = node('fun_caves:dungeon_wall_1') for y2 = 0, n-1 do --for y2 = 0, 0 do @@ -27,12 +30,12 @@ fun_caves.fortress = function(node, data, area, minp, maxp, level) if math.floor((z - minp.z) / 5) == doz and math.floor((x - minp.x) / 5) == dox and (z - minp.z) % 5 ~= 0 and (x - minp.x) % 5 ~= 0 and y ~= minp.y then data[ivm] = node("air") else - data[ivm] = node('default:steelblock') + data[ivm] = floor end elseif x == minp.x or z == minp.z or x == maxp.x or z == maxp.z then - data[ivm] = node('default:steelblock') + data[ivm] = outer_wall elseif (z - minp.z) % 5 == 0 or (x - minp.x) % 5 == 0 then - data[ivm] = node("default:sandstone") + data[ivm] = inner_wall else data[ivm] = node("air") end diff --git a/goblin_coal.lua b/goblin_coal.lua index 4c29316..b0ac2f2 100644 --- a/goblin_coal.lua +++ b/goblin_coal.lua @@ -121,7 +121,7 @@ mobs:register_mob("fun_caves:goblin_coal", { }) mobs:register_egg("fun_caves:goblin_coal", "Goblin Egg (coal)", "default_mossycobble.png", 1) -mobs:register_spawn("fun_caves:goblin_coal", {"default:coalblock", "default:stone_with_coal"}, 100, 0, 1 * fun_caves.goblin_spawn_frequency, 3, 101) +mobs:register_spawn("fun_caves:goblin_coal", {"default:coalblock", "default:stone_with_coal", "group:fortress"}, 100, 0, 1 * fun_caves.goblin_spawn_frequency, 3, 101) mobs:register_spawn("fun_caves:goblin_coal", {"default:mossycobble", "fun_caves:hot_cobble"}, 100, 0, 1 * fun_caves.goblin_spawn_frequency, 3, 101) minetest.register_node("fun_caves:stone_with_coal_trap", { diff --git a/goblin_copper.lua b/goblin_copper.lua index d9a30e1..0940831 100644 --- a/goblin_copper.lua +++ b/goblin_copper.lua @@ -120,7 +120,7 @@ mobs:register_mob("fun_caves:goblin_copper", { end, }) mobs:register_egg("fun_caves:goblin_copper", "Goblin Egg (copper)", "default_mossycobble.png", 1) -mobs:register_spawn("fun_caves:goblin_copper", {"default:stone_with_copper"}, 100, 0, 1 * fun_caves.goblin_spawn_frequency, 3, 101) +mobs:register_spawn("fun_caves:goblin_copper", {"default:stone_with_copper", "group:fortress"}, 100, 0, 1 * fun_caves.goblin_spawn_frequency, 3, 101) mobs:register_spawn("fun_caves:goblin_copper", {"default:mossycobble"}, 100, 0, 1 * fun_caves.goblin_spawn_frequency, 3, 101) minetest.register_node("fun_caves:stone_with_copper_trap", { diff --git a/mapgen.lua b/mapgen.lua index b263742..96a671a 100644 --- a/mapgen.lua +++ b/mapgen.lua @@ -1,10 +1,11 @@ -local DEBUG = false +local DEBUG = true local cave_noise_1 = {offset = 0, scale = 1, seed = 3901, spread = {x = 40, y = 10, z = 40}, octaves = 3, persist = 1, lacunarity = 2} local cave_noise_2 = {offset = 0, scale = 1, seed = -8402, spread = {x = 40, y = 20, z = 40}, octaves = 3, persist = 1, lacunarity = 2} local cave_noise_3 = {offset = 15, scale = 10, seed = 3721, spread = {x = 40, y = 40, z = 40}, octaves = 3, persist = 1, lacunarity = 2} local seed_noise = {offset = 0, scale = 32768, seed = 5202, spread = {x = 80, y = 80, z = 80}, octaves = 2, persist = 0.4, lacunarity = 2} local biome_noise = {offset = 0.0, scale = 1.0, spread = {x = 400, y = 400, z = 400}, seed = 903, octaves = 3, persist = 0.5, lacunarity = 2.0} +local fortress_noise = {offset = 0, scale = 1, seed = -4082, spread = {x = 200, y = 200, z = 200}, octaves = 2, persist = 1, lacunarity = 2} local node_cache = {} @@ -103,6 +104,31 @@ end -- end --end +fun_caves.is_fortress = function(pos) + local cs = csize + if not cs then + -- Fix this to get csize, somehow. + cs = {x=80, y=80, z=80} + end + + local x = math.floor((pos.x + 33) / cs.x) + local y = math.floor((pos.y + 33) / cs.y) + local z = math.floor((pos.z + 33) / cs.z) + + if y > -3 or (pos.y + 33) % cs.y > cs.y - 5 then + return false + end + + local n = minetest.get_perlin(fortress_noise):get3d({x=x, y=y, z=z}) + n = (n * 10000) % 20 + + if n == 1 or DEBUG then + return true + end + + return false +end + local function generate(p_minp, p_maxp, seed) minp, maxp = p_minp, p_maxp @@ -121,7 +147,7 @@ local function generate(p_minp, p_maxp, seed) math.randomseed(minetest.get_perlin(seed_noise):get2d({x=minp.x, y=minp.z})) local fortress = maxp.y / 3100 - if maxp.y < -250 and (DEBUG or math.random(20) == 1) then + if fun_caves.is_fortress(minp) then fun_caves.fortress(node, data, area, minp, maxp, math.ceil(maxp.y / 3100)) write = true else diff --git a/nodes.lua b/nodes.lua index 823f7f9..9b142f6 100644 --- a/nodes.lua +++ b/nodes.lua @@ -1,6 +1,26 @@ +-- dungeon floor, basic +local newnode = fun_caves.clone_node("default:stone") +newnode.description = "Dungeon Stone" +newnode.legacy_mineral = false +newnode.groups = {fortress = 1} +minetest.register_node("fun_caves:dungeon_floor_1", newnode) + +-- dungeon walls, basic +local newnode = fun_caves.clone_node("default:sandstone") +newnode.description = "Dungeon Stone" +newnode.groups = {fortress = 1} +minetest.register_node("fun_caves:dungeon_wall_1", newnode) + +-- dungeon walls, type 2 +local newnode = fun_caves.clone_node("default:desert_stone") +newnode.description = "Dungeon Stone" +newnode.groups = {fortress = 1} +minetest.register_node("fun_caves:dungeon_wall_2", newnode) + +-- ice -- add cold damage minetest.add_group("default:ice", {surface_cold = 3}) ---thin (transparent) ice +-- ice, thin -- transparent minetest.register_node("fun_caves:thin_ice", { description = "Thin Ice", tiles = {"caverealms_thin_ice.png"}, @@ -15,7 +35,6 @@ minetest.register_node("fun_caves:thin_ice", { paramtype = "light", }) - --minetest.register_node("fun_caves:bright_air", { -- drawtype = "glasslike", -- tiles = {"technic_light.png"}, diff --git a/sand_monster.lua b/sand_monster.lua index c58c8dd..e7d7f81 100644 --- a/sand_monster.lua +++ b/sand_monster.lua @@ -47,6 +47,6 @@ mobs:register_mob("fun_caves:sand_monster", { }, }) -mobs:register_spawn("fun_caves:sand_monster", {"group:sand"}, 20, 0, 4000, 3, -50) +mobs:register_spawn("fun_caves:sand_monster", {"default:sand"}, 20, 0, 4000, 3, -50) mobs:register_egg("fun_caves:sand_monster", "Deep Sand Monster", "default_sand.png", 1)