local Chrono_table = require 'maps.chronosphere.table' local Public = {} local Server = require 'utils.server' local Upgrades = require 'maps.chronosphere.upgrade_list' local function check_win() local objective = Chrono_table.get_table() if objective.fishchest then if objective.fishchest.valid then local inv = objective.fishchest.get_inventory(defines.inventory.chest) local countfish = inv.get_item_count('raw-fish') local enemies = game.surfaces[objective.active_surface_index].count_entities_filtered {force = 'enemy'} if countfish > 0 then local removed_fish = inv.remove({name = 'raw-fish', count = countfish}) objective.mainscore = objective.mainscore + removed_fish if enemies > 0 then game.print({'chronosphere.message_not_won_yet', enemies}, {r = 0.98, g = 0.66, b = 0.22}) else if not objective.game_reset_tick then objective.game_reset_tick = game.tick + 18000 objective.game_won = true objective.chronocharges = 200000000 - 300 game.play_sound {path = 'utility/game_won', volume_modifier = 0.85} game.print({'chronosphere.message_game_won1'}, {r = 0.98, g = 0.66, b = 0.22}) game.print({'chronosphere.message_game_won3'}, {r = 0, g = 0.98, b = 0}) Server.to_discord_embed({'chronosphere.message_game_won1'}, true) else game.print({'chronosphere.message_fish_added', objective.mainscore}, {r = 0.02, g = 0.86, b = 0.02}) end end end end end end local function upgrade_hp() local objective = Chrono_table.get_table() objective.max_health = 10000 + 2500 * objective.upgrades[1] rendering.set_text(objective.health_text, 'HP: ' .. objective.health .. ' / ' .. objective.max_health) end local function spawn_accumulators() local objective = Chrono_table.get_table() local x = -28 local y = -252 local yy = objective.upgrades[3] * 2 local surface = game.surfaces['cargo_wagon'] if yy > 8 then yy = yy + 2 end if yy > 26 then yy = yy + 2 end if yy > 44 then yy = yy + 2 end for i = 1, 27, 1 do local acumulator = surface.create_entity({name = 'accumulator', position = {x + 2 * i, y + yy}, force = 'player', create_build_effect_smoke = false}) acumulator.minable = false acumulator.destructible = false table.insert(objective.accumulators, acumulator) end end local function upgrade_pickup() game.forces.player.character_loot_pickup_distance_bonus = game.forces.player.character_loot_pickup_distance_bonus + 1 end local function upgrade_inv() game.forces.player.character_inventory_slots_bonus = game.forces.player.character_inventory_slots_bonus + 10 end local function upgrade_water() if not game.surfaces['cargo_wagon'] then return end local positions = {{28, 66}, {28, -62}, {-29, 66}, {-29, -62}} for i = 1, 4, 1 do local e = game.surfaces['cargo_wagon'].create_entity({name = 'offshore-pump', position = positions[i], force = 'player'}) e.destructible = false e.minable = false end end local function upgrade_out() local objective = Chrono_table.get_table() if not game.surfaces['cargo_wagon'] then return end local positions = {{-16, -62}, {15, -62}, {-16, 66}, {15, 66}} for i = 1, 4, 1 do local e = game.surfaces['cargo_wagon'].create_entity({name = 'blue-chest', position = positions[i], force = 'player'}) e.destructible = false e.minable = false objective.outchests[i] = e rendering.draw_text { text = 'Output', surface = e.surface, target = e, target_offset = {0, -1.5}, color = objective.locomotive.color, scale = 0.80, font = 'default-game', alignment = 'center', scale_with_zoom = false } end end local function upgrade_out_signals() local objective = Chrono_table.get_table() if not game.surfaces['cargo_wagon'] then return end local positions = {{-14, -62}, {13, -62}, {-14, 66}, {13, 66}} for i = 1, 4, 1 do local e = game.surfaces['cargo_wagon'].create_entity({name = 'constant-combinator', position = positions[i], force = 'player'}) e.destructible = false e.minable = false objective.outcombinators[i] = e end end local function upgrade_storage() local objective = Chrono_table.get_table() if not game.surfaces['cargo_wagon'] then return end local chests = {} local positions = {x = {-33, 32}, y = {-189, -127, -61, 1, 67, 129}} for i = 1, 58, 1 do for ii = 1, 6, 1 do if objective.upgrades[9] == 1 then chests[#chests + 1] = {entity = {name = 'wooden-chest', position = {x = positions.x[1], y = positions.y[ii] + i}, force = 'player'}, old = 'none'} chests[#chests + 1] = {entity = {name = 'wooden-chest', position = {x = positions.x[2], y = positions.y[ii] + i}, force = 'player'}, old = 'none'} elseif objective.upgrades[9] == 2 then chests[#chests + 1] = { entity = {name = 'iron-chest', position = {x = positions.x[1], y = positions.y[ii] + i}, force = 'player', fast_replace = true, spill = false}, old = 'wood' } chests[#chests + 1] = { entity = {name = 'iron-chest', position = {x = positions.x[2], y = positions.y[ii] + i}, force = 'player', fast_replace = true, spill = false}, old = 'wood' } elseif objective.upgrades[9] == 3 then chests[#chests + 1] = { entity = {name = 'steel-chest', position = {x = positions.x[1], y = positions.y[ii] + i}, force = 'player', fast_replace = true, spill = false}, old = 'iron' } chests[#chests + 1] = { entity = {name = 'steel-chest', position = {x = positions.x[2], y = positions.y[ii] + i}, force = 'player', fast_replace = true, spill = false}, old = 'iron' } elseif objective.upgrades[9] == 4 then chests[#chests + 1] = { entity = {name = 'logistic-chest-storage', position = {x = positions.x[1], y = positions.y[ii] + i}, force = 'player', fast_replace = true, spill = false}, old = 'steel' } chests[#chests + 1] = { entity = {name = 'logistic-chest-storage', position = {x = positions.x[2], y = positions.y[ii] + i}, force = 'player', fast_replace = true, spill = false}, old = 'steel' } end end end local surface = game.surfaces['cargo_wagon'] local tiles = {} for i = 1, #chests, 1 do if objective.upgrades[9] == 1 then tiles[#tiles + 1] = {name = 'tutorial-grid', position = chests[i].entity.position} end local old = nil local oldpos = {x = chests[i].entity.position.x + 0.5, y = chests[i].entity.position.y + 0.5} if chests[i].old == 'wood' then old = surface.find_entity('wooden-chest', oldpos) elseif chests[i].old == 'iron' then old = surface.find_entity('iron-chest', oldpos) elseif chests[i].old == 'steel' then old = surface.find_entity('steel-chest', oldpos) end if old then old.minable = true old.destructible = true end local e = surface.create_entity(chests[i].entity) e.destructible = false e.minable = false end if #tiles > 0 then surface.set_tiles(tiles) end end local function fusion_buy() local objective = Chrono_table.get_table() if objective.upgradechest[11] and objective.upgradechest[11].valid then local inv = objective.upgradechest[11].get_inventory(defines.inventory.chest) inv.insert({name = 'fusion-reactor-equipment', count = 1}) end end local function mk2_buy() local objective = Chrono_table.get_table() if objective.upgradechest[12] and objective.upgradechest[12].valid then local inv = objective.upgradechest[12].get_inventory(defines.inventory.chest) inv.insert({name = 'power-armor-mk2', count = 1}) end end local function refund_spidertrons() local objective = Chrono_table.get_table() if objective.upgradechest[16] and objective.upgradechest[16].valid then local inv = objective.upgradechest[16].get_inventory(defines.inventory.chest) inv.insert({name = 'spidertron', count = 2}) end end local function upgrade_labspeed() local objective = Chrono_table.get_table() game.forces.player.laboratory_speed_modifier = game.forces.player.laboratory_speed_modifier + 0.5 if objective.upgrades[18] > 2 then game.forces.player.laboratory_productivity_bonus = game.forces.player.laboratory_productivity_bonus + 0.1 end end local function upgrade_craftingspeed() game.forces.player.manual_crafting_speed_modifier = game.forces.player.manual_crafting_speed_modifier + 0.25 end local function upgrade_discharge() game.forces.player.set_ammo_damage_modifier('electric', game.forces.player.get_ammo_damage_modifier('electric') + 0.20) end local function upgrade_spidertron() game.forces.player.technologies['spidertron'].researched = true end local function upgrade_nuclear_artillery_add_ammo(amount) local objective = Chrono_table.get_table() objective.upgrades[24] = objective.upgrades[24] + amount end local function process_upgrade(index) local objective = Chrono_table.get_table() if index == 1 then upgrade_hp() elseif index == 3 then spawn_accumulators() elseif index == 4 then upgrade_pickup() elseif index == 5 then upgrade_inv() elseif index == 7 then upgrade_water() elseif index == 8 then if objective.upgrades[8] == 1 then upgrade_out() elseif objective.upgrades[8] == 2 then upgrade_out_signals() end elseif index == 9 then upgrade_storage() elseif index == 11 then fusion_buy() elseif index == 12 then mk2_buy() elseif index == 13 then objective.computermessage = 2 elseif index == 14 then objective.computermessage = 4 elseif index == 15 then if objective.upgrades[15] == 10 then game.print({'chronosphere.message_quest6'}, {r = 0.98, g = 0.66, b = 0.22}) end elseif index == 16 then refund_spidertrons() elseif index == 18 then upgrade_labspeed() elseif index == 19 then upgrade_craftingspeed() elseif index == 20 then upgrade_discharge() elseif index == 21 then if objective.upgrades[21] == 2 then upgrade_spidertron() end elseif index == 23 then upgrade_nuclear_artillery_add_ammo(10) elseif index == 24 then upgrade_nuclear_artillery_add_ammo(9) end end local function check_single_upgrade(index) local objective = Chrono_table.get_table() local upgrades = Upgrades.upgrades() if objective.upgradechest[index] and objective.upgradechest[index].valid then if index == 14 and (objective.upgrades[13] ~= 1 or objective.computermessage ~= 3) then return elseif index == 15 and (objective.upgrades[14] ~= 1 or objective.computermessage ~= 5) then return elseif index == 16 and objective.upgrades[15] ~= 10 then return end local inv = objective.upgradechest[index].get_inventory(defines.inventory.chest) if objective.upgrades[index] < upgrades[index].max_level and objective.chronojumps >= upgrades[index].jump_limit then for _, item in pairs(upgrades[index].cost) do if inv.get_item_count(item.name) < item.count then return end end for _, token in pairs(upgrades[index].virtual_cost) do if objective.research_tokens[token.type] < token.count then return end end else return end for _, item in pairs(upgrades[index].cost) do if item.count > 0 then inv.remove({name = item.name, count = item.count}) end end for _, token in pairs(upgrades[index].virtual_cost) do objective.research_tokens[token.type] = objective.research_tokens[token.type] - token.count end objective.upgrades[index] = objective.upgrades[index] + 1 game.print(upgrades[index].message, {r = 0.98, g = 0.66, b = 0.22}) process_upgrade(index) end end local function check_all_upgrades() local upgrades = Upgrades.upgrades() for i = 1, #upgrades, 1 do check_single_upgrade(i) end end function Public.check_upgrades() local objective = Chrono_table.get_table() if not objective.upgradechest then return end if objective.game_lost == true then return end check_all_upgrades() if objective.world.id == 7 then if objective.fishchest then check_win() end end end function Public.trigger_poison() local objective = Chrono_table.get_table() if objective.game_lost then return end if objective.upgrades[10] > 0 and objective.poisontimeout == 0 then objective.upgrades[10] = objective.upgrades[10] - 1 objective.poisontimeout = 120 local objs = {objective.locomotive, objective.locomotive_cargo[1], objective.locomotive_cargo[2], objective.locomotive_cargo[3]} local surface = objective.surface game.print({'chronosphere.message_poison_defense'}, {r = 0.98, g = 0.66, b = 0.22}) Server.to_discord_embed({'chronosphere.message_poison_defense'}, true) for i = 1, 4, 1 do surface.create_entity({name = 'poison-capsule', position = objs[i].position, force = 'player', target = objs[i], speed = 1}) end for i = 1, #objective.comfychests, 1 do surface.create_entity({name = 'poison-capsule', position = objective.comfychests[i].position, force = 'player', target = objective.comfychests[i], speed = 1}) end end end return Public