From 320c517b6157afdfaf682c7f3f1b525bb87625a6 Mon Sep 17 00:00:00 2001 From: ReimousTH Date: Fri, 19 Sep 2025 11:52:14 +0300 Subject: [PATCH 1/4] Havok & Improved way to switch collision flags properly & demo camera --- MarathonRecomp/api/Marathon.h | 2 ++ .../api/Sonicteam/Camera/CameraModeManager.h | 24 ++++++++++++++ .../api/Sonicteam/Camera/Cameraman.h | 9 ++++-- .../Message/MsgCameramanCameraMode.h | 15 +++++++++ MarathonRecomp/api/Sonicteam/Player/Object.h | 3 +- .../Sonicteam/SoX/Physics/Havok/WorldHavok.h | 4 ++- MarathonRecomp/api/hk330/hkpWorld.h | 5 +++ MarathonRecomp/patches/player_patches.cpp | 32 +++++++++++-------- MarathonRecomp/user/config_def.h | 1 + 9 files changed, 77 insertions(+), 18 deletions(-) create mode 100644 MarathonRecomp/api/Sonicteam/Camera/CameraModeManager.h create mode 100644 MarathonRecomp/api/Sonicteam/Message/MsgCameramanCameraMode.h diff --git a/MarathonRecomp/api/Marathon.h b/MarathonRecomp/api/Marathon.h index da9000e00..2be607411 100644 --- a/MarathonRecomp/api/Marathon.h +++ b/MarathonRecomp/api/Marathon.h @@ -20,6 +20,7 @@ #include "Sonicteam/AppMarathon.h" #include "Sonicteam/AudioEngineXenon.h" #include "Sonicteam/CObjBalloonIconDrawable.h" +#include "Sonicteam/Camera/CameraModeManager.h" #include "Sonicteam/Camera/CameraMode.h" #include "Sonicteam/Camera/Cameraman.h" #include "Sonicteam/Camera/SonicCamera.h" @@ -49,6 +50,7 @@ #include "Sonicteam/MainMenuTask.h" #include "Sonicteam/MainMode.h" #include "Sonicteam/Message/MsgSuckPlayer.h" +#include "Sonicteam/Message/MsgCameramanCameraMode.h" #include "Sonicteam/MessageWindowTask.h" #include "Sonicteam/MovieObject.h" #include "Sonicteam/MovieObjectWmv.h" diff --git a/MarathonRecomp/api/Sonicteam/Camera/CameraModeManager.h b/MarathonRecomp/api/Sonicteam/Camera/CameraModeManager.h new file mode 100644 index 000000000..e8c67cc6e --- /dev/null +++ b/MarathonRecomp/api/Sonicteam/Camera/CameraModeManager.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include + +namespace Sonicteam::Camera +{ + class Cameraman; + class CameraMode; + class CameraModeManager + { + //TODO figure out all these, 8218C100 + struct _vector_struct_ + { + MARATHON_INSERT_PADDING(0x14); + }; + public: + xpointer m_pCameraman; + boost::shared_ptr m_spCameraMode; + MARATHON_INSERT_PADDING(0x8); + std::vector<_vector_struct_> m_vVector; + }; +} diff --git a/MarathonRecomp/api/Sonicteam/Camera/Cameraman.h b/MarathonRecomp/api/Sonicteam/Camera/Cameraman.h index e162e02fb..c1abb4b1b 100644 --- a/MarathonRecomp/api/Sonicteam/Camera/Cameraman.h +++ b/MarathonRecomp/api/Sonicteam/Camera/Cameraman.h @@ -2,13 +2,16 @@ #include #include +#include namespace Sonicteam::Camera { - class Cameraman : Actor + class Cameraman : public Actor { public: - MARATHON_INSERT_PADDING(0x58); - be m_FOV; + MARATHON_INSERT_PADDING(0x24); + boost::shared_ptr m_spCameraModeManager; + MARATHON_INSERT_PADDING(0x2C); + be m_FOV; //0xB0 }; } diff --git a/MarathonRecomp/api/Sonicteam/Message/MsgCameramanCameraMode.h b/MarathonRecomp/api/Sonicteam/Message/MsgCameramanCameraMode.h new file mode 100644 index 000000000..a57c4cddd --- /dev/null +++ b/MarathonRecomp/api/Sonicteam/Message/MsgCameramanCameraMode.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include +#include + +namespace Sonicteam::Message +{ + struct MsgCameramanCameraInitialize : SoX::Message<0x14007> + { + be m_PadID; + be m_TargetActorID; + bool IsDemoCam; + }; +} diff --git a/MarathonRecomp/api/Sonicteam/Player/Object.h b/MarathonRecomp/api/Sonicteam/Player/Object.h index ec7f199d3..dc5a94c22 100644 --- a/MarathonRecomp/api/Sonicteam/Player/Object.h +++ b/MarathonRecomp/api/Sonicteam/Player/Object.h @@ -24,7 +24,8 @@ namespace Sonicteam::Player stdx::string m_PlayerLua; stdx::string m_PlayerPackage; - MARATHON_INSERT_PADDING(8); + be m_TargetCameraActorID; + xpointer m_pCameraman; //here as MessageReceiver be m_PlayerIndex; MARATHON_INSERT_PADDING(0x2C); bool m_IsPlayer; diff --git a/MarathonRecomp/api/Sonicteam/SoX/Physics/Havok/WorldHavok.h b/MarathonRecomp/api/Sonicteam/SoX/Physics/Havok/WorldHavok.h index 8415b9c7d..9624a456a 100644 --- a/MarathonRecomp/api/Sonicteam/SoX/Physics/Havok/WorldHavok.h +++ b/MarathonRecomp/api/Sonicteam/SoX/Physics/Havok/WorldHavok.h @@ -2,13 +2,15 @@ #include #include +#include namespace Sonicteam::SoX::Physics::Havok { class WorldHavok : public World { public: - MARATHON_INSERT_PADDING(0x18); + xpointer m_pWorld; + MARATHON_INSERT_PADDING(0x14); bool m_IsDynamicUpdateRate; }; } diff --git a/MarathonRecomp/api/hk330/hkpWorld.h b/MarathonRecomp/api/hk330/hkpWorld.h index 95bd5f91c..d16570160 100644 --- a/MarathonRecomp/api/hk330/hkpWorld.h +++ b/MarathonRecomp/api/hk330/hkpWorld.h @@ -9,5 +9,10 @@ namespace hk330 { public: MARATHON_INSERT_PADDING(0x308); + + void updateCollisionFilterOnWorld(uint32_t updateMode, uint32_t updateShapeCollectionFilter) + { + GuestToHostFunction(sub_82832910, this, updateMode, updateShapeCollectionFilter); + } }; } diff --git a/MarathonRecomp/patches/player_patches.cpp b/MarathonRecomp/patches/player_patches.cpp index e4b169a90..234ad02b3 100644 --- a/MarathonRecomp/patches/player_patches.cpp +++ b/MarathonRecomp/patches/player_patches.cpp @@ -116,7 +116,7 @@ bool PlayerDebugMode_RemapDebugExitButton(PPCRegister& r_PadState, PPCRegister& PPC_FUNC_IMPL(__imp__sub_82195500); PPC_FUNC(sub_82195500) { - if (!Config::PlayerDebugMode) + if (!(Config::PlayerDebugMode || Config::PlayerDemoCameraSwitch)) { __imp__sub_82195500(ctx, base); return; @@ -131,26 +131,32 @@ PPC_FUNC(sub_82195500) if (pPlayer->m_IsPlayer) { auto playerIndex = pGameMode->m_pGameImp->PlayerActorIDToIndex(pPlayer->m_ActorID); - auto& spManager = pDoc->m_vspInputManager[pDoc->m_PlayerControllerID[playerIndex]]; + auto padID = pDoc->m_PlayerControllerID[playerIndex]; + auto& spManager = pDoc->m_vspInputManager[padID]; + auto pGameImp = App::s_pApp->m_pDoc->GetDocMode()->m_pGameImp.get(); - // Disable camera volume collision on B press. - if (pPlayer->m_SetupModuleIndexPostfix == 2 && spManager->m_PadState.IsPressed(Sonicteam::SoX::Input::KeyState_B)) + // Disable collision on B press. + if (pPlayer->m_SetupModuleIndexPostfix == 2 && spManager->m_PadState.IsPressed(Sonicteam::SoX::Input::KeyState_B) && Config::PlayerDebugMode) { auto value = pZock->m_spPhantomA->m_pRigidBody->m_collidable.m_broadPhaseHandle.m_collisionFilterInfo == 6 ? 0x383 : 6; + pZock->m_spPhantomA->m_pRigidBody->m_collidable.m_broadPhaseHandle.m_collisionFilterInfo = value; + App::s_pApp->m_pDoc->GetDocMode()->m_pGameImp->GetPhysicsWorld()->m_pWorld.get()->updateCollisionFilterOnWorld(1,1); + } - pZock->m_spPhantomA.reset(); - pZock->m_spPhantomB.reset(); - - GuestToHostFunction(sub_821E3628, &pZock->m_spPhantomA, &pPlayer->m_spRootFrame, static_cast(pPlayer), value, 50.0); - - pZock->m_spPhantomB = pZock->m_spPhantomA; - pZock->m_spPhantomA->InitializeToWorld(pGameMode->m_pGameImp->m_spPhysicsWorld); - pZock->m_spPhantomA->SetPhantomListener(pZock->m_spPhantomListener); + //Switch to Camera<->DemoGMCamera + if ((pPlayer->m_SetupModuleIndexPostfix == 2 || Config::PlayerDemoCameraSwitch) && spManager->m_PadState.IsPressed(Sonicteam::SoX::Input::KeyState_DpadUp)) + { + auto pCamera = static_cast(pPlayer->m_pCameraman.get()); + guest_stack_var m_initMessage; + m_initMessage->IsDemoCam = pCamera->m_spCameraModeManager->m_spCameraMode->m_pVftable.ptr.get() != 0x82002004; + m_initMessage->m_TargetActorID = pPlayer->m_ActorID; + m_initMessage->m_PadID = spManager->m_ControllerID; + pCamera->OnMessageReceived(m_initMessage.get()); } // Enter debug posture on Select press. if (pPlayer->m_SetupModuleIndexPostfix != 2 && - !(pPlayer->m_SetupModuleIndexPrefix == 2 && pPlayer->m_SetupModuleIndexPostfix == 1) && + !(pPlayer->m_SetupModuleIndexPrefix == 2 && pPlayer->m_SetupModuleIndexPostfix == 1) && Config::PlayerDebugMode && spManager->m_PadState.IsPressed(Sonicteam::SoX::Input::KeyState_Select)) { pPlayer->m_SetupModuleIndexPostfix = 2; diff --git a/MarathonRecomp/user/config_def.h b/MarathonRecomp/user/config_def.h index 8e9c4c699..7c836fbc9 100644 --- a/MarathonRecomp/user/config_def.h +++ b/MarathonRecomp/user/config_def.h @@ -90,6 +90,7 @@ CONFIG_DEFINE_HIDDEN("Codes", bool, RestoreChainJumpFlips, false); CONFIG_DEFINE_HIDDEN("Codes", bool, DisableEdgeGrabLeftover, false); CONFIG_DEFINE_HIDDEN("Codes", bool, TailsGauge, false); CONFIG_DEFINE_HIDDEN("Codes", bool, PlayerDebugMode, false); +CONFIG_DEFINE_HIDDEN("Codes", bool, PlayerDemoCameraSwitch, false); CONFIG_DEFINE_HIDDEN("Codes", bool, MidairControlForMachSpeed, false); CONFIG_DEFINE_HIDDEN("Codes", bool, MidairControlForSnowboards, false); CONFIG_DEFINE_HIDDEN("Codes", bool, ControllableTeleportDash, false); From 5aa9bf28a7049f06d5ba18fbb7554ba9cbfa459f Mon Sep 17 00:00:00 2001 From: Isaac Marovitz Date: Sat, 20 Sep 2025 01:47:30 -0400 Subject: [PATCH 2/4] Misc. fixes Signed-off-by: Isaac Marovitz --- MarathonRecomp/api/Sonicteam/Camera/CameraModeManager.h | 4 ++-- MarathonRecomp/api/Sonicteam/Camera/Cameraman.h | 2 +- MarathonRecomp/api/Sonicteam/Player/Object.h | 2 +- MarathonRecomp/patches/player_patches.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MarathonRecomp/api/Sonicteam/Camera/CameraModeManager.h b/MarathonRecomp/api/Sonicteam/Camera/CameraModeManager.h index e8c67cc6e..e200aee09 100644 --- a/MarathonRecomp/api/Sonicteam/Camera/CameraModeManager.h +++ b/MarathonRecomp/api/Sonicteam/Camera/CameraModeManager.h @@ -10,7 +10,7 @@ namespace Sonicteam::Camera class CameraMode; class CameraModeManager { - //TODO figure out all these, 8218C100 + // TODO: figure out all these, 8218C100 struct _vector_struct_ { MARATHON_INSERT_PADDING(0x14); @@ -19,6 +19,6 @@ namespace Sonicteam::Camera xpointer m_pCameraman; boost::shared_ptr m_spCameraMode; MARATHON_INSERT_PADDING(0x8); - std::vector<_vector_struct_> m_vVector; + stdx::vector<_vector_struct_> m_vVector; }; } diff --git a/MarathonRecomp/api/Sonicteam/Camera/Cameraman.h b/MarathonRecomp/api/Sonicteam/Camera/Cameraman.h index c1abb4b1b..bbb76405b 100644 --- a/MarathonRecomp/api/Sonicteam/Camera/Cameraman.h +++ b/MarathonRecomp/api/Sonicteam/Camera/Cameraman.h @@ -12,6 +12,6 @@ namespace Sonicteam::Camera MARATHON_INSERT_PADDING(0x24); boost::shared_ptr m_spCameraModeManager; MARATHON_INSERT_PADDING(0x2C); - be m_FOV; //0xB0 + be m_FOV; // 0xB0 }; } diff --git a/MarathonRecomp/api/Sonicteam/Player/Object.h b/MarathonRecomp/api/Sonicteam/Player/Object.h index dc5a94c22..f79da864c 100644 --- a/MarathonRecomp/api/Sonicteam/Player/Object.h +++ b/MarathonRecomp/api/Sonicteam/Player/Object.h @@ -25,7 +25,7 @@ namespace Sonicteam::Player stdx::string m_PlayerLua; stdx::string m_PlayerPackage; be m_TargetCameraActorID; - xpointer m_pCameraman; //here as MessageReceiver + xpointer m_pCameraman; // Here as MessageReceiver be m_PlayerIndex; MARATHON_INSERT_PADDING(0x2C); bool m_IsPlayer; diff --git a/MarathonRecomp/patches/player_patches.cpp b/MarathonRecomp/patches/player_patches.cpp index 234ad02b3..52b7113de 100644 --- a/MarathonRecomp/patches/player_patches.cpp +++ b/MarathonRecomp/patches/player_patches.cpp @@ -143,7 +143,7 @@ PPC_FUNC(sub_82195500) App::s_pApp->m_pDoc->GetDocMode()->m_pGameImp->GetPhysicsWorld()->m_pWorld.get()->updateCollisionFilterOnWorld(1,1); } - //Switch to Camera<->DemoGMCamera + // Switch to Camera <-> DemoGMCamera if ((pPlayer->m_SetupModuleIndexPostfix == 2 || Config::PlayerDemoCameraSwitch) && spManager->m_PadState.IsPressed(Sonicteam::SoX::Input::KeyState_DpadUp)) { auto pCamera = static_cast(pPlayer->m_pCameraman.get()); From 837daad314cca803a6b3d2ea2bdb82a4aafef08f Mon Sep 17 00:00:00 2001 From: Isaac Marovitz Date: Sat, 20 Sep 2025 01:52:41 -0400 Subject: [PATCH 3/4] Rename patches Signed-off-by: Isaac Marovitz --- MarathonRecomp/patches/player_patches.cpp | 10 +++++----- MarathonRecomp/user/config_def.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/MarathonRecomp/patches/player_patches.cpp b/MarathonRecomp/patches/player_patches.cpp index 52b7113de..abdb373a7 100644 --- a/MarathonRecomp/patches/player_patches.cpp +++ b/MarathonRecomp/patches/player_patches.cpp @@ -84,7 +84,7 @@ bool MidairSnowboardControl() // Add missing SetupModuleDebug to table. void PlayerDebugMode_RegisterLuaSetup(PPCRegister& str, PPCRegister& index) { - if (!Config::PlayerDebugMode) + if (!Config::EnableDebugMode) return; auto pString = (stdx::string*)g_memory.Translate(str.u32); @@ -116,7 +116,7 @@ bool PlayerDebugMode_RemapDebugExitButton(PPCRegister& r_PadState, PPCRegister& PPC_FUNC_IMPL(__imp__sub_82195500); PPC_FUNC(sub_82195500) { - if (!(Config::PlayerDebugMode || Config::PlayerDemoCameraSwitch)) + if (!(Config::EnableDebugMode || Config::RestoreDemoCameraMode)) { __imp__sub_82195500(ctx, base); return; @@ -136,7 +136,7 @@ PPC_FUNC(sub_82195500) auto pGameImp = App::s_pApp->m_pDoc->GetDocMode()->m_pGameImp.get(); // Disable collision on B press. - if (pPlayer->m_SetupModuleIndexPostfix == 2 && spManager->m_PadState.IsPressed(Sonicteam::SoX::Input::KeyState_B) && Config::PlayerDebugMode) + if (pPlayer->m_SetupModuleIndexPostfix == 2 && spManager->m_PadState.IsPressed(Sonicteam::SoX::Input::KeyState_B) && Config::EnableDebugMode) { auto value = pZock->m_spPhantomA->m_pRigidBody->m_collidable.m_broadPhaseHandle.m_collisionFilterInfo == 6 ? 0x383 : 6; pZock->m_spPhantomA->m_pRigidBody->m_collidable.m_broadPhaseHandle.m_collisionFilterInfo = value; @@ -144,7 +144,7 @@ PPC_FUNC(sub_82195500) } // Switch to Camera <-> DemoGMCamera - if ((pPlayer->m_SetupModuleIndexPostfix == 2 || Config::PlayerDemoCameraSwitch) && spManager->m_PadState.IsPressed(Sonicteam::SoX::Input::KeyState_DpadUp)) + if ((pPlayer->m_SetupModuleIndexPostfix == 2 || Config::RestoreDemoCameraMode) && spManager->m_PadState.IsPressed(Sonicteam::SoX::Input::KeyState_DpadUp)) { auto pCamera = static_cast(pPlayer->m_pCameraman.get()); guest_stack_var m_initMessage; @@ -156,7 +156,7 @@ PPC_FUNC(sub_82195500) // Enter debug posture on Select press. if (pPlayer->m_SetupModuleIndexPostfix != 2 && - !(pPlayer->m_SetupModuleIndexPrefix == 2 && pPlayer->m_SetupModuleIndexPostfix == 1) && Config::PlayerDebugMode && + !(pPlayer->m_SetupModuleIndexPrefix == 2 && pPlayer->m_SetupModuleIndexPostfix == 1) && Config::EnableDebugMode && spManager->m_PadState.IsPressed(Sonicteam::SoX::Input::KeyState_Select)) { pPlayer->m_SetupModuleIndexPostfix = 2; diff --git a/MarathonRecomp/user/config_def.h b/MarathonRecomp/user/config_def.h index 7c836fbc9..a1eda6fcf 100644 --- a/MarathonRecomp/user/config_def.h +++ b/MarathonRecomp/user/config_def.h @@ -89,8 +89,8 @@ CONFIG_DEFINE_HIDDEN("Codes", bool, RestoreChaosBoostJump, false); CONFIG_DEFINE_HIDDEN("Codes", bool, RestoreChainJumpFlips, false); CONFIG_DEFINE_HIDDEN("Codes", bool, DisableEdgeGrabLeftover, false); CONFIG_DEFINE_HIDDEN("Codes", bool, TailsGauge, false); -CONFIG_DEFINE_HIDDEN("Codes", bool, PlayerDebugMode, false); -CONFIG_DEFINE_HIDDEN("Codes", bool, PlayerDemoCameraSwitch, false); +CONFIG_DEFINE_HIDDEN("Codes", bool, EnableDebugMode, false); +CONFIG_DEFINE_HIDDEN("Codes", bool, RestoreDemoCameraMode, false); CONFIG_DEFINE_HIDDEN("Codes", bool, MidairControlForMachSpeed, false); CONFIG_DEFINE_HIDDEN("Codes", bool, MidairControlForSnowboards, false); CONFIG_DEFINE_HIDDEN("Codes", bool, ControllableTeleportDash, false); From f81de03cbb47d5037ee560817d78070451d3c343 Mon Sep 17 00:00:00 2001 From: Isaac Marovitz Date: Sat, 20 Sep 2025 01:54:59 -0400 Subject: [PATCH 4/4] More cleanup Signed-off-by: Isaac Marovitz --- MarathonRecomp/api/hk330/hkpWorld.h | 2 +- MarathonRecomp/patches/player_patches.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MarathonRecomp/api/hk330/hkpWorld.h b/MarathonRecomp/api/hk330/hkpWorld.h index d16570160..0ad64bf05 100644 --- a/MarathonRecomp/api/hk330/hkpWorld.h +++ b/MarathonRecomp/api/hk330/hkpWorld.h @@ -10,7 +10,7 @@ namespace hk330 public: MARATHON_INSERT_PADDING(0x308); - void updateCollisionFilterOnWorld(uint32_t updateMode, uint32_t updateShapeCollectionFilter) + void UpdateCollisionFilterOnWorld(uint32_t updateMode, uint32_t updateShapeCollectionFilter) { GuestToHostFunction(sub_82832910, this, updateMode, updateShapeCollectionFilter); } diff --git a/MarathonRecomp/patches/player_patches.cpp b/MarathonRecomp/patches/player_patches.cpp index abdb373a7..069becfd5 100644 --- a/MarathonRecomp/patches/player_patches.cpp +++ b/MarathonRecomp/patches/player_patches.cpp @@ -140,7 +140,7 @@ PPC_FUNC(sub_82195500) { auto value = pZock->m_spPhantomA->m_pRigidBody->m_collidable.m_broadPhaseHandle.m_collisionFilterInfo == 6 ? 0x383 : 6; pZock->m_spPhantomA->m_pRigidBody->m_collidable.m_broadPhaseHandle.m_collisionFilterInfo = value; - App::s_pApp->m_pDoc->GetDocMode()->m_pGameImp->GetPhysicsWorld()->m_pWorld.get()->updateCollisionFilterOnWorld(1,1); + pGameImp->GetPhysicsWorld()->m_pWorld.get()->UpdateCollisionFilterOnWorld(1,1); } // Switch to Camera <-> DemoGMCamera