74 lines
2.4 KiB
GDScript
74 lines
2.4 KiB
GDScript
extends Node
|
|
|
|
# EventBus - Centralized Observer Pattern for inter-manager communication
|
|
# Replaces direct cross-references between managers
|
|
|
|
# =============================================================================
|
|
# Events Registry
|
|
# =============================================================================
|
|
|
|
# Player Events
|
|
const EVENT_PLAYER_JOINED = "player_joined"
|
|
const EVENT_PLAYER_LEFT = "player_left"
|
|
const EVENT_PLAYER_READY = "player_ready"
|
|
|
|
# Match Events
|
|
const EVENT_MATCH_STARTED = "match_started"
|
|
const EVENT_MATCH_ENDED = "match_ended"
|
|
const EVENT_GAME_MODE_CHANGED = "game_mode_changed"
|
|
|
|
# Economy Events
|
|
const EVENT_CURRENCY_CHANGED = "currency_changed"
|
|
const EVENT_ITEM_PURCHASED = "item_purchased"
|
|
const EVENT_GACHA_PULL = "gacha_pull"
|
|
|
|
# Profile Events
|
|
const EVENT_PROFILE_LOADED = "profile_loaded"
|
|
const EVENT_PROFILE_UPDATED = "profile_updated"
|
|
const EVENT_AVATAR_CHANGED = "avatar_changed"
|
|
|
|
# Session Events
|
|
const EVENT_SESSION_REFRESHED = "session_refreshed"
|
|
const EVENT_SESSION_EXPIRED = "session_expired"
|
|
|
|
# =============================================================================
|
|
# Signal Bus
|
|
# =============================================================================
|
|
|
|
signal event_emitted(event_name: String, data: Variant)
|
|
|
|
# =============================================================================
|
|
# Internal Registry
|
|
# =============================================================================
|
|
|
|
var _listeners: Dictionary = {} # event_name -> Array[Callable]
|
|
|
|
# =============================================================================
|
|
# Public API
|
|
# =============================================================================
|
|
|
|
func emit(event_name: String, data: Variant = null) -> void:
|
|
"""Emit an event to all registered listeners."""
|
|
if _listeners.has(event_name):
|
|
for callback in _listeners[event_name]:
|
|
if data != null:
|
|
callback.call(data)
|
|
else:
|
|
callback.call()
|
|
event_emitted.emit(event_name, data)
|
|
|
|
func on(event_name: String, callback: Callable) -> void:
|
|
"""Subscribe to an event."""
|
|
if not _listeners.has(event_name):
|
|
_listeners[event_name] = []
|
|
_listeners[event_name].append(callback)
|
|
|
|
func off(event_name: String, callback: Callable) -> void:
|
|
"""Unsubscribe from an event."""
|
|
if _listeners.has(event_name):
|
|
_listeners[event_name].erase(callback)
|
|
|
|
func clear() -> void:
|
|
"""Remove all listeners. Useful for cleanup between scenes."""
|
|
_listeners.clear()
|