Randoloot/scripts/planets/poi_presentation.gd
2026-10-19 22:33:24 +02:00

91 lines
5.4 KiB
GDScript

extends RefCounted
## Expedition field cards: warm canvas, olive paint, brass and scene art.
const RULES := preload("res://scripts/planets/poi_rules.gd")
const ORDER := ["deposit","ruins","warehouse","village","cave"]
const INK := Color("dfd8c3")
const MUTED := Color("9eaa91")
const GOLD := Color("d6b477")
const STORIES := {
"deposit":["Wśród zwietrzałych skał połyskują drobiny rzadkich minerałów. Wystarczy ostrożnie oddzielić je od podłoża.","Pod cienką warstwą gruntu żyła schodzi głębiej. Odwiert odsłoni bogatszy pokład, jeśli skała pozostanie stabilna.","Wąska szczelina prowadzi do najbogatszej części złoża. Każde uderzenie narzędzia odbija się głuchym echem."],
"ruins":["Korzenie rozsunęły kamienie przy wejściu. Za progiem spoczywa porzucone urządzenie, pokryte pyłem minionych wieków.","Ciężkie drzwi ustępują. W niszy pośród zatartych reliefów czeka kolejny fragment dawnej technologii.","W sercu budowli ocalał niezwykły mechanizm. Aby go wydobyć, trzeba poruszyć konstrukcję, która od dawna nie powinna stać."],
"warehouse":["Wiatr przesuwa kurz po podłodze pustego magazynu. Kilka skrzyń wciąż ma nienaruszone zamknięcia.","Za stalową kratą zachowały się regały z wojskowym zaopatrzeniem. Rdza utrudnia dostęp do ciężkich pojemników.","Ostatnie zapasy ukryto pod zawaloną częścią budynku. Belki skrzypią przy każdym kroku."],
"village":["Między pustymi domami zarosła dawna ścieżka. W pozostawionych schowkach mogą jeszcze leżeć drobne oszczędności.","Na stole ocalały dzienniki mieszkańców. Ich notatki mogą nauczyć cię, jak przetrwać na tej planecie.","Pod zapadniętą podłogą kryje się sejf osady. Dotarcie do niego wymaga wejścia pod niestabilne stropy."],
"cave":["U podnóża góry otwiera się ciemna szczelina. Przy wilgotnych skałach rosną organizmy warte dokładniejszej analizy.","Korytarz rozszerza się w chłodną grotę. Na wapiennych ścianach widać kolejne skupiska nieznanych form życia.","Daleko od światła powierzchni leży podziemny zbiornik. Wokół niego przetrwały najcenniejsze próbki — i najtrudniejsza droga powrotna."]}
static func panel_style(panel: PanelContainer) -> void:
var style := StyleBoxFlat.new()
style.bg_color = Color("22271f7a")
style.border_color = Color("756d50")
style.set_border_width_all(1)
style.set_corner_radius_all(8)
style.set_content_margin_all(9)
style.shadow_color = Color(0,0,0,0.45)
style.shadow_size = 14
panel.add_theme_stylebox_override("panel",style)
static func text(parent: Node, content: String, font_size := 14, color := INK) -> Label:
var label := Label.new()
label.text = content
label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
label.add_theme_font_size_override("font_size",preload("res://scripts/ui/compact_interface.gd").font_size(font_size-2))
label.add_theme_font_override("font",ThemeDB.fallback_font)
label.add_theme_color_override("font_color",color)
parent.add_child(label)
return label
static func button(parent: Node, content: String, action: Callable, primary := false) -> Button:
var node := Button.new()
node.text = content
node.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
node.custom_minimum_size.y = 30
node.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
node.add_theme_font_size_override("font_size",12)
node.add_theme_font_override("font",ThemeDB.fallback_font)
node.add_theme_color_override("font_color",INK)
for state in ["normal","hover","pressed","disabled","focus"]:
var style := StyleBoxFlat.new()
style.bg_color = Color("4b5639") if primary else Color("30382b")
if state == "hover": style.bg_color = Color("626b46")
if state == "pressed": style.bg_color = Color("3c442c")
if state == "disabled": style.bg_color = Color("292c25")
style.bg_color.a = 0.50 if state == "normal" else 0.66
style.border_color = GOLD if primary else Color("687054")
style.set_border_width_all(1)
style.set_corner_radius_all(4)
style.content_margin_left = 10
style.content_margin_right = 10
style.content_margin_top = 7
style.content_margin_bottom = 7
node.add_theme_stylebox_override(state,style)
node.pressed.connect(action)
parent.add_child(node)
return node
static func header(parent: VBoxContainer, kind: String, stage: int, complete: bool) -> void:
var atlas: Texture2D = load("res://assets/planets/poi/expedition_atlas.png")
var image := AtlasTexture.new()
image.atlas = atlas
# Painted atlas rows have slightly different heights; crop inside each scene.
var row := ORDER.find(kind)
var rows := [0.0,0.198,0.394,0.589,0.776,1.0]
var extent := Vector2(atlas.get_size())
image.region = Rect2(Vector2(stage/3.0,rows[row])*extent+Vector2(3,3),Vector2(extent.x/3.0,(rows[row+1]-rows[row])*extent.y)-Vector2(6,6))
image.filter_clip = true
var frame := PanelContainer.new()
frame.custom_minimum_size.y = 164
frame.clip_contents = true
frame.add_theme_stylebox_override("panel",StyleBoxEmpty.new())
var art := TextureRect.new()
art.texture = image
art.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
art.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_COVERED
art.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS
frame.add_child(art)
parent.add_child(frame)
text(parent,"DZIENNIK WYPRAWY / %s" % ("ZAKOŃCZONO" if complete else "ETAP %02d / 03" % (stage+1)),11,MUTED)
text(parent,str(RULES.NAMES[kind]),23,GOLD)
text(parent,STORIES[kind][stage],14)
var line := HSeparator.new()
line.modulate = Color("7b8062")
parent.add_child(line)