Randoloot/scripts/ui/captain_panel.gd
2026-10-18 18:47:18 +02:00

106 lines
4.1 KiB
GDScript

extends PanelContainer
signal equipment_requested
@onready var player: CharacterBody2D = get_node("../../../PlayerShip")
@onready var level_label: Label = $Contents/Header/Level
@onready var xp_label: Label = $Contents/XPLabel
@onready var xp_bar: ProgressBar = $Contents/XPBar
@onready var credits_label: Label = $Contents/Wallet/Credits
var _captain: CaptainProgress
var _level_up_button: Button
func _ready() -> void:
_build_portrait()
_captain = GameState.captain
_captain.normalize_skill_ranks()
_level_up_button = Button.new()
_level_up_button.name = "LevelUpButton"
_level_up_button.text = "Nowy poziom"
_level_up_button.custom_minimum_size.y = 32
_level_up_button.focus_mode = Control.FOCUS_NONE
preload("res://scripts/ui/hud_button_style.gd").apply(_level_up_button, Color("efb568"))
$Contents.add_child(_level_up_button)
_level_up_button.pressed.connect(func() -> void:
get_node("../../CaptainSkills").call("open_management")
)
_captain.changed.connect(_refresh)
player.get_node("ShipInventory").connect("inventory_changed", _refresh)
for label in [level_label, xp_label, credits_label]:
label.add_theme_color_override("font_shadow_color", Color("030811"))
label.add_theme_constant_override("shadow_offset_x", 1)
label.add_theme_constant_override("shadow_offset_y", 1)
_refresh()
mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
tooltip_text = "Kliknij, aby otworzyć ekwipunek kapitana"
_pass_clicks($Contents)
func _pass_clicks(node: Node) -> void:
for child in node.get_children():
if child is BaseButton: continue
if child is Control: child.mouse_filter = Control.MOUSE_FILTER_IGNORE
_pass_clicks(child)
if node == $Contents: node.mouse_filter = Control.MOUSE_FILTER_IGNORE
func _gui_input(event: InputEvent) -> void:
if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
equipment_requested.emit()
accept_event()
func _refresh() -> void:
level_label.text = "POZ. %d" % _captain.level
xp_label.text = "XP %d / %d" % [_captain.experience, _captain.get_xp_required()]
xp_bar.max_value = _captain.get_xp_required()
xp_bar.value = _captain.experience
credits_label.text = "Kredyty: %d" % _captain.credits
var available := _captain.learning_points > 0
if _level_up_button.visible != available:
_level_up_button.visible = available
reset_size.call_deferred()
_level_up_button.tooltip_text = "Wybierz umiejętność · oczekujące awanse: %d" % _captain.learning_points
func _build_portrait() -> void:
custom_minimum_size = Vector2(244, 0)
var style := StyleBoxFlat.new()
style.bg_color = Color(0.025, 0.042, 0.064, 0.8)
style.border_color = Color("56726e")
style.set_border_width_all(1)
style.set_corner_radius_all(8)
style.set_content_margin_all(6)
add_theme_stylebox_override("panel", style)
var row := HBoxContainer.new()
row.name = "PortraitRow"
row.add_theme_constant_override("separation", 8)
$Contents.add_child(row)
$Contents.move_child(row, 1)
var frame := PanelContainer.new()
frame.name = "AvatarFrame"
var portrait_style := style.duplicate() as StyleBoxFlat
portrait_style.set_content_margin_all(2)
portrait_style.border_color = Color("daa85d")
portrait_style.bg_color = Color("0b1520")
frame.add_theme_stylebox_override("panel", portrait_style)
row.add_child(frame)
var portrait := TextureRect.new()
portrait.name = "CaptainAvatar"
portrait.custom_minimum_size = Vector2(54, 54)
portrait.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
portrait.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_COVERED
portrait.mouse_filter = Control.MOUSE_FILTER_IGNORE
if ResourceLoader.exists("res://assets/avatars/captain.png"):
portrait.texture = load("res://assets/avatars/captain.png")
frame.add_child(portrait)
var info := VBoxContainer.new()
info.size_flags_horizontal = Control.SIZE_EXPAND_FILL
info.alignment = BoxContainer.ALIGNMENT_CENTER
row.add_child(info)
var designation := Label.new()
designation.text = "KLIKNIJ · WYPOSAŻENIE"
designation.add_theme_font_size_override("font_size", 9)
designation.add_theme_color_override("font_color", Color("91dbea"))
info.add_child(designation)
xp_label.reparent(info, false)
xp_bar.reparent(info, false)
xp_bar.custom_minimum_size.y = 5