## 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()