--luacheck: ignore --rivers-- mewmew made this -- require 'modules.satellite_score' require 'modules.spawners_contain_biters' require 'modules.dynamic_landfill' require 'modules.rocks_yield_ore' local event = require 'utils.event' local table_insert = table.insert local math_random = math.random local simplex_noise = require 'utils.simplex_noise'.d2 local map_functions = require 'tools.map_functions' local disabled_for_deconstruction = { ['fish'] = true } local rock_raffle = {'sand-rock-big', 'sand-rock-big', 'rock-big', 'rock-big', 'rock-big', 'rock-big', 'rock-big', 'rock-big', 'rock-huge'} local tile_replacements = { ['water'] = 'grass-2', ['deepwater'] = 'grass-2', ['dirt-1'] = 'grass-1', ['dirt-2'] = 'grass-2', ['dirt-3'] = 'grass-3', ['dirt-4'] = 'grass-4', ['sand-1'] = 'grass-1', ['sand-2'] = 'grass-2', ['sand-3'] = 'grass-3', ['dry-dirt'] = 'grass-2', ['red-desert-0'] = 'grass-1', ['red-desert-1'] = 'grass-2', ['red-desert-2'] = 'grass-3', ['red-desert-3'] = 'grass-4' } 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 function get_noise(name, pos) local seed = game.surfaces[1].map_gen_settings.seed local noise = {} local noise_seed_add = 25000 if name == 1 then noise[1] = simplex_noise(pos.x * 0.007, pos.y * 0.007, seed) seed = seed + noise_seed_add noise[2] = simplex_noise(pos.x * 0.05, pos.y * 0.05, seed) seed = seed + noise_seed_add noise[3] = simplex_noise(pos.x * 0.1, pos.y * 0.1, seed) local noise = noise[1] + noise[2] * 0.1 + noise[3] * 0.025 return noise end seed = seed + noise_seed_add seed = seed + noise_seed_add if name == 2 then noise[1] = simplex_noise(pos.x * 0.008, pos.y * 0.008, seed) seed = seed + noise_seed_add noise[2] = simplex_noise(pos.x * 0.05, pos.y * 0.05, seed) local noise = noise[1] + noise[2] * 0.05 return noise end end local ore_level = 0.73 local water_level = 0.25 local connections = 0.08 local function process_tiles(surface, pos, noise, noise_2) local tile = surface.get_tile(pos) if tile_replacements[tile.name] then surface.set_tiles({{name = tile_replacements[tile.name], position = pos}}, true) end if noise > water_level * -1 and noise < water_level then if noise_2 < connections * -1 or noise_2 > connections then surface.set_tiles({{name = 'water', position = pos}}, true) if math_random(1, 256) == 1 then surface.create_entity({name = 'fish', position = pos}) end return else if math_random(1, 2) == 1 then surface.create_entity({name = rock_raffle[math_random(1, #rock_raffle)], position = pos}) end end end end local function process_entities(surface, pos, noise, noise_2) if not surface.can_place_entity({name = 'iron-ore', position = pos, amount = 1}) then return end if noise > ore_level then local distance_to_center = math.sqrt(pos.x ^ 2 + pos.y ^ 2) local amount = (600 + distance_to_center) * math.abs(noise) if math.floor(noise * 15) % 3 ~= 0 then surface.create_entity({name = 'iron-ore', position = pos, amount = amount}) return else surface.create_entity({name = 'coal', position = pos, amount = amount}) return end end if noise < ore_level * -1 then local distance_to_center = math.sqrt(pos.x ^ 2 + pos.y ^ 2) local amount = (600 + distance_to_center) * math.abs(noise) if math.floor(noise * 15) % 3 ~= 0 then surface.create_entity({name = 'copper-ore', position = pos, amount = amount}) return else surface.create_entity({name = 'stone', position = pos, amount = amount}) return end end end local function on_chunk_generated(event) local surface = event.surface if surface.name ~= 'rivers' then return end local left_top = event.area.left_top local tiles = {} local entities = {} for x = 0, 31, 1 do for y = 0, 31, 1 do local pos = {x = left_top.x + x, y = left_top.y + y} local noise_1 = get_noise(1, pos) local noise_2 = get_noise(2, pos) process_tiles(surface, pos, noise_1, noise_2) process_entities(surface, pos, noise_1, noise_2) end end local decorative_names = {} for k, v in pairs(game.decorative_prototypes) do if v.autoplace_specification then decorative_names[#decorative_names + 1] = k end end surface.regenerate_decorative(decorative_names, {{left_top.x / 32, left_top.y / 32}}) end local function init_map() if game.surfaces['rivers'] then return end local map_gen_settings = {} map_gen_settings.water = '0' map_gen_settings.starting_area = '1' map_gen_settings.cliff_settings = {cliff_elevation_interval = 22, cliff_elevation_0 = 22} map_gen_settings.autoplace_controls = { ['coal'] = {frequency = 'none', size = 'none', richness = 'none'}, ['stone'] = {frequency = 'none', size = 'none', richness = 'none'}, ['copper-ore'] = {frequency = 'none', size = 'none', richness = 'none'}, ['iron-ore'] = {frequency = 'none', size = 'none', richness = 'none'}, ['crude-oil'] = {frequency = '4', size = '1', richness = '1'}, ['trees'] = {frequency = '4', size = '1', richness = '1'}, ['enemy-base'] = {frequency = '50', size = '1.5', richness = '1'} } game.create_surface('rivers', map_gen_settings) local surface = game.surfaces['rivers'] surface.ticks_per_day = game.surfaces['rivers'].ticks_per_day * 1.5 game.map_settings.enemy_expansion.enabled = true game.map_settings.enemy_expansion.min_expansion_cooldown = 18000 game.map_settings.enemy_expansion.max_expansion_cooldown = 36000 surface.request_to_generate_chunks({0, 0}, 3) surface.force_generate_chunk_requests() game.forces.player.research_queue_enabled = true map_functions.draw_smoothed_out_ore_circle({x = -3, y = -3}, 'iron-ore', surface, 8, 5000) map_functions.draw_smoothed_out_ore_circle({x = 3, y = 3}, 'copper-ore', surface, 8, 5000) map_functions.draw_smoothed_out_ore_circle({x = 3, y = -3}, 'stone', surface, 8, 5000) map_functions.draw_smoothed_out_ore_circle({x = -3, y = 3}, 'coal', surface, 8, 5000) end local function on_player_joined_game(event) init_map() local player = game.players[event.player_index] if player.online_time == 0 then player.insert({name = 'iron-plate', count = 32}) player.insert({name = 'iron-gear-wheel', count = 16}) player.teleport(game.surfaces['rivers'].find_non_colliding_position('character', {0, 2}, 50, 0.5), 'rivers') end end local function on_marked_for_deconstruction(event) if disabled_for_deconstruction[event.entity.name] then event.entity.cancel_deconstruction(game.players[event.player_index].force.name) end end event.add(defines.events.on_marked_for_deconstruction, on_marked_for_deconstruction) event.add(defines.events.on_player_joined_game, on_player_joined_game) event.add(defines.events.on_chunk_generated, on_chunk_generated)