1
0
mirror of synced 2024-11-28 00:20:52 +01:00

Gaelco FFB Changes

This commit is contained in:
Boomslangnz 2023-03-18 15:01:18 +13:00
parent 430ab81e22
commit af94899cb2
4 changed files with 32 additions and 101 deletions

View File

@ -252,18 +252,21 @@ GameId=64
FeedbackLength=500 FeedbackLength=500
EnableDamper=0 EnableDamper=0
DamperStrength=100 DamperStrength=100
DoubleConstant=0
[Tokyo Cop] [Tokyo Cop]
GameId=65 GameId=65
FeedbackLength=500 FeedbackLength=500
EnableDamper=0 EnableDamper=0
DamperStrength=100 DamperStrength=100
DoubleConstant=0
[Ring Riders] [Ring Riders]
GameId=66 GameId=66
FeedbackLength=500 FeedbackLength=500
EnableDamper=0 EnableDamper=0
DamperStrength=100 DamperStrength=100
DoubleConstant=0
[Winter X Games SnoCross] [Winter X Games SnoCross]
GameId=44 GameId=44

View File

@ -13,14 +13,17 @@ along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>.
#include <string> #include <string>
#include "GaelcoTuningRace.h" #include "GaelcoTuningRace.h"
static EffectTriggers* myTriggers; static EffectTriggers* myTriggers;
static EffectConstants* myConstants; static EffectConstants* myConstants;
static Helpers* myHelpers; static Helpers* myHelpers;
extern int EnableDamper; extern int EnableDamper;
extern int DamperStrength; extern int DamperStrength;
static bool init; static bool init;
static int __stdcall SetMotor(DWORD* a1) static int(__stdcall* SetMotorOri)(DWORD* a1);
static int __stdcall SetMotorHook(DWORD* a1)
{ {
long double v1 = *(float*)&a1; long double v1 = *(float*)&a1;
@ -46,43 +49,17 @@ static int __stdcall SetMotor(DWORD* a1)
myTriggers->Rumble(0, percentForce, percentLength); myTriggers->Rumble(0, percentForce, percentLength);
myTriggers->Constant(myConstants->DIRECTION_FROM_RIGHT, percentForce); myTriggers->Constant(myConstants->DIRECTION_FROM_RIGHT, percentForce);
} }
return 0; return SetMotorOri(a1);
} }
static bool Hook(void* toHook, void* ourFunct, int len) {
if (len < 5) {
return false;
}
DWORD curProtection;
VirtualProtect(toHook, len, PAGE_EXECUTE_READWRITE, &curProtection);
memset(toHook, 0x90, len);
DWORD relativeAddress = ((DWORD)ourFunct - (DWORD)toHook) - 5;
*(BYTE*)toHook = 0xE9;
*(DWORD*)((DWORD)toHook + 1) = relativeAddress;
DWORD temp;
VirtualProtect(toHook, len, curProtection, &temp);
return true;
}
static DWORD jmpBackAddy;
void GaelcoTuningRace::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) { void GaelcoTuningRace::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) {
if (!init) if (!init)
{ {
int hookLength = 6; init = true;
DWORD hookAddress = 0x8188ABC; MH_Initialize();
if (hookAddress) MH_CreateHook((void*)0x8188ABC, SetMotorHook, (void**)&SetMotorOri);
{ MH_EnableHook(MH_ALL_HOOKS);
jmpBackAddy = hookAddress + hookLength;
Hook((void*)hookAddress, SetMotor, hookLength);
init = true;
}
} }
if (EnableDamper) if (EnableDamper)

View File

@ -20,7 +20,8 @@ extern int EnableDamper;
extern int DamperStrength; extern int DamperStrength;
static bool init; static bool init;
static int __stdcall SetMotor(DWORD* a1, float a2) static int(__stdcall* SetMotorOri)(DWORD* a1, float a2);
static int __stdcall SetMotorHook(DWORD* a1, float a2)
{ {
if (a2 > 0) if (a2 > 0)
{ {
@ -44,46 +45,20 @@ static int __stdcall SetMotor(DWORD* a1, float a2)
myTriggers->Rumble(0, percentForce, percentLength); myTriggers->Rumble(0, percentForce, percentLength);
myTriggers->Constant(myConstants->DIRECTION_FROM_RIGHT, percentForce); myTriggers->Constant(myConstants->DIRECTION_FROM_RIGHT, percentForce);
} }
return 0; return SetMotorOri(a1, a2);
} }
static bool Hook(void* toHook, void* ourFunct, int len) {
if (len < 5) {
return false;
}
DWORD curProtection;
VirtualProtect(toHook, len, PAGE_EXECUTE_READWRITE, &curProtection);
memset(toHook, 0x90, len);
DWORD relativeAddress = ((DWORD)ourFunct - (DWORD)toHook) - 5;
*(BYTE*)toHook = 0xE9;
*(DWORD*)((DWORD)toHook + 1) = relativeAddress;
DWORD temp;
VirtualProtect(toHook, len, curProtection, &temp);
return true;
}
static DWORD jmpBackAddy;
void RingRiders::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) { void RingRiders::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) {
if (!init) if (!init)
{ {
int hookLength = 6; init = true;
DWORD hookAddress = 0x8107568; MH_Initialize();
if (hookAddress) MH_CreateHook((void*)0x8107568, SetMotorHook, (void**)&SetMotorOri);
{ MH_EnableHook(MH_ALL_HOOKS);
jmpBackAddy = hookAddress + hookLength;
Hook((void*)hookAddress, SetMotor, hookLength);
init = true;
}
} }
if (EnableDamper == 1) if (EnableDamper)
triggers->Damper(DamperStrength / 100.0); triggers->Damper(DamperStrength / 100.0);
myTriggers = triggers; myTriggers = triggers;

View File

@ -16,11 +16,13 @@ along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>.
static EffectTriggers* myTriggers; static EffectTriggers* myTriggers;
static EffectConstants* myConstants; static EffectConstants* myConstants;
static Helpers* myHelpers; static Helpers* myHelpers;
extern int EnableDamper; extern int EnableDamper;
extern int DamperStrength; extern int DamperStrength;
static bool init; static bool init;
static int __stdcall SetMotor(DWORD* a1, float a2) static int(__stdcall* SetMotorOri)(DWORD* a1, float a2);
static int __stdcall SetMotorHook(DWORD* a1, float a2)
{ {
if (a2 > 0) if (a2 > 0)
{ {
@ -44,46 +46,20 @@ static int __stdcall SetMotor(DWORD* a1, float a2)
myTriggers->Rumble(0, percentForce, percentLength); myTriggers->Rumble(0, percentForce, percentLength);
myTriggers->Constant(myConstants->DIRECTION_FROM_RIGHT, percentForce); myTriggers->Constant(myConstants->DIRECTION_FROM_RIGHT, percentForce);
} }
return 0; return SetMotorOri(a1, a2);
} }
static bool Hook(void* toHook, void* ourFunct, int len) {
if (len < 5) {
return false;
}
DWORD curProtection;
VirtualProtect(toHook, len, PAGE_EXECUTE_READWRITE, &curProtection);
memset(toHook, 0x90, len);
DWORD relativeAddress = ((DWORD)ourFunct - (DWORD)toHook) - 5;
*(BYTE*)toHook = 0xE9;
*(DWORD*)((DWORD)toHook + 1) = relativeAddress;
DWORD temp;
VirtualProtect(toHook, len, curProtection, &temp);
return true;
}
static DWORD jmpBackAddy;
void TokyoCop::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) { void TokyoCop::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) {
if (!init) if (!init)
{ {
int hookLength = 6; init = true;
DWORD hookAddress = 0x80E6FA4; MH_Initialize();
if (hookAddress) MH_CreateHook((void*)0x80E6FA4, SetMotorHook, (void**)&SetMotorOri);
{ MH_EnableHook(MH_ALL_HOOKS);
jmpBackAddy = hookAddress + hookLength;
Hook((void*)hookAddress, SetMotor, hookLength);
init = true;
}
} }
if (EnableDamper == 1) if (EnableDamper)
triggers->Damper(DamperStrength / 100.0); triggers->Damper(DamperStrength / 100.0);
myTriggers = triggers; myTriggers = triggers;