Files
Station-0/scripts/autoload/audio_manager.gd
T
2026-03-12 10:12:48 -04:00

58 lines
2.4 KiB
GDScript

extends Node
# ---------------------------------------------------------------------------
# AudioManager — singleton for playing sound effects
# Uses a pool of AudioStreamPlayers to allow overlapping sounds
# ---------------------------------------------------------------------------
const POOL_SIZE := 8
# Preloaded sound effects
var _sounds: Dictionary = {
"enemy_hit": preload("res://assets/audio/sfx/enemy_hit.wav"),
"enemy_death": preload("res://assets/audio/sfx/enemy_death.wav"),
"enemy_shoot": preload("res://assets/audio/sfx/enemy_shoot.wav"),
"player_hit": preload("res://assets/audio/sfx/player_hit.wav"),
"player_shoot": preload("res://assets/audio/sfx/player_shoot.wav"),
"explosion": preload("res://assets/audio/sfx/explosion.wav"),
"pickup_scrap": preload("res://assets/audio/sfx/pickup_scrap.wav"),
"item_pickup": preload("res://assets/audio/sfx/item_pickup.wav"),
"ui_click": preload("res://assets/audio/sfx/ui_click.wav"),
"ui_select": preload("res://assets/audio/sfx/ui_select.wav"),
"door_close": preload("res://assets/audio/sfx/door_close.wav"),
"room_clear": preload("res://assets/audio/sfx/room_clear.wav"),
"teleport": preload("res://assets/audio/sfx/teleport.wav"),
"warden_sweep": preload("res://assets/audio/sfx/warden_sweep.wav"),
"mine_arm": preload("res://assets/audio/sfx/mine_arm.wav"),
"mine_explode": preload("res://assets/audio/sfx/mine_explode.wav"),
"relay_burst": preload("res://assets/audio/sfx/relay_burst.wav"),
"relay_teleport": preload("res://assets/audio/sfx/relay_teleport.wav"),
"hivemind_pulse": preload("res://assets/audio/sfx/hivemind_pulse.wav"),
"hivemind_beam": preload("res://assets/audio/sfx/hivemind_beam.wav"),
"hivemind_knockback": preload("res://assets/audio/sfx/hivemind_knockback.wav"),
"player_death": preload("res://assets/audio/sfx/player_death.wav"),
"boss_death": preload("res://assets/audio/sfx/boss_death.wav"),
}
var _pool: Array[AudioStreamPlayer] = []
var _pool_index: int = 0
func _ready() -> void:
process_mode = Node.PROCESS_MODE_ALWAYS
for i in POOL_SIZE:
var player := AudioStreamPlayer.new()
player.bus = "Master"
add_child(player)
_pool.append(player)
func play(sound_name: String) -> void:
if not _sounds.has(sound_name):
push_warning("AudioManager: Unknown sound '%s'" % sound_name)
return
var player := _pool[_pool_index]
_pool_index = (_pool_index + 1) % POOL_SIZE
player.stream = _sounds[sound_name]
player.play()