205 lines
5.1 KiB
GDScript
205 lines
5.1 KiB
GDScript
extends Node
|
|
## Settings Service
|
|
##
|
|
## Singleton service for application configuration.
|
|
## Stores URLs, feature flags, and other runtime settings.
|
|
##
|
|
## Usage:
|
|
## Settings.get_api_url()
|
|
## Settings.get_web_url()
|
|
## Settings.set_environment("production")
|
|
|
|
# Environment types
|
|
enum Env {
|
|
DEVELOPMENT,
|
|
STAGING,
|
|
PRODUCTION
|
|
}
|
|
|
|
# Current environment
|
|
var _current_environment: int = Env.DEVELOPMENT
|
|
|
|
# URL Configuration
|
|
var _api_urls := {
|
|
Env.DEVELOPMENT: "http://localhost:5000",
|
|
Env.STAGING: "https://staging-api.codeofconquest.com",
|
|
Env.PRODUCTION: "https://api.codeofconquest.com"
|
|
}
|
|
|
|
var _web_urls := {
|
|
Env.DEVELOPMENT: "http://localhost:8000", # Flask serves web pages in dev
|
|
Env.STAGING: "https://staging.codeofconquest.com",
|
|
Env.PRODUCTION: "https://www.codeofconquest.com"
|
|
}
|
|
|
|
# Feature flags
|
|
var _features := {
|
|
"enable_debug_logging": true,
|
|
"enable_analytics": false,
|
|
"enable_multiplayer": false,
|
|
"max_characters_per_user": 5
|
|
}
|
|
|
|
# User preferences (persisted)
|
|
var _preferences := {
|
|
"remember_login": true,
|
|
"auto_save": true,
|
|
"sound_enabled": true,
|
|
"music_enabled": true,
|
|
"sound_volume": 0.8,
|
|
"music_volume": 0.6
|
|
}
|
|
|
|
# Save file configuration
|
|
const SETTINGS_FILE_PATH := "user://settings.save"
|
|
const SETTINGS_VERSION := 1
|
|
|
|
|
|
func _ready() -> void:
|
|
_load_settings()
|
|
_detect_environment()
|
|
print("[Settings] Service initialized")
|
|
print("[Settings] Environment: %s" % _environment_to_string(_current_environment))
|
|
print("[Settings] API URL: %s" % get_api_url())
|
|
print("[Settings] Web URL: %s" % get_web_url())
|
|
|
|
|
|
## Get current API base URL
|
|
func get_api_url() -> String:
|
|
return _api_urls.get(_current_environment, _api_urls[Env.DEVELOPMENT])
|
|
|
|
|
|
## Get current web frontend base URL
|
|
func get_web_url() -> String:
|
|
return _web_urls.get(_current_environment, _web_urls[Env.DEVELOPMENT])
|
|
|
|
|
|
## Get current environment
|
|
func get_environment() -> int:
|
|
return _current_environment
|
|
|
|
|
|
## Set environment (for testing/switching)
|
|
func set_environment(env: int) -> void:
|
|
_current_environment = env
|
|
print("[Settings] Environment changed to: %s" % _environment_to_string(env))
|
|
print("[Settings] API URL: %s" % get_api_url())
|
|
print("[Settings] Web URL: %s" % get_web_url())
|
|
|
|
|
|
## Check if a feature is enabled
|
|
func is_feature_enabled(feature_name: String) -> bool:
|
|
return _features.get(feature_name, false)
|
|
|
|
|
|
## Get feature value
|
|
func get_feature(feature_name: String, default: Variant = null) -> Variant:
|
|
return _features.get(feature_name, default)
|
|
|
|
|
|
## Set feature flag (for testing/debugging)
|
|
func set_feature(feature_name: String, value: Variant) -> void:
|
|
_features[feature_name] = value
|
|
print("[Settings] Feature updated: %s = %s" % [feature_name, value])
|
|
|
|
|
|
## Get user preference
|
|
func get_preference(key: String, default: Variant = null) -> Variant:
|
|
return _preferences.get(key, default)
|
|
|
|
|
|
## Set user preference
|
|
func set_preference(key: String, value: Variant) -> void:
|
|
_preferences[key] = value
|
|
print("[Settings] Preference updated: %s = %s" % [key, value])
|
|
_save_settings()
|
|
|
|
|
|
## Get all preferences
|
|
func get_all_preferences() -> Dictionary:
|
|
return _preferences.duplicate()
|
|
|
|
|
|
## Auto-detect environment based on OS and build flags
|
|
func _detect_environment() -> void:
|
|
# Check for --production command line argument
|
|
var args := OS.get_cmdline_args()
|
|
if "--production" in args:
|
|
_current_environment = Env.PRODUCTION
|
|
return
|
|
|
|
if "--staging" in args:
|
|
_current_environment = Env.STAGING
|
|
return
|
|
|
|
# Default to development
|
|
_current_environment = Env.DEVELOPMENT
|
|
|
|
|
|
## Save settings to disk
|
|
func _save_settings() -> void:
|
|
var save_data := {
|
|
"version": SETTINGS_VERSION,
|
|
"preferences": _preferences,
|
|
"timestamp": Time.get_unix_time_from_system()
|
|
}
|
|
|
|
var file := FileAccess.open(SETTINGS_FILE_PATH, FileAccess.WRITE)
|
|
if file == null:
|
|
push_error("[Settings] Failed to open settings file for writing: %s" % FileAccess.get_open_error())
|
|
return
|
|
|
|
file.store_string(JSON.stringify(save_data))
|
|
file.close()
|
|
|
|
print("[Settings] Settings saved to %s" % SETTINGS_FILE_PATH)
|
|
|
|
|
|
## Load settings from disk
|
|
func _load_settings() -> void:
|
|
if not FileAccess.file_exists(SETTINGS_FILE_PATH):
|
|
print("[Settings] No settings file found, using defaults")
|
|
return
|
|
|
|
var file := FileAccess.open(SETTINGS_FILE_PATH, FileAccess.READ)
|
|
if file == null:
|
|
push_error("[Settings] Failed to open settings file for reading: %s" % FileAccess.get_open_error())
|
|
return
|
|
|
|
var json_string := file.get_as_text()
|
|
file.close()
|
|
|
|
var json := JSON.new()
|
|
var parse_error := json.parse(json_string)
|
|
|
|
if parse_error != OK:
|
|
push_error("[Settings] Failed to parse settings file")
|
|
return
|
|
|
|
var save_data: Dictionary = json.data
|
|
|
|
# Check version
|
|
if save_data.get("version", 0) != SETTINGS_VERSION:
|
|
print("[Settings] Settings file version mismatch, using defaults")
|
|
return
|
|
|
|
# Restore preferences
|
|
var saved_prefs = save_data.get("preferences", {})
|
|
for key in saved_prefs:
|
|
_preferences[key] = saved_prefs[key]
|
|
|
|
print("[Settings] Settings loaded from %s" % SETTINGS_FILE_PATH)
|
|
|
|
|
|
## Convert environment enum to string
|
|
func _environment_to_string(env: int) -> String:
|
|
match env:
|
|
Env.DEVELOPMENT:
|
|
return "Development"
|
|
Env.STAGING:
|
|
return "Staging"
|
|
Env.PRODUCTION:
|
|
return "Production"
|
|
_:
|
|
return "Unknown"
|