@@ -23,3 +23,61 @@ void SonicCamera_RotationSpeedFix(PPCRegister& f0, PPCRegister& deltaTime, PPCRe
2323{
2424 f0.f64 = float ((f0.f64 * (deltaTime.f64 * (1.0 / (deltaTime.f64 * 60.0 )))) + f13.f64 );
2525}
26+
27+ bool ObjTarzan_VolatileBranch (PPCRegister& r30)
28+ {
29+ if (Config::FPS <= 60 .0f )
30+ return false ;
31+
32+ return r30.f64 >= 0 ;
33+ }
34+
35+ void ObjTarzan_PatchStaticDeltaTime (PPCRegister& value, PPCRegister& delta)
36+ {
37+ if (Config::FPS <= 60 .0f )
38+ return ;
39+
40+ value.f64 = delta.f64 ;
41+ }
42+
43+ void ObjTarzan_PatchDeltaTimeArgument (PPCRegister& value, PPCRegister& value2, PPCRegister& stack)
44+ {
45+ if (Config::FPS <= 60 .0f )
46+ return ;
47+
48+ auto deltaTime = *(be<double >*)g_memory.Translate (stack.u32 + 0x90 + 0x420 - 0x88 );
49+
50+ value.f64 = deltaTime;
51+ value2.f64 = deltaTime;
52+ }
53+
54+ // Sonicteam::ObjTarzan::UpdatePoint (speculatory)
55+ PPC_FUNC_IMPL (__imp__sub_8232D770);
56+ PPC_FUNC (sub_8232D770)
57+ {
58+ if (Config::FPS <= 60 .0f )
59+ {
60+ __imp__sub_8232D770 (ctx, base);
61+ return ;
62+ }
63+
64+ struct TarzanPoint
65+ {
66+ MARATHON_INSERT_PADDING (0x4C );
67+ be<float > m_Time;
68+ MARATHON_INSERT_PADDING (0xB0 );
69+ };
70+
71+ auto pTarzanPoint = (TarzanPoint*)(base + ctx.r3 .u32 );
72+ auto deltaTime = ctx.f1 .f64 ;
73+
74+ if (deltaTime > 1.0 )
75+ deltaTime = 1.0 ;
76+
77+ do
78+ {
79+ GuestToHostFunction<void >(sub_8232D288, pTarzanPoint, ctx.f1 .u64 , deltaTime, deltaTime, deltaTime);
80+ pTarzanPoint->m_Time = pTarzanPoint->m_Time - deltaTime;
81+ }
82+ while (pTarzanPoint->m_Time >= deltaTime);
83+ }
0 commit comments