Files
enne2 ae32ad9615 Classifica globale: API dei punteggi, schermata iniziale e nome memorizzato
- services/scores-api: microservizio (solo stdlib) con SQLite WAL, idempotenza per
  submission_id, limiti di frequenza e validazione; immagine Docker non-root.
- nginx: reverse proxy su /api/zombie-fps/ (stessa origine del gioco, niente CORS).
- scripts/leaderboard.gd: client HTTP con retry idempotente; su desktop la classifica
  resta disattivata senza --api=, cosi' i test non sporcano la classifica pubblica.
- scripts/player_profile.gd: nome, id anonimo e miglior punteggio in user:// e in
  window.localStorage; il nome scelto non viene piu' richiesto; riparazione dei
  profili con la stringa "null".
- scripts/start_screen.gd: menu con nome, GIOCA e classifica; la partita parte solo
  dal pulsante (via la rete di sicurezza sull'input, Invio nel campo non avvia).
- scripts/main.gd, player.gd: avvio esplicito, segnale died, nota dell'invio.
- tools: test_scores_api.py (42), test_leaderboard (14), test_player_profile (21),
  test_start_screen (10); suite esistenti adeguate all'avvio manuale.
- docs/HIGHSCORES.md + docs/WEB-DEPLOY.md aggiornati.
2026-10-13 23:26:00 +02:00

39 lines
1.5 KiB
GDScript

extends SceneTree
## Verifica la colonna sonora in loop: nodo presente, stream OGG con loop attivo,
## volume da sottofondo, durata attesa e riproduzione avviata.
const EXPECTED_LENGTH := 57.6
const EXPECTED_VOLUME_DB := -11.0
func _initialize() -> void:
call_deferred("run_test")
func run_test() -> void:
var world = load("res://scenes/main.tscn").instantiate()
root.add_child(world)
world.start_game("Test", false) # come premere GIOCA, senza toccare il profilo salvato
await process_frame
var players := get_nodes_in_group("music")
assert(players.size() == 1)
var music: AudioStreamPlayer = players[0]
assert(music.name == "Music")
assert(music.stream is AudioStreamOggVorbis)
assert(music.stream.loop)
assert(absf(music.volume_db - EXPECTED_VOLUME_DB) < 0.001)
var length: float = music.stream.get_length()
assert(absf(length - EXPECTED_LENGTH) < 0.3)
assert(music.playing)
var first := music.get_playback_position()
await create_timer(0.5).timeout
assert(music.playing)
var second := music.get_playback_position()
print("PASS: Music loop=%s durata=%.2fs volume=%.1fdB posizione %.2f -> %.2f | driver audio: %s"
% [music.stream.loop, length, music.volume_db, first, second, AudioServer.get_driver_name()])
# La musica deve restare in riproduzione anche a giocatore morto.
world.player.take_damage(9999)
await create_timer(0.3).timeout
assert(music.playing)
print("PASS: musica attiva anche dopo la morte del giocatore")
world.queue_free()
await process_frame
quit()