From f0ca0cbe6ac47d061cef3f2f257f5b06d88c070d Mon Sep 17 00:00:00 2001 From: Ziemas Date: Thu, 5 Jan 2023 00:22:18 +0100 Subject: [PATCH] Overlord: mirror sound RPC command (#2094) And replace the previous mechanism for mirroring the sound. --- decompiler/config/all-types.gc | 13 +++++++++++++ game/overlord/srpc.cpp | 8 ++++++-- game/overlord/srpc.h | 8 +++++++- game/overlord/ssound.cpp | 12 ++++++++++-- game/overlord/ssound.h | 1 + goal_src/jak1/engine/sound/gsound-h.gc | 12 ++++++++++++ goal_src/jak1/engine/sound/gsound.gc | 16 +++++++++------- goal_src/jak1/pc/pckernel.gc | 4 ++++ .../reference/jak1/engine/sound/gsound-h_REF.gc | 1 + 9 files changed, 63 insertions(+), 12 deletions(-) diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index 2aebdfab3a..f3d81290cb 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -601,6 +601,7 @@ (list-sounds) (unload-music) (set-fps) + (set-mirror 201) ;; added ) ;; flavors for music @@ -3429,6 +3430,17 @@ :flag-assert #x900000004 ) +; added +(defenum sound-mirror-mode + :type uint8 + (normal) + (mirrored) + ) + +; added for mirror mode +(deftype sound-rpc-set-mirror-mode (sound-rpc-cmd) + ((mirror sound-mirror-mode))) + (deftype sound-rpc-union (structure) ((data uint32 20 :offset-assert 0) (load-bank sound-rpc-load-bank :offset 0) @@ -3454,6 +3466,7 @@ (shutdown sound-rpc-shutdown :offset 0) (list-sounds sound-rpc-list-sounds :offset 0) (unload-music sound-rpc-unload-music :offset 0) + (mirror-mode sound-rpc-set-mirror-mode :offset 0) ;; added ) :method-count-assert 9 :size-assert #x50 diff --git a/game/overlord/srpc.cpp b/game/overlord/srpc.cpp index aec5cb8dc8..23e2a9ae78 100644 --- a/game/overlord/srpc.cpp +++ b/game/overlord/srpc.cpp @@ -733,9 +733,13 @@ void* RPC_Loader(unsigned int /*fno*/, void* data, int size) { } SignalSema(gSema); } break; + case Jak1SoundCommand::MIRROR_MODE: { + gMirrorMode = cmd->mirror.value; + } break; default: - ASSERT_MSG(false, fmt::format("Unhandled RPC Loader command {}", - magic_enum::enum_name(cmd->j1command))); + ASSERT_MSG(false, + fmt::format("Unhandled RPC Loader command {} ({})", + magic_enum::enum_name(cmd->j1command), (int)cmd->j1command)); } n_messages--; cmd++; diff --git a/game/overlord/srpc.h b/game/overlord/srpc.h index b7901cf576..f5b2ff38c9 100644 --- a/game/overlord/srpc.h +++ b/game/overlord/srpc.h @@ -43,7 +43,8 @@ enum class Jak1SoundCommand : u16 { SET_EAR_TRANS = 19, SHUTDOWN = 20, LIST_SOUNDS = 21, - UNLOAD_MUSIC = 22 + UNLOAD_MUSIC = 22, + MIRROR_MODE = 201, }; enum class Jak2SoundCommand : u16 { @@ -193,6 +194,10 @@ struct SoundRpcSetMidiReg { s32 value; }; +struct SoundRpcSetMirrror { + u8 value; +}; + struct SoundRpcCommand { u16 rsvd1; union { @@ -217,6 +222,7 @@ struct SoundRpcCommand { SoundRpcSetParamCommand param; SoundRpcStereoMode stereo_mode; SoundRpcSetMidiReg midi_reg; + SoundRpcSetMirrror mirror; u8 max_size[0x4C]; // Temporary }; }; diff --git a/game/overlord/ssound.cpp b/game/overlord/ssound.cpp index 0b117fa4c9..90603892ee 100644 --- a/game/overlord/ssound.cpp +++ b/game/overlord/ssound.cpp @@ -27,6 +27,8 @@ s32 gMusicFadeDir = 0; u32 gStreamSRAM = 0; u32 gTrapSRAM = 0; +u8 gMirrorMode = 0; + s32 gSema; static u32 sLastTick; @@ -351,6 +353,7 @@ s32 CalculateFallofVolume(Vec3w* pos, s32 volume, s32 fo_curve, s32 fo_min, s32 s32 CalculateAngle(Vec3w* trans) { s32 diffX = gCamTrans.x - trans->x; s32 diffZ = gCamTrans.z - trans->z; + s32 angle; s32 lookupX = diffX; s32 lookupZ = diffZ; @@ -367,7 +370,6 @@ s32 CalculateAngle(Vec3w* trans) { return 0; } - s32 angle; if (lookupZ >= lookupX) { angle = atan_table[(lookupX << 8) / lookupZ]; @@ -396,7 +398,13 @@ s32 CalculateAngle(Vec3w* trans) { } } - return (angle - gCamAngle + 720) % 360; + angle = (angle - gCamAngle + 720) % 360; + + if (gMirrorMode) { + angle = ((180 - angle) + 180) % 360; + } + + return angle; } s32 GetVolume(Sound* sound) { diff --git a/game/overlord/ssound.h b/game/overlord/ssound.h index 8e465febd3..7fdf4e0b40 100644 --- a/game/overlord/ssound.h +++ b/game/overlord/ssound.h @@ -18,6 +18,7 @@ extern s32 gMusicVol; extern VolumePair gPanTable[361]; extern u32 gStreamSRAM; extern u32 gTrapSRAM; +extern u8 gMirrorMode; struct Vec3w { s32 x; diff --git a/goal_src/jak1/engine/sound/gsound-h.gc b/goal_src/jak1/engine/sound/gsound-h.gc index b8510b91a7..5ca159662e 100644 --- a/goal_src/jak1/engine/sound/gsound-h.gc +++ b/goal_src/jak1/engine/sound/gsound-h.gc @@ -94,6 +94,7 @@ (list-sounds) (unload-music) (set-fps) + (set-mirror 201) ) ;; flavors for music @@ -164,6 +165,12 @@ (fo-curve) ) +(defenum sound-mirror-mode + :type uint8 + (normal) + (mirrored) + ) + ;; like should match the sound type in OVERLORD ;; This is shared between all sound RPCs and acts like the header for the sound messages (deftype sound-rpc-cmd (structure) @@ -412,6 +419,10 @@ :flag-assert #x900000004 ) +; added for mirror mode +(deftype sound-rpc-set-mirror-mode (sound-rpc-cmd) + ((mirror sound-mirror-mode))) + ;; union of all the possible sound commands. (deftype sound-rpc-union (structure) ((data uint32 20 :offset-assert 0) @@ -438,6 +449,7 @@ (shutdown sound-rpc-shutdown :offset 0) (list-sounds sound-rpc-list-sounds :offset 0) (unload-music sound-rpc-unload-music :offset 0) + (mirror-mode sound-rpc-set-mirror-mode :offset 0) ) :method-count-assert 9 :size-assert #x50 diff --git a/goal_src/jak1/engine/sound/gsound.gc b/goal_src/jak1/engine/sound/gsound.gc index cf5ceee1b8..6af3df7a30 100644 --- a/goal_src/jak1/engine/sound/gsound.gc +++ b/goal_src/jak1/engine/sound/gsound.gc @@ -212,6 +212,15 @@ 0 ) +(define *sound-current-mirror* (sound-mirror-mode normal)) +(defun sound-set-mirror-mode ((mode sound-mirror-mode)) + (when (!= mode *sound-current-mirror*) + (let ((cmd (the sound-rpc-set-mirror-mode (add-element *sound-loader-rpc*)))) + (set! (-> cmd command) (sound-command set-mirror)) + (set! (-> cmd mirror) mode)) + (call *sound-loader-rpc* (the-as uint 0) (the-as pointer 0) (the-as uint 0)) + (set! *sound-current-mirror* mode)) + (none)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; sound playback @@ -335,13 +344,6 @@ (sound-trans-convert (-> cmd ear-trans) ear-trans) (sound-trans-convert (-> cmd cam-trans) cam-trans) (set! (-> cmd cam-angle) (sound-angle-convert cam-angle)) - (#when PC_PORT - (when (pc-cheats? (-> *pc-settings* cheats) mirror) - ;; flip sound pan. - ;; this isn't really appropriate if there's front-back panning (surround)... - (+! (-> cmd cam-angle) 180) - ) - ) ) 0 ) diff --git a/goal_src/jak1/pc/pckernel.gc b/goal_src/jak1/pc/pckernel.gc index 3f0d5104a4..d8e881a153 100644 --- a/goal_src/jak1/pc/pckernel.gc +++ b/goal_src/jak1/pc/pckernel.gc @@ -245,6 +245,10 @@ (pc-sound-set-fade-hack fade-hack) ) + (if (pc-cheats? (-> obj cheats) mirror) + (sound-set-mirror-mode (sound-mirror-mode mirrored)) + (sound-set-mirror-mode (sound-mirror-mode normal))) + (none)) ;; where we store the input progress for the cheat codes. make sure there's enough space for all cheats. diff --git a/test/decompiler/reference/jak1/engine/sound/gsound-h_REF.gc b/test/decompiler/reference/jak1/engine/sound/gsound-h_REF.gc index c6e3fdec3d..ef2febd5c9 100644 --- a/test/decompiler/reference/jak1/engine/sound/gsound-h_REF.gc +++ b/test/decompiler/reference/jak1/engine/sound/gsound-h_REF.gc @@ -599,6 +599,7 @@ (shutdown sound-rpc-shutdown :offset 0) (list-sounds sound-rpc-list-sounds :offset 0) (unload-music sound-rpc-unload-music :offset 0) + (mirror-mode sound-rpc-set-mirror-mode :offset 0) ) :method-count-assert 9 :size-assert #x50