extends Node ## Unified interface for backend services ## All platforms use Nakama for achievements, leaderboards, and shop ## Steam is only used for authentication (auth session ticket for Nakama login) enum Platform { DESKTOP_STEAM, DESKTOP_NAKAMA, MOBILE_NAKAMA } var current_platform: Platform = Platform.DESKTOP_STEAM var steamworks_manager: Node # Only for auth ticket retrieval var nakama_backend: Node func _ready() -> void: _detect_platform() _initialize_backend() func _detect_platform() -> void: # Detect if running on mobile or desktop if OS.has_feature("android") or OS.has_feature("ios"): current_platform = Platform.MOBILE_NAKAMA else: # Desktop: detect Steam by checking if GodotSteam class exists # OS.has_feature("steam") is only true when launched through Steam client, # but ClassDB.class_exists("Steam") is true whenever the GDExtension is enabled if ClassDB.class_exists("Steam"): current_platform = Platform.DESKTOP_STEAM else: current_platform = Platform.DESKTOP_NAKAMA func _initialize_backend() -> void: # All platforms use Nakama for backend features # Steamworks is only initialized for auth ticket retrieval when GodotSteam is available if current_platform == Platform.DESKTOP_STEAM: _initialize_steamworks_for_auth() _initialize_nakama() func _initialize_steamworks_for_auth() -> void: var steamworks_script = load("res://scripts/services/steamworks_manager.gd") if steamworks_script: steamworks_manager = steamworks_script.new() add_child(steamworks_manager) print("BackendService: Initialized Steamworks for auth only") else: push_error("BackendService: Failed to load Steamworks manager") func _initialize_nakama() -> void: nakama_backend = NakamaManager if nakama_backend: _connect_nakama_signals() print("BackendService: Initialized Nakama backend") else: push_error("BackendService: NakamaManager not found") func _connect_nakama_signals() -> void: # Nakama signals are handled directly by NakamaManager # No need to connect through BackendService pass ## Achievement Methods # All platforms use Nakama for achievements func unlock_achievement(achievement_id: String) -> void: if nakama_backend: # Nakama achievement implementation pass func set_achievement_progress(achievement_id: String, current: int, max: int) -> void: if nakama_backend: # Nakama progress implementation pass func get_achievement_progress(achievement_id: String) -> Dictionary: if nakama_backend: # Nakama get progress implementation pass return {} func get_all_achievements() -> Array: if nakama_backend: # Nakama get all achievements implementation pass return [] ## Leaderboard Methods # All platforms use Nakama for leaderboards func submit_leaderboard_score(leaderboard_id: String, score: int) -> void: if nakama_backend: # Nakama leaderboard submission - use UserProfileManager.submit_to_leaderboard() await UserProfileManager.submit_to_leaderboard() func get_leaderboard_entries(leaderboard_id: String, range_start: int = 1, range_end: int = 10) -> void: if nakama_backend: # Nakama get leaderboard entries - use LeaderboardPanel._fetch_leaderboard_data() # This is handled by the UI panel directly pass ## Shop Methods # All platforms use Nakama for shop func purchase_shop_item(item_id: String) -> void: if nakama_backend: # Nakama shop purchase - use UserProfileManager.purchase_item() # This is handled by the UI panel directly via ShopPanel pass func get_shop_items() -> void: if nakama_backend: # Nakama get shop items - use UserProfileManager.fetch_shop_catalog() # This is handled by the UI panel directly via ShopPanel pass ## Utility Methods func is_initialized() -> bool: # Nakama is the primary backend for all features if nakama_backend != null: return true # Steamworks is optional (only for auth) return false func get_platform_name() -> String: return Platform.keys()[current_platform] func get_steamworks_manager() -> Node: # Returns SteamworksManager for auth ticket retrieval (Steam login) return steamworks_manager