Skip to content

Commit d54179e

Browse files
ReimousTHReimousTHhyperbx
authored
Fix End of the World purple eyes at HFR (#156)
* Patch * Clean-up * Fix suck force Co-Authored-By: ReimousTH <[email protected]> * Fix naming convention * Clean-up * Fix typo --------- Co-authored-by: ReimousTH <[email protected]> Co-authored-by: Hyper <[email protected]>
1 parent 610aead commit d54179e

File tree

8 files changed

+123
-32
lines changed

8 files changed

+123
-32
lines changed

MarathonRecomp/api/Marathon.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#include "Sonicteam/MainDisplayTask.h"
4949
#include "Sonicteam/MainMenuTask.h"
5050
#include "Sonicteam/MainMode.h"
51+
#include "Sonicteam/Message/MsgSuckPlayer.h"
5152
#include "Sonicteam/MessageWindowTask.h"
5253
#include "Sonicteam/MovieObject.h"
5354
#include "Sonicteam/MovieObjectWmv.h"
@@ -114,6 +115,7 @@
114115
#include "Sonicteam/SoX/Math/Matrix.h"
115116
#include "Sonicteam/SoX/Math/Quaternion.h"
116117
#include "Sonicteam/SoX/Math/Vector.h"
118+
#include "Sonicteam/SoX/Message.h"
117119
#include "Sonicteam/SoX/MessageReceiver.h"
118120
#include "Sonicteam/SoX/Object.h"
119121
#include "Sonicteam/SoX/Physics/Entity.h"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#pragma once
2+
3+
#include <Marathon.inl>
4+
#include <Sonicteam/SoX/Math/Vector.h>
5+
#include <Sonicteam/SoX/Message.h>
6+
7+
namespace Sonicteam::Message
8+
{
9+
struct MsgSuckPlayer : SoX::Message<0x11034A>
10+
{
11+
Sonicteam::SoX::Math::Vector Point;
12+
};
13+
}

MarathonRecomp/api/Sonicteam/Player/Object.h

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
#pragma once
22

3-
#include <Marathon.h>
3+
#include <Marathon.inl>
44
#include <boost/smart_ptr/shared_ptr.h>
55
#include <Sonicteam/Player/State/Machine2.h>
66
#include <Sonicteam/Player/IGauge.h>
77
#include <Sonicteam/Player/IPlugIn.h>
88
#include <Sonicteam/Player/RootFrame.h>
9-
#include <Sonicteam/SoX/RefCountObject.h>
109
#include <Sonicteam/SoX/RefSharedPointer.h>
1110
#include <stdx/vector.h>
1211

@@ -43,12 +42,22 @@ namespace Sonicteam::Player
4342
stdx::vector<boost::shared_ptr<IPlugIn>> m_vspPlayerPlugins;
4443
MARATHON_INSERT_PADDING(0x1F4);
4544

46-
template <typename T>
47-
inline T* GetGauge();
45+
template <typename T = IGauge>
46+
T* GetGauge()
47+
{
48+
return (T*)m_spGauge.get();
49+
}
4850

4951
template <typename T = IPlugIn>
50-
inline T* GetPlugin(const char* pluginName);
52+
inline T* GetPlugin(const char* pluginName)
53+
{
54+
for (auto& spPlugin : m_vspPlayerPlugins)
55+
{
56+
if (spPlugin->m_Name == pluginName)
57+
return static_cast<T*>(spPlugin.get());
58+
}
59+
60+
return nullptr;
61+
}
5162
};
5263
}
53-
54-
#include <Sonicteam/Player/Object.inl>

MarathonRecomp/api/Sonicteam/Player/Object.inl

Lines changed: 0 additions & 20 deletions
This file was deleted.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#pragma once
2+
3+
#include <Marathon.inl>
4+
5+
namespace Sonicteam::SoX
6+
{
7+
struct IMessage
8+
{
9+
be<uint32_t> ID{};
10+
11+
IMessage() {}
12+
IMessage(const uint32_t id) : ID(id) {}
13+
};
14+
15+
template <const uint32_t id>
16+
struct Message : IMessage
17+
{
18+
Message()
19+
{
20+
ID = id;
21+
}
22+
23+
static const uint32_t GetID()
24+
{
25+
return id;
26+
}
27+
};
28+
}
Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
#pragma once
22

