Randoloot/scripts/ui/ship_inventory_panel.gd

69 lines
2.7 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
var _inventory: ShipInventory
var _drawer_open := false
var _slide_tween: Tween
var _minerals_label: Label
var drawer_width := 560.0
func _ready() -> void:
close_button.pressed.connect(close_drawer)
_minerals_label = Label.new()
_minerals_label.add_theme_font_size_override("font_size", 10)
$Contents.add_child(_minerals_label)
$Contents.move_child(_minerals_label, $Contents/CargoGrid.get_index())
_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.name = "Cargo%d" % (index + 1)
slot.set("slot_kind", "cargo")
slot.set("slot_index", index)
cargo_grid.add_child(slot)
_refresh_title()
func _refresh_title() -> void:
_minerals_label.text = "SUROWCE · Tytan: %d · Żelazo: %d · Aluminium: %d" % [GameState.captain.minerals.get("titanium", 0), GameState.captain.minerals.get("iron", 0), GameState.captain.minerals.get("aluminium", 0)]
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()]
ammunition_label.text += " · GAMMA: %d" % _inventory.irradiated_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
GameState.hud_panel_state["inventory_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
GameState.hud_panel_state["inventory_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)