- assets/audio/music/zombie_industrial_loop.ogg: 57.60 s Ogg Vorbis loop generated locally with YuE2-3B on the Tesla V100 (score written for this track; vocals removed with HTDemucs). The loop is spliced at the track's structural repeat with a 0.6 s crossfade: measured seam dip <= 1.6 dB. - scripts/main.gd: "Music" AudioStreamPlayer at -11 dB, started at boot on desktop and on the start click on Web (browser autoplay policy). It forces stream.loop at runtime because the Web staging step re-imports the OGG with loop=false. - tools/test_music.gd: soundtrack test (loop, length, volume, playback, still playing after player death). - docs/MUSIC.md: source, loop construction, verification, licence. - docs/WEB-DEPLOY.md: release ab6054111f5919a8 notes. Initial commit of the project.
25 lines
935 B
GDScript
25 lines
935 B
GDScript
extends SceneTree
|
|
func _initialize() -> void:
|
|
call_deferred("run_test")
|
|
func run_test() -> void:
|
|
var world = load("res://scenes/main.tscn").instantiate()
|
|
root.add_child(world)
|
|
world.player.hp = 100000
|
|
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
|
await create_timer(5.2).timeout
|
|
assert(world.wave == 1 and world.alive == 6 and not world.spawning)
|
|
for zombie in get_nodes_in_group("live_zombies"):
|
|
zombie.take_damage(1000, zombie.global_position.y + 0.9)
|
|
assert(world.alive == 0 and world.wave_pending)
|
|
world._check_wave()
|
|
world._check_wave() # no duplicate next-wave scheduling
|
|
await create_timer(3.2).timeout
|
|
assert(world.wave == 2)
|
|
await create_timer(6.4).timeout
|
|
assert(world.wave == 2 and world.alive == 8 and not world.spawning)
|
|
assert(get_nodes_in_group("zombie_corpses").size() == 6)
|
|
print("PASS: wave1=6, clear -> wave2=8, single transition, corpses retained")
|
|
world.queue_free()
|
|
await process_frame
|
|
quit()
|