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 — przycisk TWÓRZ[/b][/color]\nZ minerałów wytworzysz części, amunicję, rakiety i powerbanki. Receptura pokazuje wymagane składniki oraz ilość produktu.\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 wytwarza sprzęt kapitana, a laboratorium przechowuje skany i archiwa.\n\nKapitan zaczyna z podstawowym systemem oddychania, skafandrem i bronią ręczną. Kolejne poziomy tworzysz w warsztacie; sprzęt zmienisz także w panelu pod kapitanem. 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]"] ] 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()