xanarch-td/scripts/ui/BuildPanel.gd
2026-06-03 21:53:16 -04:00

47 lines
1.5 KiB
GDScript

## BuildPanel.gd
## Displays available towers for the selected player's race and handles placement.
extends PanelContainer
@onready var tower_list: VBoxContainer = $ScrollContainer/TowerList
@onready var race_label: Label = $RaceLabel
@onready var close_btn: Button = $CloseButton
var _player_id: int = 0
var _selected_slot: Node = null
var _tower_defs: Array = []
func _ready() -> void:
close_btn.pressed.connect(hide)
EventBus.phase_changed.connect(_on_phase_changed)
func open_for_slot(slot: Node, player_id: int) -> void:
_selected_slot = slot
_player_id = player_id
var race = GameState.get_player_race(player_id)
race_label.text = race.capitalize()
_tower_defs = DataLoader.load_towers(race)
_populate_list()
show()
func _populate_list() -> void:
for child in tower_list.get_children():
child.queue_free()
for tower in _tower_defs:
var btn := Button.new()
var cost = tower.get("cost_minerals", 0)
btn.text = "%s [%dM]" % [tower.get("id", "?").replace("_", " ").capitalize(), cost]
btn.disabled = Economy.get_minerals(_player_id) < cost
btn.pressed.connect(_on_tower_selected.bind(tower))
tower_list.add_child(btn)
func _on_tower_selected(tower_data: Dictionary) -> void:
if _selected_slot == null:
return
var cost = tower_data.get("cost_minerals", 0)
if Economy.spend_minerals(_player_id, cost):
_selected_slot.place_tower(tower_data, _player_id)
hide()
func _on_phase_changed(new_phase: GameState.Phase) -> void:
if new_phase != GameState.Phase.BUILD:
hide()