78 lines
3.8 KiB
GDScript
78 lines
3.8 KiB
GDScript
extends RefCounted
|
|
const DURATION := 600.0
|
|
const IDS := [
|
|
"gamma_cannon", "beam_laser", "machine_gun", "missile_launcher", "unguided_missile",
|
|
"incendiary_missile", "radiation_laser", "artillery_cannon", "external_turret", "pulse_laser",
|
|
"recycler", "virus", "titanium_armor", "combat_drones", "teleport", "cloak",
|
|
"mine_layer", "flares", "solar_shield_charge", "auxiliary_shield",
|
|
"afterburner", "shield_charge", "repair_drones",
|
|
]
|
|
const COSTS := {
|
|
"auxiliary_shield":{"uranium":45,"aluminium":40,"titanium":30,"silicon":15},
|
|
"pulse_laser":{"uranium":40,"aluminium":35,"titanium":25,"copper":15},
|
|
"external_turret":{"iron":50,"titanium":35,"aluminium":25,"sulfur":20},
|
|
"gamma_cannon":{"uranium":45,"titanium":30,"aluminium":20},
|
|
"beam_laser":{"uranium":30,"aluminium":30,"iron":15},
|
|
"machine_gun":{"iron":30,"titanium":20,"sulfur":15},
|
|
"missile_launcher":{"iron":40,"sulfur":30,"uranium":15},
|
|
"unguided_missile":{"iron":30,"sulfur":25,"aluminium":15},
|
|
"recycler":{"iron":25,"aluminium":25,"titanium":15},
|
|
"virus":{"uranium":25,"aluminium":30,"titanium":15},
|
|
"titanium_armor":{"titanium":45,"iron":30},
|
|
"combat_drones":{"iron":35,"titanium":25,"uranium":20},
|
|
"teleport":{"uranium":45,"aluminium":30,"titanium":20},
|
|
"cloak":{"uranium":35,"aluminium":30,"titanium":20},
|
|
"mine_layer":{"iron":30,"sulfur":25,"uranium":15},
|
|
"flares":{"sulfur":25,"aluminium":20,"iron":15},
|
|
"solar_shield_charge":{"uranium":25,"aluminium":35,"titanium":15},
|
|
"afterburner":{"iron":25,"sulfur":30,"aluminium":20},
|
|
"shield_charge":{"uranium":30,"aluminium":25,"titanium":20},
|
|
"repair_drones":{"iron":30,"titanium":25,"aluminium":20},
|
|
"incendiary_missile":{"iron":45,"sulfur":60,"uranium":30,"copper":12,"mercury":6},
|
|
"radiation_laser":{"uranium":60,"aluminium":45,"silicon":18,"copper":12},
|
|
"artillery_cannon":{"iron":75,"titanium":45,"nickel":15,"tungsten":10},
|
|
}
|
|
|
|
static func definition(id: String) -> ItemDefinition:
|
|
return load("res://resources/items/%s.tres" % id) as ItemDefinition if id in IDS else null
|
|
|
|
static func ensure_offers(progress: Resource) -> void:
|
|
if not progress.laboratory_offers.is_empty() or not progress.laboratory_project.is_empty(): return
|
|
var pool := IDS.duplicate()
|
|
for id in progress.laboratory_unlocks: pool.erase(id)
|
|
pool.shuffle()
|
|
for id in pool.slice(0,3): progress.laboratory_offers.append(id)
|
|
|
|
static func can_start(captain: Resource, id: String) -> bool:
|
|
var progress: Resource = captain.expedition
|
|
if progress.freighter_rooms.get("expansion_1","") != "laboratory" or not progress.laboratory_project.is_empty(): return false
|
|
if id not in progress.laboratory_offers or id not in IDS or progress.laboratory_unlocks.get(id,false): return false
|
|
for key in COSTS[id]:
|
|
if int(captain.minerals.get(key,0)) < int(COSTS[id][key]): return false
|
|
return true
|
|
|
|
static func start(captain: Resource, id: String) -> bool:
|
|
if not can_start(captain,id): return false
|
|
for key in COSTS[id]: captain.minerals[key] = int(captain.minerals.get(key,0))-int(COSTS[id][key])
|
|
captain.expedition.laboratory_project = id
|
|
captain.expedition.laboratory_duration = research_duration(captain)
|
|
captain.expedition.laboratory_remaining = captain.expedition.laboratory_duration
|
|
captain.emit_changed()
|
|
captain.expedition.emit_changed()
|
|
return true
|
|
|
|
static func research_duration(captain: Resource) -> float:
|
|
return DURATION * (1.0 - captain.get_skill_bonus("scientist"))
|
|
|
|
static func advance(progress: Resource, delta: float) -> bool:
|
|
if progress.laboratory_project.is_empty() or delta <= 0.0: return false
|
|
progress.laboratory_remaining = maxf(0.0,progress.laboratory_remaining-delta)
|
|
if progress.laboratory_remaining <= 0.00001:
|
|
progress.laboratory_remaining = 0.0
|
|
progress.laboratory_unlocks[progress.laboratory_project] = true
|
|
progress.laboratory_project = ""
|
|
progress.laboratory_offers.clear()
|
|
ensure_offers(progress)
|
|
progress.emit_changed()
|
|
return true
|