Leaderboard attiva di default, senza configurazione
La classifica globale non dipende più da un argomento: sui build desktop il client usa il servizio pubblico DEFAULT_API_BASE (https://enne2.net/api/zombie-fps). - scripts/leaderboard.gd: resolve_base() statica con priorità --api=<url> (test) → --offline/--no-api (opt-out esplicito per le partite di prova) → origine della pagina sul Web → servizio pubblico. Rimosso l'avviso "Classifica disattivata". - Le suite di test (--script) restano spente a meno di un --api= esplicito, così nessun test può scrivere nella classifica pubblica. - tools/test_start_screen.gd: verifica default attivo, opt-out e override; tools/test_rebalance_branding.gd: suite di test senza invii. - docs/HIGHSCORES.md: nuova regola della base URL e diagnostica aggiornata. Verifiche: test_start_screen 18/18 PASS con display; test_rebalance_branding 14/14 PASS; test_leaderboard.sh invariato (12 PASS, 2 FAIL preesistenti su questa macchina anche prima della modifica).
This commit is contained in:
+34
-10
@@ -3,8 +3,12 @@ extends Node
|
||||
##
|
||||
## - Web: stessa origine della pagina (window.location.origin) + /api/zombie-fps, cosi'
|
||||
## il browser non ha bisogno di CORS.
|
||||
## - Desktop: nessuna classifica, a meno di --api=http://... (serve ai test). Cosi' una
|
||||
## partita di prova non finisce MAI nella classifica pubblica.
|
||||
## - Desktop: servizio pubblico `DEFAULT_API_BASE`, quindi la classifica e' ATTIVA DI
|
||||
## DEFAULT: non serve nessuna configurazione ne' argomento per leggere e inviare.
|
||||
## - Override espliciti: `--api=<url>` punta a un altro servizio (test), `--offline`
|
||||
## (alias `--no-api`) spegne la classifica per le partite di prova.
|
||||
## - Suite di test (avviate con `--script`): spente, a meno di un `--api=` esplicito,
|
||||
## cosi' nessun test puo' scrivere nella classifica pubblica.
|
||||
## - Due nodi HTTPRequest separati: Godot non ammette due richieste insieme sullo
|
||||
## stesso nodo, e lettura e invio possono sovrapporsi (l'invio avviene alla morte).
|
||||
## - Un errore di rete non deve mai rompere il gioco: si segnala e basta.
|
||||
@@ -14,6 +18,8 @@ signal score_submitted(info: Dictionary)
|
||||
signal submit_failed(reason: String)
|
||||
|
||||
const API_PATH := "/api/zombie-fps"
|
||||
## Servizio pubblico: la classifica funziona senza alcuna configurazione.
|
||||
const DEFAULT_API_BASE := "https://enne2.net/api/zombie-fps"
|
||||
const TOP_LIMIT := 10
|
||||
const RETRY_DELAY := 6.0
|
||||
const RETRY_LIMIT := 3
|
||||
@@ -22,7 +28,7 @@ const DISABLED_REASON := "classifica non attiva in questa build"
|
||||
|
||||
var player_id := ""
|
||||
var base_url := ""
|
||||
## Vero quando non c'e' nessun servizio da usare (build desktop senza --api=).
|
||||
## Vero solo quando il servizio e' spento apposta (--offline) o in una suite di test.
|
||||
var disabled := false
|
||||
|
||||
var _get_request: HTTPRequest
|
||||
@@ -52,19 +58,37 @@ func _ready() -> void:
|
||||
add_child(_retry_timer)
|
||||
_retry_timer.timeout.connect(_send_pending)
|
||||
|
||||
## Ordine di priorita': --api=..., poi l'origine della pagina sul Web. Senza nessuno
|
||||
## dei due non si usa NIENTE: una build desktop di prova non deve poter inviare
|
||||
## punteggi alla classifica pubblica (e' successo: righe "Test" in produzione).
|
||||
func _resolve_base() -> String:
|
||||
for argument in OS.get_cmdline_user_args():
|
||||
## Ordine di priorita': `--api=<url>` (test), `--offline`/`--no-api` (spegne), origine
|
||||
## della pagina sul Web, altrimenti il servizio pubblico. La classifica e' quindi
|
||||
## abilitata di default e non dipende da configurazione; `--offline` esiste solo per
|
||||
## le partite di prova che non devono finire nella classifica pubblica.
|
||||
## `script_run` e' il guard delle suite di test: non e' configurazione utente, la
|
||||
## passa `_resolve_base()` quando il processo gira con `--script`.
|
||||
static func resolve_base(user_args: PackedStringArray, script_run := false) -> String:
|
||||
for argument in user_args:
|
||||
if argument.begins_with("--api="):
|
||||
return argument.substr(6).trim_suffix("/")
|
||||
for argument in user_args:
|
||||
if argument == "--offline" or argument == "--no-api":
|
||||
return ""
|
||||
if OS.has_feature("web") and ClassDB.class_exists("JavaScriptBridge"):
|
||||
var origin := str(JavaScriptBridge.eval("window.location.origin", true))
|
||||
if origin.begins_with("http"):
|
||||
return origin.trim_suffix("/") + API_PATH
|
||||
push_warning("Classifica disattivata: usa --api=http://host:porta per indicare il servizio.")
|
||||
return ""
|
||||
if script_run:
|
||||
return "" # suite di test: mai verso il servizio pubblico
|
||||
return DEFAULT_API_BASE
|
||||
|
||||
## Le suite di test girano come script (`--script ...`): in quel caso la classifica
|
||||
## resta spenta, a meno che il test non abbia passato un suo `--api=`.
|
||||
static func _is_script_run() -> bool:
|
||||
for argument in OS.get_cmdline_args():
|
||||
if argument == "--script" or argument == "-s":
|
||||
return true
|
||||
return false
|
||||
|
||||
func _resolve_base() -> String:
|
||||
return resolve_base(OS.get_cmdline_user_args(), _is_script_run())
|
||||
|
||||
## Godot non ammette due richieste insieme sullo stesso nodo: una lettura chiesta
|
||||
## mentre la precedente e' in volo viene rimandata a fine risposta invece di fallire
|
||||
|
||||
Reference in New Issue
Block a user