86 lines
2.9 KiB
GDScript
86 lines
2.9 KiB
GDScript
## Separate-screen panel displaying the prestige buff graph.
|
|
## Tiles are placed manually in the scene editor — each PrestigeBuffGraphTile has its PrestigeBuffNode
|
|
## resource assigned directly. The panel manages the prestige currency balance display and
|
|
## delegates connection-line drawing to a PrestigeBuffConnectionOverlay child.
|
|
class_name PrestigeBuffGraphPanel
|
|
extends PanelContainer
|
|
|
|
@onready var _balance_label: Label = $MarginContainer/VBoxContainer/BalanceLabel
|
|
@onready var _tiles_area: Control = $MarginContainer/VBoxContainer/TilesArea
|
|
@onready var _close_button: Button = $MarginContainer/VBoxContainer/Header/CloseButton
|
|
@onready var _connection_overlay: PrestigeBuffConnectionOverlay = $MarginContainer/VBoxContainer/TilesArea/ConnectionOverlay
|
|
|
|
var _game_state: LevelGameState
|
|
|
|
|
|
func _ready() -> void:
|
|
_game_state = find_parent("LevelGameState")
|
|
if _game_state == null:
|
|
push_error("PrestigeBuffGraphPanel: Could not find LevelGameState parent")
|
|
return
|
|
|
|
_game_state.currency_changed.connect(_on_currency_changed)
|
|
_close_button.pressed.connect(_on_close_pressed)
|
|
|
|
visibility_changed.connect(_on_visibility_changed)
|
|
_refresh_balance()
|
|
|
|
|
|
## Rebuilds the connection overlay by scanning all PrestigeBuffGraphTile children and matching parent_ids.
|
|
func _refresh_connections() -> void:
|
|
if _connection_overlay == null:
|
|
return
|
|
|
|
var tiles_by_id: Dictionary = {}
|
|
var all_tiles: Array[PrestigeBuffGraphTile] = []
|
|
_collect_tiles(_tiles_area, all_tiles)
|
|
|
|
for tile in all_tiles:
|
|
var node_id: StringName = tile.get_node_id()
|
|
if node_id != &"":
|
|
tiles_by_id[node_id] = tile
|
|
|
|
var connections: Array = []
|
|
for tile in all_tiles:
|
|
if tile.prestige_buff == null:
|
|
continue
|
|
for parent_id in tile.prestige_buff.parent_ids:
|
|
var parent_tile: PrestigeBuffGraphTile = tiles_by_id.get(parent_id, null)
|
|
if parent_tile:
|
|
connections.append([parent_tile, tile])
|
|
|
|
_connection_overlay.set_connections(connections)
|
|
|
|
|
|
## Collects all PrestigeBuffGraphTile nodes rooted at `from`, recursing into every child.
|
|
func _collect_tiles(from: Node, out_tiles: Array[PrestigeBuffGraphTile]) -> void:
|
|
var found: Array[Node] = from.find_children("*", "PrestigeBuffGraphTile", true, false)
|
|
for node in found:
|
|
var tile := node as PrestigeBuffGraphTile
|
|
if tile:
|
|
out_tiles.append(tile)
|
|
|
|
func _refresh_balance() -> void:
|
|
if _game_state == null:
|
|
_balance_label.text = "Prestige Currency: 0"
|
|
return
|
|
|
|
var currency_id: StringName = _game_state.get_prestige_currency_id()
|
|
var balance: BigNumber = _game_state.get_currency_amount_by_id(currency_id)
|
|
_balance_label.text = "Prestige Currency: %s" % balance.to_string_suffix(2)
|
|
|
|
func _on_currency_changed(currency_id: StringName, _new_amount: BigNumber) -> void:
|
|
if currency_id == _game_state.get_prestige_currency_id():
|
|
_refresh_balance()
|
|
|
|
func _on_close_pressed() -> void:
|
|
hide()
|
|
|
|
func _on_visibility_changed() -> void:
|
|
if visible:
|
|
_refresh_balance()
|
|
_refresh_connections()
|
|
|
|
func _on_prestige_buff_toggle_pressed() -> void:
|
|
show()
|