diff --git a/assets/audio/sfx/boss_death.wav b/assets/audio/sfx/boss_death.wav new file mode 100644 index 0000000..5715c04 Binary files /dev/null and b/assets/audio/sfx/boss_death.wav differ diff --git a/assets/audio/sfx/hivemind_beam.wav b/assets/audio/sfx/hivemind_beam.wav new file mode 100644 index 0000000..6067e3d Binary files /dev/null and b/assets/audio/sfx/hivemind_beam.wav differ diff --git a/assets/audio/sfx/hivemind_knockback.wav b/assets/audio/sfx/hivemind_knockback.wav new file mode 100644 index 0000000..13ab9f5 Binary files /dev/null and b/assets/audio/sfx/hivemind_knockback.wav differ diff --git a/assets/audio/sfx/hivemind_pulse.wav b/assets/audio/sfx/hivemind_pulse.wav new file mode 100644 index 0000000..12d4d27 Binary files /dev/null and b/assets/audio/sfx/hivemind_pulse.wav differ diff --git a/assets/audio/sfx/mine_arm.wav b/assets/audio/sfx/mine_arm.wav new file mode 100644 index 0000000..6905695 Binary files /dev/null and b/assets/audio/sfx/mine_arm.wav differ diff --git a/assets/audio/sfx/mine_explode.wav b/assets/audio/sfx/mine_explode.wav new file mode 100644 index 0000000..e68b266 Binary files /dev/null and b/assets/audio/sfx/mine_explode.wav differ diff --git a/assets/audio/sfx/player_death.wav b/assets/audio/sfx/player_death.wav new file mode 100644 index 0000000..63baa69 Binary files /dev/null and b/assets/audio/sfx/player_death.wav differ diff --git a/assets/audio/sfx/relay_burst.wav b/assets/audio/sfx/relay_burst.wav new file mode 100644 index 0000000..c4d55d5 Binary files /dev/null and b/assets/audio/sfx/relay_burst.wav differ diff --git a/assets/audio/sfx/relay_teleport.wav b/assets/audio/sfx/relay_teleport.wav new file mode 100644 index 0000000..889687b Binary files /dev/null and b/assets/audio/sfx/relay_teleport.wav differ diff --git a/assets/audio/sfx/warden_sweep.wav b/assets/audio/sfx/warden_sweep.wav new file mode 100644 index 0000000..72ed43e Binary files /dev/null and b/assets/audio/sfx/warden_sweep.wav differ diff --git a/scripts/autoload/audio_manager.gd b/scripts/autoload/audio_manager.gd index 2f607a6..27971f2 100644 --- a/scripts/autoload/audio_manager.gd +++ b/scripts/autoload/audio_manager.gd @@ -22,6 +22,16 @@ var _sounds: Dictionary = { "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] = [] diff --git a/scripts/enemies/hivemind.gd b/scripts/enemies/hivemind.gd index 3e7813c..3be2a6c 100644 --- a/scripts/enemies/hivemind.gd +++ b/scripts/enemies/hivemind.gd @@ -232,6 +232,7 @@ func _tick_assembly(_delta: float) -> void: func _spawn_wave() -> void: + AudioManager.play("hivemind_pulse") var scenes := [DRIFTER_SCENE, REPEATER_SCENE, ANCHOR_SCENE] var hw := ROOM_HW - WALL_T - 80.0 var hh := ROOM_HH - WALL_T - 80.0 @@ -642,6 +643,7 @@ func _do_unique_attack() -> void: func _start_beam() -> void: + AudioManager.play("hivemind_beam") # Start with telegraph phase _beam_telegraphing = true _telegraph_timer = BEAM_TELEGRAPH @@ -745,6 +747,7 @@ func _on_beam_hit(body: Node) -> void: func _attack_pulse() -> void: + AudioManager.play("hivemind_knockback") if _player == null or not is_instance_valid(_player): return @@ -903,6 +906,7 @@ func _tick_flash(delta: float) -> void: # Climax / Death # --------------------------------------------------------------------------- func _enter_climax() -> void: + AudioManager.play("boss_death") _phase = Phase.CLIMAX _climax_timer = FREEZE_DURATION velocity = Vector2.ZERO diff --git a/scripts/enemies/relay.gd b/scripts/enemies/relay.gd index c01beb8..6282f96 100644 --- a/scripts/enemies/relay.gd +++ b/scripts/enemies/relay.gd @@ -142,6 +142,7 @@ func _enter_transit() -> void: _transit_timer = TRANSIT_TIME func _reappear() -> void: + AudioManager.play("relay_teleport") # Pick random position within room bounds var min_x := _room_center.x - ROOM_HW + WALL_T + WALL_MARGIN var max_x := _room_center.x + ROOM_HW - WALL_T - WALL_MARGIN @@ -193,6 +194,7 @@ func _roll_drifter_threshold() -> void: # Burst Transmission # --------------------------------------------------------------------------- func _fire_burst() -> void: + AudioManager.play("relay_burst") var count := BURST_COUNT_P2 if _phase == Phase.TWO else BURST_COUNT_P1 var angle_step := TAU / float(count) @@ -394,6 +396,7 @@ func _flash_damage() -> void: # Climax / Death # --------------------------------------------------------------------------- func _enter_climax() -> void: + AudioManager.play("boss_death") _phase = Phase.CLIMAX _climax_timer = FREEZE_DURATION _blink_accum = 0.0 diff --git a/scripts/enemies/warden.gd b/scripts/enemies/warden.gd index edfe308..ed1c3d4 100644 --- a/scripts/enemies/warden.gd +++ b/scripts/enemies/warden.gd @@ -111,6 +111,7 @@ func _enter_phase_two() -> void: _sweep_cd_timer = SWEEP_CD_P2 * 0.6 # first P2 sweep sooner func _enter_climax() -> void: + AudioManager.play("boss_death") _phase = Phase.CLIMAX velocity = Vector2.ZERO _freeze_timer = FREEZE_DURATION @@ -165,6 +166,7 @@ func _tick_sweep(delta: float) -> void: func _fire_sweep_pass() -> void: + AudioManager.play("warden_sweep") _passes_fired += 1 _pass_delay_timer = PASS_DELAY @@ -287,6 +289,7 @@ func _tick_mines(delta: float) -> void: func _spawn_mine(world_pos: Vector2) -> void: + AudioManager.play("mine_arm") var mine := Node2D.new() # AOE ring visual — shows blast radius when armed (hidden initially) @@ -316,6 +319,7 @@ func _spawn_mine(world_pos: Vector2) -> void: func _explode_mine(entry: Dictionary) -> void: + AudioManager.play("mine_explode") var node: Node2D = entry["node"] if not is_instance_valid(node): return diff --git a/scripts/player/player.gd b/scripts/player/player.gd index 013fddd..698b42d 100644 --- a/scripts/player/player.gd +++ b/scripts/player/player.gd @@ -224,6 +224,7 @@ func take_damage(amount: float) -> void: _die() func _die() -> void: + AudioManager.play("player_death") if RunManager.run_active: # Disable player so they can't move during death screen set_physics_process(false)