Randoloot/scripts/planets/alien_research.gd
2026-10-25 12:34:56 +01:00

59 lines
3.7 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"]
const BRANCHES := ["weapons", "hull", "shields"]
const TITLES := {"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"}
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:
return str(TITLES.get(id, "Pusty slot"))
static func description(id: String) -> String:
match id:
"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."
"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 3 sekundy losowy system obcego: silnik, broń lub tarcze. 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 purchase(progress: Resource, id: String) -> bool:
if id not in ACTIVE_IDS: return false
if progress.alien_skills.get(id, false): return false
var prerequisite := parent(id)
if prerequisite != "" and not progress.alien_skills.get(prerequisite, false): return false
if progress.analysis_samples < cost(id): return false
progress.analysis_samples -= cost(id)
progress.alien_skills[id] = true
progress.emit_changed()
return true