3+
#include <Marathon.inl>
4+
#include <Sonicteam/SoX/Message.h>
5+
36
namespace Sonicteam::SoX
47
{
5-
struct Message;
6-
78
class MessageReceiver
89
{
910
public:
1011
struct Vftable
1112
{
12-
be<uint32_t> OnMessageRecieved;
13+
be<uint32_t> fpDestroy;
14+
be<uint32_t> fpOnMessageReceived;
1315
};
1416

1517
xpointer<Vftable> m_pVftable;
1618

17-
bool OnMessageRecieved(Message* message)
19+
bool OnMessageReceived(IMessage* pMessage)
1820
{
19-
return GuestToHostFunction<uint32_t>(m_pVftable->OnMessageRecieved, this, message);
21+
return GuestToHostFunction<uint32_t>(m_pVftable->fpOnMessageReceived, this, pMessage);
2022
}
2123
};
2224
}

MarathonRecomp/patches/fps_patches.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ PPC_FUNC(sub_82587AA8)
1616
void PostureControl_RotationSpeedFix(PPCRegister& c_rotation_speed, PPCRegister& stack)
1717
{
1818
auto deltaTime = *(be<double>*)g_memory.Translate(stack.u32 + 0x200);
19+
1920
c_rotation_speed.f64 = (c_rotation_speed.f64 * (60.0 * deltaTime));
2021
}
2122

@@ -86,3 +87,37 @@ void ObjEspSwing_DecayRateFix(PPCRegister& f0, PPCRegister& f13, PPCRegister& de
8687
{
8788
f0.f64 = float(f13.f64 * pow(pow(f0.f64, 60.0), deltaTime.f64));
8889
}
90+
91+
struct MsgSuckPlayerEx : public Sonicteam::Message::MsgSuckPlayer
92+
{
93+
be<float> DeltaTime;
94+
};
95+
96+
void ObjectInputWarp_ExtendMsgSuckPlayer(PPCRegister& phantom, PPCRegister& message, PPCRegister& deltaTime)
97+
{
98+
auto pPhantom = (Sonicteam::SoX::Physics::Phantom*)g_memory.Translate(phantom.u32);
99+
auto pMessage = (Sonicteam::Message::MsgSuckPlayer*)g_memory.Translate(message.u32);
100+
101+
auto pNewMessage = (MsgSuckPlayerEx*)g_userHeap.Alloc(sizeof(MsgSuckPlayerEx));
102+
pNewMessage->ID = pMessage->ID;
103+
pNewMessage->Point = pMessage->Point;
104+
pNewMessage->DeltaTime = deltaTime.f64;
105+
106+
pPhantom->OnMessageReceived(pNewMessage);
107+
108+
g_userHeap.Free(pNewMessage);
109+
}
110+
111+
void PlayerObject_ProcessMsgSuckPlayer_FixForce(PPCRegister& message, PPCRegister& force)
112+
{
113+
auto pMessage = (MsgSuckPlayerEx*)g_memory.Translate(message.u32);
114+
115+
force.f64 = pow(force.f64, pMessage->DeltaTime * 60.0);
116+
}
117+
118+
void PlayerObject_ProcessMsgSuckPlayer_FixDeltaTime(PPCRegister& message, PPCRegister& deltaTime)
119+
{
120+
auto pMessage = (MsgSuckPlayerEx*)g_memory.Translate(message.u32);
121+
122+
deltaTime.f64 = pMessage->DeltaTime;
123+
}

MarathonRecompLib/config/Marathon.toml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,3 +486,25 @@ name = "ObjEspSwing_DecayRateFix"
486486
address = 0x8232A4D0
487487
registers = ["f0", "f13", "f28"]
488488
jump_address = 0x8232A4D4
489+
490+
[[midasm_hook]]
491+
name = "ObjectInputWarp_ExtendMsgSuckPlayer"
492+
address = 0x82389D70
493+
registers = ["r3", "r4", "f25"]
494+
jump_address = 0x82389D74
495+
496+
[[midasm_hook]]
497+
name = "ObjectInputWarp_ExtendMsgSuckPlayer"
498+
address = 0x82389E48
499+
registers = ["r3", "r4", "f25"]
500+
jump_address = 0x82389E4C
501+
502+
[[midasm_hook]]
503+
name = "PlayerObject_ProcessMsgSuckPlayer_FixForce"
504+
address = 0x8219B64C
505+
registers = ["r28", "f1"]
506+
507+
[[midasm_hook]]
508+
name = "PlayerObject_ProcessMsgSuckPlayer_FixDeltaTime"
509+
address = 0x8219B660
510+
registers = ["r28", "f31"]

0 commit comments

Comments
 (0)