diff --git a/functions/loot_raffle.lua b/functions/loot_raffle.lua index bd3242d9..f1b6c6aa 100644 --- a/functions/loot_raffle.lua +++ b/functions/loot_raffle.lua @@ -6,7 +6,6 @@ blacklist - optional list of item names that can not be rolled. example: {["sub ]] local Public = {} -local table_shuffle_table = table.shuffle_table local table_insert = table.insert local math_random = math.random local math_floor = math.floor @@ -407,6 +406,15 @@ local tech_tier_list = { 'rocket-silo' } +local function shuffle(tbl) + local size = #tbl + for i = size, 1, -1 do + local rand = math_random(size) + tbl[i], tbl[rand] = tbl[rand], tbl[i] + end + return tbl +end + local item_names = {} for k, _ in pairs(item_worths) do table_insert(item_names, k) @@ -418,7 +426,7 @@ local function get_raffle_keys() for i = 1, size_of_item_names, 1 do raffle_keys[i] = i end - table_shuffle_table(raffle_keys) + shuffle(raffle_keys) return raffle_keys end diff --git a/maps/mountain_fortress_v3/breached_wall.lua b/maps/mountain_fortress_v3/breached_wall.lua index 5df020bc..27472fb1 100644 --- a/maps/mountain_fortress_v3/breached_wall.lua +++ b/maps/mountain_fortress_v3/breached_wall.lua @@ -1,5 +1,4 @@ local Collapse = require 'modules.collapse' -local Terrain = require 'maps.mountain_fortress_v3.terrain' local Balance = require 'maps.mountain_fortress_v3.balance' local RPG = require 'modules.rpg.main' local WPT = require 'maps.mountain_fortress_v3.table' @@ -15,21 +14,7 @@ local abs = math.abs local random = math.random local sub = string.sub local sqrt = math.sqrt -local level_depth = WPT.level_depth - -local forest = { - [2] = true, - [10] = true, - [13] = true, - [17] = true, - [19] = true, - [21] = true -} - -local scrap = { - [5] = true, - [15] = true -} +local zone_settings = WPT.zone_settings local clear_breach_text_and_render = function() local beam1 = WPT.get('zone1_beam1') @@ -140,8 +125,10 @@ end local compare_player_pos = function(player) local p = player.position local index = player.index - local zone = floor((abs(p.y / level_depth)) % 22) - if scrap[zone] then + local zone = floor((abs(p.y / zone_settings.zone_depth)) % zone_settings.size) + 1 + local adjusted_zones = WPT.get('adjusted_zones') + + if adjusted_zones.scrap[zone] then RPG.set_value_to_player(index, 'scrap_zone', true) else local has_scrap = RPG.get_value_from_player(index, 'scrap_zone') @@ -150,7 +137,7 @@ local compare_player_pos = function(player) end end - if forest[zone] then + if adjusted_zones.forest[zone] then RPG.set_value_to_player(index, 'forest_zone', true) else local is_in_forest = RPG.get_value_from_player(index, 'forest_zone') @@ -189,7 +176,7 @@ local compare_player_and_train = function(player, entity) { name = 'flying-text', position = position, - text = 'Warning!!! You are too far from the train!!!', + text = 'Warning! You are too far away from the main locomotive!', color = {r = 0.9, g = 0.0, b = 0.0} } ) @@ -228,14 +215,14 @@ local function distance(player) compare_player_pos(player) - local distance_to_center = floor(sqrt(p.x ^ 2 + p.y ^ 2)) + local distance_to_center = floor(sqrt(p.y ^ 2)) local location = distance_to_center - if location < Terrain.level_depth * bonus - 10 then + if location < zone_settings.zone_depth * bonus - 10 then return end - local max = Terrain.level_depth * bonus - local breach_max = Terrain.level_depth * breached_wall + local max = zone_settings.zone_depth * bonus + local breach_max = zone_settings.zone_depth * breached_wall local breach_max_times = location >= breach_max local max_times = location >= max if max_times then @@ -245,10 +232,8 @@ local function distance(player) rpg_extra.breached_walls = rpg_extra.breached_walls + 1 rpg_extra.reward_new_players = bonus_xp_on_join * rpg_extra.breached_walls WPT.set('breached_wall', breached_wall + 1) - placed_trains_in_zone.placed = 0 biters.amount = 0 placed_trains_in_zone.randomized = false - placed_trains_in_zone.positions = {} raise_event(Balance.events.breached_wall, {}) if WPT.get('breached_wall') == WPT.get('spidertron_unlocked_at_zone') then local main_market_items = WPT.get('main_market_items') @@ -258,7 +243,7 @@ local function distance(player) stack = 1, value = 'coin', price = rng, - tooltip = 'Chonk Spidertron', + tooltip = 'BiterStunner 9000', upgrade = false, static = true } diff --git a/maps/mountain_fortress_v3/entities.lua b/maps/mountain_fortress_v3/entities.lua index d77584ed..e44c830a 100644 --- a/maps/mountain_fortress_v3/entities.lua +++ b/maps/mountain_fortress_v3/entities.lua @@ -7,7 +7,6 @@ local Loot = require 'maps.mountain_fortress_v3.loot' local RPG = require 'modules.rpg.main' local Callbacks = require 'maps.mountain_fortress_v3.functions' local Mining = require 'maps.mountain_fortress_v3.mining' -local Terrain = require 'maps.mountain_fortress_v3.terrain' local Traps = require 'maps.mountain_fortress_v3.traps' local Locomotive = require 'maps.mountain_fortress_v3.locomotive' local DefenseSystem = require 'maps.mountain_fortress_v3.locomotive.defense_system' @@ -26,6 +25,7 @@ local RPG_Progression = require 'utils.datastore.rpg_data' -- tables local WPT = require 'maps.mountain_fortress_v3.table' local WD = require 'modules.wave_defense.table' +local zone_settings = WPT.zone_settings -- module local Public = {} @@ -394,7 +394,7 @@ local function angry_tree(entity, cause, player) return end - if abs(entity.position.y) < Terrain.level_depth then + if abs(entity.position.y) < zone_settings.zone_depth then return end if random(1, 6) == 1 then diff --git a/maps/mountain_fortress_v3/functions.lua b/maps/mountain_fortress_v3/functions.lua index 2be282db..e75e1283 100644 --- a/maps/mountain_fortress_v3/functions.lua +++ b/maps/mountain_fortress_v3/functions.lua @@ -13,6 +13,7 @@ local Difficulty = require 'modules.difficulty_vote_by_amount' local ICW_Func = require 'maps.mountain_fortress_v3.icw.functions' local math2d = require 'math2d' local Misc = require 'utils.commands.misc' +local zone_settings = WPT.zone_settings local this = { power_sources = {index = 1}, @@ -1094,8 +1095,8 @@ function Public.render_direction(surface) scale_with_zoom = false } - local x_min = -WPT.level_width / 2 - local x_max = WPT.level_width / 2 + local x_min = -zone_settings.zone_width / 2 + local x_max = zone_settings.zone_width / 2 surface.create_entity({name = 'electric-beam', position = {x_min, 74}, source = {x_min, 74}, target = {x_max, 74}}) surface.create_entity({name = 'electric-beam', position = {x_min, 74}, source = {x_min, 74}, target = {x_max, 74}}) diff --git a/maps/mountain_fortress_v3/generate.lua b/maps/mountain_fortress_v3/generate.lua index 7210bfcf..a2ff5304 100644 --- a/maps/mountain_fortress_v3/generate.lua +++ b/maps/mountain_fortress_v3/generate.lua @@ -19,6 +19,7 @@ local tiles_per_call = 8 local total_calls = ceil(1024 / tiles_per_call) local regen_decoratives = false local generate_map = Terrain.heavy_functions +local winter_mode = false local wintery_type = { ['simple-entity'] = true, ['tree'] = true, @@ -299,7 +300,6 @@ local function do_place_buildings(data) end local function wintery(ent, extra_lights) - local winter_mode = WPT.get('winter_mode') if not winter_mode then return false end diff --git a/maps/mountain_fortress_v3/get_perlin.lua b/maps/mountain_fortress_v3/get_perlin.lua index 88f49e3c..cb6336ba 100644 --- a/maps/mountain_fortress_v3/get_perlin.lua +++ b/maps/mountain_fortress_v3/get_perlin.lua @@ -73,6 +73,12 @@ local noises = { {modifier = 0.05, weight = 0.23}, {modifier = 0.1, weight = 0.11} }, + ['scrapyard_modified'] = { + {modifier = 0.006, weight = 1}, + {modifier = 0.04, weight = 0.15}, + {modifier = 0.22, weight = 0.05}, + {modifier = 0.05, weight = 0.32} + }, ['big_cave'] = { {modifier = 0.003, weight = 1}, {modifier = 0.02, weight = 0.05}, diff --git a/maps/mountain_fortress_v3/main.lua b/maps/mountain_fortress_v3/main.lua index d4dd60f1..a2db0647 100644 --- a/maps/mountain_fortress_v3/main.lua +++ b/maps/mountain_fortress_v3/main.lua @@ -252,7 +252,7 @@ function Public.reset_map() Collapse.set_kill_specific_entities(collapse_kill) Collapse.set_speed(8) Collapse.set_amount(1) - -- Collapse.set_max_line_size(WPT.level_width) + -- Collapse.set_max_line_size(zone_settings.zone_width) Collapse.set_max_line_size(540) Collapse.set_surface(surface) Collapse.set_position({0, 130}) diff --git a/maps/mountain_fortress_v3/surface.lua b/maps/mountain_fortress_v3/surface.lua index 801187c9..95287961 100644 --- a/maps/mountain_fortress_v3/surface.lua +++ b/maps/mountain_fortress_v3/surface.lua @@ -2,6 +2,7 @@ local Global = require 'utils.global' local surface_name = 'mountain_fortress_v3' local WPT = require 'maps.mountain_fortress_v3.table' local Reset = require 'maps.mountain_fortress_v3.soft_reset' +local zone_settings = WPT.zone_settings local Public = {} @@ -22,7 +23,7 @@ local starting_items = {['pistol'] = 1, ['firearm-magazine'] = 16, ['rail'] = 16 function Public.create_surface() local map_gen_settings = { ['seed'] = math.random(10000, 99999), - ['width'] = WPT.level_width, + ['width'] = zone_settings.zone_width, ['water'] = 0.001, ['starting_area'] = 1, ['cliff_settings'] = {cliff_elevation_interval = 0, cliff_elevation_0 = 0}, diff --git a/maps/mountain_fortress_v3/table.lua b/maps/mountain_fortress_v3/table.lua index a26e86b1..5a01fd81 100644 --- a/maps/mountain_fortress_v3/table.lua +++ b/maps/mountain_fortress_v3/table.lua @@ -17,8 +17,11 @@ Global.register( end ) -Public.level_depth = 704 -Public.level_width = 510 +Public.zone_settings = { + zone_depth = 704, + zone_width = 510, + size = nil +} Public.pickaxe_upgrades = { 'Wood', @@ -167,10 +170,9 @@ function Public.reset_table() this.chests_linked_to = {} this.chest_limit_outside_upgrades = 1 this.placed_trains_in_zone = { - placed = 0, - positions = {}, limit = 2, - randomized = false + randomized = false, + zones = {} } this.marked_fixed_prices = { chest_limit_cost = 3000, @@ -226,6 +228,10 @@ function Public.reset_table() current = {}, temp_boosts = {} } + this.adjusted_zones = { + scrap = {}, + forest = {} + } this.alert_zone_1 = false -- alert the players for k, _ in pairs(this.players) do diff --git a/maps/mountain_fortress_v3/terrain.lua b/maps/mountain_fortress_v3/terrain.lua index b5390c38..a810c496 100644 --- a/maps/mountain_fortress_v3/terrain.lua +++ b/maps/mountain_fortress_v3/terrain.lua @@ -11,17 +11,9 @@ local abs = math.abs local floor = math.floor local ceil = math.ceil -Public.level_depth = WPT.level_depth -Public.level_width = WPT.level_width +local zone_settings = WPT.zone_settings local worm_level_modifier = 0.19 --- local start_ground_tiles = { --- 'dirt-1', --- 'grass-1', --- 'grass-2', --- 'dirt-2' --- } - local wagon_raffle = { 'cargo-wagon', 'cargo-wagon', @@ -133,6 +125,15 @@ local function get_scrap_mineable_entities() return scrap_mineable_entities, scrap_mineable_entities_index end +local function shuffle(tbl) + local size = #tbl + for i = size, 1, -1 do + local rand = random(size) + tbl[i], tbl[rand] = tbl[rand], tbl[i] + end + return tbl +end + local function is_position_near(area, table_to_check) local status = false local function inside(pos) @@ -159,7 +160,33 @@ local function place_wagon(data) placed_trains_in_zone = WPT.get('placed_trains_in_zone') end - if placed_trains_in_zone.placed >= placed_trains_in_zone.limit then + if not data.new_zone then + data.new_zone = 1 + end + + if data.new_zone == zone_settings.size then + data.new_zone = 1 + end + + if data.current_zone == zone_settings.size then + local new_zone = placed_trains_in_zone.zones[data.new_zone] + if new_zone then + new_zone.placed = 0 + new_zone.positions = {} + data.new_zone = data.new_zone + 1 + end + end + + local zone = placed_trains_in_zone.zones[data.current_zone] + if not zone then + placed_trains_in_zone.zones[data.current_zone] = { + placed = 0, + positions = {} + } + zone = placed_trains_in_zone.zones[data.current_zone] + end + + if zone.placed >= placed_trains_in_zone.limit then return end @@ -182,7 +209,7 @@ local function place_wagon(data) right_bottom = {x = position.x + radius, y = position.y + radius} } - if is_position_near(area, placed_trains_in_zone.positions) then + if is_position_near(area, zone.positions) then return end @@ -217,8 +244,9 @@ local function place_wagon(data) force = 'player', callback = wagon_mineable } - placed_trains_in_zone.placed = placed_trains_in_zone.placed + 1 - placed_trains_in_zone.positions[#placed_trains_in_zone.positions + 1] = position + + zone.placed = zone.placed + 1 + zone.positions[#zone.positions + 1] = position return true end @@ -313,8 +341,8 @@ local function wall(p, data) callback = stone_wall } if not alert_zone_1 then - local x_min = -WPT.level_width / 2 - local x_max = WPT.level_width / 2 + local x_min = -zone_settings.zone_width / 2 + local x_max = zone_settings.zone_width / 2 WPT.set('zone1_beam1', surface.create_entity({name = 'electric-beam', position = {x_min, p.y}, source = {x_min, p.y}, target = {x_max, p.y}})) WPT.set('zone1_beam2', surface.create_entity({name = 'electric-beam', position = {x_min, p.y}, source = {x_min, p.y}, target = {x_max, p.y}})) WPT.set('alert_zone_1', true) @@ -393,36 +421,36 @@ local function wall(p, data) end if random(1, 25) == 1 then - if abs(p.y) < Public.level_depth * 1.5 then + if abs(p.y) < zone_settings.zone_depth * 1.5 then if random(1, 16) == 1 then spawn_turret(entities, p, 1) else spawn_turret(entities, p, 2) end - elseif abs(p.y) < Public.level_depth * 2.5 then + elseif abs(p.y) < zone_settings.zone_depth * 2.5 then if random(1, 8) == 1 then spawn_turret(entities, p, 3) end - elseif abs(p.y) < Public.level_depth * 3.5 then + elseif abs(p.y) < zone_settings.zone_depth * 3.5 then if random(1, 4) == 1 then spawn_turret(entities, p, 4) else spawn_turret(entities, p, 3) end - elseif abs(p.y) < Public.level_depth * 4.5 then + elseif abs(p.y) < zone_settings.zone_depth * 4.5 then if random(1, 4) == 1 then spawn_turret(entities, p, 4) else spawn_turret(entities, p, 5) end - elseif abs(p.y) < Public.level_depth * 5.5 then + elseif abs(p.y) < zone_settings.zone_depth * 5.5 then if random(1, 4) == 1 then spawn_turret(entities, p, 4) elseif random(1, 2) == 1 then spawn_turret(entities, p, 5) end end - elseif abs(p.y) > Public.level_depth * 5.5 then + elseif abs(p.y) > zone_settings.zone_depth * 5.5 then if random(1, 15) == 1 then spawn_turret(entities, p, random(3, enable_arties)) end @@ -430,7 +458,7 @@ local function wall(p, data) end end -local function process_level_14_position(x, y, data) +local function generate_zone_14(x, y, data) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -445,7 +473,7 @@ local function process_level_14_position(x, y, data) --Resource Spots if smol_areas < -0.71 then if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end end @@ -510,7 +538,7 @@ local function process_level_14_position(x, y, data) tiles[#tiles + 1] = {name = 'water-shallow', position = p} end -local function process_level_13_position(x, y, data) +local function generate_zone_13(x, y, data) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -525,7 +553,7 @@ local function process_level_13_position(x, y, data) --Resource Spots if smol_areas < -0.72 then if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end end @@ -590,7 +618,7 @@ local function process_level_13_position(x, y, data) tiles[#tiles + 1] = {name = 'water-shallow', position = p} end -local function process_level_12_position(x, y, data, void_or_lab) +local function generate_zone_12(x, y, data, void_or_lab) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -606,7 +634,7 @@ local function process_level_12_position(x, y, data, void_or_lab) --Resource Spots if smol_areas < -0.72 then if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end end @@ -676,7 +704,7 @@ local function process_level_12_position(x, y, data, void_or_lab) tiles[#tiles + 1] = {name = 'tutorial-grid', position = p} end -local function process_level_11_position(x, y, data) +local function generate_zone_11(x, y, data) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -700,7 +728,7 @@ local function process_level_11_position(x, y, data) --Resource Spots if smol_areas < -0.72 then if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end end @@ -772,7 +800,7 @@ local function process_level_11_position(x, y, data) end end -local function process_level_10_position(x, y, data) +local function generate_zone_10(x, y, data) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -798,7 +826,7 @@ local function process_level_10_position(x, y, data) --Resource Spots if smol_areas < -0.72 then if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end end @@ -886,7 +914,7 @@ local function process_level_10_position(x, y, data) tiles[#tiles + 1] = {name = 'grass-2', position = p} end -local function process_level_9_position(x, y, data) +local function generate_zone_9(x, y, data) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -940,7 +968,7 @@ local function process_level_9_position(x, y, data) --Resource Spots if smol_areas < -0.72 then if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end end @@ -959,13 +987,143 @@ local function process_level_9_position(x, y, data) end --SCRAPYARD -local function process_scrap_zone_1(x, y, data, void_or_lab) +local function process_zone_scrap_2(x, y, data, void_or_lab) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles local entities = data.entities local buildings = data.buildings local treasure = data.treasure + data.scrap_zone = true + + local scrapyard_modified = get_perlin('scrapyard_modified', p, seed) + local cave_rivers = get_perlin('cave_rivers', p, seed + 65030) + + --Chasms + local noise_cave_ponds = get_perlin('cave_ponds', p, seed) + local small_caves = get_perlin('small_caves', p, seed) + if noise_cave_ponds < 0.15 and noise_cave_ponds > -0.15 then + if small_caves > 0.35 then + tiles[#tiles + 1] = {name = void_or_lab, position = p} + return + end + + if small_caves < -0.35 then + tiles[#tiles + 1] = {name = void_or_lab, position = p} + return + end + end + + if scrapyard_modified < -0.25 or scrapyard_modified > 0.25 then + if random(1, 256) == 1 then + if random(1, 8) == 1 then + spawn_turret(entities, p, 3) + else + spawn_turret(entities, p, 4) + end + if random(1, 2048) == 1 then + treasure[#treasure + 1] = {position = p, chest = 'wooden-chest'} + end + end + tiles[#tiles + 1] = {name = 'dirt-7', position = p} + if scrapyard_modified < -0.55 or scrapyard_modified > 0.55 then + if random(1, 2) == 1 then + entities[#entities + 1] = {name = rock_raffle[random(1, size_of_rock_raffle)], position = p} + end + return + end + if scrapyard_modified < -0.28 or scrapyard_modified > 0.28 then + local success = place_wagon(data) + if success then + return + end + if random(1, 128) == 1 then + Biters.wave_defense_set_worm_raffle(abs(p.y) * worm_level_modifier) + entities[#entities + 1] = { + name = Biters.wave_defense_roll_worm_name(), + position = p, + force = 'enemy', + note = true + } + end + if random(1, 96) == 1 then + entities[#entities + 1] = { + name = scrap_entities[random(1, scrap_entities_index)], + position = p, + force = 'enemy' + } + end + if random(1, 96) == 1 then + entities[#entities + 1] = { + name = scrap_entities_friendly[random(1, scrap_entities_friendly_index)], + position = p, + force = 'neutral' + } + end + + local scrap_mineable_entities, scrap_mineable_entities_index = get_scrap_mineable_entities() + + if random(1, 5) > 1 then + entities[#entities + 1] = {name = scrap_mineable_entities[random(1, scrap_mineable_entities_index)], position = p, force = 'neutral'} + end + + if random(1, 256) == 1 then + entities[#entities + 1] = {name = 'land-mine', position = p, force = 'enemy'} + end + return + end + return + end + + local cave_ponds = get_perlin('cave_ponds', p, seed) + if cave_ponds < -0.6 and scrapyard_modified > -0.2 and scrapyard_modified < 0.2 then + tiles[#tiles + 1] = {name = 'deepwater-green', position = p} + if random(1, 128) == 1 then + entities[#entities + 1] = {name = 'fish', position = p} + end + return + end + + --Resource Spots + if cave_rivers < -0.72 then + if random(1, 32) == 1 then + Generate_resources(buildings, p, zone_settings.zone_depth) + end + end + + local large_caves = get_perlin('large_caves', p, seed) + if scrapyard_modified > -0.15 and scrapyard_modified < 0.15 then + if floor(large_caves * 10) % 4 < 3 then + tiles[#tiles + 1] = {name = 'dirt-7', position = p} + if random(1, 2) == 1 then + entities[#entities + 1] = {name = rock_raffle[random(1, size_of_rock_raffle)], position = p} + end + if random(1, 2048) == 1 then + treasure[#treasure + 1] = {position = p, chest = 'wooden-chest'} + end + return + end + end + + if random(1, 64) == 1 and cave_ponds > 0.6 then + entities[#entities + 1] = {name = 'crude-oil', position = p, amount = get_oil_amount(p)} + end + + tiles[#tiles + 1] = {name = 'nuclear-ground', position = p} + if random(1, 256) == 1 then + entities[#entities + 1] = {name = 'land-mine', position = p, force = 'enemy'} + end +end + +--SCRAPYARD +local function process_zone_scrap_1(x, y, data, void_or_lab) + local p = {x = x, y = y} + local seed = data.seed + local tiles = data.tiles + local entities = data.entities + local buildings = data.buildings + local treasure = data.treasure + data.scrap_zone = true local scrapyard = get_perlin('scrapyard', p, seed) local smol_areas = get_perlin('smol_areas', p, seed + 35000) @@ -1028,7 +1186,7 @@ local function process_scrap_zone_1(x, y, data, void_or_lab) entities[#entities + 1] = { name = scrap_entities_friendly[random(1, scrap_entities_friendly_index)], position = p, - force = 'player' + force = 'neutral' } end @@ -1058,7 +1216,7 @@ local function process_scrap_zone_1(x, y, data, void_or_lab) --Resource Spots if smol_areas < -0.72 then if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end end @@ -1086,7 +1244,7 @@ local function process_scrap_zone_1(x, y, data, void_or_lab) end end -local function process_level_7_position(x, y, data, void_or_lab) +local function generate_zone_7(x, y, data, void_or_lab) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -1190,7 +1348,7 @@ local function process_level_7_position(x, y, data, void_or_lab) --Resource Spots if smol_areas < -0.72 then if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end end @@ -1203,7 +1361,7 @@ local function process_level_7_position(x, y, data, void_or_lab) end end -local function process_forest_zone_2(x, y, data, void_or_lab) +local function generate_zone_forest_2(x, y, data, void_or_lab) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -1211,6 +1369,7 @@ local function process_forest_zone_2(x, y, data, void_or_lab) local buildings = data.buildings local markets = data.markets local treasure = data.treasure + data.forest_zone = true local large_caves = get_perlin('large_caves', p, seed) local cave_rivers = get_perlin('cave_rivers', p, seed) @@ -1243,7 +1402,7 @@ local function process_forest_zone_2(x, y, data, void_or_lab) if smol_areas < 0.055 and smol_areas > -0.025 then tiles[#tiles + 1] = {name = 'deepwater-green', position = p} if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end if random(1, 128) == 1 then Biters.wave_defense_set_worm_raffle(abs(p.y) * worm_level_modifier) @@ -1338,7 +1497,7 @@ local function process_forest_zone_2(x, y, data, void_or_lab) end end -local function process_level_5_position(x, y, data, void_or_lab) +local function generate_zone_5(x, y, data, void_or_lab) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -1385,7 +1544,7 @@ local function process_level_5_position(x, y, data, void_or_lab) if smol_areas < 0.055 and smol_areas > -0.025 then tiles[#tiles + 1] = {name = 'deepwater-green', position = p} if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end if random(1, 128) == 1 then Biters.wave_defense_set_worm_raffle(abs(p.y) * worm_level_modifier) @@ -1430,7 +1589,7 @@ local function process_level_5_position(x, y, data, void_or_lab) tiles[#tiles + 1] = {name = void_or_lab, position = p} end -local function process_level_4_position(x, y, data, void_or_lab) +local function generate_zone_4(x, y, data, void_or_lab) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -1521,7 +1680,7 @@ local function process_level_4_position(x, y, data, void_or_lab) if smol_areas < 0.055 and smol_areas > -0.025 then tiles[#tiles + 1] = {name = 'deepwater-green', position = p} if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end if random(1, 128) == 1 then Biters.wave_defense_set_worm_raffle(abs(p.y) * worm_level_modifier) @@ -1561,7 +1720,7 @@ local function process_level_4_position(x, y, data, void_or_lab) tiles[#tiles + 1] = {name = void_or_lab, position = p} end -local function process_level_3_position(x, y, data, void_or_lab) +local function generate_zone_3(x, y, data, void_or_lab) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -1581,7 +1740,7 @@ local function process_level_3_position(x, y, data, void_or_lab) if smol_areas < 0.055 and smol_areas > -0.025 then tiles[#tiles + 1] = {name = 'deepwater-green', position = p} if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end if random(1, 128) == 1 then Biters.wave_defense_set_worm_raffle(abs(p.y) * worm_level_modifier) @@ -1727,7 +1886,7 @@ local function process_level_3_position(x, y, data, void_or_lab) end end -local function process_level_2_position(x, y, data, void_or_lab) +local function generate_zone_2(x, y, data, void_or_lab) local p = {x = x, y = y} local seed = data.seed local tiles = data.tiles @@ -1744,7 +1903,7 @@ local function process_level_2_position(x, y, data, void_or_lab) if smol_areas < 0.055 and smol_areas > -0.025 then tiles[#tiles + 1] = {name = 'deepwater-green', position = p} if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end if random(1, 128) == 1 then Biters.wave_defense_set_worm_raffle(abs(p.y) * worm_level_modifier) @@ -1871,7 +2030,7 @@ local function process_level_2_position(x, y, data, void_or_lab) tiles[#tiles + 1] = {name = void_or_lab, position = p} end -local function process_forest_zone_1(x, y, data, void_or_lab) +local function generate_zone_forest_1(x, y, data, void_or_lab) local p = {x = x, y = y} local seed = data.seed local buildings = data.buildings @@ -1879,6 +2038,7 @@ local function process_forest_zone_1(x, y, data, void_or_lab) local entities = data.entities local markets = data.markets local treasure = data.treasure + data.forest_zone = true local small_caves = get_perlin('dungeons', p, seed + 33322) local noise_cave_ponds = get_perlin('cave_ponds', p, seed) @@ -1888,7 +2048,7 @@ local function process_forest_zone_1(x, y, data, void_or_lab) if smol_areas < 0.055 and smol_areas > -0.025 then tiles[#tiles + 1] = {name = 'deepwater-green', position = p} if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end if random(1, 128) == 1 then Biters.wave_defense_set_worm_raffle(abs(p.y) * worm_level_modifier) @@ -2054,7 +2214,7 @@ local function process_forest_zone_1(x, y, data, void_or_lab) end end -local function process_level_1_position(x, y, data, void_or_lab) +local function generate_zone_1(x, y, data, void_or_lab) local p = {x = x, y = y} local seed = data.seed local buildings = data.buildings @@ -2070,7 +2230,7 @@ local function process_level_1_position(x, y, data, void_or_lab) if smol_areas < 0.055 and smol_areas > -0.025 then tiles[#tiles + 1] = {name = 'deepwater-green', position = p} if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end if random(1, 32) == 1 then Biters.wave_defense_set_worm_raffle(abs(p.y) * worm_level_modifier) @@ -2218,7 +2378,7 @@ local function process_level_1_position(x, y, data, void_or_lab) end end -local function process_level_0_position(x, y, data, void_or_lab) +local function starting_zone(x, y, data, void_or_lab) local p = {x = x, y = y} local seed = data.seed local buildings = data.buildings @@ -2237,7 +2397,7 @@ local function process_level_0_position(x, y, data, void_or_lab) if smol_areas < 0.055 and smol_areas > -0.025 then entities[#entities + 1] = {name = rock_raffle[random(1, size_of_rock_raffle)], position = p} if random(1, 32) == 1 then - Generate_resources(buildings, p, Public.level_depth) + Generate_resources(buildings, p, zone_settings.zone_depth) end if random(1, 128) == 1 then Biters.wave_defense_set_worm_raffle(abs(p.y) * worm_level_modifier) @@ -2356,31 +2516,88 @@ local function process_level_0_position(x, y, data, void_or_lab) end end -Public.levels = { - process_level_0_position, - process_level_1_position, - process_forest_zone_1, -- zone 3 - process_level_3_position, - process_level_5_position, - process_scrap_zone_1, -- zone 6 - process_level_9_position, - process_level_4_position, - process_level_2_position, - process_level_3_position, - process_forest_zone_2, -- zone 11 - process_level_4_position, - process_level_5_position, - process_forest_zone_2, -- zone 14 - process_level_7_position, - process_scrap_zone_1, -- zone 16 - process_level_9_position, - process_level_10_position, - process_level_11_position, - process_level_12_position, - process_level_13_position, - process_level_14_position +local zones = { + generate_zone_1, + generate_zone_forest_1, + generate_zone_3, + generate_zone_5, + generate_zone_11, + generate_zone_forest_2, + process_zone_scrap_1, + process_zone_scrap_2, + generate_zone_9, + generate_zone_4, + process_zone_scrap_1, + generate_zone_2, + generate_zone_3, + process_zone_scrap_2, + generate_zone_3, + generate_zone_forest_2, + generate_zone_4, + generate_zone_forest_1, + generate_zone_forest_2, + generate_zone_2, + generate_zone_4, + process_zone_scrap_2, + generate_zone_5, + generate_zone_1, + generate_zone_forest_2, + generate_zone_7, + process_zone_scrap_1, + generate_zone_9, + generate_zone_10, + generate_zone_11, + generate_zone_12, + generate_zone_forest_2, + process_zone_scrap_2, + process_zone_scrap_1, + generate_zone_11, + generate_zone_12, + process_zone_scrap_1, + generate_zone_13, + generate_zone_14, + process_zone_scrap_1, + generate_zone_forest_1, + generate_zone_14, + process_zone_scrap_2 } +--[[ local zones_non_raffled = { + generate_zone_1, + generate_zone_2, + generate_zone_3, + generate_zone_4, + generate_zone_5, + generate_zone_forest_1, + generate_zone_forest_2, + process_zone_scrap_1, + process_zone_scrap_2, + generate_zone_7, + generate_zone_9, + generate_zone_11, + generate_zone_10, + generate_zone_11, + generate_zone_12, + generate_zone_13, + generate_zone_14 +} ]] + +zone_settings.size = #zones + +local function shuffle_terrains(new_zone) + local adjusted_zones = WPT.get('adjusted_zones') + + if not adjusted_zones.shuffled_terrains then + shuffle(zones) + adjusted_zones.shuffled_terrains = new_zone + end + + -- if adjusted_zones.shuffled_terrains and adjusted_zones.shuffled_terrains ~= new_zone then + -- table.shuffle_table(zones) + -- adjusted_zones.shuffled_terrains = new_zone + -- end +end + local function is_out_of_map(p) if p.x < 480 and p.x >= -480 then return @@ -2389,12 +2606,30 @@ local function is_out_of_map(p) end local function process_bits(p, data) - local levels = Public.levels local left_top_y = data.area.left_top.y - local index = floor((abs(left_top_y / Public.level_depth)) % 22) + 1 - local process_level = levels[index] - if not process_level then - process_level = levels[#levels] + local index = floor((abs(left_top_y / zone_settings.zone_depth)) % zone_settings.size) + 1 + shuffle_terrains(index) + + local generate_zone + if left_top_y >= -zone_settings.zone_depth then + generate_zone = starting_zone + else + generate_zone = zones[index] + if not generate_zone then + generate_zone = zones[zone_settings.size] + end + end + + data.current_zone = index + + local adjusted_zones = WPT.get('adjusted_zones') + + if data.forest_zone and not adjusted_zones.forest[index] then + adjusted_zones.forest[index] = true + end + + if data.scrap_zone and not adjusted_zones.scrap[index] then + adjusted_zones.scrap[index] = true end local void_or_tile = WPT.get('void_or_tile') @@ -2402,7 +2637,7 @@ local function process_bits(p, data) local x = p.x local y = p.y - process_level(x, y, data, void_or_tile) + generate_zone(x, y, data, void_or_tile) end local function border_chunk(p, data) @@ -2508,8 +2743,8 @@ function Public.heavy_functions(data) return end - if top_y % Public.level_depth == 0 and top_y < 0 then - WPT.set().left_top = data.left_top + if top_y % zone_settings.zone_depth == 0 and top_y < 0 then + WPT.set('left_top', data.left_top) return wall(p, data) end