95 lines
8.1 KiB
GDScript
95 lines
8.1 KiB
GDScript
extends RefCounted
|
|
const ACTIVE_IDS := ["general", "weapons", "hull", "shields", "weapons_a", "weapons_a_next", "weapons_a_next_next", "weapons_a_next_next_next", "weapons_b", "weapons_b_next", "weapons_b_next_next", "weapons_b_next_next_next", "hull_a", "hull_a_next", "hull_a_next_next", "hull_a_next_next_next", "hull_b", "hull_b_next", "hull_b_next_next", "hull_b_next_next_next", "shields_a", "shields_a_next", "shields_a_next_next", "shields_a_next_next_next", "shields_b", "shields_b_next", "shields_b_next_next", "shields_b_next_next_next"]
|
|
const BRANCHES := ["weapons", "hull", "shields"]
|
|
const SYSTEM_DISABLE_DURATION := 5.0
|
|
const TITLES := {"hull_a":"Analiza konstrukcji", "hull_a_next":"Pęknięcie poszycia", "hull_a_next_next":"Przestrzał", "hull_a_next_next_next":"Rozpad konstrukcji", "hull_b":"Wzmocnione poszycie", "hull_b_next":"Pancerz reaktywny", "hull_b_next_next":"Awaryjne grodzie", "hull_b_next_next_next":"Ostatni bastion", "general":"Ogólna wiedza", "weapons":"Wiedza o broni", "hull":"Wiedza o kadłubie", "shields":"Wiedza o tarczach", "weapons_a":"Słaby punkt", "weapons_a_next":"Celny strzał", "weapons_a_next_next":"Rykoszet", "weapons_a_next_next_next":"Strzał w 10", "weapons_b":"Manewr wyprzedzający", "weapons_b_next":"System obrony przed obcymi", "weapons_b_next_next":"Dezorientacja celowania", "weapons_b_next_next_next":"Zakłócenia systemów obcych"}
|
|
|
|
const SHIELD_IDS := ["shields_a", "shields_a_next", "shields_a_next_next", "shields_a_next_next_next", "shields_b", "shields_b_next", "shields_b_next_next", "shields_b_next_next_next"]
|
|
const SHIELD_TITLES := ["Analiza częstotliwości", "Blokada regeneracji", "Przeciążenie osłon", "Odwrócona polaryzacja", "Pojemne kondensatory", "Rezerwa kondensatorów", "Rozproszenie salwy", "Tarcza awaryjna"]
|
|
|
|
static func learned(id: String) -> bool:
|
|
return id in ACTIVE_IDS and bool(GameState.captain.expedition.alien_skills.get(id,false))
|
|
|
|
static func path_color(id: String) -> Color:
|
|
return Color("efa653") if "_a" in id else Color("79cba8")
|
|
|
|
static func parent(id: String) -> String:
|
|
if id == "general": return ""
|
|
return id.substr(0,id.rfind("_")) if "_" in id else "general"
|
|
|
|
static func cost(id: String) -> int:
|
|
var depth := 0 if id == "general" else id.split("_").size()
|
|
return 10 + depth * 5
|
|
|
|
static func title(id: String) -> String:
|
|
if id in SHIELD_IDS: return SHIELD_TITLES[SHIELD_IDS.find(id)]
|
|
return str(TITLES.get(id, "Pusty slot"))
|
|
|
|
static func description(id: String) -> String:
|
|
match id:
|
|
"shields_a": return "Dodatkowe 5% obrażeń tarczom obcych. Sumuje się z Wiedzą o tarczach."
|
|
"shields_a_next": return "Trafienie tarczy obcego blokuje regenerację na 5 s. Kolejne trafienia odświeżają czas."
|
|
"shields_a_next_next": return "Zbicie tarczy obcego razi pozostałych obcych w promieniu 120 px za 400% obrażeń trafienia, które zbiło tarczę. Bez reakcji łańcuchowych. Ten sam wróg wywołuje impuls najwyżej raz na 10 s."
|
|
"shields_a_next_next_next": return "Obcy trafiający twoją aktywną tarczę otrzymuje wyładowanie równe 20% obrażeń faktycznie pochłoniętych przez osłonę. Bez kolejnych efektów trafienia."
|
|
"shields_b": return "Zwiększa maksymalne tarcze o 10%. Zakup nie uzupełnia osłon."
|
|
"shields_b_next": return "Spadek tarcz z co najmniej 30% poniżej tego progu zmniejsza koszt energii broni o 50% przez 2 s. Odnowienie: 15 s."
|
|
"shields_b_next_next": return "Pierwsze trafienie w aktywną tarczę zadaje tylko 10% obrażeń. Odnowienie: 60 s. Redukcja obejmuje też przebicie tego trafienia na kadłub."
|
|
"shields_b_next_next_next": return "Po zbiciu tarcz natychmiast odzyskujesz 25% ich maksimum. Przez 2 s obrażenia kierowane w tarczę są zmniejszone o 50%. Odnowienie: 30 s. Nie sumuje redukcji z Rozproszeniem salwy; działa silniejsza. Dokowanie nie resetuje odnowienia."
|
|
"general": return "Ujawnia paski HP i tarcz wrogów."
|
|
"weapons": return "Broń obcych zadaje o 10% mniej obrażeń."
|
|
"hull": return "Twoja broń zadaje o 10% więcej obrażeń kadłubom obcych."
|
|
"shields": return "Twoja broń zadaje o 10% więcej obrażeń tarczom obcych."
|
|
"hull_a": return "Twoja broń zadaje dodatkowe 5% obrażeń kadłubom obcych. Sumuje się z Wiedzą o kadłubie."
|
|
"hull_a_next": return "Bezpośrednie trafienie odsłoniętego kadłuba otwiera wyrwę na 5 s. Kolejne twoje trafienia ignorują połowę absorpcji tego statku. Wyrwy nie sumują się."
|
|
"hull_a_next_next": return "Po uszkodzeniu kadłuba pocisk lub laser przebija jeden dodatkowy cel za 50% obrażeń. Rakieta wypuszcza dodatkowy pocisk penetrujący bez kolejnej eksplozji. Bez łańcuchowych przestrzałów i dodatkowego kosztu strzału."
|
|
"hull_a_next_next_next": return "Bezpośrednie trafienie kadłuba dobija zwykłego obcego przy maksymalnie 8% kadłuba, a bossa przy 2%. Statek rozpada się na fragmenty."
|
|
"hull_b": return "Zwiększa maksymalny kadłub twojego statku o 10%. Zakup nie odnawia utraconego kadłuba."
|
|
"hull_b_next": return "Pierwsze trafienie sięgające kadłuba po utracie tarcz zadaje kadłubowi o 70% mniej obrażeń. Odnowienie: 15 s aktywnego lotu."
|
|
"hull_b_next_next": return "Spadek kadłuba z co najmniej 30% poniżej tego progu uruchamia naprawę 15% maksymalnego kadłuba przez 5 s. Odnowienie: 45 s. Trafienia nie przerywają naprawy."
|
|
"hull_b_next_next_next": return "Śmiertelne trafienie zostawia 1 punkt kadłuba i daje 2 s niewrażliwości. Raz na wyprawę lub wejście do zwykłego układu. Dokowanie ani restart po porażce nie odnawiają efektu."
|
|
"weapons_a": return "Każde bezpośrednie trafienie twojej broni zadaje obcym dodatkowe 5 obrażeń przed absorpcją."
|
|
"weapons_a_next": return "Każdy strzał ma 1% szansy wyłączyć na 5 sekund losowy system obcego: silnik, broń lub tarcze. Czerwona ikona nad wrogiem wskazuje wyłączony system. Obrażenia okresowe nie losują ponownie."
|
|
"weapons_a_next_next": return "Trafienie dowolną bronią razi też obcych do 10 px od obrysu trafionego statku. Promień eksplozji twoich rakiet rośnie o 10 px. Bez łańcuchowych rykoszetów."
|
|
"weapons_a_next_next_next": return "Każde bezpośrednie trafienie zadaje pełne obrażenia jednocześnie tarczom i kadłubowi obcego. Nadal działa absorpcja."
|
|
"weapons_b": return "Dodatkowe 5% szansy uniknięcia obrażeń od wrogich obcych. Łączy się niezależnie z pozostałymi unikami."
|
|
"weapons_b_next": return "Każda nadlatująca wroga rakieta ma 25% szansy zostać przechwycona w zasięgu 240 px od statku. Przechwycona rakieta wybucha bez zadawania obrażeń. Jeden rzut na rakietę."
|
|
"weapons_b_next_next": return "Wrogie pociski i lasery mają 25% szansy na dodatkowy szeroki rozrzut celowania."
|
|
"weapons_b_next_next_next": return "Pociski, rakiety i lasery obcych mogą trafiać także innych wrogich obcych. Trafienie własnego statku strzelca jest wykluczone."
|
|
return "Miejsce na przyszłe badanie."
|
|
|
|
static func learned_count(progress: Resource) -> int:
|
|
var count := 0
|
|
for id in ACTIVE_IDS:
|
|
if progress.alien_skills.get(id, false): count += 1
|
|
return count
|
|
|
|
static func bonus(progress: Resource, branch: String) -> float:
|
|
var learned: Dictionary = progress.alien_skills
|
|
return 0.1 if branch in BRANCHES and learned.get(branch, false) else 0.0
|
|
|
|
static func can_start(progress: Resource, id: String) -> bool:
|
|
if id not in ACTIVE_IDS or not progress.alien_project.is_empty(): return false
|
|
if progress.alien_skills.get(id,false): return false
|
|
var prerequisite := parent(id)
|
|
if not prerequisite.is_empty() and not progress.alien_skills.get(prerequisite,false): return false
|
|
return progress.analysis_samples >= cost(id)
|
|
|
|
static func purchase(progress: Resource, id: String) -> bool:
|
|
if not can_start(progress,id): return false
|
|
progress.analysis_samples -= cost(id)
|
|
progress.alien_project = id
|
|
progress.alien_duration = 600.0
|
|
progress.alien_remaining = progress.alien_duration
|
|
progress.emit_changed()
|
|
return true
|
|
|
|
static func advance(progress: Resource, delta: float) -> bool:
|
|
if progress.alien_project.is_empty() or delta <= 0: return false
|
|
progress.alien_remaining = maxf(0,progress.alien_remaining-delta)
|
|
if progress.alien_remaining <= 0.00001:
|
|
progress.alien_remaining = 0
|
|
progress.alien_skills[progress.alien_project] = true
|
|
progress.alien_project = ""
|
|
progress.emit_changed()
|
|
return true
|