Randoloot/tests/levels/freighter_audio_test.gd
2026-10-18 15:11:06 +02:00

62 lines
2.7 KiB
GDScript

extends Node
func _ready() -> void:
GameState.start_new_run()
var game := preload("res://scenes/game/game.tscn").instantiate()
add_child(game)
await get_tree().process_frame
var manager := game.get_node("PlanetExpeditions")
var music: AudioStreamPlayer = game.get_node("GameMusic")
var original_buses := AudioServer.bus_count
for visit in 3:
manager.open_freighter()
var screen: Control = manager.screen
var audio: Node = screen.get_node("FreighterAudio")
assert(get_tree().paused and audio.can_process())
assert(audio._streams.size() == 15)
assert(audio._beds.size() == 2 and audio._voices.size() == 4)
assert(AudioServer.bus_count == original_buses+4)
for id in audio._streams:
var stream: AudioStream = audio._streams[id]
assert(stream != null and stream.get_length() > 0.1)
for bed in audio._beds:
assert(bed.stream.loop_mode == AudioStreamWAV.LOOP_FORWARD)
assert(bed.stream.loop_end > bed.stream.loop_begin)
assert(bed.playing and not bed.stream_paused)
var music_before := music.get_playback_position()
var bed_before: float = audio._beds[0].get_playback_position()
await get_tree().create_timer(0.25,true).timeout
assert(music.get_playback_position() > music_before)
assert(audio._beds[0].get_playback_position() > bed_before)
screen._select_section("workshop")
var actions: int = audio.played_count
screen._select_section("workshop")
screen._hover_section("hangar")
assert(audio.played_count == actions,"Repeated clicks and hover must not spam doors")
audio._next_tool = audio._elapsed
audio._process(0.1)
assert(audio._last_tool != "")
for index in 20: audio.play_effect("metal_1",0,-20,true)
assert(audio._voices.size() == 4,"Rapid actions must keep bounded polyphony")
for voice in audio._voices: voice.stop()
audio.set_maintenance_needed(true)
audio._next_tool = INF
audio._next_console = INF
audio._next_pressure = INF
audio._process(4.1)
assert(is_inf(audio._alarm_due))
var warnings: int = audio.played_count
audio._process(1.0)
assert(audio.played_count == warnings,"No repeated false emergency loop")
audio.set_maintenance_needed(false)
assert(is_inf(audio._alarm_due))
screen.closed.emit()
assert(not get_tree().paused)
assert(AudioServer.bus_count == original_buses,"All temporary panning buses must be removed on departure")
assert(music.playing and not music.stream_paused)
await get_tree().process_frame
game.queue_free()
await get_tree().process_frame
print("FREIGHTER AUDIO PASS: 15 streams, seamless loop configuration, paused playback with uninterrupted music, room foley, hover/click debounce, bounded voices, one maintenance warning, cleanup across three docking visits")
get_tree().quit()