From ed4359686ccd00dd036f8795266faaa7f22f98fe Mon Sep 17 00:00:00 2001 From: Mike McGhen Date: Wed, 11 Mar 2026 10:07:47 -0400 Subject: [PATCH] Audio manager implementation --- assets/audio/sfx/enemy_death.wav | Bin 0 -> 7052 bytes assets/audio/sfx/enemy_hit.wav | Bin 0 -> 2079 bytes assets/audio/sfx/explosion.wav | Bin 0 -> 16056 bytes assets/audio/sfx/item_pickup.wav | Bin 0 -> 10683 bytes assets/audio/sfx/pickup_scrap.wav | Bin 0 -> 3597 bytes assets/audio/sfx/player_hit.wav | Bin 0 -> 6956 bytes assets/audio/sfx/player_shoot.wav | Bin 0 -> 5044 bytes assets/audio/sfx/teleport.wav | Bin 0 -> 78811 bytes assets/audio/sfx/ui_click.wav | Bin 0 -> 5020 bytes assets/audio/sfx/ui_select.wav | Bin 0 -> 6053 bytes project.godot | 3 +- scripts/autoload/audio_manager.gd | 42 +++++++++++++++++++++++++++ scripts/enemies/currency_orb.gd | 1 + scripts/enemies/enemy_base.gd | 1 + scripts/items/run_item_pickup.gd | 1 + scripts/items/shop_item_pedestal.gd | 1 + scripts/player/player.gd | 2 ++ scripts/player/projectile.gd | 1 + scripts/ui/armory_ui.gd | 3 ++ scripts/ui/atm_ui.gd | 8 ++--- scripts/ui/pause_menu.gd | 2 +- scripts/ui/run_end_screen.gd | 2 +- scripts/upgrades/body_part_pickup.gd | 1 + 23 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 assets/audio/sfx/enemy_death.wav create mode 100644 assets/audio/sfx/enemy_hit.wav create mode 100644 assets/audio/sfx/explosion.wav create mode 100644 assets/audio/sfx/item_pickup.wav create mode 100644 assets/audio/sfx/pickup_scrap.wav create mode 100644 assets/audio/sfx/player_hit.wav create mode 100644 assets/audio/sfx/player_shoot.wav create mode 100644 assets/audio/sfx/teleport.wav create mode 100644 assets/audio/sfx/ui_click.wav create mode 100644 assets/audio/sfx/ui_select.wav create mode 100644 scripts/autoload/audio_manager.gd diff --git a/assets/audio/sfx/enemy_death.wav b/assets/audio/sfx/enemy_death.wav new file mode 100644 index 0000000000000000000000000000000000000000..bb46d57feb216a26a704f3508222f48d92c37374 GIT binary patch literal 7052 zcmeHL*-{fx5FOrp^xYSK#VV!BH}-u=AVgenBa#5hq69-gL5PqLLI?!H5nV$r_br`OUcv1!hr{hQu(OjiM!47@V=rb1@QAYt&raW<(}el zdYlgUPI6&kettfYn46o6$7g3}W3kxG%uF;Iot~bKL?YpExT>hAxVWUWw5+VWyrQDA zvZ|`Oy1J&OwzjUWzP`Spp|P>i;cz;gO-)VB&CM>CtEHvI?RGx{w6?ZB2fP5h1iS*Y zAzmZiAeIge_V@O7cXzh8x3+$5Zfucy;%tE($3%gd=$YH4Y4aR?7;z=It8AUKB~ z1m|Q9!gJU`{G7K0?-1_^+9^B~J!hvUC&x!ehX?x@&dv@-gW-^9SU91)vn9z2K}b=k zL3lo>=m4b8&rVNiNSq-O62`Q~LQ2K*FG0>hVPIabcl_e~3GEgUL&AO&FQX@)}irlVNSuC>3Ck@u? z;|K!7SbktwFo;@y@P|k+giTDGNKi{kP7xi6mgGj!J5o!wkx{hKqZ}xB@V-tFU3cGGI%)!z#)_uf<5VGIb-`oQ=y`_Q97 zgiq_N9fj;Su;66n6etZ%AjSbd5MzkZ0O6S|JiNR9M-J5!ZALG9uc6ucW3LXw*bZ57 zgvHK6M*zK};8neo;$Uq^acFHu5#JHt2u3J|DS|$1DK}TSTw03QTJ=Lj>k)m;@^pyR z(&_4UD=)@`Rfeo!M)whR9l`sE+ya>-1iLat7)v5ZFqA=n;VZ|W0Dng=`pMisu4yD$ z>#$n!z_W>dn8D3HSe1+Rd$*#NJAO!j@4jp|6mH^z^vxy}lfGdyq{zq=V8}_FEjw*@v<;k*z-T*{~V-R~hIvT(xeu;q?6h!N;Vn literal 0 HcmV?d00001 diff --git a/assets/audio/sfx/enemy_hit.wav b/assets/audio/sfx/enemy_hit.wav new file mode 100644 index 0000000000000000000000000000000000000000..851db7815944c92ff9934e14d0373fb62413a7b0 GIT binary patch literal 2079 zcma*h%TB^T6b9hK3YPBN@+u@s;?{*M1hiUFF+~ZL+61*RP-S6_w?swbC9~x1cmZbG zfazsU|F3B>nREVgW^$BpypZ0j1W%V9#!w8a{^cwj?T&oVIpgzo^i%UP4!*b*~Sj(u8W8;EAg$Dht`iCcm QWTW%!LdkU3)_h!N0DsZMjB}@J=6E@bHDd> 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 literal 0 HcmV?d00001 diff --git a/assets/audio/sfx/item_pickup.wav b/assets/audio/sfx/item_pickup.wav new file mode 100644 index 0000000000000000000000000000000000000000..43d05c02ef7a863276db31086dfb4a1fe168845c GIT binary patch literal 10683 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

@0cj zDU9D^OTtgNrJ>WRV5y~EC@S%=E&RywJ+aG3a22K!_lJkV~gJg9=iqC531ccQ)j=JaSFnO9d76AtX&d zfJ)KP2i!5?MZsy{UP8$4qcyQ*V{>}_=E1!v(3j)`^AvX$697C;E&gcx0}sT52m#3> zH|WRky?qnxpWQrSG@1Bk5xzm1o-2W gNji}rzj^q$F#q@rg!8ZL8$bWg+JEKe8$jg$0T29w<^TWy literal 0 HcmV?d00001 diff --git a/assets/audio/sfx/player_shoot.wav b/assets/audio/sfx/player_shoot.wav new file mode 100644 index 0000000000000000000000000000000000000000..349d35166b00c2e82382760a2750e677a6074089 GIT binary patch literal 5044 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 literal 0 HcmV?d00001 diff --git a/assets/audio/sfx/ui_click.wav b/assets/audio/sfx/ui_click.wav new file mode 100644 index 0000000000000000000000000000000000000000..077b2e88a7de3806993be765aa6d5ffce62ac279 GIT binary patch literal 5020 zcmeHLT~m@l6n?$yvYGxsf2EmnrmLoG#E&!xLP0bT49Id%r9>)FX7~YFn#F}o^%L9g zJ^S*0kTZDEyz4mZ?s=YP&pvy0nc>0R@$vl|juX2zc_+PGx_RAkoH6=$yYKM-G3T0- zN|X|LiaFfbdh;5R^ZCll4MO@yY*?9CdcOW@gS5{-*58`o*-5iThjWQSm0{&jQ6*S$ zNw2e8qssZ%a(SJirL-AKI!vTXFX&o?{Aq8qRLXL3Qt$7--=q_8FS8~Py-tHk>TER! z&4?X+W_G2__Dq}RVxXBsNNRz|*W#1zY3m)eku|+{s;m5< z(^IKpm0LomwF@pd>5G$NGWjX#G0Tr!m;gLnkmmBp@Aft~lyT;ttnyRj0n+O2)i*^> z)ThUy7(|Gierd2{7cKkf87~wWBfpR&a1O`h>5!g-d3Spihiep zWkkPoz#mma_Ugu6*I`h{nyJ~h#Y<7mB|blHFtkHq_{L_$Ba*4r|mIXGb}c3I`y zQ$vmBhB{BPy1(d-f6@Ar>`2Of@XV@yJ)0gl+QRQ{AadwnVG(~F_~nS^hgJ>+HvX}? zLIr~XD>?e=ppArfgXOL?+OobiuXO24ELIxf6}Ut?5hZdUav*Xbav*Xba$rOb=$`{d Jr2ikw{sql5yp#X{ literal 0 HcmV?d00001 diff --git a/assets/audio/sfx/ui_select.wav b/assets/audio/sfx/ui_select.wav new file mode 100644 index 0000000000000000000000000000000000000000..a2f05634246d292db85a612b47877e5efbb71ef9 GIT binary patch literal 6053 zcmeH~$x|Cw5XR+Oj=ANUe`E)e+bhhKl%h@`*&HV_Cr!@nON1N{G4 z;G4kO+w|K!nA`Wz&CSg_X!hd8iaFMs|-l$f1Le#u}1>+2i2&!0gt^l<-B*1kE%gS%s)3s-5Zug z4boT4)gXuYmj= zN|?`0dPsZ!QiDO`(fWX2F&Dy5&0sKir=PxC(u5LukWj%uKFoZPP||jh@y*XA6xuXKw-1Xb zC2|%N43RcB-|OiPLtxg0Fac!q!k7~mMbpJL0W)+)$;Dm6NaP@!Z8dDtRN8ZDF_5i_ zJ&*F>ItC-Xb&##Ct%8iKjLfIL$X3c3f9LaC!v(cMaDmi-%)@kyFCrx}kZ^b=Gc-(~ zZCqwoDKH6#!xJe*Ci0?ct&;~xcwh|e?;DPZltM%}d|;3D^cHZ_C5B7kS}6|{si?`H z-V;WyVigkE;cDeg;^y4F9yW$fm1Vpt8aW$PLae1UCCK5X*8u}ifIadC0N zj9m$*0g*^#9pd8r9E_VFB#}@aAkNRzencX1idrEe&d&18*jdB_Hpzh^fSi?xaSGu? z$z-x49z>i?YJNmA*`O>!OeP0j57;Ej4l$YZnBf#uhtjU{m`qMjhhRKJDwU%;NT(z} zB9%%R#CV($7nLN5IBBFj#!!KnWg?a8OBN!=CnY~3oo-VdLY$mby&h?(F2MMN)D%Xl zpe+&UbeWSdF&cG<(S!il?x76Qh}8EZ(wV$NjE;}J9_b9EJdR1*4Cy2cfEjQWCXR0Lf-dAiKT2%}Ipl_j9fsKmkBq+v2DX?K(wh08E=aC{8Nr zEc|`7X=s5qNG1=#GRW?AJR5vpakzCc|Og z)DI-g+mbL&RF0|&X+q_~a+uF6trkT^6)&<2?W=gR*=W>EhN7YpF%4UFW>iS;_f(wr zb^WpXfSJ0jJ$H=G_Mn=I)4u316jQ1SQ)89ndn%^(6^Y7rUw!J{mo-zZR?F^~oE3}v z2x%Ei(NIYPIH(u_ 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() diff --git a/scripts/enemies/currency_orb.gd b/scripts/enemies/currency_orb.gd index cd068ee..c7a95cc 100644 --- a/scripts/enemies/currency_orb.gd +++ b/scripts/enemies/currency_orb.gd @@ -24,5 +24,6 @@ func _physics_process(delta: float) -> void: func _on_body_entered(body: Node) -> void: if body.is_in_group("player"): + AudioManager.play("pickup_scrap") RunManager.earn_credits(value) queue_free() \ No newline at end of file diff --git a/scripts/enemies/enemy_base.gd b/scripts/enemies/enemy_base.gd index f033570..200849f 100644 --- a/scripts/enemies/enemy_base.gd +++ b/scripts/enemies/enemy_base.gd @@ -86,6 +86,7 @@ func get_slow_factor() -> float: func take_damage(amount: float) -> void: current_health -= amount _flash_timer = 0.1 + AudioManager.play("enemy_hit") if current_health <= 0.0: _die() diff --git a/scripts/items/run_item_pickup.gd b/scripts/items/run_item_pickup.gd index 476078d..d6729b0 100644 --- a/scripts/items/run_item_pickup.gd +++ b/scripts/items/run_item_pickup.gd @@ -15,6 +15,7 @@ func _draw() -> void: func _on_body_entered(body: Node) -> void: if not body.is_in_group("player") or item == null: return + AudioManager.play("item_pickup") RunManager.collect_item(item) # Triggers item_collected signal -> player_stats recalculates if item.heal_on_pickup > 0.0: body.stats.heal(item.heal_on_pickup) diff --git a/scripts/items/shop_item_pedestal.gd b/scripts/items/shop_item_pedestal.gd index e8734c9..02cacfa 100644 --- a/scripts/items/shop_item_pedestal.gd +++ b/scripts/items/shop_item_pedestal.gd @@ -68,6 +68,7 @@ func _attempt_purchase() -> void: return RunManager.spend_credits(price) + AudioManager.play("item_pickup") var player := get_tree().get_first_node_in_group("player") as Node2D if player == null: diff --git a/scripts/player/player.gd b/scripts/player/player.gd index 08ae2a3..8cc2353 100644 --- a/scripts/player/player.gd +++ b/scripts/player/player.gd @@ -94,6 +94,7 @@ func _handle_shooting(delta: float) -> void: _shoot_timer = 1.0 / stats.fire_rate func _fire(direction: Vector2) -> void: + AudioManager.play("player_shoot") # Overclock: every 3rd shot deals 0 damage var is_zeroed_shot := false if stats.overclock: @@ -201,6 +202,7 @@ func take_damage(amount: float) -> void: stats.current_health -= actual _iframe_timer = IFRAME_DURATION + AudioManager.play("player_hit") EventBus.player_health_changed.emit(stats.current_health, stats.max_health) # Reactive effects on taking damage diff --git a/scripts/player/projectile.gd b/scripts/player/projectile.gd index d0ba453..4ff44ba 100644 --- a/scripts/player/projectile.gd +++ b/scripts/player/projectile.gd @@ -76,6 +76,7 @@ func _on_body_entered(body: Node) -> void: # Explosive — AoE damage to all enemies in radius # --------------------------------------------------------------------------- func _explode() -> void: + AudioManager.play("explosion") var space := get_world_2d().direct_space_state var query := PhysicsShapeQueryParameters2D.new() var circle := CircleShape2D.new() diff --git a/scripts/ui/armory_ui.gd b/scripts/ui/armory_ui.gd index 52de41a..6ffce66 100644 --- a/scripts/ui/armory_ui.gd +++ b/scripts/ui/armory_ui.gd @@ -82,13 +82,16 @@ func _input(event: InputEvent) -> void: if event.is_action_pressed("ui_up"): _cursor = wrapi(_cursor - 1, 0, maxi(1, _items.size())) + AudioManager.play("ui_select") _refresh_labels() get_viewport().set_input_as_handled() elif event.is_action_pressed("ui_down"): _cursor = wrapi(_cursor + 1, 0, maxi(1, _items.size())) + AudioManager.play("ui_select") _refresh_labels() get_viewport().set_input_as_handled() elif event.is_action_pressed("ui_accept"): + AudioManager.play("ui_click") _equip_selected() get_viewport().set_input_as_handled() elif event.is_action_pressed("ui_cancel"): diff --git a/scripts/ui/atm_ui.gd b/scripts/ui/atm_ui.gd index db35127..4c291d5 100644 --- a/scripts/ui/atm_ui.gd +++ b/scripts/ui/atm_ui.gd @@ -113,24 +113,24 @@ func _build_ui() -> void: var dep_btn := Button.new() dep_btn.text = "DEPOSIT\n(ON HAND → BANK)" - dep_btn.pressed.connect(_on_deposit) + dep_btn.pressed.connect(func(): AudioManager.play("ui_click"); _on_deposit()) action_row.add_child(dep_btn) var wth_btn := Button.new() wth_btn.text = "WITHDRAW\n(BANK → ON HAND)" - wth_btn.pressed.connect(_on_withdraw) + wth_btn.pressed.connect(func(): AudioManager.play("ui_click"); _on_withdraw()) action_row.add_child(wth_btn) # Close var close_btn := Button.new() close_btn.text = "CLOSE" - close_btn.pressed.connect(close) + close_btn.pressed.connect(func(): AudioManager.play("ui_click"); close()) vbox.add_child(close_btn) func _add_btn(parent: Node, text: String, cb: Callable) -> void: var b := Button.new() b.text = text - b.pressed.connect(cb) + b.pressed.connect(func(): AudioManager.play("ui_click"); cb.call()) parent.add_child(b) # --------------------------------------------------------------------------- diff --git a/scripts/ui/pause_menu.gd b/scripts/ui/pause_menu.gd index ed6f86d..67fbdad 100644 --- a/scripts/ui/pause_menu.gd +++ b/scripts/ui/pause_menu.gd @@ -43,7 +43,7 @@ func _add_button(parent: Node, text: String, callback: Callable) -> void: var btn := Button.new() btn.text = text btn.custom_minimum_size = Vector2(240, 48) - btn.pressed.connect(callback) + btn.pressed.connect(func(): AudioManager.play("ui_click"); callback.call()) parent.add_child(btn) # --------------------------------------------------------------------------- diff --git a/scripts/ui/run_end_screen.gd b/scripts/ui/run_end_screen.gd index fc74da2..8043836 100644 --- a/scripts/ui/run_end_screen.gd +++ b/scripts/ui/run_end_screen.gd @@ -53,7 +53,7 @@ func _show_victory() -> void: var btn := Button.new() btn.text = "RETURN TO HUB" btn.position = Vector2(-80, 70) - btn.pressed.connect(_fade_out_then_hub) + btn.pressed.connect(func(): AudioManager.play("ui_click"); _fade_out_then_hub()) _root.add_child(btn) _fade_in() diff --git a/scripts/upgrades/body_part_pickup.gd b/scripts/upgrades/body_part_pickup.gd index 1b5b261..4255bda 100644 --- a/scripts/upgrades/body_part_pickup.gd +++ b/scripts/upgrades/body_part_pickup.gd @@ -7,5 +7,6 @@ func _ready() -> void: func _on_body_entered(body: Node) -> void: if body.is_in_group("player") and part != null: + AudioManager.play("item_pickup") UpgradeManager.acquire_part(part) queue_free()