Files
zombie-fps/tools/test_death_effects.gd
T
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

54 lines
2.1 KiB
GDScript

extends SceneTree
var world: Node3D
func _initialize() -> void:
call_deferred("run_test")
func run_test() -> void:
world = load("res://scenes/main.tscn").instantiate()
root.add_child(world)
world.start_game("Test", false) # come premere GIOCA, senza toccare il profilo salvato
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
await create_timer(2.4).timeout
var zombie: Node3D
for child in world.get_children():
if child.get_script() == world.ZombieScript:
zombie = child
break
assert(zombie != null)
world.player.hp = 10000
zombie.position = Vector3(0, 0, -3)
if zombie.entry_tween:
zombie.entry_tween.kill()
zombie.entering = false
var point := zombie.global_position + Vector3(0, 1.2, 0)
preload("res://scripts/blood_effects.gd").impact(world, point, Vector3(0, 0, -1))
zombie.take_damage(1000, point.y)
assert(zombie.dead and zombie.collision_layer == 0)
await create_timer(0.2).timeout
assert(get_nodes_in_group("blood_stains").size() == 1)
if DisplayServer.get_name() != "headless":
await RenderingServer.frame_post_draw
root.get_texture().get_image().save_png("/tmp/zombie-blood.png")
await create_timer(4.3).timeout
assert(is_instance_valid(zombie) and zombie.is_inside_tree())
assert(absf(zombie.position.y) < 0.01)
assert(get_nodes_in_group("zombie_corpses").has(zombie))
if DisplayServer.get_name() != "headless":
await RenderingServer.frame_post_draw
root.get_texture().get_image().save_png("/tmp/zombie-corpse.png")
world.player.take_damage(20000)
world.player.take_damage(12)
assert(world.player.death_started and world.player.hp == 0)
var ammo: int = world.player.ammo
world.player.shoot()
assert(world.player.ammo == ammo)
await create_timer(3).timeout
assert(world.player.camera.position.y < 0.25)
assert(world.player.death_overlay.color.a > 0.99)
if DisplayServer.get_name() != "headless":
await RenderingServer.frame_post_draw
root.get_texture().get_image().save_png("/tmp/zombie-death-fade.png")
print("PASS: persistent corpse, blood decal, single death, blocked shooting, camera fall, black fade")
world.queue_free()
await process_frame
quit()