diff --git a/assets/graphics/vfx/gogo_sprite.png b/assets/graphics/vfx/gogo_sprite.png new file mode 100644 index 0000000..4aece1f Binary files /dev/null and b/assets/graphics/vfx/gogo_sprite.png differ diff --git a/assets/graphics/vfx/gogo_sprite.png.import b/assets/graphics/vfx/gogo_sprite.png.import new file mode 100644 index 0000000..29d8d38 --- /dev/null +++ b/assets/graphics/vfx/gogo_sprite.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqdntrjuarixl" +path="res://.godot/imported/gogo_sprite.png-9c7123654645ea9aeba75ebe74a547bf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/graphics/vfx/gogo_sprite.png" +dest_files=["res://.godot/imported/gogo_sprite.png-9c7123654645ea9aeba75ebe74a547bf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sfx/pick_up_tekton_roaming.mp3 b/assets/sfx/pick_up_tekton_roaming.mp3 deleted file mode 100644 index 19f8e12..0000000 Binary files a/assets/sfx/pick_up_tekton_roaming.mp3 and /dev/null differ diff --git a/assets/sfx/pick_up_tekton_roaming.mp3.import b/assets/sfx/pick_up_tekton_roaming.mp3.import deleted file mode 100644 index 3a21de1..0000000 --- a/assets/sfx/pick_up_tekton_roaming.mp3.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="mp3" -type="AudioStreamMP3" -uid="uid://8ctpkvemgvmt" -path="res://.godot/imported/pick_up_tekton_roaming.mp3-fcbc7bdfbf724091b491495057817c9b.mp3str" - -[deps] - -source_file="res://assets/sfx/pick_up_tekton_roaming.mp3" -dest_files=["res://.godot/imported/pick_up_tekton_roaming.mp3-fcbc7bdfbf724091b491495057817c9b.mp3str"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/sfx/pick_up_tekton_roaming.wav b/assets/sfx/pick_up_tekton_roaming.wav new file mode 100644 index 0000000..06799d2 Binary files /dev/null and b/assets/sfx/pick_up_tekton_roaming.wav differ diff --git a/assets/sfx/pick_up_tekton_roaming.wav.import b/assets/sfx/pick_up_tekton_roaming.wav.import new file mode 100644 index 0000000..0dbcf2a --- /dev/null +++ b/assets/sfx/pick_up_tekton_roaming.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://db4vo6r3kpquq" +path="res://.godot/imported/pick_up_tekton_roaming.wav-8942d5b7e57f38a308199ed30a36e90f.sample" + +[deps] + +source_file="res://assets/sfx/pick_up_tekton_roaming.wav" +dest_files=["res://.godot/imported/pick_up_tekton_roaming.wav-8942d5b7e57f38a308199ed30a36e90f.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/sfx/pick_up_tiles.wav b/assets/sfx/pick_up_tiles.wav new file mode 100644 index 0000000..e91a888 Binary files /dev/null and b/assets/sfx/pick_up_tiles.wav differ diff --git a/assets/sfx/pick_up_tiles.wav.import b/assets/sfx/pick_up_tiles.wav.import new file mode 100644 index 0000000..8dbf9cd --- /dev/null +++ b/assets/sfx/pick_up_tiles.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d2i01ld0puh3m" +path="res://.godot/imported/pick_up_tiles.wav-00c55b444fa0e1c1bc5e092df839b61e.sample" + +[deps] + +source_file="res://assets/sfx/pick_up_tiles.wav" +dest_files=["res://.godot/imported/pick_up_tiles.wav-00c55b444fa0e1c1bc5e092df839b61e.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/sfx/tile_scatter.mp3 b/assets/sfx/tile_scatter.mp3 deleted file mode 100644 index 463e977..0000000 Binary files a/assets/sfx/tile_scatter.mp3 and /dev/null differ diff --git a/assets/sfx/tile_scatter.mp3.import b/assets/sfx/tile_scatter.mp3.import deleted file mode 100644 index 394154e..0000000 --- a/assets/sfx/tile_scatter.mp3.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="mp3" -type="AudioStreamMP3" -uid="uid://cpgg54uaogaaq" -path="res://.godot/imported/tile_scatter.mp3-73bb39bcbdf43b4782c4b8f6a040f991.mp3str" - -[deps] - -source_file="res://assets/sfx/tile_scatter.mp3" -dest_files=["res://.godot/imported/tile_scatter.mp3-73bb39bcbdf43b4782c4b8f6a040f991.mp3str"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/assets/sfx/tile_scatter.wav b/assets/sfx/tile_scatter.wav new file mode 100644 index 0000000..25ae52b Binary files /dev/null and b/assets/sfx/tile_scatter.wav differ diff --git a/assets/sfx/tile_scatter.wav.import b/assets/sfx/tile_scatter.wav.import new file mode 100644 index 0000000..8812ec5 --- /dev/null +++ b/assets/sfx/tile_scatter.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c13vw2lorgv6q" +path="res://.godot/imported/tile_scatter.wav-aa9d8fa0a43423ae0619a49b773da03e.sample" + +[deps] + +source_file="res://assets/sfx/tile_scatter.wav" +dest_files=["res://.godot/imported/tile_scatter.wav-aa9d8fa0a43423ae0619a49b773da03e.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/scenes/player.gd b/scenes/player.gd index 0e41c1a..ced58d9 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -530,9 +530,14 @@ func sync_walk_animation() -> void: play_walk_animation() @rpc("any_peer", "call_local", "reliable") -func sync_pickup_animation() -> void: - """Sync pickup/grab animation across network.""" +func sync_pickup_animation(item_id: int = -1) -> void: + """Sync pickup/grab animation across network and play sound.""" play_pickup_animation() + + if item_id >= 11 and item_id <= 14: + SfxManager.play("pick_up_power_tile") + elif item_id >= 7 and item_id <= 10: + SfxManager.play("pick_up_tiles") @rpc("any_peer", "call_local", "reliable") func sync_put_animation() -> void: @@ -875,6 +880,7 @@ func drop_random_item(): # Drop it playerboard[slot_index] = -1 rpc("sync_playerboard", playerboard) + SfxManager.play("tile_scatter") # Sync grid item var cell = Vector3i(drop_pos.x, 1, drop_pos.y) @@ -906,6 +912,7 @@ func drop_all_tiles(): if dropped_count > 0: rpc("sync_playerboard", playerboard) rpc("trigger_screen_shake", "targeted") + SfxManager.play("tile_scatter") NotificationManager.send_message(self , NotificationManager.MESSAGES.CRITICALLY_HIT, NotificationManager.MessageType.WARNING) print("Player %s dropped %d tiles due to Super Push" % [name, dropped_count]) @@ -968,6 +975,7 @@ func on_stop_phase_violation(): if main: main.rpc("sync_grid_item", cell.x, cell.y, cell.z, item_id) + SfxManager.rpc("play_rpc", "tile_scatter") NotificationManager.send_message(self , "STOP VIOLATION! Tiles scattered!", NotificationManager.MessageType.WARNING) func _find_multiple_drop_positions(count: int) -> Array: @@ -2229,6 +2237,7 @@ func sync_grab_tekton(tekton_path: NodePath): is_attack_mode = false SfxManager.play("pick_up_tekton_roaming") + play_pickup_animation() print("[Player %s] Grabbed Tekton %s" % [name, tekton.name]) func throw_tekton(): diff --git a/scripts/managers/playerboard_manager.gd b/scripts/managers/playerboard_manager.gd index 323d533..7727137 100644 --- a/scripts/managers/playerboard_manager.gd +++ b/scripts/managers/playerboard_manager.gd @@ -82,7 +82,7 @@ func grab_item(grid_position: Vector2i) -> bool: # Play pickup animation (synced across network) if player.is_multiplayer_authority() and player.has_method("sync_pickup_animation"): - player.rpc("sync_pickup_animation") + player.rpc("sync_pickup_animation", item) # === Optimistic Local Update (immediate visual feedback) === # Apply changes locally first, server will validate/sync @@ -95,9 +95,7 @@ func grab_item(grid_position: Vector2i) -> bool: if special_tiles_manager: special_tiles_manager.add_powerup_from_item(item) - SfxManager.play("pick_up_power_tile") - # Animation for powerup? - # ... + # Animation and sound handled via sync_pickup_animation RPC above # Skip adding to playerboard. Just consume. else: @@ -311,6 +309,10 @@ func bot_try_grab_item() -> bool: player.playerboard[empty_slot] = item + # Play pickup animation for bot + if player.has_method("sync_pickup_animation"): + player.rpc("sync_pickup_animation", item) + var main = player.get_tree().get_root().get_node_or_null("Main") if main: main.rpc("sync_grid_item", current_cell.x, current_cell.y, current_cell.z, -1) @@ -338,6 +340,10 @@ func bot_try_grab_item() -> bool: if player.is_multiplayer_authority(): player.playerboard[empty_slot] = item + # Play pickup animation for bot + if player.has_method("sync_pickup_animation"): + player.rpc("sync_pickup_animation", item) + var main = player.get_tree().get_root().get_node_or_null("Main") if main: main.rpc("sync_grid_item", cell.x, cell.y, cell.z, -1)