47 lines
1.5 KiB
GDScript
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()
|