--luacheck: ignore
-- Refactor-io -- made by mewmew and p.p

require 'modules.satellite_score'
require 'modules.spawners_contain_biters'
require 'modules.no_blueprint_library'
require 'modules.map_info'

storage.map_info = {}
storage.map_info.main_caption = 'Refactor-io'
storage.map_info.sub_caption = ''
storage.map_info.text =
[[
	Hello visitor.

	You cannot mine things.
	You cannot deconstruct things ... except for with your railgun.
	You cannot destroy things ... except the biters, who have been known to hoard railgun darts in their nests.

	Have fun <3
]]

local math_random = math.random

-- noobs spawn with things
local function on_player_joined_game(event)
    local player = game.players[event.player_index]
    local surface = game.surfaces['refactor-io']

    if player.online_time == 0 then
        local non_colliding_position = surface.find_non_colliding_position('character', { 0, 0 }, 96, 1)
        player.teleport(non_colliding_position, surface)
        player.insert { name = 'iron-plate', count = 32 }
        player.insert { name = 'iron-gear-wheel', count = 16 }
        player.insert { name = 'wood', count = 100 }
        player.insert { name = 'stone', count = 50 }
        player.insert { name = 'pistol', count = 1 }
        player.insert { name = 'firearm-magazine', count = 16 }
    end
end

-- players always spawn with railgun
local function on_player_respawned(event)
    local player = game.players[event.player_index]
    player.insert { name = 'railgun', count = 1 }
    player.insert { name = 'wood', count = 25 }
end

-- decon planner doesn't work
local function on_marked_for_deconstruction(event)
    event.entity.cancel_deconstruction(game.players[event.player_index].force.name)
end

local function on_entity_damaged(event)
    if not event.entity.valid then
        return
    end
    if event.entity.force.index == 2 then
        return
    end
    if event.entity.name == 'character' then
        return
    end
    if event.cause then
        if event.cause.force.index == 2 then
            return
        end
        if event.cause.name == 'character' then
            if event.damage_type.name == 'physical' then
                if event.original_damage_amount == 100 then
                    event.entity.die('player')
                    return
                end
            end
        end
    end
    event.entity.health = event.entity.health + event.final_damage_amount
end

local function on_entity_died(event)
    if not event.entity.valid then
        return
    end
    if event.entity.type == 'unit-spawner' or event.entity.type == 'turret' then
        event.entity.surface.spill_item_stack({ event.entity.position.x, event.entity.position.y + 2 }, { name = 'railgun-dart', count = math.random(0, 3) }, false)
    end
end

local function on_init()
    game.forces.player.technologies['steel-axe'].researched = true
    game.forces.player.manual_mining_speed_modifier = -1000000

    local map_gen_settings = {}
    map_gen_settings.seed = math.random(1, 999999999)
    map_gen_settings.water = 1.25
    map_gen_settings.starting_area = 1.5
    map_gen_settings.terrain_segmentation = 3.5
    map_gen_settings.cliff_settings = { cliff_elevation_interval = 6, cliff_elevation_0 = 6 }
    map_gen_settings.autoplace_controls = {
        ['coal'] = { frequency = 3, size = 0.75, richness = 0.75 },
        ['stone'] = { frequency = 3, size = 0.75, richness = 0.75 },
        ['copper-ore'] = { frequency = 3.5, size = 0.95, richness = 0.85 },
        ['iron-ore'] = { frequency = 3.5, size = 0.95, richness = 0.85 },
        ['uranium-ore'] = { frequency = 3.5, size = 0.95, richness = 0.85 },
        ['crude-oil'] = { frequency = 3, size = 0.85, richness = 1 },
        ['trees'] = { frequency = 2.5, size = 0.85, richness = 1 },
        ['enemy-base'] = { frequency = 8, size = 1.5, richness = 1 }
    }
    local surface = game.create_surface('refactor-io', map_gen_settings)
    surface.request_to_generate_chunks({ 0, 0 }, 5)
    surface.force_generate_chunk_requests()

    game.forces.player.set_spawn_position(surface.find_non_colliding_position('character', { 0, 0 }, 96, 1), surface)
end

local event = require 'utils.event'
event.on_init(on_init)
event.add(defines.events.on_entity_damaged, on_entity_damaged)
event.add(defines.events.on_entity_died, on_entity_died)
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_player_respawned, on_player_respawned)
