Randoloot/scripts/ui/player_guide.gd
2026-10-17 16:20:14 +02:00

120 lines
9.2 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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ć. Możesz znaleźć zapasy lub wyposażenie.\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: 3 bronie, 5 modułów i 5 rozszerzeń. 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. 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."]
]
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()