From e092d324651cf71e0867aa226a6eb3e59d071860 Mon Sep 17 00:00:00 2001 From: Duane Robertson Date: Mon, 4 Apr 2016 02:34:05 -0500 Subject: [PATCH] Add some cave decorations. --- deco_caves.lua | 519 +++++++++++++++++++++++ init.lua | 1 + mapgen.lua | 47 +- textures/caverealms_algae.png | Bin 0 -> 3094 bytes textures/caverealms_glow_obsidian.png | Bin 0 -> 162 bytes textures/caverealms_glow_obsidian2.png | Bin 0 -> 661 bytes textures/caverealms_hot_cobble.png | Bin 0 -> 431 bytes textures/caverealms_salty2.png | Bin 0 -> 330 bytes textures/caverealms_thin_ice.png | Bin 0 -> 679 bytes textures/loud_walking_moon_juice.png | Bin 0 -> 2988 bytes textures/loud_walking_mushroom_steak.png | Bin 0 -> 2988 bytes 11 files changed, 558 insertions(+), 9 deletions(-) create mode 100644 deco_caves.lua create mode 100644 textures/caverealms_algae.png create mode 100644 textures/caverealms_glow_obsidian.png create mode 100644 textures/caverealms_glow_obsidian2.png create mode 100644 textures/caverealms_hot_cobble.png create mode 100644 textures/caverealms_salty2.png create mode 100644 textures/caverealms_thin_ice.png create mode 100644 textures/loud_walking_moon_juice.png create mode 100644 textures/loud_walking_mushroom_steak.png diff --git a/deco_caves.lua b/deco_caves.lua new file mode 100644 index 0000000..ca73032 --- /dev/null +++ b/deco_caves.lua @@ -0,0 +1,519 @@ +---------------------- +-- Cave Decorations -- +---------------------- + +-- Mushrooms and Speleothems +-- These are instantiated by voxel.lua since the decoration manager +-- only works at the surface of the world. + +local light_max = 9 +loud_walking.time_factor = 10 + +minetest.register_node("loud_walking:huge_mushroom_cap", { + description = "Huge Mushroom Cap", + tiles = {"loud_walking_mushroom_giant_cap.png", "loud_walking_mushroom_giant_under.png", "loud_walking_mushroom_giant_cap.png"}, + is_ground_content = false, + paramtype = "light", + drawtype = "nodebox", + node_box = { type = "fixed", + fixed = { + {-0.5, -0.5, -0.33, 0.5, -0.33, 0.33}, + {-0.33, -0.5, 0.33, 0.33, -0.33, 0.5}, + {-0.33, -0.5, -0.33, 0.33, -0.33, -0.5}, + {-0.33, -0.33, -0.33, 0.33, -0.17, 0.33}, + } }, + light_source = 4, + groups = {fleshy=1, dig_immediate=3, flammable=2, plant=1, leafdecay=1}, +}) + +minetest.register_node("loud_walking:giant_mushroom_cap", { + description = "Giant Mushroom Cap", + tiles = {"loud_walking_mushroom_giant_cap.png", "loud_walking_mushroom_giant_under.png", "loud_walking_mushroom_giant_cap.png"}, + is_ground_content = false, + paramtype = "light", + drawtype = "nodebox", + node_box = { type = "fixed", + fixed = { + {-0.4, -0.5, -0.4, 0.4, 0.0, 0.4}, + {-0.75, -0.5, -0.4, -0.4, -0.25, 0.4}, + {0.4, -0.5, -0.4, 0.75, -0.25, 0.4}, + {-0.4, -0.5, -0.75, 0.4, -0.25, -0.4}, + {-0.4, -0.5, 0.4, 0.4, -0.25, 0.75}, + } }, + light_source = 8, + groups = {fleshy=1, dig_immediate=3, flammable=2, plant=1, leafdecay=1}, +}) + +minetest.register_node("loud_walking:giant_mushroom_stem", { + description = "Giant Mushroom Stem", + tiles = {"loud_walking_mushroom_giant_stem.png", "loud_walking_mushroom_giant_stem.png", "loud_walking_mushroom_giant_stem.png"}, + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2, plant=1}, + sounds = default.node_sound_wood_defaults(), + paramtype = "light", + drawtype = "nodebox", + node_box = { type = "fixed", fixed = { {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25}, }}, +}) + +-- Mushroom stems can be used as wood, ala Journey to the Center of the Earth. +minetest.register_craft({ + output = "default:wood", + recipe = { + {"loud_walking:giant_mushroom_stem"} + } +}) + +-- Caps can be cooked and eaten. +minetest.register_node("loud_walking:mushroom_steak", { + description = "Mushroom Steak", + drawtype = "plantlike", + paramtype = "light", + tiles = {"loud_walking_mushroom_steak.png"}, + inventory_image = "loud_walking_mushroom_steak.png", + on_use = minetest.item_eat(4), + groups = {dig_immediate = 3, attached_node = 1}, +}) + +minetest.register_craft({ + type = "cooking", + output = "loud_walking:mushroom_steak", + recipe = "loud_walking:huge_mushroom_cap", + cooktime = 2, +}) + +minetest.register_craft({ + type = "cooking", + output = "loud_walking:mushroom_steak 2", + recipe = "loud_walking:giant_mushroom_cap", + cooktime = 2, +}) + +-- Glowing fungal stone provides an eerie light. +minetest.register_node("loud_walking:glowing_fungal_stone", { + description = "Glowing Fungal Stone", + tiles = {"default_stone.png^loud_walking_glowing_fungal.png",}, + is_ground_content = true, + light_source = 8, + groups = {cracky=3, stone=1}, + drop = {items={ {items={"default:cobble"},}, {items={"loud_walking:glowing_fungus",},},},}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("loud_walking:glowing_fungus", { + description = "Glowing Fungus", + drawtype = "plantlike", + paramtype = "light", + tiles = {"loud_walking_glowing_fungus.png"}, + inventory_image = "loud_walking_glowing_fungus.png", + groups = {dig_immediate = 3, attached_node = 1}, +}) + +-- The fungus can be made into juice and then into glowing glass. +minetest.register_node("loud_walking:moon_juice", { + description = "Moon Juice", + drawtype = "plantlike", + paramtype = "light", + tiles = {"loud_walking_moon_juice.png"}, + inventory_image = "loud_walking_moon_juice.png", + groups = {dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("loud_walking:moon_glass", { + description = "Moon Glass", + drawtype = "glasslike", + tiles = {"default_glass.png",}, + inventory_image = minetest.inventorycube("default_glass.png"), + is_ground_content = true, + light_source = default.LIGHT_MAX, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft({ + output = "loud_walking:moon_juice", + recipe = { + {"loud_walking:glowing_fungus", "loud_walking:glowing_fungus", "loud_walking:glowing_fungus"}, + {"loud_walking:glowing_fungus", "loud_walking:glowing_fungus", "loud_walking:glowing_fungus"}, + {"loud_walking:glowing_fungus", "vessels:glass_bottle", "loud_walking:glowing_fungus"}, + }, +}) + +minetest.register_craft({ + output = "loud_walking:moon_glass", + type = "shapeless", + recipe = { + "loud_walking:moon_juice", + "loud_walking:moon_juice", + "default:glass", + }, +}) + +-- What's a cave without speleothems? +local spel = { + {type1="stalactite", type2="stalagmite", tile="default_stone.png"}, + {type1="stalactite_slimy", type2="stalagmite_slimy", tile="default_stone.png^loud_walking_algae.png"}, + {type1="stalactite_mossy", type2="stalagmite_mossy", tile="default_stone.png^loud_walking_moss.png"}, + {type1="icicle_down", type2="icicle_up", desc="Icicle", tile="caverealms_thin_ice.png", drop="default:ice"}, +} + +for _, desc in pairs(spel) do + minetest.register_node("loud_walking:"..desc.type1, { + description = (desc.desc or "Stalactite"), + tiles = {desc.tile}, + is_ground_content = true, + walkable = false, + paramtype = "light", + --light_source = 14, + drop = (desc.drop or "loud_walking:stalactite"), + drawtype = "nodebox", + node_box = { type = "fixed", + fixed = { + {-0.07, 0.0, -0.07, 0.07, 0.5, 0.07}, + {-0.04, -0.25, -0.04, 0.04, 0.0, 0.04}, + {-0.02, -0.5, -0.02, 0.02, 0.25, 0.02}, + } }, + groups = {rock=1, cracky=3}, + sounds = default.node_sound_stone_defaults(), + }) + + minetest.register_node("loud_walking:"..desc.type2, { + description = (desc.desc or "Stalagmite"), + tiles = {desc.tile}, + is_ground_content = true, + walkable = false, + paramtype = "light", + --light_source = 14, + drop = "loud_walking:stalagmite", + drawtype = "nodebox", + node_box = { type = "fixed", + fixed = { + {-0.07, -0.5, -0.07, 0.07, 0.0, 0.07}, + {-0.04, 0.0, -0.04, 0.04, 0.25, 0.04}, + {-0.02, 0.25, -0.02, 0.02, 0.5, 0.02}, + } }, + groups = {rock=1, cracky=3}, + sounds = default.node_sound_stone_defaults(), + }) +end + +-- They can be made into cobblestone, to get them out of inventory. +minetest.register_craft({ + output = "default:cobble", + recipe = { + {"", "", ""}, + {"loud_walking:stalactite", "loud_walking:stalactite", ""}, + {"loud_walking:stalactite", "loud_walking:stalactite", ""}, + }, +}) + +minetest.register_craft({ + output = "default:cobble", + recipe = { + {"", "", ""}, + {"loud_walking:stalagmite", "loud_walking:stalagmite", ""}, + {"loud_walking:stalagmite", "loud_walking:stalagmite", ""}, + }, +}) + +minetest.register_node("loud_walking:glowing_dirt", { + description = "Glowing Dirt", + tiles = {"default_dirt.png"}, + groups = {crumbly = 3, soil = 1}, + light_source = default.LIGHT_MAX, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "loud_walking:glowing_dirt", + dry = "loud_walking:glowing_soil", + wet = "loud_walking:glowing_soil_wet" + }, +}) + +minetest.register_node("loud_walking:glowing_soil", { + description = "Glowing Soil", + tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"}, + drop = "loud_walking:glowing_dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + light_source = default.LIGHT_MAX, + soil = { + base = "loud_walking:glowing_dirt", + dry = "loud_walking:glowing_soil", + wet = "loud_walking:glowing_soil_wet" + }, +}) + +minetest.register_node("loud_walking:glowing_soil_wet", { + description = "Wet Glowing Soil", + tiles = {"default_dirt.png^farming_soil_wet.png", "default_dirt.png^farming_soil_wet_side.png"}, + drop = "loud_walking:glowing_dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + light_source = default.LIGHT_MAX, + soil = { + base = "loud_walking:glowing_dirt", + dry = "loud_walking:glowing_soil", + wet = "loud_walking:glowing_soil_wet" + }, +}) + +minetest.register_craft({ + output = "loud_walking:glowing_dirt", + type = "shapeless", + recipe = { + "loud_walking:moon_juice", + "default:dirt", + }, +}) + +--thin (transparent) ice +minetest.register_node("loud_walking:thin_ice", { + description = "Thin Ice", + tiles = {"caverealms_thin_ice.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + use_texture_alpha = true, + light_source = 1, + drawtype = "glasslike", + sunlight_propagates = true, + freezemelt = "default:water_source", + paramtype = "light", +}) + +minetest.register_node("loud_walking:stone_with_moss", { + description = "Cave Stone with Moss", + tiles = {"default_stone.png^loud_walking_moss.png"}, + is_ground_content = true, + light_source = 1, + groups = {stone=1, crumbly=3}, + drop = 'default:cobble', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("loud_walking:stone_with_lichen", { + description = "Cave Stone with Lichen", + tiles = {"default_stone.png^loud_walking_lichen.png"}, + is_ground_content = true, + light_source = 1, + groups = {stone=1, crumbly=3}, + drop = 'default:cobble', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("loud_walking:stone_with_algae", { + description = "Cave Stone with Algae", + tiles = {"default_stone.png^loud_walking_algae.png"}, + is_ground_content = true, + light_source = 1, + groups = {stone=1, crumbly=3}, + drop = 'default:cobble', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("loud_walking:stone_with_salt", { + description = "Cave Stone with Salt", + tiles = {"caverealms_salty2.png"},--{"caverealms_salty2.png^caverealms_salty.png", "caverealms_salty2.png", "caverealms_salty2.png^caverealms_salty_side.png"}, + light_source = 9, + paramtype = "light", + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, + is_ground_content = true, + groups = {stone=1, crumbly=3}, + sounds = default.node_sound_glass_defaults(), +}) + +--Glow Obsidian +minetest.register_node("loud_walking:glow_obsidian", { + description = "Glowing Obsidian", + tiles = {"caverealms_glow_obsidian.png"}, + is_ground_content = true, + groups = {stone=2, crumbly=1}, + light_source = 7, + sounds = default.node_sound_stone_defaults({ + footstep = {name="default_stone_footstep", gain=0.25}, + }), +}) + +--Glow Obsidian 2 - has traces of lava +minetest.register_node("loud_walking:glow_obsidian_2", { + description = "Hot Glow Obsidian", + tiles = {"caverealms_glow_obsidian2.png"}, + is_ground_content = true, + groups = {stone=2, crumbly=1, hot=1}, + damage_per_second = 1, + light_source = 9, + sounds = default.node_sound_stone_defaults({ + footstep = {name="default_stone_footstep", gain=0.25}, + }), +}) + + +--minetest.register_node("loud_walking:bright_air", { +-- drawtype = "glasslike", +-- tiles = {"technic_light.png"}, +-- paramtype = "light", +-- groups = {not_in_creative_inventory=1}, +-- drop = "", +-- walkable = false, +-- buildable_to = true, +-- sunlight_propagates = true, +-- light_source = LIGHT_MAX, +-- pointable = false, +--}) + +--define special flame so that it does not expire +minetest.register_node("loud_walking:constant_flame", { + description = "Fire", + drawtype = "plantlike", + tiles = {{ + name="fire_basic_flame_animated.png", + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}, + }}, + inventory_image = "fire_basic_flame.png", + light_source = 14, + groups = {igniter=2,dig_immediate=3,hot=3, not_in_creative_inventory=1}, + drop = '', + walkable = false, + buildable_to = true, + damage_per_second = 4, + + --after_place_node = function(pos, placer) + -- if pos.y > -7000 then + -- minetest.remove_node(pos) + -- end + --end, +}) + +--Hot Cobble - cobble with lava instead of mortar XD +minetest.register_node("loud_walking:hot_cobble", { + description = "Hot Cobble", + tiles = {"caverealms_hot_cobble.png"}, + is_ground_content = true, + groups = {crumbly=2, hot=1}, + damage_per_second = 1, + light_source = 3, + sounds = default.node_sound_stone_defaults({ + footstep = {name="default_stone_footstep", gain=0.25}, + }), +}) + +-- mushroom growth +minetest.register_abm({ + nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"}, + interval = 50 * loud_walking.time_factor, + chance = 100, + action = function(pos, node) + if pos.y > -50 then + return + end + local pos_up = {x=pos.x,y=pos.y+1,z=pos.z} + local node_up = minetest.get_node_or_nil(pos_up) + if not node_up then + return + end + if node_up.name ~= "air" then + return + end + local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + if not node_under then + return + end + if minetest.get_item_group(node_under.name, "soil") ~= 0 and + minetest.get_node_light(pos_up, nil) <= light_max then + minetest.set_node(pos_up, {name = "loud_walking:huge_mushroom_cap"}) + minetest.set_node(pos, {name = "loud_walking:giant_mushroom_stem"}) + end + end +}) + +-- mushroom growth +minetest.register_abm({ + nodenames = {"loud_walking:huge_mushroom_cap"}, + interval = 100 * loud_walking.time_factor, + chance = 150, + action = function(pos, node) + if minetest.get_node_light(pos, nil) >= 14 then + minetest.set_node(pos, {name = "air"}) + return + end + local pos_up = {x=pos.x,y=pos.y+1,z=pos.z} + local node_up = minetest.get_node_or_nil(pos_up) + if not node_up then + return + end + if node_up.name ~= "air" then + return + end + local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + if not node_under or node_under.name ~= "loud_walking:giant_mushroom_stem" then + return + end + node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 2, z = pos.z}) + if not node_under then + return + end + if minetest.get_item_group(node_under.name, "soil") ~= 0 and + minetest.get_node_light(pos_up, nil) <= light_max then + minetest.set_node(pos_up, {name = "loud_walking:giant_mushroom_cap"}) + minetest.set_node(pos, {name = "loud_walking:giant_mushroom_stem"}) + end + end +}) + +-- mushroom growth +minetest.register_abm({ + nodenames = {"loud_walking:giant_mushroom_stem"}, + interval = 5 * loud_walking.time_factor, + chance = 5, + action = function(pos, node) + local pos_up = {x=pos.x,y=pos.y+1,z=pos.z} + local node_up = minetest.get_node_or_nil(pos_up) + if not node_up then + return + end + if node_up.name ~= "air" then + return + end + if minetest.get_node_light(pos_up, nil) <= light_max then + minetest.set_node(pos_up, {name = "loud_walking:huge_mushroom_cap"}) + end + end +}) + +-- mushroom spread +minetest.register_abm({ + nodenames = {"loud_walking:giant_mushroom_cap", "loud_walking:huge_mushroom_cap"}, + interval = 3 * loud_walking.time_factor, + chance = 40, + action = function(pos, node) + if minetest.get_node_light(pos, nil) >= 14 then + minetest.set_node(pos, {name = "air"}) + return + end + local pos_down = pos + pos_down.y = pos_down.y - 1 + local pos1, count = minetest.find_nodes_in_area_under_air(vector.subtract(pos_down, 4), vector.add(pos_down, 4), {"group:soil"}) + if #pos1 < 1 then + return + end + local random = pos1[math.random(1, #pos1)] + random.y = random.y + 1 + local mushroom_type + if math.random(1,2) == 1 then + mushroom_type = "flowers:mushroom_red" + else + mushroom_type = "flowers:mushroom_brown" + end + if minetest.get_node_light(random, nil) <= light_max then + minetest.set_node(random, {name = mushroom_type}) + end + end +}) diff --git a/init.lua b/init.lua index 7fe40e5..b1fae58 100644 --- a/init.lua +++ b/init.lua @@ -79,6 +79,7 @@ end dofile(loud_walking.path .. "/nodes.lua") dofile(loud_walking.path .. "/deco.lua") +dofile(loud_walking.path .. "/deco_caves.lua") dofile(loud_walking.path .. "/mapgen.lua") diff --git a/mapgen.lua b/mapgen.lua index 6b17af5..4d3b775 100644 --- a/mapgen.lua +++ b/mapgen.lua @@ -178,6 +178,7 @@ local function get_biome(px, pz) end local biome = biome_names[rarity][math.random(#biome_names[rarity])] return biome + --return "glacier" end local function get_decoration(biome) @@ -267,7 +268,11 @@ function loud_walking.generate(p_minp, p_maxp, seed) local terr = get_height(dx, dz, biomes[biome].terrain_scale, ocean, index) local in_cave = false + if biome == "underground" then + terr = half - 5 + end + local cave_height = 0 for y = minp.y, maxp.y do local dy = y - minp.y if pod then @@ -325,20 +330,32 @@ function loud_walking.generate(p_minp, p_maxp, seed) elseif dy > terr + ground then data[ivm] = node("air") in_cave = false - elseif cave[index3d] ^ 2 > 0.1 + dy / half then + elseif cave[index3d] ^ 2 > (biome == "underground" and 0.5 or 1.3 - math.sin(dy / (half * 0.2))) then if terr + ground >= dy and not in_cave and dy > terr + ground - 10 then data[ivm] = node(node_top) elseif dy == 1 then - local sr = math.random(9) - if not ocean and not swamp and not beach and sr == 1 then + if not ocean and not swamp and not beach and math.random(6) == 1 then data[ivm] = node("default:lava_source") - elseif sr > 6 then - data[ivm] = node(node_stone) elseif ocean or swamp or beach then data[ivm] = node(node_filler) end - elseif ocean or swamp or beach and dy < half then + elseif (ocean or swamp or beach) and not in_cave and node_stone == "default:stone" and dy < half and math.random(20) == 1 then + data[ivm] = node("loud_walking:glowing_fungal_stone") + elseif (ocean or swamp or beach) and dy < half then data[ivm] = node(node_water) + elseif cave_height == 2 and node_filler == "default:dirt" and data[ivm - 3] == node(node_stone) and math.random(40) == 1 then + data[ivm] = node("loud_walking:giant_mushroom_cap") + data[ivm - a.ystride] = node("loud_walking:giant_mushroom_stem") + data[ivm - 2 * a.ystride] = node("loud_walking:giant_mushroom_stem") + data[ivm - 3 * a.ystride] = node(node_filler) + elseif cave_height == 1 and node_filler == "default:dirt" and data[ivm - 3] == node(node_stone) and math.random(20) == 1 then + data[ivm] = node("loud_walking:huge_mushroom_cap") + data[ivm - a.ystride] = node("loud_walking:giant_mushroom_stem") + data[ivm - 2 * a.ystride] = node(node_filler) + elseif not in_cave and node_stone == "default:stone" and math.random(10) == 1 then + data[ivm] = node("loud_walking:stalagmite") + elseif not in_cave and node_stone == "default:ice" and math.random(10) == 1 then + data[ivm] = node("loud_walking:icicle_up") else data[ivm] = node("air") end @@ -356,6 +373,13 @@ function loud_walking.generate(p_minp, p_maxp, seed) write = true else data[ivm] = node(node_stone) + if in_cave and node_stone == "default:stone" and math.random(20) == 1 then + data[ivm] = node("loud_walking:glowing_fungal_stone") + elseif in_cave and not (ocean or swamp or beach) and node_stone == "default:stone" and math.random(10) == 1 then + data[ivm - a.ystride] = node("loud_walking:stalactite") + elseif in_cave and not (ocean or swamp or beach) and node_stone == "default:ice" and math.random(10) == 1 then + data[ivm - a.ystride] = node("loud_walking:icicle_down") + end lightmap[ivm] = 0 in_cave = false write = true @@ -366,6 +390,11 @@ function loud_walking.generate(p_minp, p_maxp, seed) write = true end + if in_cave then + cave_height = cave_height + 1 + else + cave_height = 0 + end ivm = ivm + a.ystride index3d = index3d + csize.x end @@ -377,8 +406,8 @@ function loud_walking.generate(p_minp, p_maxp, seed) for dz = 0, 75, 5 do for dx = 0, 75, 5 do if math.random(2) == 1 then - local x = minp.x + dx + math.random(0, 4) - local z = minp.z + dz + math.random(0, 4) + local x = minp.x + dx + math.random(5) - 1 + local z = minp.z + dz + math.random(5) - 1 local y = minp.y + get_height(x - minp.x, z - minp.z, biomes[biome].terrain_scale, ocean) + ground local ivm = a:index(x, y, z) @@ -406,7 +435,7 @@ function loud_walking.generate(p_minp, p_maxp, seed) minetest.generate_decorations(vm, minp, maxp) --vm:set_param2_data(p2data) --vm:set_lighting({day = 15, night = 0}) - vm:set_light_data(lightmap) + --vm:set_light_data(lightmap) vm:calc_lighting(minp, maxp, false) vm:update_liquids() vm:write_to_map() diff --git a/textures/caverealms_algae.png b/textures/caverealms_algae.png new file mode 100644 index 0000000000000000000000000000000000000000..980a4a16ede24c6b4bb917afbbdc1afb6393b3c9 GIT binary patch literal 3094 zcmV+x4C(WUP)()ig*b~6;zM}l#r0&%=5ZGLQ$IEI?;pycv(FAW2t%JXQ~k!HoFx`1c_PvMB7dHeNn2)>U(w} zziODSE;}q+wiRmQ`Old3_&WknRy$S`{xC}_{w^~XjZov2?UQu(&R2<^8_G3T^}=K| z5bu}VGJF(^X1^hcq>C6qQasAyP1oz_Ykp0ybPuh*MuN#C@puxG!%23wjjGl6E&^D+ zF;7>Q9TtECN4F6To&%t2<4@G$aFO08m3ixj=ufWigOo3upc?X`lEmpsFsERb%&r`& zg9qGke~bV4_QCxx;ftnbVxb@l3wKN9%6rx7b`S`35;y#4!UTyBnd!Z;nC-Or&d{&- zAevj+Df`2FviiB})ZNEQGL}L|BuXOGm-FY(J(h@iUT`?=T}QBDbFQY@BQ&4?iu0}Q zhyyh0AUoTHkV-glmO*_-(;obs_D%;9?_}=uy^^c-gm<`fP2j?sAL6lHlIh+%dS z@(atJ*)M*t5DYdF4@IzwiTp?27aM}p#p_*zM z#>!0(YCNPAP5p0Kv}&9tEKyc${DnF!m(bSkB{QQR!A^sZo8F-{+zG&fq9amMm#O;? zzCLlj(Clw!?c9SsE9oAk%g1QnjBJ|Do}#AYfK)E~ zu|_OzO!6i3o;o34fBLrWJ^VLPt$k=X(?C21hABo`n(fMn#EzFd@$z?KR<9hTo-`9S zSHEe!og?a`y6zSY1;J|0;F%fQzc+!xMb~J*zSrXoMu|mQh()}(U746nIy%GY+-J27 z z|E-?wXySZJ3ejjMCQF<_nf-AEF2$RAj7VpM(wRHE7O>)Bttfn17O(uR1|z3%dQu5T z1Ng)3)E0I1gPDu(P^&0u9y8%^Xsg@SYhuy}W7yqp;)X%_v|Zx!wPCV!wa&}jHxo{@ zv#j{9l945-DS$m0C#PVg1e)!boHmxO|Ap2(`-oN)zAW=rkDKU?HsQ)LV^4EXF}+^; zWo6LtkF8p=>=unhf-Eks7cob1+MN?))@BTA5~E=9HgVb_0IVrLEzPapI%m{erQ^p< zmjzP}%k0`aHRelY)vO~jAZru=!-m~~)#M;-bmHmLz~-$v>h*eGshV9c_uMp@f$pyN zPBul^^0&1_ql#gUv*NkmD9Pmg(L{)n$3GO8EgJ(MGu7R5CMh;=aO5=usQL4FUHII1 zO>?ADHR~+_=!k#G%KyAsPX~5mP8H@%t(VqsoV15NB-`nta>-Bi=#jIWJpEDEm9~Ll zwXwW(pJZeVr0~g?B$P01k6);QU^t1?ZkV8cUmF#(xjHEzkW__8)jjFU=Uj$#3?vqhSjYZzenCI&yQie6P|0UVlGN8=5}A=gr2V z21}mWAvG_K*J#L&;=~BY!Wbr{vUaQj)RZ7Eyq2$S%Lrb1y;@JUodTdd_fzTWego-0 zc!a!vU@JB;aEOcCoGntj{w}RpcC+TrxmJ5{UN=hPAq&}-pPd5h z5kkzFlug+q)z99e;Y1U|2VKsC_imTXnI<||(#sCRD zkH-_kEJe%B`eo_%q;w)l^8 zu}|16<_!|JPyMG)1TZS|_enf{o>UnK;a<4t&+Q{-k)1IBfJit&Kg-=*-TP4rAK537 zP$!ugA#5oJak)R`%FClvJ+niu7<@Ska~+wc zWQ^k9|3iNF%fAZ1?;rl7{C_^t+TjDh>2l+;q?2k*K~`-1xjHO;dU$TAL5ueUt>Jc- z&)y*bHFbArFUMd4Q9s`38O-J;il?6X!Fyl6bc|Nc+9i4OM(DcvhkAVC_7VA~@B7)4 z{cG1u(3q)>(%gEfSa-Y1@&9>E4}7-ghj>mzV*DRGC&M~~2PVuHfawcv)PL6}EJhgf zmDm4D{_DjGZSkMREFDBlhq&Sb&kHBLB@5QxrWf2?=Vxp<>iW~r(B`Jvg<-W;)H z&7<1Gb0RV9b_d-&FM0AUDXJZ&X>J=9!$V6;l#6)Ig8aYB(oJ`3A{wD2w_Ymi#%Q-s zc+!T@D?NpaePYd=J+f-!M0Eu&C8uDeR4*T^r89SmQS;oxYO#VkJ18l5QM!3vS~X7l zWo7Wdt+VOu@Dqy!NlJ_hJZJIqKUOg(aHOXL5LYWcUmMj0$7S{tf01sV@TB=!GiQ&? zSbCjy`^3Vk3EJ%w0(_Xp|M4Lefm80pS(*_!?;o`ghNph$p{0pt|n}p zA{K*Q+3A?#=@=TJ&3lI8C-(`!l=&WYIf9c>;M1& literal 0 HcmV?d00001 diff --git a/textures/caverealms_glow_obsidian.png b/textures/caverealms_glow_obsidian.png new file mode 100644 index 0000000000000000000000000000000000000000..a157738249ff0635f2c7b2d6cefd04960552664f GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUWt7)pRMcZMaA7j_X0i@u za*AaRDPxYP`JkpO1ytke>Eal|F*7+qAfI#~wX;z@Zc*lMo}eBQwXrae?g$Ge!o>K8}PbQ=;2}1~PcM`njxg HN@xNA<>4&= literal 0 HcmV?d00001 diff --git a/textures/caverealms_glow_obsidian2.png b/textures/caverealms_glow_obsidian2.png new file mode 100644 index 0000000000000000000000000000000000000000..2702d59d9db68d98f92a8dc2037f376feb58a23c GIT binary patch literal 661 zcmV;G0&4wYwf9Khipx+n}8 zj15-SjbFQU3+1I$*SfC%*0vjTWt%N!4P|7?Akj>d!iX;c1Oky@h&MGcB+9{X<>-a4 z;Klffd>*j-g=drL#<%H%Z9y?RtXQ2i`I8OI;wWz4@e+0+A|K6FGcV%lOum|kOK&}w zb?Ud`^LL6pik}sug{wr3SUng6a0fTBu;?fr{na7d#HFt7>(M8+F*#%zr?B?9fD=1z z;4tQK5%ZYBbzII^&=IV+JW%me_%6S3}p2sz;eIFhC0JGs_+Agx+IxgTDgg;GV zDx4T{?u{8tjGH4qB5L%WaP1XweBEPMCB8XfiDY_Cb5%<}xH4lA!Px`me)lrAaROJb zIR4h^hD&=c!193jc*j)TY5Xb^Tf}Zejo#jg-s@8DZYc&thgibV`)0r-eu`op6EE#& ze1F>ge+VANPujL{r4r*RV?5LW^rNEHJpcdi1{x~zjW~zXYs=^&*M0r zLej4M*n2|nRUT4ezw|4_KtMo2K|w-7LPJACL_|bIMMX$RNJ&Xa zOG`^kOiWHrPESuyP!bYQP*7A_~T3T9LTU%UQTwN6vWfvE3K>&Fh8;l?zq9i1_ z${3FT007HLL_t&-83n|PqSkzY{2oe>lE*! zc@;Aw2x9lHzy>l6S7TmRHZxOI>FR01OjQp9)Q#l(O8KtGv2FT<^eiuNjt`4d-PL6Y znSh$D-mhi+8tg#yR~6vTtC`s-?RByHFe*UV)fY+9tg!s6>7h84E|w?)W>>ZLcHHlx Z=pXNMAwp|7a`pfK002ovPDHLkV1mVTmd5}9 literal 0 HcmV?d00001 diff --git a/textures/caverealms_salty2.png b/textures/caverealms_salty2.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8b5219e571d9df0d1bbf2e07feb67981202e3a GIT binary patch literal 330 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 ipFH>ZeE6Bll>Q6O5^j6iB&!Di0000