1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2024-12-30 23:17:53 +02:00
ComfyFactorio/maps/chronosphere/upgrades.lua
2021-03-24 16:46:00 +01:00

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