Files
idle/core/prestige/prestige_buff_graph_panel.gd
Michele Rossi 81a4058b04 systems rework: buffs, prestige graph, research, modular architecture
Decouples core systems from centralized globals in favor of catalogue-based architecture and data-driven content.

   Key changes:
   - Prestige: node-based buff tech tree, graph panel, progress bar
   - Research: multi-worker system, per-generator research, xp generation
   - Ascension: meta-currency layer via multi-currency prestige resets
   - Buffs: refactored as generator-independent via catalogues
   - UI: currency panel, edge-scrolling camera + zoom, current-goal panel
   - Alchemy Tower: crafting building with recipe/cost system
   - Testing: 7 test suites (ascension, prestige, research, goals)
   - Content: migrated from hardcoded idles/ to gym format (tiny_sword)
2026-05-07 20:36:21 +00:00

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