Added Glitch Room Source code to Gitty

This commit is contained in:
Jeff Luke committed 2026-10-04 11:31:17 -07:00
commit 1ac9eb5644
505 files changed
+28504

No files matched your search

+96
View File
@@ -0,0 +1,96 @@
extends Node
## Separate effects from ambience so pellet sounds never restart the siren.
## Tune this to the end of the fourth wah in death_0.wav.
const DEATH_INTRO_SECONDS := 1.35
var death_cutoff: Timer
var effects: Array[AudioStreamPlayer] = []
var ambience: AudioStreamPlayer
var streams := {}
var background := ""
var effect_cursor := 0
var death_tail := false
var intro_pending := false
func _ready() -> void:
death_cutoff = Timer.new()
death_cutoff.one_shot = true
add_child(death_cutoff)
death_cutoff.timeout.connect(_death_finished)
for i in range(4):
var voice := AudioStreamPlayer.new()
voice.volume_db = -10.0
add_child(voice)
effects.append(voice)
ambience = AudioStreamPlayer.new()
ambience.volume_db = -15.0
add_child(ambience)
ambience.finished.connect(_ambient_finished)
effects[3].finished.connect(_death_finished)
func stream(name: String) -> AudioStream:
if not streams.has(name):
var path := "res://games/pacman/audio/%s.wav" % name
if not ResourceLoader.exists(path): return null
streams[name] = load(path)
return streams[name]
func play_effect(name: String) -> void:
if name == "death":
stop_all()
death_tail = true
effects[3].stream = stream("death_0")
effects[3].play()
death_cutoff.start(DEATH_INTRO_SECONDS)
return
var voice: AudioStreamPlayer = effects[0] if name.begins_with("eat_dot") else effects[1 + effect_cursor % 2]
if not name.begins_with("eat_dot"): effect_cursor += 1
voice.stream = stream(name)
if voice.stream != null: voice.play()
func _death_finished() -> void:
if not death_tail: return
death_tail = false
death_cutoff.stop()
effects[3].stop()
effects[3].stream = stream("death_1")
effects[3].play()
func set_background(name: String) -> void:
if name == background: return
background = name
ambience.stop()
intro_pending = false
if name.is_empty(): return
var intro := stream(name + "_firstloop")
# Join PCM samples before playback: no finished-signal gap at the intro seam.
ambience.stream = _loop_stream(name, intro)
if ambience.stream != null: ambience.play()
func _loop_stream(name: String, intro: AudioStream = null) -> AudioStream:
var source := stream(name)
if source is AudioStreamWAV:
var loop: AudioStreamWAV = source.duplicate()
loop.loop_mode = AudioStreamWAV.LOOP_FORWARD
loop.loop_begin = 0
loop.loop_end = roundi(loop.get_length() * loop.mix_rate)
if intro is AudioStreamWAV and intro.format == loop.format and intro.mix_rate == loop.mix_rate and intro.stereo == loop.stereo:
var intro_frames := roundi(intro.get_length() * intro.mix_rate)
loop.data = intro.data + loop.data
loop.loop_begin = intro_frames
loop.loop_end += intro_frames
return loop
return source
func _ambient_finished() -> void:
if background.is_empty(): return
intro_pending = false
ambience.stream = _loop_stream(background)
if ambience.stream != null: ambience.play()
func stop_all() -> void:
background = ""
death_tail = false
intro_pending = false
if death_cutoff != null: death_cutoff.stop()
if ambience != null: ambience.stop()
for voice in effects: voice.stop()