1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-06 00:23:49 +02:00
ComfyFactorio/maps/chronosphere/upgrades.lua
2020-04-28 04:21:07 +02:00

265 lines
10 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
inv.remove({name = "raw-fish", count = countfish})
objective.mainscore = objective.mainscore + countfish
if enemies > 0 then
game.print("Comfylatron: You delivered fish, but there is still " .. enemies .. " enemies left. Kill them all so fish are safe!", {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.game_lost = true
objective.chronotimer = 200000000 - 300
for _, player in pairs(game.connected_players) do
player.play_sound{path="utility/game_won", volume_modifier=0.85}
end
local message = {"chronosphere.message_game_won1"}
local message2 = "Number of delivered fish: " .. objective.mainscore
game.print(message, {r=0.98, g=0.66, b=0.22})
game.print(message2, {r=0.98, g=0.66, b=0.22})
Server.to_discord_embed(message)
Server.to_discord_embed(message2)
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_acumulators()
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.acumulators, 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}}
local out = {}
for i = 1, 4, 1 do
local e = game.surfaces["cargo_wagon"].create_entity({name = "steel-chest", position = positions[i], force = "player"})
e.destructible = false
e.minable = false
objective.outchests[i] = e
out[i] = 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
return out
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"]
for i = 1, #chests, 1 do
if objective.upgrades[9] == 1 then
surface.set_tiles({{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
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 process_upgrade(index)
local objective = Chrono_table.get_table()
if index == 1 then
upgrade_hp()
elseif index == 3 then
spawn_acumulators()
elseif index == 4 then
upgrade_pickup()
elseif index == 5 then
upgrade_inv()
elseif index == 7 then
upgrade_water()
elseif index == 8 then
upgrade_out()
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
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
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
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.planet[1].name.id == 17 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})
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