mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2024-12-30 23:17:53 +02:00
380 lines
15 KiB
Lua
380 lines
15 KiB
Lua
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
|