class_name CSoundManager extends Node const MASTER_BUS = "Master" const UI_BUS = "UI" const SFX_BUS = "SFX" const MUSIC_BUS = "Music" @export_group("Pitch settings", "pitch") @export_range(0.9, 1.1, 0.01) var putch_ui_min := 1.0 @export_range(0.9, 1.1, 0.01) var putch_ui_max := 1.0 @export_range(0.9, 1.1, 0.01) var putch_sfx_min := 1.0 @export_range(0.9, 1.1, 0.01) var putch_sfx_max := 1.0 @export_group("Number of players", "player_count") @export_range(1, 10) var player_count_ui := 1 @export_range(1, 100) var player_count_sfx := 1 @export_group("UI Sounds", "ui") @export var ui_stream_accept : AudioStream @export var ui_stream_decline : AudioStream @export var ui_stream_next : AudioStream @export var ui_stream_previous : AudioStream @export_group("SFX Sounds", "sfx") @export_subgroup("Weapon", "sfx_weapon") @export var sfx_weapon_gatling_shot : AudioStream @export var sfx_weapon_cannon_shot : AudioStream @export var sfx_weapon_plasma_shot : AudioStream @export var sfx_weapon_railgun_shot : AudioStream @export var sfx_weapon_sharapnel_shot : AudioStream var _ui_players : Array[AudioStreamPlayer] = [] var _sfx_players : Array[AudioStreamPlayer2D] = [] var _music_player : AudioStreamPlayer func _ready() -> void: _create_ui_players() _create_sfx_players() _create_music_player() func play_ui_stream(stream: AudioStream) -> AudioStreamPlayer: var player := _get_free_player(_ui_players) player.stream = stream player.pitch_scale = randf_range(putch_ui_min, putch_ui_max) player.play() return player func play_sfx_stream(stream: AudioStream, position: Vector2) -> AudioStreamPlayer2D: var player := _get_free_2d_player(_sfx_players) player.stream = stream player.pitch_scale = randf_range(putch_ui_min, putch_ui_max) player.position = position player.play() return player func play_music_stream(stream: AudioStream) -> AudioStreamPlayer: _music_player.stream = stream _music_player.play() return _music_player func _create_ui_players() -> void: for i in range(player_count_ui): var player : AudioStreamPlayer = AudioStreamPlayer.new() player.bus = UI_BUS _ui_players.append(player) add_child(player) func _create_sfx_players() -> void: for i in range(player_count_sfx): var player : AudioStreamPlayer2D = AudioStreamPlayer2D.new() player.bus = SFX_BUS _sfx_players.append(player) add_child(player) func _create_music_player() -> void: var player : AudioStreamPlayer = AudioStreamPlayer.new() player.bus = MUSIC_BUS _music_player = player add_child(player) func _get_free_player(players: Array[AudioStreamPlayer]) -> AudioStreamPlayer: for player in players: if not player.playing: return player return players[0] func _get_free_2d_player(players: Array[AudioStreamPlayer2D]) -> AudioStreamPlayer2D: for player in players: if not player.playing: return player return players[0]