Compare commits

...

4 Commits

Author SHA1 Message Date
DeaTh-G 4545de14c0 remove uncertain note 2026-02-16 22:09:51 +01:00
DeaTh-G c5b21af964 modify fix based on comparison with ps3 logic 2026-02-16 21:52:46 +01:00
DeaTh-G f6b03f8769 fix town npc related member variable initialization 2026-02-15 20:23:33 +01:00
Hyper 5e8695a157 Fix Werehog rotating into walls when leaving them at HFR (#1570) 2026-02-01 14:09:38 +03:00
3 changed files with 46 additions and 0 deletions
+8
View File
@@ -195,3 +195,11 @@ bool SparkleLocusMidAsmHook()
// This has the side effect of the locus particle eventually snapping to the rest position during pause, but it's better than vertices exploding. // This has the side effect of the locus particle eventually snapping to the rest position during pause, but it's better than vertices exploding.
return App::s_deltaTime < (1.0 / 60.0); return App::s_deltaTime < (1.0 / 60.0);
} }
void CEvilSonicContext_CStateWall_LeaveRotationMidAsmHook(PPCRegister& f1)
{
// The code in the Werehog's "wall" state for leaving walls adds a constant
// value of 0.05 to his transform every frame. This makes the value respect
// delta time whilst maintaining the original behaviour at 30 FPS.
f1.f64 = f1.f64 * (std::min(App::s_deltaTime, 1.0 / 15.0) / (1.0 / 30.0));
}
+26
View File
@@ -193,3 +193,29 @@ PPC_FUNC(sub_824EE620)
ctx.r3.u32 = PersistentStorageManager::ShouldDisplayDLCMessage(true); ctx.r3.u32 = PersistentStorageManager::ShouldDisplayDLCMessage(true);
} }
// This is a constructor for some struct that constructed inside CTownManContext::CTownManContext()
// and within the calls contained in CTownManBase::ProcMsgSetTownManRetryTimeTable().
//
// Within the constructor of the CTownManContext, the second member of this struct is initialized to -1
// after this call happens inside CTownManContext::CTownManContext() at pretty much the very of that function call.
//
// This initialization of the member variable is however not executed when this constructor for the struct
// is called from someplace else in the game's code, as such it remains with unitialized data for that field.
//
// Ensuring that this member variable is initialized to 0 anytime this constructor is called fixes an issue with
// Tails not disappearing when giving you the camera after Rooftop Run Act 1 (Night). This setting of it to 0 won't
// break the behaviour created by the call to it from CTownManContext::CTownManContext() as that itself sets it to -1 later on.
// It only affects other instance of the call.
//
// NOTE: ctx.r3.u32 + 0 is also unitialized by this constructor, however both instances of this function being called
// initialized the said variable later on before being used.
//
// NOTE: ctx.r3.u32 + 20 is also unitialized, however I could not find any uses for this. Since this is already
// quite a big change due to the amount of NPCs in the game, I would rather not touch this unless an issue is found.
PPC_FUNC_IMPL(__imp__sub_8297C630);
PPC_FUNC(sub_8297C630)
{
PPC_STORE_U32(ctx.r3.u32 + 4, 0);
__imp__sub_8297C630(ctx, base);
}
+12
View File
@@ -1141,3 +1141,15 @@ registers = ["r3"]
name = "EndingTextPositionMidAsmHook" name = "EndingTextPositionMidAsmHook"
address = 0x82580168 address = 0x82580168
registers = ["r31", "f13"] registers = ["r31", "f13"]
# Wall Leave - Left
[[midasm_hook]]
name = "CEvilSonicContext_CStateWall_LeaveRotationMidAsmHook"
address = 0x824067BC
registers = ["f1"]
# Wall Leave - Right
[[midasm_hook]]
name = "CEvilSonicContext_CStateWall_LeaveRotationMidAsmHook"
address = 0x82406774
registers = ["f1"]