122 lines
13 KiB
GDScript
122 lines
13 KiB
GDScript
extends Control
|
||
|
||
signal closed
|
||
const BUTTON_STYLE := preload("res://scripts/ui/hud_button_style.gd")
|
||
const PAGES := [
|
||
["Pierwsza wyprawa", "01", "[font_size=26][color=#f1bd79]Twój pierwszy układ[/color][/font_size]\n\nWybierz statek przyciskiem [b]Nowa wyprawa[/b]. Każdy kadłub ma inne parametry — na początek wybierz ten, który pasuje do Twojego stylu.\n\n[color=#91dbea][b]1. Pokonaj zwykłych wrogów[/b][/color]\nOdszukuj przeciwników, rozwijaj wyposażenie i pilnuj zasobów. Aktualny cel znajdziesz w lewym dolnym rogu ekranu.\n\n[color=#91dbea][b]2. Pokonaj bossa[/b][/color]\nGdy zniszczysz pozostałych wrogów, w układzie pojawi się boss. Przygotuj zapas amunicji i sprawdź kadłub przed walką.\n\n[color=#91dbea][b]3. Znajdź zamieszkaną planetę[/b][/color]\nPo zwycięstwie podleć do zamieszkanej planety. Skorzystaj z usług i otwórz wormhole. Wleć w jego środek, żeby przejść do następnego, trudniejszego układu."],
|
||
["Sterowanie", "02", "[font_size=26][color=#f1bd79]Opanuj statek[/color][/font_size]\n\n[color=#91dbea][b]W[/b][/color] — ciąg do przodu.\n[color=#91dbea][b]S[/b][/color] — hamowanie; po zatrzymaniu lot wstecz.\n[color=#91dbea][b]A / D[/b][/color] — obracanie statku.\n[color=#91dbea][b]Q / E[/b][/color] — ruch boczny w lewo / prawo.\n[color=#91dbea][b]TAB[/b][/color] — dopalanie: większa prędkość kosztem energii.\n\n[color=#91dbea][b]Kursor myszy[/b][/color] — celowanie.\n[color=#91dbea][b]LPM / PPM / ŚPM[/b][/color] — strzelanie z trzech slotów broni.\n[color=#91dbea][b]1–5[/b][/color] — użycie zamontowanych rozszerzeń.\n[color=#91dbea][b]F1–F5[/b][/color] — aktywne umiejętności kapitana.\n[color=#91dbea][b]R[/b][/color] — użycie powerbanku, jeśli masz go w zapasach.\n\nStatek ma bezwładność. Obrót nie zatrzymuje ruchu — hamuj wcześniej i wykorzystuj ruch boczny, żeby unikać ostrzału."],
|
||
["Walka i przetrwanie", "03", "[font_size=26][color=#f1bd79]Wróć z wyprawy[/color][/font_size]\n\n[color=#91dbea][b]Tarcze, kadłub i energia[/b][/color]\nTarcze pochłaniają obrażenia przed kadłubem. Utrata całego kadłuba oznacza zniszczenie statku. Energia zasila część broni oraz dopalanie; odnawia się z czasem, szybciej przy gwieździe.\n\n[color=#91dbea][b]Dobieraj broń do zapasów[/b][/color]\nBroń energetyczna zużywa energię. Działko maszynowe potrzebuje zwykłej amunicji, gamma — napromieniowanej, a wyrzutnie — rakiet. Puste zapasy oznaczają brak strzału. Absorpcja ogranicza obrażenia danego typu.\n\n[color=#91dbea][b]Korzystaj z rozszerzeń[/b][/color]\nMiny atakują obszarowo, flary odciągają uwagę, kamuflaż pomaga zerwać kontakt, teleport przenosi w bezpieczne miejsce, a drony wspierają ostrzał. Doładowanie tarcz działa przy gwieździe. Sprawdzaj koszt i cooldown w opisie.\n\n[color=#f1bd79][b]Uważaj na uciekających przeciwników[/b][/color]\nWróg z kadłubem poniżej 10% ucieka wolniej, ale może zostawić minę. Nie leć bezmyślnie prosto za nim."],
|
||
["Łup i wytwarzanie", "04", "[font_size=26][color=#f1bd79]Zbieraj. Porównuj. Twórz.[/color][/font_size]\n\n[color=#91dbea][b]Łup zbierasz przez podlecenie[/b][/color]\nPrzedmioty w pobliżu są przyciągane do statku. Magazyn mieści 20 przedmiotów; przy pełnym magazynie zwolnij miejsce, żeby zebrać kolejny.\n\n[color=#91dbea][b]Asteroidy zostawiają fizyczne odłamki[/b][/color]\nStrzelaj do asteroid. Po zniszczeniu rozpadają się bazowo na 5–7 poszarpanych fragmentów. Każdy to jedna jednostka surowca — musisz go zebrać. Umiejętność górnika zwiększa uzysk.\n\n[color=#91dbea][b]Przeszukuj wraki[/b][/color]\nPodleć do wraku i przytrzymaj E, aby go przeszukać. Wraki dają surowce (65%), amunicję lub rakiety (łącznie 20%) albo moduł (15%).\n\n[color=#91dbea][b]Warsztat fregaty — produkcja[/b][/color]\nZadokuj na fregacie i wybierz Warsztat. Tam wytworzysz amunicję, rakiety, części, powerbanki i wyposażenie kapitana. Koszt sprawdzisz w podpowiedzi przycisku produkcji.\n\n[color=#91dbea][b]Odzyskuj części[/b][/color]\nNajedź na zbędny przedmiot w magazynie i użyj przycisku rozłożenia. Części przydadzą się do napraw."],
|
||
["Statek i kapitan", "05", "[font_size=26][color=#f1bd79]Buduj własny styl gry[/color][/font_size]\n\n[color=#91dbea][b]Wyposażenie[/b][/color]\nKliknij panel statku w prawym górnym rogu i otwórz magazyn. Przeciągaj przedmioty do pasujących slotów: maksymalnie 3 bronie, 5 modułów i 5 rozszerzeń. Na początku dostępny jest 1 slot broni i 1 rozszerzenia. Kolejne odblokowujesz w hangarze fregaty za 10 żelaza każdy. Ładownia zaczyna z jednym rzędem (5 miejsc); kolejne rzędy kupujesz w hangarze po 10 żelaza. Po zbudowaniu składu modułów zakładka Magazyn na frachtowcu pozwala odkładać i odbierać wyposażenie. Aktywne rozszerzenia uruchamiasz klawiszami 1–5; pasywne (oznaczone P) działają automatycznie w tych samych slotach. Najedź kursorem, żeby sprawdzić parametry i porównanie wyposażenia.\n\n[color=#91dbea][b]Nie każdy duplikat jest taki sam[/b][/color]\nBroń i moduły mogą mieć różne parametry oraz addony. Aktywne rozszerzenia losują cooldown od 30 do 5 pełnych sekund. Pasywne mają losowaną siłę efektu: Recykler odnawia tarcze i energię po zebraniu odłamka, Wirus przejmuje uciekających wrogów, a Pancerz z tytanu ogranicza obrażenia przy niskim kadłubie. Krótsze odnowienia są rzadkie — przed rozłożeniem porównaj egzemplarze. Rozszerzenia tego samego typu dzielą aktywne odnowienie.\n\n[color=#91dbea][b]Umiejętności kapitana[/b][/color]\nZa pokonanych wrogów zdobywasz doświadczenie i kredyty. Trudniejsze układy dają więcej bazowego XP. Jeśli kapitan przewyższa poziom układu o ponad 2 poziomy, XP za przeciwników i ruiny maleje; przy przewadze 8 poziomów spada do zera. Kredyty i surowce nadal zbierasz. Po awansie wybierasz umiejętność. Pasywne działają stale, aktywne przypisujesz do F1–F5.\n\n[color=#f1bd79][b]Okno umiejętności nie pauzuje gry.[/b][/color]\nOtwieraj je w bezpiecznym miejscu. Przed kolejnym układem uzupełnij zapasy i sprawdź wyposażenie."]
|
||
,["Planety i frachtowiec", "06", "[font_size=26][color=#f1bd79]Wyprawa na powierzchnię[/color][/font_size]\n\nPodleć do planety oznaczonej EARTHLIKE. [b]F[/b] skanuje tlen, temperaturę i zagrożenie biologiczne. [b]L[/b] rozpoczyna lądowanie. Możesz eksplorować przed pokonaniem wrogów, ale lądowanie jest zablokowane podczas walki.\n\nLądownik wymaga 100 HP przed startem i traci 5–20 HP przy wejściu w atmosferę. Na powierzchni sterujesz jak statkiem: [b]W[/b] — ciąg, [b]S[/b] — hamowanie i wstecz, [b]A/D[/b] — obrót, [b]Q/E[/b] — ruch boczny, [b]TAB[/b] — dopalanie. Odkrywaj miejsca i używaj [b]F[/b], aby je zbadać. Lądownik ma osobną energię dopalania. Każdy etap badania pokazuje szansę sukcesu; dalsze etapy dają więcej łupu i większe ryzyko.\n\n[b]L[/b] lub przycisk powrotu kończy wyprawę i przenosi łup do Twoich zasobów. Zniszczenie lądownika oznacza utratę tylko zdobyczy tej wyprawy. Kolejne lądowanie tworzy nową mapę.\n\n[color=#91dbea][b]Frachtowiec[/b][/color]\nZnajdziesz go przy gwieździe centralnej. Podleć i naciśnij [b]L[/b]. Hangar naprawia lądownik (1 część za 1% HP), warsztat prowadzi całą produkcję amunicji, rakiet, zaopatrzenia i sprzętu kapitana, a laboratorium przechowuje skany i archiwa.\n\nKapitan zaczyna z podstawowym systemem oddychania, skafandrem i bronią ręczną. Kolejne poziomy tworzysz w warsztacie; posiadany sprzęt zmienisz w Warsztacie. Kliknięcie panelu kapitana pokazuje sylwetkę, założone przedmioty i redukcję zagrożeń nad slotami. Wyższy poziom poprawia szanse eksploracji.\n\n[color=#91dbea][b]Losowe spotkania[/b][/color]\nPytajnik na mapie oznacza wydarzenie. Podleć, aby otworzyć okno. Miejscowy inżynier może zaoferować nieznany moduł za 100 kredytów. Wyższe poziomy przedmiotów są coraz rzadsze. Kupiony moduł pozostaje w ładowni wyprawy do bezpiecznego powrotu.\n\n[color=#f1bd79]Podczas wyprawy i wizyty we frachtowcu kosmos jest zamrożony. Zapisywanie między uruchomieniami gry nie jest jeszcze dostępne.[/color]"]
|
||
, ["Autorzy dźwięków", "07", "[font_size=26][color=#f1bd79]Dźwięki otoczenia[/color][/font_size]\n\n[b]Blender Foundation — Ambient Bird, Cricket and Frog (Yo Frankie!)[/b]\nOdgłosy świerszcza i żaby, udostępnione przez Lamoot:\nhttps://opengameart.org/content/ambient-bird-cricket-and-frog\nLicencja Creative Commons Attribution 3.0:\nhttps://creativecommons.org/licenses/by/3.0/\nZmiany: filtrowanie, płynne początki i zakończenia, zmiana wysokości żaby oraz konwersja do stereo 48 kHz. Autorzy nie są powiązani z tą grą.\n\n[b]Nagrania na licencji CC0[/b]\nThimras — Park ambiences (wiatr).\nIwan „qubodup” Gabovitch — 20 Rustles of dry leaves.\nisaiah658 — Ambient Bird Sounds.\nRudmer_Rotteveel — Wood Creak Single V7.\n\n[b]Wnętrze fregaty — CC0[/b]\nLEGIT Audio — The Shop (bezpłatne próbki OpenGameArt).\nbart — 68 Workshop Sounds i Steam release sounds.\nKenney — Sci-Fi Sounds.\n\nSzczegółowe źródła i zakres obróbki znajdują się w plikach CREDITS.md i manifest.json przy zasobach audio."]
|
||
]
|
||
var _panel: PanelContainer
|
||
var _reader: RichTextLabel
|
||
var _tabs: Array[Button] = []
|
||
var _close_button: Button
|
||
|
||
func _ready() -> void:
|
||
name = "PlayerGuide"
|
||
set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
||
var dim := ColorRect.new()
|
||
dim.color = Color(0.005, 0.012, 0.025, 0.82)
|
||
add_child(dim)
|
||
dim.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
||
_panel = PanelContainer.new()
|
||
var style := StyleBoxFlat.new()
|
||
style.bg_color = Color("0b1725")
|
||
style.border_color = Color("46798a")
|
||
style.set_border_width_all(1)
|
||
style.set_corner_radius_all(10)
|
||
style.set_content_margin_all(24)
|
||
_panel.add_theme_stylebox_override("panel", style)
|
||
add_child(_panel)
|
||
var contents := VBoxContainer.new()
|
||
contents.add_theme_constant_override("separation", 18)
|
||
_panel.add_child(contents)
|
||
var header := HBoxContainer.new()
|
||
contents.add_child(header)
|
||
var heading := Label.new()
|
||
heading.text = "INSTRUKCJA / AKADEMIA PILOTA"
|
||
heading.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||
heading.add_theme_font_size_override("font_size", 16)
|
||
heading.add_theme_color_override("font_color", Color("91dbea"))
|
||
header.add_child(heading)
|
||
_close_button = Button.new()
|
||
_close_button.text = "ZAMKNIJ [ESC]"
|
||
BUTTON_STYLE.apply(_close_button)
|
||
_close_button.pressed.connect(close)
|
||
header.add_child(_close_button)
|
||
contents.add_child(HSeparator.new())
|
||
var body := HBoxContainer.new()
|
||
body.size_flags_vertical = Control.SIZE_EXPAND_FILL
|
||
body.add_theme_constant_override("separation", 24)
|
||
contents.add_child(body)
|
||
var navigation := VBoxContainer.new()
|
||
navigation.custom_minimum_size.x = 190
|
||
navigation.add_theme_constant_override("separation", 8)
|
||
body.add_child(navigation)
|
||
for index in PAGES.size():
|
||
var button := Button.new()
|
||
button.text = "%s %s" % [PAGES[index][1], PAGES[index][0]]
|
||
button.alignment = HORIZONTAL_ALIGNMENT_LEFT
|
||
button.custom_minimum_size.y = 44
|
||
BUTTON_STYLE.apply(button)
|
||
button.add_theme_font_override("font", ThemeDB.fallback_font)
|
||
button.add_theme_font_size_override("font_size", 14)
|
||
button.pressed.connect(_show_page.bind(index))
|
||
navigation.add_child(button)
|
||
_tabs.append(button)
|
||
_reader = RichTextLabel.new()
|
||
_reader.name = "GuideText"
|
||
_reader.bbcode_enabled = true
|
||
_reader.scroll_active = true
|
||
_reader.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||
_reader.size_flags_vertical = Control.SIZE_EXPAND_FILL
|
||
_reader.add_theme_font_override("normal_font", ThemeDB.fallback_font)
|
||
_reader.add_theme_font_override("bold_font", ThemeDB.fallback_font)
|
||
_reader.add_theme_font_size_override("normal_font_size", 17)
|
||
_reader.add_theme_constant_override("line_separation", 5)
|
||
_reader.add_theme_color_override("default_color", Color("c5d4df"))
|
||
body.add_child(_reader)
|
||
var tip := Label.new()
|
||
tip.text = "Pierwszy cel: pokonaj wrogów → pokonaj bossa → znajdź zamieszkaną planetę."
|
||
tip.add_theme_font_override("font", ThemeDB.fallback_font)
|
||
tip.add_theme_font_size_override("font_size", 13)
|
||
tip.add_theme_color_override("font_color", Color("8ca5b8"))
|
||
contents.add_child(tip)
|
||
resized.connect(_layout)
|
||
_layout()
|
||
_show_page(0)
|
||
hide()
|
||
|
||
func _layout() -> void:
|
||
if _panel == null:
|
||
return
|
||
var base := Vector2(1040, 620)
|
||
var factor := minf(1.0, minf((size.x - 32) / base.x, (size.y - 32) / base.y))
|
||
_panel.size = base
|
||
_panel.scale = Vector2.ONE * factor
|
||
_panel.position = (size - base * factor) * 0.5
|
||
|
||
func _show_page(index: int) -> void:
|
||
_reader.text = PAGES[index][2]
|
||
_reader.scroll_to_line(0)
|
||
for tab_index in _tabs.size():
|
||
_tabs[tab_index].modulate = Color("f1bd79") if tab_index == index else Color.WHITE
|
||
|
||
func open() -> void:
|
||
show()
|
||
_show_page(0)
|
||
_close_button.grab_focus()
|
||
|
||
func close() -> void:
|
||
hide()
|
||
closed.emit()
|
||
|
||
func _unhandled_key_input(event: InputEvent) -> void:
|
||
if visible and event.is_action_pressed("ui_cancel"):
|
||
close()
|
||
get_viewport().set_input_as_handled()
|