From 44d2395e972982095eb665b823213910a279a203 Mon Sep 17 00:00:00 2001 From: HeroOfTheWinds Date: Sat, 31 May 2014 21:33:59 -1000 Subject: [PATCH] Version 2.5 Release Watershed floods the new release with new biomes and nodes, thanks to a powerful humidity/temperature system. --- init.lua | 599 ++++++++++++++++++---------- nodes.lua | 310 ++++++++++++++ textures/mapgen_wheat_grass_1.png | Bin 0 -> 300 bytes textures/mapgen_wheat_grass_2.png | Bin 0 -> 406 bytes textures/mapgen_wheat_grass_3.png | Bin 0 -> 474 bytes textures/mapgen_wheat_grass_4.png | Bin 0 -> 573 bytes textures/mapgen_wheat_grass_5.png | Bin 0 -> 728 bytes textures/skylands_acacialeaf.png | Bin 0 -> 340 bytes textures/skylands_acaciatree.png | Bin 0 -> 682 bytes textures/skylands_acaciatreetop.png | Bin 0 -> 731 bytes textures/skylands_acaciawood.png | Bin 0 -> 364 bytes textures/skylands_drygrass.png | Bin 0 -> 771 bytes textures/skylands_drygrass_side.png | Bin 0 -> 501 bytes textures/skylands_goldengrass.png | Bin 0 -> 683 bytes textures/skylands_icydirt.png | Bin 0 -> 746 bytes textures/skylands_icydirt_side.png | Bin 0 -> 491 bytes textures/skylands_needles.png | Bin 0 -> 860 bytes textures/skylands_permafrost.png | Bin 0 -> 897 bytes textures/skylands_pinetree.png | Bin 0 -> 693 bytes textures/skylands_pinetreetop.png | Bin 0 -> 802 bytes textures/skylands_pinewood.png | Bin 0 -> 366 bytes wheat.lua | 171 ++++++++ 22 files changed, 875 insertions(+), 205 deletions(-) create mode 100644 nodes.lua create mode 100644 textures/mapgen_wheat_grass_1.png create mode 100644 textures/mapgen_wheat_grass_2.png create mode 100644 textures/mapgen_wheat_grass_3.png create mode 100644 textures/mapgen_wheat_grass_4.png create mode 100644 textures/mapgen_wheat_grass_5.png create mode 100644 textures/skylands_acacialeaf.png create mode 100644 textures/skylands_acaciatree.png create mode 100644 textures/skylands_acaciatreetop.png create mode 100644 textures/skylands_acaciawood.png create mode 100644 textures/skylands_drygrass.png create mode 100644 textures/skylands_drygrass_side.png create mode 100644 textures/skylands_goldengrass.png create mode 100644 textures/skylands_icydirt.png create mode 100644 textures/skylands_icydirt_side.png create mode 100644 textures/skylands_needles.png create mode 100644 textures/skylands_permafrost.png create mode 100644 textures/skylands_pinetree.png create mode 100644 textures/skylands_pinetreetop.png create mode 100644 textures/skylands_pinewood.png create mode 100644 wheat.lua diff --git a/init.lua b/init.lua index 75fd1ea..acbe748 100644 --- a/init.lua +++ b/init.lua @@ -5,7 +5,7 @@ -- Parameters -local YMIN = 128 -- Approximate realm limits. +local YMIN = 700 -- Approximate realm limits. local YMAX = 33000 local XMIN = -33000 local XMAX = 33000 @@ -14,22 +14,27 @@ local ZMAX = 33000 local FLOW = 256 --for pools -local CHUINT = 2 -- Chunk interval for floatland layers +local CHUINT = 1 -- Chunk interval for floatland layers local WAVAMP = 16 -- Structure wave amplitude local HISCAL = 24 -- Upper structure vertical scale local LOSCAL = 24 -- Lower structure vertical scale local HIEXP = 0.5 -- Upper structure density gradient exponent local LOEXP = 0.5 -- Lower structure density gradient exponent -local CLUSAV = 0.5 -- Large scale variation average +local CLUSAV = -0.4 -- Large scale variation average local CLUSAM = 0.5 -- Large scale variation amplitude local DIRTHR = 0.04 -- Dirt density threshold local STOTHR = 0.08 -- Stone density threshold local STABLE = 2 -- Minimum number of stacked stone nodes in column for dirt / sand on top local APPCHA = 0.02 -- Appletree chance +local PINCHA = 0.015 -- Pine tree chance +local SPINCHA = 0.01 -- Pine tree chance for snow plains +local ACACHA = 0.01 -- Acacia tree chance +local JUNTCHA = 0.04 -- Jungle tree chance local FLOCHA = 0.02 -- Flower chance local GRACHA = 0.11 -- Grass chance local CACCHA = 0.02 -- Cactus chance +local JUNGCHA = 0.2 -- Junglegrass chance local FIRCHA = 0.03 -- Fire chance local LAKCHA = 0.002 local ORECHA = 1 / (6 * 6 * 6) @@ -89,186 +94,34 @@ local np_biome = { persist = 0.5 } +-- 3D noise for temperature + +local np_temp = { + offset = 0, + scale = 1, + spread = {x=512, y=512, z=512}, + seed = 9130, + octaves = 3, + persist = 0.5 +} + +-- 3D noise for humidity + +local np_humid = { + offset = 0, + scale = 1, + spread = {x=512, y=512, z=512}, + seed = -55500, + octaves = 3, + persist = 0.5 +} + -- Stuff skylands = {} --- Nodes - -minetest.register_node("skylands:stone", { - description = "FLI Stone", - tiles = {"default_stone.png"}, - is_ground_content = false, -- stops cavegen removing this node - groups = {cracky=3}, - drop = "default:cobble", - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("skylands:desertstone", { - description = "FLI Desert Stone", - tiles = {"default_desert_stone.png"}, - is_ground_content = false, -- stops cavegen removing this node - groups = {cracky=3}, - drop = "default:desert_stone", - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("skylands:obsidian", { - description = "FLI Obsidian", - tiles = {"default_obsidian.png"}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - groups = {cracky=1,level=2}, - drop = "default:obsidian", -}) ---NEW! Cinder for volcanic biomes -minetest.register_node("skylands:cinder", { - description = "Cinder", - tiles = {"skylands_cinder.png"}, - is_ground_content = true, - groups = {crumbly=2, falling_node=1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_gravel_footstep", gain=0.5}, - dug = {name="default_gravel_footstep", gain=1.0}, - }), -}) ---NEW! Cinder block crafted from cinder -minetest.register_node("skylands:cinder_block", { - description = "Cinder Block", - tiles = {"skylands_cinder_block.png"}, - groups = {cracky=3, crumbly=1}, - sounds = default.node_sound_stone_defaults(), -}) ---Craft to create cinder blocks from 4 cinders -minetest.register_craft({ - output = "skylands:cinder_block", - recipe = { - {"skylands:cinder", "skylands:cinder"}, - {"skylands:cinder", "skylands:cinder"} - } -}) - ---vars for it moreblocks and moreores are installed -local mblocks = false -local mores = false - ---moreblocks nodes - iron_stone redefined so that cavegen doesn't destroy -minetest.register_node("skylands:coal_stone", { - description = "FLI Coal Stone", - tiles = {"moreblocks_coal_stone.png"}, - --is_ground_content = false, - groups = {cracky=3}, - drop = "moreblocks:coal_stone", -}) - -minetest.register_node("skylands:iron_stone", { - description = "FLI Iron Stone", - tiles = {"moreblocks_iron_stone.png"}, - is_ground_content = false, - groups = {cracky=3}, - drop = "moreblocks:iron_stone", -}) ---define special flame so that it does not expire -minetest.register_node("skylands: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}, - drop = '', - walkable = false, - buildable_to = true, - damage_per_second = 4, - - after_place_node = function(pos, placer) - fire.on_flame_add_at(pos) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - fire.on_flame_remove_at(pos) - end, -}) - ---Define the ores so that they propagate with the abm -minetest.register_node("skylands:stone_with_coal", { - description = "Coal Ore", - tiles = {"default_stone.png^default_mineral_coal.png"}, - is_ground_content = true, - groups = {cracky=3, skyores=1}, - drop = 'default:coal_lump', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("skylands:stone_with_iron", { - description = "Iron Ore", - tiles = {"default_stone.png^default_mineral_iron.png"}, - is_ground_content = true, - groups = {cracky=2, skyores=1}, - drop = 'default:iron_lump', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("skylands:stone_with_copper", { - description = "Copper Ore", - tiles = {"default_stone.png^default_mineral_copper.png"}, - is_ground_content = true, - groups = {cracky=2, skyores=1}, - drop = 'default:copper_lump', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("skylands:stone_with_mese", { - description = "Mese Ore", - tiles = {"default_stone.png^default_mineral_mese.png"}, - is_ground_content = true, - groups = {cracky=1, skyores=1}, - drop = "default:mese_crystal", - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("skylands:stone_with_gold", { - description = "Gold Ore", - tiles = {"default_stone.png^default_mineral_gold.png"}, - is_ground_content = true, - groups = {cracky=2, skyores=1}, - drop = "default:gold_lump", - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("skylands:stone_with_diamond", { - description = "Diamond Ore", - tiles = {"default_stone.png^default_mineral_diamond.png"}, - is_ground_content = true, - groups = {cracky=1, skyores=1}, - drop = "default:diamond", - sounds = default.node_sound_stone_defaults(), -}) -minetest.register_node("skylands:mineral_tin", { - description = "Tin Ore", - tiles = {"default_stone.png^moreores_mineral_tin.png"}, - groups = {cracky=3, skyores=1}, - sounds = default_stone_sounds, - drop = "moreores:tin_lump" -}) -minetest.register_node("skylands:mineral_silver", { - description = "Silver Ore", - tiles = {"default_stone.png^moreores_mineral_silver.png"}, - groups = {cracky=3, skyores=1}, - sounds = default_stone_sounds, - drop = "moreores:silver_lump" -}) -minetest.register_node("skylands:mineral_mithril", { - description = "Mithril Ore", - tiles = {"default_stone.png^moreores_mineral_mithril.png"}, - groups = {cracky=3, skyores=1}, - sounds = default_stone_sounds, - drop = "moreores:mithril_lump" -}) - +dofile(minetest.get_modpath("skylands").."/nodes.lua") +dofile(minetest.get_modpath("skylands").."/wheat.lua") -- Functions @@ -315,6 +168,26 @@ local function skylands_grass(data, vi) end end +local function skylands_wheat(data, vi) + local c_wgrass1 = minetest.get_content_id("skylands:wheat_grass_1") + local c_wgrass2 = minetest.get_content_id("skylands:wheat_grass_2") + local c_wgrass3 = minetest.get_content_id("skylands:wheat_grass_3") + local c_wgrass4 = minetest.get_content_id("skylands:wheat_grass_4") + local c_wgrass5 = minetest.get_content_id("skylands:wheat_grass_5") + local rand = math.random(5) + if rand == 1 then + data[vi] = c_wgrass1 + elseif rand == 2 then + data[vi] = c_wgrass2 + elseif rand == 3 then + data[vi] = c_wgrass3 + elseif rand == 4 then + data[vi] = c_wgrass4 + else + data[vi] = c_wgrass5 + end +end + local function skylands_flower(data, vi) local c_danwhi = minetest.get_content_id("flowers:dandelion_white") local c_danyel = minetest.get_content_id("flowers:dandelion_yellow") @@ -388,6 +261,11 @@ function highlandpools_remplant(x, y, z, area, data) local c_grass3 = minetest.get_content_id("default:grass_3") local c_grass4 = minetest.get_content_id("default:grass_4") local c_grass5 = minetest.get_content_id("default:grass_5") + local c_wgrass1 = minetest.get_content_id("skylands:wheat_grass_1") + local c_wgrass2 = minetest.get_content_id("skylands:wheat_grass_2") + local c_wgrass3 = minetest.get_content_id("skylands:wheat_grass_3") + local c_wgrass4 = minetest.get_content_id("skylands:wheat_grass_4") + local c_wgrass5 = minetest.get_content_id("skylands:wheat_grass_5") local c_danwhi = minetest.get_content_id("flowers:dandelion_white") local c_danyel = minetest.get_content_id("flowers:dandelion_yellow") local c_rose = minetest.get_content_id("flowers:rose") @@ -396,6 +274,8 @@ function highlandpools_remplant(x, y, z, area, data) local c_viola = minetest.get_content_id("flowers:viola") local c_cactus = minetest.get_content_id("default:cactus") local c_dry_shrub = minetest.get_content_id("default:dry_shrub") + local c_golgrass = minetest.get_content_id("skylands:goldengrass") + local c_jungrass = minetest.get_content_id("default:junglegrass") local c_air = minetest.get_content_id("air") local c_water = minetest.get_content_id("default:water_source") for j = 1, 7 do @@ -407,6 +287,13 @@ function highlandpools_remplant(x, y, z, area, data) or data[vi] == c_grass3 or data[vi] == c_grass4 or data[vi] == c_grass5 + or data[vi] == c_wgrass1 + or data[vi] == c_wgrass2 + or data[vi] == c_wgrass3 + or data[vi] == c_wgrass4 + or data[vi] == c_wgrass5 + or data[vi] == c_golgrass + or data[vi] == c_jungrass or data[vi] == c_danwhi or data[vi] == c_danyel or data[vi] == c_rose @@ -429,6 +316,13 @@ function highlandpools_remplant(x, y, z, area, data) or data[vi] == c_grass3 or data[vi] == c_grass4 or data[vi] == c_grass5 + or data[vi] == c_wgrass1 + or data[vi] == c_wgrass2 + or data[vi] == c_wgrass3 + or data[vi] == c_wgrass4 + or data[vi] == c_wgrass5 + or data[vi] == c_golgrass + or data[vi] == c_jungrass or data[vi] == c_danwhi or data[vi] == c_danyel or data[vi] == c_rose @@ -444,17 +338,163 @@ function highlandpools_remplant(x, y, z, area, data) end end + +--watershed functions +function skylands_pinetree(x, y, z, area, data) + local c_wspitree = minetest.get_content_id("skylands:pinetree") + local c_wsneedles = minetest.get_content_id("skylands:needles") + local c_snowblock = minetest.get_content_id("default:snowblock") + for j = -4, 14 do + if j == 3 or j == 6 or j == 9 or j == 12 then + for i = -2, 2 do + for k = -2, 2 do + if math.abs(i) == 2 or math.abs(k) == 2 then + if math.random(7) ~= 2 then + local vil = area:index(x + i, y + j, z + k) + data[vil] = c_wsneedles + local vila = area:index(x + i, y + j + 1, z + k) + data[vila] = c_snowblock + end + end + end + end + elseif j == 4 or j == 7 or j == 10 then + for i = -1, 1 do + for k = -1, 1 do + if not (i == 0 and j == 0) then + if math.random(11) ~= 2 then + local vil = area:index(x + i, y + j, z + k) + data[vil] = c_wsneedles + local vila = area:index(x + i, y + j + 1, z + k) + data[vila] = c_snowblock + end + end + end + end + elseif j == 13 then + for i = -1, 1 do + for k = -1, 1 do + if not (i == 0 and j == 0) then + local vil = area:index(x + i, y + j, z + k) + data[vil] = c_wsneedles + local vila = area:index(x + i, y + j + 1, z + k) + data[vila] = c_wsneedles + local vilaa = area:index(x + i, y + j + 2, z + k) + data[vilaa] = c_snowblock + end + end + end + end + local vit = area:index(x, y + j, z) + data[vit] = c_wspitree + end + local vil = area:index(x, y + 15, z) + local vila = area:index(x, y + 16, z) + local vilaa = area:index(x, y + 17, z) + data[vil] = c_wsneedles + data[vila] = c_wsneedles + data[vilaa] = c_snowblock +end + +function skylands_jungletree(x, y, z, area, data) + local c_juntree = minetest.get_content_id("default:jungletree") + local c_wsjunleaf = minetest.get_content_id("default:jungleleaves") + local c_vine = minetest.get_content_id("skylands:vine") + local top = math.random(17,23) + local branch = math.floor(top * 0.6) + for j = -5, top do + if j == top or j == top - 1 or j == branch + 1 or j == branch + 2 then + for i = -2, 2 do -- leaves + for k = -2, 2 do + local vi = area:index(x + i, y + j, z + k) + if math.random(5) ~= 2 then + data[vi] = c_wsjunleaf + end + end + end + elseif j == top - 2 or j == branch then -- branches + for i = -1, 1 do + for k = -1, 1 do + if math.abs(i) + math.abs(k) == 2 then + local vi = area:index(x + i, y + j, z + k) + data[vi] = c_juntree + end + end + end + end + if j >= 0 and j <= top - 3 then -- climbable nodes + for i = -1, 1 do + for k = -1, 1 do + if math.abs(i) + math.abs(k) == 1 then + local vi = area:index(x + i, y + j, z + k) + data[vi] = c_vine + end + end + end + end + if j <= top - 3 then -- trunk + local vi = area:index(x, y + j, z) + data[vi] = c_juntree + end + end +end + +function skylands_acaciatree(x, y, z, area, data) + local c_wsactree = minetest.get_content_id("skylands:acaciatree") + local c_wsacleaf = minetest.get_content_id("skylands:acacialeaf") + for j = -3, 6 do + if j == 6 then + for i = -4, 4 do + for k = -4, 4 do + if not (i == 0 or k == 0) then + if math.random(7) ~= 2 then + local vil = area:index(x + i, y + j, z + k) + data[vil] = c_wsacleaf + end + end + end + end + elseif j == 5 then + for i = -2, 2, 4 do + for k = -2, 2, 4 do + local vit = area:index(x + i, y + j, z + k) + data[vit] = c_wsactree + end + end + elseif j == 4 then + for i = -1, 1 do + for k = -1, 1 do + if math.abs(i) + math.abs(k) == 2 then + local vit = area:index(x + i, y + j, z + k) + data[vit] = c_wsactree + end + end + end + else + local vit = area:index(x, y + j, z) + data[vit] = c_wsactree + end + end +end + + +--vars for it moreblocks and moreores are installed +local mblocks = false +local mores = false + + + -- On generated function minetest.register_on_generated(function(minp, maxp, seed) --- if (minetest.get_modpath("moreblocks")) then + if (minetest.get_modpath("moreblocks")) then --let the generator know it can use moreblocks mblocks = minetest.get_modpath("moreblocks") --- end --- if (minetest.get_modpath("moreores")) then + end + if (minetest.get_modpath("moreores")) then mores = minetest.get_modpath("moreores") --- end + end if minp.x < XMIN or maxp.x > XMAX or minp.y < YMIN or maxp.y > YMAX @@ -488,6 +528,9 @@ minetest.register_on_generated(function(minp, maxp, seed) local c_stoiron = minetest.get_content_id("skylands:stone_with_iron") local c_stocoal = minetest.get_content_id("skylands:stone_with_coal") local c_grass = minetest.get_content_id("default:dirt_with_grass") + local c_golgrass = minetest.get_content_id("skylands:goldengrass") + local c_jungrass = minetest.get_content_id("default:junglegrass") + local c_dryshrub = minetest.get_content_id("default:dry_shrub") local c_dirt = minetest.get_content_id("default:dirt") local c_desand = minetest.get_content_id("default:desert_sand") --Newly added @@ -509,6 +552,11 @@ minetest.register_on_generated(function(minp, maxp, seed) local c_flistone = minetest.get_content_id("skylands:stone") local c_flidestone = minetest.get_content_id("skylands:desertstone") + --watershed nodes for more biomes + local c_icydirt = minetest.get_content_id("skylands:icydirt") + local c_drygrass = minetest.get_content_id("skylands:drygrass") + local c_permafrost = minetest.get_content_id("skylands:permafrost") + local sidelen = x1 - x0 + 1 local chulens = {x=sidelen, y=sidelen, z=sidelen} local minposxyz = {x=x0, y=y0, z=z0} @@ -521,6 +569,9 @@ minetest.register_on_generated(function(minp, maxp, seed) local nvals_wave = minetest.get_perlin_map(np_wave, chulens):get2dMap_flat(minposxz) local nvals_biome = minetest.get_perlin_map(np_biome, chulens):get2dMap_flat({x=x0+150, y=z0+50}) + local nvals_temp = minetest.get_perlin_map(np_temp, chulens):get3dMap_flat(minposxyz) + local nvals_humid = minetest.get_perlin_map(np_humid, chulens):get3dMap_flat(minposxyz) + local nixyz = 1 local nixz = 1 local stable = {} @@ -553,10 +604,75 @@ minetest.register_on_generated(function(minp, maxp, seed) local density = nvals_float[nixyz] - grad + CLUSAV + nvals_cluster[nixyz] * CLUSAM if density > 0 and density < 0.7 then -- if floatland shell if nvals_caves[nixyz] - density > -0.7 then -- if no cave + + n_temp = nvals_temp[nixyz] + n_humid = nvals_humid[nixyz] + local biome = false + if n_temp < -0.35 then + if n_humid < -0.35 then + biome = 1 -- tundra + elseif n_humid > 0.35 then + biome = 3 -- taiga + else + biome = 2 -- snowy plains + end + elseif n_temp > 0.35 then + if n_humid < -0.35 then + biome = 7 -- desert + elseif n_humid > 0.35 then + biome = 9 -- rainforest + else + biome = 8 -- savanna + end + else + if n_humid < -0.35 then + biome = 4 -- dry grassland + elseif n_humid > 0.35 then + if n_humid > 0.55 and n_humid < 0.75 then + biome = 10 -- wheat field + else + biome = 6 -- deciduous forest + end + else + biome = 5 -- grassland + end + end + if y > flomid and density < STOTHR and stable[si] >= STABLE then - if nvals_biome[nixz] > 0.15 and nvals_biome[nixz] <= 0.65 then -- fine materials + --if nvals_biome[nixz] > 0.15 and nvals_biome[nixz] <= 0.65 then -- fine materials + if biome == 7 then data[vi] = c_desand dirt[si] = dirt[si] + 1 + elseif biome == 4 or biome == 8 then --dry grassland or savanna + if density < DIRTHR then + data[vi] = c_drygrass + else + data[vi] = c_dirt + end + dirt[si] = dirt[si] + 1 + + --snow biome + elseif biome == 2 then --nvals_biome[nixz] < -0.45 then + if density < DIRTHR then + data[vi] = c_snow + else + data[vi] = c_dirt + end + dirt[si] = dirt[si] + 1 + elseif biome == 1 then --tundra + if density < DIRTHR then + data[vi] = c_permafrost + else + data[vi] = c_permafrost + end + dirt[si] = dirt[si] + 1 + elseif biome == 3 then --taiga + if density < DIRTHR then + data[vi] = c_icydirt + else + data[vi] = c_dirt + end + dirt[si] = dirt[si] + 1 --volcano biome elseif nvals_biome[nixz] > 0.65 then if density < DIRTHR then @@ -577,14 +693,6 @@ minetest.register_on_generated(function(minp, maxp, seed) end end dirt[si] = dirt[si] + 1 - --snow biome - elseif nvals_biome[nixz] < -0.45 then - if density < DIRTHR then - data[vi] = c_snow - else - data[vi] = c_dirt - end - dirt[si] = dirt[si] + 1 else if density < DIRTHR then data[vi] = c_grass @@ -594,11 +702,19 @@ minetest.register_on_generated(function(minp, maxp, seed) dirt[si] = dirt[si] + 1 end else - if nvals_biome[nixz] > 0.15 and nvals_biome[nixz] <= 0.65 then -- stone + if biome == 7 then--nvals_biome[nixz] > 0.15 and nvals_biome[nixz] <= 0.65 then -- stone data[vi] = c_flidestone elseif nvals_biome[nixz] > 0.65 then - data[vi] = c_fliobsidian - elseif nvals_biome[nixz] < -0.45 then + if nvals_biome[nixz] > 0.80 then + data[vi] = c_fliobsidian + else + if mblocks then + data[vi] = c_coalstone + else + data[vi] = c_fliobsidian + end + end + elseif biome == 2 then--nvals_biome[nixz] < -0.45 then if mblocks then data[vi] = c_ironstone else @@ -648,12 +764,50 @@ minetest.register_on_generated(function(minp, maxp, seed) end stable[si] = stable[si] + 1 end + + + else -- cave stable[si] = 0 end elseif y > flomid and density < 0 and dirt[si] >= 1 then -- node above surface dirt - if nvals_biome[nixz] > 0.15 and nvals_biome[nixz] <= 0.65 then --desert - if math.random() < CACCHA then + + n_temp = nvals_temp[nixyz] + n_humid = nvals_humid[nixyz] + local biome = false + if n_temp < -0.35 then + if n_humid < -0.35 then + biome = 1 -- tundra + elseif n_humid > 0.35 then + biome = 3 -- taiga + else + biome = 2 -- snowy plains + end + elseif n_temp > 0.35 then + if n_humid < -0.35 then + biome = 7 -- desert + elseif n_humid > 0.35 then + biome = 9 -- rainforest + else + biome = 8 -- savanna + end + else + if n_humid < -0.35 then + biome = 4 -- dry grassland + elseif n_humid > 0.35 then + if n_humid > 0.55 and n_humid < 0.75 then + biome = 10 --wheat field + else + biome = 6 -- deciduous forest + end + else + biome = 5 -- grassland + end + end + + + if biome == 7 then --desert + if dirt[si] >= 2 and math.random() < CACCHA then skylands_desertplant(data, vi) end dirt[si] = 0 @@ -662,17 +816,52 @@ minetest.register_on_generated(function(minp, maxp, seed) data[vi] = c_fire end dirt[si] = 0 - elseif nvals_biome[nixz] <= 0.15 then --regular and snow - if dirt[si] >= 2 and math.random() < APPCHA then + elseif biome == 5 then --grassland + if dirt[si] >= 2 and math.random() < (APPCHA * 0.5) then skylands_appletree(x, y, z, area, data) - elseif nvals_biome[nixz] >= -0.45 then --not snow - if math.random() < FLOCHA then - skylands_flower(data, vi) - elseif math.random() < GRACHA then - skylands_grass(data, vi) - end + elseif math.random() < FLOCHA then + skylands_flower(data, vi) + elseif math.random() < GRACHA then + skylands_grass(data, vi) end dirt[si] = 0 + elseif biome == 10 then --wheat field + skylands_wheat(data, vi) + dirt[si] = 0 + elseif biome == 6 then --deciduous forest + if dirt[si] >= 2 and math.random() < APPCHA then + skylands_appletree(x, y, z, area, data) + end + dirt[si] = 0 + elseif biome == 4 then -- drylands + if dirt[si] >= 2 and math.random() < GRACHA then + data[vi] = c_dryshrub + end + dirt[si] = 0 + elseif biome == 3 then --taiga + if dirt[si] >= 2 and math.random() < PINCHA then + skylands_pinetree(x, y, z, area, data) + end + dirt[si] = 0 + elseif biome == 2 then --snowy plains + if dirt[si] >= 2 and math.random() < SPINCHA then + skylands_pinetree(x, y, z, area, data) + end + dirt[si] = 0 + elseif biome == 8 then --savanna + if dirt[si] >= 2 and math.random() < ACACHA then + skylands_acaciatree(x, y, z, area, data) + elseif dirt[si] >= 2 and math.random() < GRACHA then + data[vi] = c_golgrass + end + dirt[si] = 0 + elseif biome == 9 then --rainforest + if dirt[si] >= 2 and math.random() < JUNTCHA then + skylands_jungletree(x, y, z, area, data) + elseif math.random() < JUNGCHA then + data[vi] = c_jungrass + end + dirt[si] = 0 end else -- atmosphere stable[si] = 0 diff --git a/nodes.lua b/nodes.lua new file mode 100644 index 0000000..b944ee5 --- /dev/null +++ b/nodes.lua @@ -0,0 +1,310 @@ +-- Nodes + +minetest.register_node("skylands:stone", { + description = "FLI Stone", + tiles = {"default_stone.png"}, + is_ground_content = false, -- stops cavegen removing this node + groups = {cracky=3}, + drop = "default:cobble", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("skylands:desertstone", { + description = "FLI Desert Stone", + tiles = {"default_desert_stone.png"}, + is_ground_content = false, -- stops cavegen removing this node + groups = {cracky=3}, + drop = "default:desert_stone", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("skylands:obsidian", { + description = "FLI Obsidian", + tiles = {"default_obsidian.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, + drop = "default:obsidian", +}) +--NEW! Cinder for volcanic biomes +minetest.register_node("skylands:cinder", { + description = "Cinder", + tiles = {"skylands_cinder.png"}, + is_ground_content = true, + groups = {crumbly=2, falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_gravel_footstep", gain=0.5}, + dug = {name="default_gravel_footstep", gain=1.0}, + }), +}) +--NEW! Cinder block crafted from cinder +minetest.register_node("skylands:cinder_block", { + description = "Cinder Block", + tiles = {"skylands_cinder_block.png"}, + groups = {cracky=3, crumbly=1}, + sounds = default.node_sound_stone_defaults(), +}) +--Craft to create cinder blocks from 4 cinders +minetest.register_craft({ + output = "skylands:cinder_block", + recipe = { + {"skylands:cinder", "skylands:cinder"}, + {"skylands:cinder", "skylands:cinder"} + } +}) +--moreblocks nodes - iron_stone redefined so that cavegen doesn't destroy +minetest.register_node("skylands:coal_stone", { + description = "FLI Coal Stone", + tiles = {"moreblocks_coal_stone.png"}, + --is_ground_content = false, + groups = {cracky=3}, + drop = "moreblocks:coal_stone", +}) + +minetest.register_node("skylands:iron_stone", { + description = "FLI Iron Stone", + tiles = {"moreblocks_iron_stone.png"}, + is_ground_content = false, + groups = {cracky=3}, + drop = "moreblocks:iron_stone", +}) +--define special flame so that it does not expire +minetest.register_node("skylands: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}, + drop = '', + walkable = false, + buildable_to = true, + damage_per_second = 4, + + after_place_node = function(pos, placer) + fire.on_flame_add_at(pos) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + fire.on_flame_remove_at(pos) + end, +}) + +--Define the ores so that they propagate with the abm +minetest.register_node("skylands:stone_with_coal", { + description = "Coal Ore", + tiles = {"default_stone.png^default_mineral_coal.png"}, + is_ground_content = true, + groups = {cracky=3, skyores=1}, + drop = 'default:coal_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("skylands:stone_with_iron", { + description = "Iron Ore", + tiles = {"default_stone.png^default_mineral_iron.png"}, + is_ground_content = true, + groups = {cracky=2, skyores=1}, + drop = 'default:iron_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("skylands:stone_with_copper", { + description = "Copper Ore", + tiles = {"default_stone.png^default_mineral_copper.png"}, + is_ground_content = true, + groups = {cracky=2, skyores=1}, + drop = 'default:copper_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("skylands:stone_with_mese", { + description = "Mese Ore", + tiles = {"default_stone.png^default_mineral_mese.png"}, + is_ground_content = true, + groups = {cracky=1, skyores=1}, + drop = "default:mese_crystal", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("skylands:stone_with_gold", { + description = "Gold Ore", + tiles = {"default_stone.png^default_mineral_gold.png"}, + is_ground_content = true, + groups = {cracky=2, skyores=1}, + drop = "default:gold_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("skylands:stone_with_diamond", { + description = "Diamond Ore", + tiles = {"default_stone.png^default_mineral_diamond.png"}, + is_ground_content = true, + groups = {cracky=1, skyores=1}, + drop = "default:diamond", + sounds = default.node_sound_stone_defaults(), +}) +minetest.register_node("skylands:mineral_tin", { + description = "Tin Ore", + tiles = {"default_stone.png^moreores_mineral_tin.png"}, + groups = {cracky=3, skyores=1}, + sounds = default_stone_sounds, + drop = "moreores:tin_lump" +}) +minetest.register_node("skylands:mineral_silver", { + description = "Silver Ore", + tiles = {"default_stone.png^moreores_mineral_silver.png"}, + groups = {cracky=3, skyores=1}, + sounds = default_stone_sounds, + drop = "moreores:silver_lump" +}) +minetest.register_node("skylands:mineral_mithril", { + description = "Mithril Ore", + tiles = {"default_stone.png^moreores_mineral_mithril.png"}, + groups = {cracky=3, skyores=1}, + sounds = default_stone_sounds, + drop = "moreores:mithril_lump" +}) + +--WaterShed rip-offs + +minetest.register_node("skylands:acacialeaf", { + description = "Acacia Leaves", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"skylands_acacialeaf.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, flammable=2, leaves=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("skylands:acaciatree", { + description = "Acacia Tree", + tiles = {"skylands_acaciatreetop.png", "skylands_acaciatreetop.png", "skylands_acaciatree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +minetest.register_node("skylands:needles", { + description = "Pine Needles", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"skylands_needles.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("skylands:pinetree", { + description = "Pine Tree", + tiles = {"skylands_pinetreetop.png", "skylands_pinetreetop.png", "skylands_pinetree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node +}) + +minetest.register_node("skylands:icydirt", { + description = "Icy Dirt", + tiles = {"skylands_icydirt.png", "default_dirt.png", "default_dirt.png^skylands_icydirt_side.png"}, + is_ground_content = false, + groups = {crumbly=1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.15}, + dug = {name="default_snow_footstep", gain=0.45}, + }), +}) + +minetest.register_node("skylands:goldengrass", { + description = "Golden Grass", + drawtype = "plantlike", + tiles = {"skylands_goldengrass.png"}, + inventory_image = "skylands_goldengrass.png", + wield_image = "skylands_goldengrass.png", + paramtype = "light", + walkable = false, + buildable_to = true, + is_ground_content = false, + groups = {snappy=3,flammable=3,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +minetest.register_node("skylands:drygrass", { + description = "Dry Grass", + tiles = {"skylands_drygrass.png", "default_dirt.png", "default_dirt.png^skylands_drygrass_side.png"}, + is_ground_content = false, + groups = {crumbly=1,soil=1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.4}, + }), +}) + +minetest.register_node("skylands:permafrost", { + description = "Permafrost", + tiles = {"skylands_permafrost.png"}, + is_ground_content = false, + groups = {crumbly=1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("skylands:vine", { + description = "Jungletree Vine", + drawtype = "airlike", + paramtype = "light", + walkable = false, + climbable = true, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + groups = {not_in_creative_inventory=1}, +}) + +minetest.register_node("skylands:acaciawood", { + description = "Acacia Wood Planks", + tiles = {"skylands_acaciawood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("skylands:pinewood", { + description = "Pine Wood Planks", + tiles = {"skylands_pinewood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + + + +-- Crafting + +minetest.register_craft({ + output = "skylands:acaciawood 4", + recipe = { + {"skylands:acaciatree"}, + } +}) + +minetest.register_craft({ + output = "skylands:pinewood 4", + recipe = { + {"skylands:pinetree"}, + } +}) + diff --git a/textures/mapgen_wheat_grass_1.png b/textures/mapgen_wheat_grass_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac4fd27ac1ad0209ac20e5bcb2285ead86a3e5e GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKRz?naQ7erWb)e81PZ!4!i_>rW zHgYuuNVM*+R@Kq*l5$$9J1csrc(zdy*Yp<)51D3gXYwdXZ3!va$-5}wg7A~=f6^`f zTe3$*{hNL}bGer8@_hb-ysV33NAur>mdKI;Vst0EuX8mH+?% literal 0 HcmV?d00001 diff --git a/textures/mapgen_wheat_grass_2.png b/textures/mapgen_wheat_grass_2.png new file mode 100644 index 0000000000000000000000000000000000000000..175a66698a13cd38a267f7408405aea4c1408172 GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKRz?m**-|s{44^4uo-U3d7N_4% zu=RE-6ggJ^-~O8K+38&dngtq5S6=gYA?;~mIn~SCPql8bLq_+kL(>l~+_dFE)%#HW zuH_G(@y5hR)h;XM<3E48QFYo6eT%bQI*)GjS~C{h4xRsc+v-J(Rm=7UoRHhaAhB}J ztWKX}!6nak>P-G9((vKn&Z>H?(=|rRBLyeghbvDF{(Efgp4wR~*P7X^-78Js|M*p* zJU33hVV|**kP*X+TI(y>sy|;uE%9GJWgDBG{&&~=rZQ2i3OlwP`gd|ElfhZVYX?>@ z*s3&Hcg2&kE4Ov4U3A30%-tP-&z_0VcW;D~QwQL`jD^U68loohMl1JmPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^q% z2p=Q$k`cZD00CM_L_t(I%k7f8N&`U@hQBjO7S~H+vKCqiwz2TNB31#PK@13zeJ_!u zun|(Nh#Sp%8J$f$7L(nuS_zgO7&voo|M~wJ__x2c{4Unt_L$1;W97QZ@W-%pJkalX z1CS>kS*iBiU7b||&F!%Cr;o3=$xsczEVTeE7N2E7uzxI__C|?pZ!cBnt9iRery_x1 z9!3Lgwf*G!daXi10`bV5knrF{e(2=Dw4xCE;(S0?JOu%_Dg=0bd8c5R-CQUE7zFb9 z!bb(RHrJLMmS^d^$xx$iU+_y2HUnm<#h?&%`vTC|?MboS+%CwbUK@2vL1+Hv!Dgvt z=ddqEotA3nNvu-$h4n^_sN0u3iFNw;iaNi0t>$086?xsv)6CLoZ;&UkHuidwJy{+` z1I57o^|=;`mjFu+>XdXmP|1^65zr4Mdw!?26M{lxuP4R-C@h;=no%|X1@5A(i~LzN Q&;S4c07*qoM6N<$f{aei$^ZZW literal 0 HcmV?d00001 diff --git a/textures/mapgen_wheat_grass_4.png b/textures/mapgen_wheat_grass_4.png new file mode 100644 index 0000000000000000000000000000000000000000..0b116217cd8e5ef7540bd64036e1afd7ac21d5a8 GIT binary patch literal 573 zcmV-D0>b@?P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^q% z2q7o4I?mbv00F&8L_t(I%hgg%Z__{!eX}-><2VX&b1nyrIKnB2pGA(XWL1`0Ayk>4 zg_28EAt6;+q^bubAfNTu+PE1Gu@|TC2iVJM=FPmBc{9L&{WdaUv6d0HopKf)*xx?C zKd_tl+pBZt$IeZQteyBTyzvPDSgsNPK$e%f61VF9_<0WiSk!R<5T^>7;K+0TN_yZO z=F|N+FW;Wg_b(s#>A=x=p(@;6U+_T()$TzD9KSlDj%{jPRQU@`Sluw%w@l|V26e;iPj|6w2c6S_}wELRB@ zH3!w|UnbjFS11_=NF(cX?z1vv|u)-qy2gd{DHs}dv6 z1-E8zpYgKRs*MW(7(9PRj$>iux%%4L$wPla05qOuCAMEbG64JrHO&RF!y6$N00000 LNkvXXu0mjfH}LSp literal 0 HcmV?d00001 diff --git a/textures/mapgen_wheat_grass_5.png b/textures/mapgen_wheat_grass_5.png new file mode 100644 index 0000000000000000000000000000000000000000..3fdc16475693a5e9bd04a7d7f85581ec3e51c9df GIT binary patch literal 728 zcmV;}0w?{6P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^q% z2p5)anst3^yXNxz>#+uKhXDYNKjP}gCsQOWc=7Fno=#>ct5lJE#xfOm_KxK7E9qpM zbTV%ANK^rk&sbQciYTvH*PZSFfS&Ce2m0Yn#~;zY?gP;3^qEd(5BC9Hv#ym@sz`A) zLzwi~!P#k5ufI5y%|Z@<)qD!8R1pB%9y0JoD1gwxZ1$8_Hk$z8>UKc;`$z5h<0o1= z8ACO`yw`=*Gyp5h){_DmYu@|%N`^!{YB+=r++l#)Sj*BI_y9~NGs8e+-haqp`S~01 zhhxJaVMR$N<4ACEq9@~fqKgZ(I(-WHv~eIJSfz@%jhc=wE^yiIk+Nbe=aNju_jI}g zB%En18X=X4;rIc?mxtmuYWmlW&H7q~>#l=RbGC(i8pjWC+!33F9O5==y4C3$D2^Xs z+e5aBIYfkDGUcZ0uu;sS5Tj?a30yCjPhoezD)MN3cK54dyCbe{2Sg%@Y&L;HNRms5`|#fLmWTAZPc_<^Elic<+vkbKUF@E z?w!j*L=lN7etv$ZLq~tX&SS?9IRARA4dLH?AJ+@m-dtibz9&^a5U*L+#u{*a=de}G z8QpEvv;v4ddoAf?jP1=OTAjZ6&RT0k=Dh=K6?0s+dpLez7U~a#wM9dSg7kj?0000< KMNUMnLSTZ$i%E|F literal 0 HcmV?d00001 diff --git a/textures/skylands_acacialeaf.png b/textures/skylands_acacialeaf.png new file mode 100644 index 0000000000000000000000000000000000000000..08cf3998c0c8d47ae63ddcf51878b725faec497e GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggK7CvSv7MGoE(}6-)JY5_^EKaYT zq$|{HAkZp5w`r}@W3A+()`T67MU&?&INtG?!?b|aN0qPlkkCfaxvjEY%GsaHZ~p!E z_O#UcjJZW$-cFEQzH*K7Gd=e}*AKQX63bWSx1V8iWhgj&bO&R@nG@-ecP)I6_ZLr3 zmJAkH6TB}~XH`e)9ZiOYlNGjEMROm_2y}Zas;e9j^6`Cdsh2V9%#VM6<+!Zj&n|JB z*ml6e*Gxm}b;YgaA^SgeEzw^mY*JUQ@ICYJ`Yzrsl~&#^x%0J7o*eJ?B(l$A{eC`g e>b@O5A6QpKmzL{@-S7eWkHOQ`&t;ucLK6V4LxIx( literal 0 HcmV?d00001 diff --git a/textures/skylands_acaciatree.png b/textures/skylands_acaciatree.png new file mode 100644 index 0000000000000000000000000000000000000000..169823d41612d29e16c7faa44baae5d51b842de3 GIT binary patch literal 682 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 BUZMa1 literal 0 HcmV?d00001 diff --git a/textures/skylands_drygrass_side.png b/textures/skylands_drygrass_side.png new file mode 100644 index 0000000000000000000000000000000000000000..747d76cc2cae1383babaabf9bdbd31f4ecc11b27 GIT binary patch literal 501 zcmV)iF1yf-4R-N z%q54h*5dn;s;&@dRHxlSOGTPzlvNE4%y&9yU*UOzC=5wvVr*j><|Ve868MsqX|Y#K z@bb}=G%F~|l6K&e#35ljBFzgn2iwG!{p%4;Gcd0qH&Tl?6ZmL00000NkvXXu0mjf@+#v< literal 0 HcmV?d00001 diff --git a/textures/skylands_goldengrass.png b/textures/skylands_goldengrass.png new file mode 100644 index 0000000000000000000000000000000000000000..50f6a669c960bda5e09c6aafdaf8933268dcd40c GIT binary patch literal 683 zcmV;c0#yBpP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^n- z0y!a-y%1Ue00JvXL_t(I%XO2_Zqq;z#=jZc+qC)fL@gB#M-mCar6?p4>ZPcUQ>YMJ zk`^k2xFkK26wy9WY^V0_dWXZ-n}WpL#-sV>x8IBb0E<~)@K4OAsr;|j#PvlgyqNW6 zb8o}PtMdZ^0AqZg)($^DKMf*{;J1&5B0}K7cuBjhC@3DC+|uJIN->n;P$%+QyR8U= z@sfBk>q}mEf~t~0AlMSDGYtU9asv^sUseu_SzmZCUQ(wWqiJdgoC7Y;_T}aA4fVR} zuc=)-L$);_VF?QwI-{B!W^5y1q!oIggy>2JO8hP!JIY<0Z|f zsW1cU%t9$fYbSRvV z0?ntXtTT;PD~3uKW#yo?^+h6B>riaG5Hmv?hqAO#Du%VrZ(($LN919^?DI<3$O|2| z!OR#=RwN>!`SrWs#AW4hdA2Xj;lz>Oe;hH6PHu^aptVI=In1Z2GPx#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^n| z5g99aln_w>00L@BL_t(I%Pr4ImfJ=U0MV$qK#*ur{WPq6G#|q&-`3u=B=$g%1Zv1i zFXRiv`(gh6>rV~NFi?gF);VhJe0%fL^Td#u(t)isN)?uQ2H<^t(3>zs8KUHnS??92U{S@{fCzYJ5$U|GD@__xjEtc; z?@%?&hlDczUsa3&f65cq8ip}Ewu)%yIL+kfS+~mGDpO30dy7)T%NcE^y|Yp3+i(_vzcp3*wj!TEGzj6rP``|E8*We{9sNs&+UOcmvyAFn+2 z!q@YHah9!hwo+k0tDW0cu~@uf7;4!{AqI!Ra-1e|3^-%R!DB7h5!fDu);m>%(kopQ zJ0A{s4~G?5cpwy0Yj(=Y+%y}Z@#NsSPgrCP_+{+F+2tE+KWlD)hsa&^8lTMC_ zKnFQT za!g!r8(o#-l*lpBddIrVeJ}Jr2+?3;umlIedoYIMA+tUt<8 literal 0 HcmV?d00001 diff --git a/textures/skylands_icydirt_side.png b/textures/skylands_icydirt_side.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e506595a7a35d9553aefafe0b114dd5d18a9ae GIT binary patch literal 491 zcmV@}7rNC-K-j)oyUDTwmxHdmW>pY_$DYTAh6I0bKMn!}W80Q5_KtGwq zIgeHmTE&1uCDvjh$$3#yw=H<+&&;5uL_~s)wIowrd~l4ipBQ4a6vT1Nq-=>zkBE9dBmQFW4mb^nu?}Tg+d4$Bv`-}*dTVS`8WI|7A)Eoh$vE3 zQDsw9r?s8NV|%dYap!Sa1c|dhNBYh=g7a7(lm+j5E+>-#O{clZ3bM3dJoH(-m&vQc zDLakYlmJM8QK-3H<=o~KeIE`2m!E$;{q#C3IR5rXk6Z`2s!8jHV9!C%OO$Hiq_3qD zSjf?kw$nVB49F_Ux>EeQT3y~NOMdz8EL3$%XBa#k4;b$C=vvJncJX~1!GH2TOLS2- zh*YuvBxG^BgH_AXX~LW37N!Np$fk7+jCTcXWO4i`#z@kxHz_f6oPeRfoF1clOad3$K$S`5nxFHvB`9nQEN@q2h)@=uc!>j{`er) zzu$N6RJ?B*41r{N+M0L`o- z>h~bAXavljzZYDj!nB2;S`_HWqq*mD^=^&p?f_V3cW+A~mu!=v>XymSXP#GB=ZSt0 z`^a2(v|6yu6+cADS>ReEo{ej?lwC*s#aL%$jj$vdn7^2bec$0Da^9p{gnvHN^-Yc% z^)Q7X+!l2EeagHhN0Vd)tAUG+pwxG>^bE;A5%lF@W m{J^nI0N&0r4xdG6Q}QphLRcP}nEqP;0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*(| z2rdo}{(^e|00RL@L_t(I%Po>iQ`=SmM$di7wk*r$RYO8}C4^_mq>q#`Nt;a;ndwXy zU3J;N+fD*WXs0bH1Snw3k_?uGEo5|W7xV|5#dp3VetiAPHm4@gN^M#WK1rxM;P>vK+lMH_O4{5n5@q(kP{f;x0$Wr#M>iXlVh@ zbIFDoe;xe8%ybi{`w}xoCF~KfHQr7v~>fjU^xDwAvv6)>@1)6sBNyW*R9a zI7F{4KjiS!30~D@bNw-6jXJLD@_zphCMPCI(*f!A0I%i|bV9tUi?x=y*?WwSHPAu` zj4`aOEYk`?ZVN+tJwOUc7{(Z5sCrc}27p!&qLe~An&XpGq_I#cmH73|9!WpN8Vf+9 z;nPd{Jl}bS?|ED%eR@fsFQ0x+mSvPn4y95F8AdUS3-grAWxCxf3R93I38PWL_OmaD z;x02YP3})O$+C=IuaE1xbUG1ADWtWQ!%rs+vl|TX_s2upL4>uIN~J;=U2^d8h~aQ} z2Zj+fuS&ZUQ4|F_in~ZDsgz4R+1kL-iue0}l3u5@S^>u1Z9ltc|L<84ia$US48rbDccTab1_qja9@iKmTMK zzDJUzjE&VfJG;Ola9x+66C#8_N{OQtNk3(BVjN>(WqFYxjL`tS{xxCLCFq3I{TjwX z>;FQL^6oYzdAqldTPf2DLf-6t;L*|oQVBsA##n1vUtc9j2jrt$wl-JsY98&NgE0nc zEseU*%E~g|KmUfBS0(6#cM{!7nZj7Cu{_;cqcE1;cfa42=4iq&ChlJ1C_$cOq=Nz9 zZhy`0-Usw|FLoG>MucI^(eWuYuS&Byg%E;X(g#3ELA6@t;nF;(XBS8*iQ+5n-<#n- Xz}kFTciJ;M00000NkvXXu0mjfcFv7^ literal 0 HcmV?d00001 diff --git a/textures/skylands_pinetree.png b/textures/skylands_pinetree.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2a8b21790d8d00048847a4a6a9547e6c8a0858 GIT binary patch literal 693 zcmV;m0!safP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^n@ z11b`4D+M(G00K2hL_t(I%RQ4zjx1FS1;f7I%&h8uunnecfc>uoBqZpr%({OwNMLN~ zC>+O@-+ukY)JL{`BX~zjiJT&RPGZXZ`N!{k{`?c?>m=n3C&GE27{>WJ(FKGU=&jS| zWUWPQ9TCGj<^298$B1_x=NyRA$HY0o=0sH>B!@ahL@1@uduPtcvc)u`l*WGS*qU7B z0-*N^0&3!L?hXjfv4Ckt?~?_@5dRNtwXtjgV9Qtrsx0Q5Y&p^AWcH48j#3)ER`%xy z*LmTcQfgt@!aJqb4uF~&wM`IZj>$qvG0^J8XpLjvK$KD%qc)DbQEJ211p9Y|1s|bP$sM-Rj)Kan8S#zMyvmXx(!$dGM<}y-F04y6U zTP(P1Oet`lZ{oJoS_2kN9Wh2;*F`Ih7$e7i<3FFDEE_1Gf?;BuuWugvjyfzMtK)h73Tvn`nv@M zuCtJigRj58cz!%N&o@4JFeM!a0HwBDE=GA@Y}%0gdkaMQBL96X{U>Iu*+PkpUqSwlt6I3xXQV56$wN_G0j4_yfGR^K41jENn zX@j(FU`oyz?;@(oyHt+jKvkJ$_bljt4d4;IHJTBEC#Q%4$FX5z1aY*{Q0H$lz^lK1 b!YTg%;Xz=CmniwT00000NkvXXu0mjfhT1f1 literal 0 HcmV?d00001 diff --git a/textures/skylands_pinetreetop.png b/textures/skylands_pinetreetop.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2f8647645e47ea52f0014e6d638b7751cc6f8f GIT binary patch literal 802 zcmV+-1Ks?IP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^n@ z11bUQl|<_R00N>(L_t(I%WacSYb#Y8hMzO%%uFW9}?gu4*D{=o}UTkMr2ZSKiTCUa)a9~VI@>brawKc3$MulV$n4u z7*p}@{MBn+{@p2nkKUg1)7tP(p%|Q8;?o>GKc%fZ5Dxpwu)Mw|goMp-#Lc#0Tqy4P z3}sA3x7U39!Mhwiy~4E}-tG`8Mdmrd2b5Bz@_j^>lTOaKd;W~iKl=h>DwNhGqiWCb zTUWH(n%#OuR!*SX(=OKtC6Refo1{pUlJ^PoH?BCJYo0IL1A%;fK|rzlW5xL5f^=9y zfOzat#gs&5BvKJ$r2hS91QX6K&e1o`!NGRdfOkX@iN2@0`;GDZ0#|SGoh1<&-dl>J zGlUQadu{vpf=?yUd-`g}epu1BJ!2HZ#hV}!Y<-X0Y;d-QBmo>@-vW>rQ!&yduC2*W zG{e~pr4-J#tbh5A=HU+4Y;m?l2tjZy-g!nRbF?l=0A$}|o1V?GqHAhoCb88$!8;yq zex=*jL}vl;y(RjH&r*!34hQZZ3~45rPKTsfjx`mDfP7LiT`Z6?1(6Y4OZ1)?Ji;AZ zD6LCOd%*KukN2L?HTXWqS6jMWhpl$Zo?H?`Pv2Mu8oWOcDPt;Ldr}g-BY20md&cJr zVi2gokhFA+&t^!au$5sjn?i8-c8}KOf#B<9%X^(=cs#}JTdLca$WcK$C=f~_Lc}!< z#gV2sJw=X2*!$JNfiV@kR`Bf0ZwO68=sHI8V+yTNnLp!9^GhD2*gd_(U%QA)baD}G!(AYJmf#%((0_PXMQ78tYo g-#Pzx%7+7g0#Pt$?Q?}=djJ3c07*qoM6N<$f-zxgssI20 literal 0 HcmV?d00001 diff --git a/textures/skylands_pinewood.png b/textures/skylands_pinewood.png new file mode 100644 index 0000000000000000000000000000000000000000..fa102ce3358067055657638232d8c6d1329ef061 GIT binary patch literal 366 zcmV-!0g?WRP)Px#32;bRa{vGi!vFvd!vV){sAK>D00(qQO+^RZ1P&4u8%ox1s{jB207*naR4C7N zQax|NKn#63S+GPj6y+8ab&nYOC;Bt`&-f>ux|OX1VsBA|bQT|pSgr#wm{`Z<`X-<4 zd-k)Pt(NcTam62i3?sD#;t|lZE%lMxTJ4|p$IIdkz}amOAlrQ{_0hE)#*F8P1psN1 z@jQ8q0p*Z|gy!J5sOl&d*13#JF=+1^(RA8A^s1u!88r6_)9TfDzKlyD%WW+x#WMs& zNnOk6QzuV}KO{rQW4SSOxO8?KtuC^X&>Y&k2ECwgqXXQzXlCbOKfmkGqWZTz