Randoloot/scripts/ui/ship_inventory_panel.gd
2026-10-11 17:42:46 +02:00

79 lines
3.1 KiB
GDScript

extends PanelContainer
const SLOT_SCENE := preload("res://scenes/ui/inventory_slot_view.tscn")
const CARGO_SIZE := 20
@onready var cargo_grid: GridContainer = $Contents/CargoGrid
@onready var close_button: Button = $Contents/Header/CloseButton
@onready var title_label: Label = $Contents/Header/Title
@onready var ammunition_label: Label = $Contents/Ammunition/Count
@onready var craft_button: Button = $Contents/Ammunition/CraftButton
var _inventory: ShipInventory
var _drawer_open := false
var _slide_tween: Tween
var _missile_button: Button
var drawer_width := 780.0
func _ready() -> void:
close_button.pressed.connect(close_drawer)
craft_button.pressed.connect(_craft_ammunition)
craft_button.text = "TWÓRZ +%d AMUNICJI (%.0f części)" % [ShipInventory.AMMUNITION_CRAFT_AMOUNT, ShipInventory.AMMUNITION_CRAFT_PARTS_COST]
var missile_row := HBoxContainer.new()
$Contents.add_child(missile_row)
$Contents.move_child(missile_row, $Contents/CargoGrid.get_index())
_missile_button = Button.new()
_missile_button.text = "TWÓRZ +1 RAKIETĘ (%.0f części)" % ShipInventory.MISSILE_CRAFT_PARTS_COST
_missile_button.tooltip_text = "Amunicja do obu typów wyrzutni rakiet. Wyrzutnie zdobywasz jako loot."
_missile_button.add_theme_font_size_override("font_size", 11)
_missile_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
_missile_button.pressed.connect(func() -> void: _inventory.craft_missile())
missile_row.add_child(_missile_button)
_inventory = get_tree().get_first_node_in_group("ship_inventory") as ShipInventory
if _inventory:
_inventory.inventory_changed.connect(_refresh_title)
_inventory.ammunition_changed.connect(_refresh_title)
GameState.captain.changed.connect(_refresh_title)
for index in CARGO_SIZE:
var slot := SLOT_SCENE.instantiate()
slot.set("slot_kind", "cargo")
slot.set("slot_index", index)
cargo_grid.add_child(slot)
_refresh_title()
func _refresh_title() -> void:
craft_button.disabled = _inventory == null or not _inventory.can_craft_ammunition()
_missile_button.disabled = _inventory == null or not _inventory.can_craft_missile()
if _inventory:
title_label.text = "MAGAZYN (%d/%d) · Części: %.1f" % [_inventory.get_cargo_used(), CARGO_SIZE, GameState.captain.parts]
ammunition_label.text = "AMUNICJA: %d · RAKIETY: %d" % [_inventory.ammunition, _inventory.get_missile_count()]
func _craft_ammunition() -> void:
if _inventory:
_inventory.craft_ammunition()
func toggle_drawer() -> void:
_set_drawer_open(not _drawer_open)
func close_drawer(immediately: bool = false) -> void:
if immediately:
if _slide_tween != null and _slide_tween.is_running():
_slide_tween.kill()
_drawer_open = false
position.x = drawer_width
hide()
return
_set_drawer_open(false)
func _set_drawer_open(value: bool) -> void:
if _slide_tween != null and _slide_tween.is_running():
_slide_tween.kill()
_drawer_open = value
if value and not visible:
position = Vector2(drawer_width, 0)
show()
_slide_tween = create_tween()
_slide_tween.tween_property(self, "position:x", 0.0 if value else drawer_width, 0.25).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT if value else Tween.EASE_IN)
if not value:
_slide_tween.tween_callback(hide)