diff --git a/AutoSetup.cmd b/AutoSetup.cmd index 172d6e5..5199e51 100644 --- a/AutoSetup.cmd +++ b/AutoSetup.cmd @@ -51,6 +51,9 @@ cd.. cd Battle Gear 4 Tuned rename dinput8.dll d3d9.dll cd.. +cd Cruisn Blast +rename dinput8.dll winmm.dll +cd.. cd Crazy Taxi Steam rename dinput8.dll xinput1_3.dll cd.. @@ -81,6 +84,15 @@ cd.. cd Dirty Drivin' rename dinput8.dll d3d9.dll cd.. +cd FnF +rename dinput8.dll dinput8.dll +cd.. +cd FnFDrift +rename dinput8.dll dinput8.dll +cd.. +cd FnFSuperCars +rename dinput8.dll dinput8.dll +cd.. cd H2Overdrive rename dinput8.dll d3d9.dll cd.. diff --git a/Config/FFBPlugin.ini b/Config/FFBPlugin.ini index 1089f1f..d407635 100644 --- a/Config/FFBPlugin.ini +++ b/Config/FFBPlugin.ini @@ -348,6 +348,34 @@ DefaultCentering=15 EnableDamper=0 DamperStrength=100 +[FnF] +GameId=77 +FeedbackLength=500 +DefaultCentering=15 +EnableDamper=0 +DamperStrength=100 + +[FNFDrift] +GameId=78 +FeedbackLength=500 +DefaultCentering=15 +EnableDamper=0 +DamperStrength=100 + +[FNFSuperCars] +GameId=79 +FeedbackLength=500 +DefaultCentering=15 +EnableDamper=0 +DamperStrength=100 + +[Sega Race TV] +GameId=80 +FeedbackLength=500 +DefaultCentering=15 +EnableDamper=0 +DamperStrength=100 + [KODrive] GameId=39 PowerMode=0 @@ -788,6 +816,13 @@ PowerMode=1 EnableForceSpringEffect = 1; ForceSpringStrength = 100; +[Cruisn Blast] +GameId=76 +FeedbackLength=500 +DefaultCentering=15 +EnableDamper=0 +DamperStrength=100 + [WMMT5] GameId=9 DefaultCentering=0 diff --git a/Dinput8Wrapper.vcxproj b/Dinput8Wrapper.vcxproj index d4964c7..9c883ec 100644 --- a/Dinput8Wrapper.vcxproj +++ b/Dinput8Wrapper.vcxproj @@ -27,11 +27,15 @@ + + + + @@ -64,6 +68,7 @@ + @@ -87,6 +92,7 @@ + @@ -97,6 +103,9 @@ + + + @@ -138,6 +147,7 @@ + diff --git a/Dinput8Wrapper.vcxproj.filters b/Dinput8Wrapper.vcxproj.filters index 36df76a..937b781 100644 --- a/Dinput8Wrapper.vcxproj.filters +++ b/Dinput8Wrapper.vcxproj.filters @@ -160,6 +160,11 @@ + + + + + @@ -403,6 +408,21 @@ Common Header Files + + Common Header Files + + + Common Header Files + + + Common Header Files + + + Common Header Files + + + Common Header Files + diff --git a/DllMain.cpp b/DllMain.cpp index b3196aa..f3e2a6c 100644 --- a/DllMain.cpp +++ b/DllMain.cpp @@ -37,12 +37,16 @@ along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. #include "Game Files/BG4JP.h" #include "Game Files/ChaseHQ2.h" #include "Game Files/CrazyTaxi.h" +#include "Game Files/CruisnBlast.h" #include "Game Files/D1GP.h" #include "Game Files/Daytona3.h" #include "Game Files/Daytona3NSE.h" #include "Game Files/DeadHeat.h" #include "Game Files/DeadHeatRiders.h" #include "Game Files/DirtyDrivin.h" +#include "Game Files/FnF.h" +#include "Game Files/FnFDrift.h" +#include "Game Files/FnFSuperCars.h" #include "Game Files/FordRacing.h" #include "Game Files/FordRacingOther.h" #include "Game Files/GaelcoTuningRace.h" @@ -68,6 +72,7 @@ along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. #include "Game Files/MAMESupermodel.h" #include "Game Files/OutRun2Fake.h" #include "Game Files/OutRun2Real.h" +#include "Game Files/SegaRaceTV.h" #include "Game Files/SegaRacingClassic.h" #include "Game Files/SegaRally3.h" #include "Game Files/SegaRally3Other.h" @@ -1068,6 +1073,11 @@ const int MARIO_KART_GPDX_118_CUSTOM = 72; const int SEGA_SHOWDOWN = 73; const int SPRING_EFFECT = 74; const int ARCTIC_THUNDER = 75; +const int CRUISN_BLAST = 76; +const int FNF = 77; +const int FNF_DRIFT = 78; +const int FNF_SUPERCARS = 79; +const int SEGA_RACE_TV = 80; HINSTANCE Get_hInstance() { @@ -2595,6 +2605,21 @@ DWORD WINAPI FFBLoop(LPVOID lpParam) case ARCTIC_THUNDER: game = new ArcticThunder; break; + case CRUISN_BLAST: + game = new CruisnBlast; + break; + case FNF: + game = new FnF; + break; + case FNF_DRIFT: + game = new FnFDrift; + break; + case FNF_SUPERCARS: + game = new FnFSuperCars; + break; + case SEGA_RACE_TV: + game = new SegaRaceTV; + break; case TEST_GAME_CONST: case TEST_GAME_FRICTION: case TEST_GAME_SINE: diff --git a/Game Files/CruisnBlast.cpp b/Game Files/CruisnBlast.cpp new file mode 100644 index 0000000..988b5c1 --- /dev/null +++ b/Game Files/CruisnBlast.cpp @@ -0,0 +1,113 @@ +/*This file is part of FFB Arcade Plugin. +FFB Arcade Plugin is free software : you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +FFB Arcade Plugin is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. +*/ + +#include "CruisnBlast.h" +#include +static bool init; + +static EffectTriggers* myTriggers; +static EffectConstants* myConstants; +static Helpers* myHelpers; +extern int EnableDamper; +extern int DamperStrength; + +static float lastFF = 0; +static int currentScreen = 0; + +static int(__cdecl* Wheel_SetHookOrig)(float param_1); +static int __cdecl Wheel_SetHook(float param_1) +{ + float puVar1 = myHelpers->ReadFloat32(0x8babbac, false); //menus ffb?! CHECKED COOL + float puVar2 = myHelpers->ReadByte(0x8babba8, false); //in game ffb?! //CHECKED seems to just go 0 when off the road + //int puVar3 = myHelpers->ReadFloat32(0x8babbb0, false); //ffb effects FLOAT?? + //int puVar4 = myHelpers->ReadFloat32(0x8babbb4, false); + //int puVar5 = myHelpers->ReadFloat32(0x8babbbc, false); //ffb effects + //int puVar6 = myHelpers->ReadFloat32(0x8babbb8, false); //ffb effects are running (1 at the start i think) + int puVar7 = myHelpers->ReadInt32(0x8babbc0, false); //0 menus, 1 game + + if (puVar7 == 1) + { + if (currentScreen == 0) + { + //in game - turn on wheel effects + myHelpers->WriteByte(0x9c28504, 1, false); + currentScreen = 1; + lastFF = 0; + } + else + { + lastFF = param_1; + } + } + else + { + if (currentScreen == 1) + { + //not in game turn off wheel effects + myHelpers->WriteByte(0x9c28504, 0, false); + lastFF = 0; + currentScreen = 0; + } + else + { + lastFF = puVar1; + } + } + if (lastFF >= 0) { + myTriggers->Rumble(0, lastFF, 100.0); + myTriggers->Constant(myConstants->DIRECTION_FROM_RIGHT, lastFF); + } + if (lastFF <= 0) { + myTriggers->Rumble(0, lastFF * -1, 100.0); + myTriggers->Constant(myConstants->DIRECTION_FROM_LEFT, lastFF * -1); + } + return 0; +} + + +void CruisnBlast::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) { + if (!init) + { + DWORD ImageBase = (DWORD)GetModuleHandleA(0); + + if (EnableDamper) + triggers->Damper(DamperStrength / 100.0); + + myHelpers = helpers; + myTriggers = triggers; + myConstants = constants; + + //set cab type + myHelpers->WriteByte(0xa0a7808, 4, false); + //enable wheel found + //myHelpers->WriteByte(0x8bab744, 1, false); + + OutputDebugStringA("CruisnBlast FFB Loop"); + + MH_Initialize(); + MH_CreateHook((LPVOID)(0x8151b50), Wheel_SetHook, (LPVOID*)&Wheel_SetHookOrig); + //remove wheel check for WHEEL_SET function + myHelpers->WriteNop(0x8151b61, 2, false); + //remove outs for WHEEL_SET function just incase we get there + myHelpers->WriteNop(0x8151b90, 1, false); + myHelpers->WriteNop(0x8151b96, 1, false); + myHelpers->WriteNop(0x8151b9c, 1, false); + myHelpers->WriteNop(0x8151b87, 1, false); + + MH_EnableHook(MH_ALL_HOOKS); + init = true; + } + + + +} \ No newline at end of file diff --git a/Game Files/CruisnBlast.h b/Game Files/CruisnBlast.h new file mode 100644 index 0000000..3fe8c96 --- /dev/null +++ b/Game Files/CruisnBlast.h @@ -0,0 +1,21 @@ +#pragma once +/*This file is part of FFB Arcade Plugin. +FFB Arcade Plugin is free software : you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +FFB Arcade Plugin is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. +*/ + +#pragma once +#include "../Common Files/TeknoParrotGame.h" + +class CruisnBlast : public Game { +public: + void FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers); +}; diff --git a/Game Files/FnF.cpp b/Game Files/FnF.cpp new file mode 100644 index 0000000..4f9b7f8 --- /dev/null +++ b/Game Files/FnF.cpp @@ -0,0 +1,80 @@ + +/*This file is part of FFB Arcade Plugin. +FFB Arcade Plugin is free software : you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +FFB Arcade Plugin is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. +*/ + +#include +#include "FnF.h" + +static bool init; +static EffectTriggers* myTriggers; +static EffectConstants* myConstants; +static Helpers* myHelpers; +extern int EnableDamper; +extern int DamperStrength; + +static int(__cdecl* FnFSendToLptOrig)(uint16_t addr, uint8_t FFB); +static int __cdecl FnFSendToLpt(uint16_t addr, uint8_t FFB) +{ + if (addr == 0x378) + { + bool isLeft = FFB < 0x80; + float percentForce; + if (isLeft) { + + percentForce = static_cast(FFB) / 0x7F; + myTriggers->Rumble(0, percentForce, 100.0); + myTriggers->Constant(myConstants->DIRECTION_FROM_RIGHT, percentForce); + } + else { + + percentForce = static_cast(FFB - 0x80) / 0x7F; + myTriggers->Rumble(0, percentForce, 100.0); + myTriggers->Constant(myConstants->DIRECTION_FROM_LEFT, percentForce); + } + } + + return 0; +} + +static void(__cdecl* FnFIgnoreLPTOrig)(); +static void __cdecl FnFignoreLPT() { + return; +} + + +void FnF::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) { + if (!init) + { + //enable IO calls + myHelpers->WriteIntPtr(0x05b2ed4, 1, false); + + MH_Initialize(); + MH_CreateHook((LPVOID)0x046da10, FnFSendToLpt, (LPVOID*)&FnFSendToLptOrig); + //null all the other functions IO functions + MH_CreateHook((LPVOID)0x046dd60, FnFignoreLPT, (LPVOID*)&FnFIgnoreLPTOrig); + MH_CreateHook((LPVOID)0x046dda0, FnFignoreLPT, (LPVOID*)&FnFIgnoreLPTOrig); + MH_CreateHook((LPVOID)0x046dec0, FnFignoreLPT, (LPVOID*)&FnFIgnoreLPTOrig); + MH_CreateHook((LPVOID)0x046df70, FnFignoreLPT, (LPVOID*)&FnFIgnoreLPTOrig); + + MH_EnableHook(MH_ALL_HOOKS); + + init = true; + } + + if (EnableDamper) + triggers->Damper(DamperStrength / 100.0); + + myTriggers = triggers; + myConstants = constants; + myHelpers = helpers; +} \ No newline at end of file diff --git a/Game Files/FnF.h b/Game Files/FnF.h new file mode 100644 index 0000000..db4efdf --- /dev/null +++ b/Game Files/FnF.h @@ -0,0 +1,20 @@ +/*This file is part of FFB Arcade Plugin. +FFB Arcade Plugin is free software : you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +FFB Arcade Plugin is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. +*/ + +#pragma once +#include "../Common Files/Game.h" +class FnF : public Game { + +public: + void FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers); +}; \ No newline at end of file diff --git a/Game Files/FnFDrift.cpp b/Game Files/FnFDrift.cpp new file mode 100644 index 0000000..a27c931 --- /dev/null +++ b/Game Files/FnFDrift.cpp @@ -0,0 +1,79 @@ + +/*This file is part of FFB Arcade Plugin. +FFB Arcade Plugin is free software : you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +FFB Arcade Plugin is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. +*/ + +#include +#include "FnFDrift.h" + + +static bool init; +static EffectTriggers* myTriggers; +static EffectConstants* myConstants; +static Helpers* myHelpers; +extern int EnableDamper; +extern int DamperStrength; + +static int(__cdecl* FnFSendToLptOrig)(uint16_t addr, uint8_t FFB); +static int __cdecl FnFSendToLpt(uint16_t addr, uint8_t FFB) +{ + if (addr == 0x378) + { + bool isLeft = FFB < 0x80; + float percentForce; + if (isLeft) { + + percentForce = static_cast(FFB) / 0x7F; + myTriggers->Rumble(0, percentForce, 100.0); + myTriggers->Constant(myConstants->DIRECTION_FROM_RIGHT, percentForce); + } + else { + + percentForce = static_cast(FFB - 0x80) / 0x7F; + myTriggers->Rumble(0, percentForce, 100.0); + myTriggers->Constant(myConstants->DIRECTION_FROM_LEFT, percentForce); + } + } + + return 0; + +} + + +static void(__cdecl* FnFIgnoreLPTOrig)(); +static void __cdecl FnFignoreLPT() { + return; +} + +void FnFDrift::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) { + if (!init) + { + //enable IO calls + myHelpers->WriteIntPtr(0x05a3ca4, 1, false); + MH_Initialize(); + MH_CreateHook((LPVOID)0x048a410, FnFSendToLpt, (LPVOID*)&FnFSendToLptOrig); + + MH_CreateHook((LPVOID)0x048a760, FnFignoreLPT, (LPVOID*)&FnFIgnoreLPTOrig); + MH_CreateHook((LPVOID)0x048a7b0, FnFignoreLPT, (LPVOID*)&FnFIgnoreLPTOrig); + MH_CreateHook((LPVOID)0x048a8f0, FnFignoreLPT, (LPVOID*)&FnFIgnoreLPTOrig); + MH_CreateHook((LPVOID)0x048aa20, FnFignoreLPT, (LPVOID*)&FnFIgnoreLPTOrig); + MH_EnableHook(MH_ALL_HOOKS); + init = true; + } + + if (EnableDamper) + triggers->Damper(DamperStrength / 100.0); + + myTriggers = triggers; + myConstants = constants; + myHelpers = helpers; +} \ No newline at end of file diff --git a/Game Files/FnFDrift.h b/Game Files/FnFDrift.h new file mode 100644 index 0000000..545a8de --- /dev/null +++ b/Game Files/FnFDrift.h @@ -0,0 +1,21 @@ +#pragma once +/*This file is part of FFB Arcade Plugin. +FFB Arcade Plugin is free software : you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +FFB Arcade Plugin is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. +*/ + +#pragma once +#include "../Common Files/Game.h" +class FnFDrift : public Game { + +public: + void FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers); +}; \ No newline at end of file diff --git a/Game Files/FnFSuperCars.cpp b/Game Files/FnFSuperCars.cpp new file mode 100644 index 0000000..da28577 --- /dev/null +++ b/Game Files/FnFSuperCars.cpp @@ -0,0 +1,72 @@ + +/*This file is part of FFB Arcade Plugin. +FFB Arcade Plugin is free software : you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +FFB Arcade Plugin is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. +*/ + +#include "FnFSuperCars.h" + +static bool init; +static EffectTriggers* myTriggers; +static EffectConstants* myConstants; +static Helpers* myHelpers; +extern int EnableDamper; +extern int DamperStrength; + +static void(__cdecl* FUN_00402cf0Orig)(float param_1); +static void __cdecl FUN_00402cf0(float param_1) { + + + if (param_1 >= 0) { + + myTriggers->Rumble(0, param_1, 100.0); + myTriggers->Constant(myConstants->DIRECTION_FROM_RIGHT, param_1 ); + } + if (param_1 <= 0) { + myTriggers->Rumble(0, param_1 * -1, 100.0); + myTriggers->Constant(myConstants->DIRECTION_FROM_LEFT, param_1 * -1); + } + return; +} + + + +static void(__cdecl* FnFSCIgnoreLPTOrig)(); +static void __cdecl FnFSCignoreLPT() { + return ; +} + +void FnFSuperCars::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) { + if (!init) + { + OutputDebugStringA("FnFSuperCars::FFBLoop"); + + + MH_Initialize(); + MH_CreateHook((LPVOID)0x0402cf0, FUN_00402cf0, (LPVOID*)&FUN_00402cf0Orig); + + //remove unwanted instances + MH_CreateHook((LPVOID)0x0402ca0, FnFSCignoreLPT, (LPVOID*)&FnFSCIgnoreLPTOrig); + MH_CreateHook((LPVOID)0x0402c50, FnFSCignoreLPT, (LPVOID*)&FnFSCIgnoreLPTOrig); + MH_CreateHook((LPVOID)0x0402bc0, FnFSCignoreLPT, (LPVOID*)&FnFSCIgnoreLPTOrig); + MH_EnableHook(MH_ALL_HOOKS); + + init = true; + } + + if (EnableDamper) + triggers->Damper(DamperStrength / 100.0); + + myTriggers = triggers; + myConstants = constants; + myHelpers = helpers; + +} \ No newline at end of file diff --git a/Game Files/FnFSuperCars.h b/Game Files/FnFSuperCars.h new file mode 100644 index 0000000..2278915 --- /dev/null +++ b/Game Files/FnFSuperCars.h @@ -0,0 +1,22 @@ +#pragma once +#pragma once +/*This file is part of FFB Arcade Plugin. +FFB Arcade Plugin is free software : you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +FFB Arcade Plugin is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. +*/ + +#pragma once +#include "../Common Files/Game.h" +class FnFSuperCars : public Game { + +public: + void FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers); +}; \ No newline at end of file diff --git a/Game Files/SegaRaceTV.cpp b/Game Files/SegaRaceTV.cpp new file mode 100644 index 0000000..a2a3d00 --- /dev/null +++ b/Game Files/SegaRaceTV.cpp @@ -0,0 +1,63 @@ + +/*This file is part of FFB Arcade Plugin. +FFB Arcade Plugin is free software : you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +FFB Arcade Plugin is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. +*/ + +#include +#include "SegaRaceTV.h" +#include + +static bool init; +extern int EnableDamper; +extern int DamperStrength; +extern int EnableForceSpringEffect; +extern int ForceSpringStrength; + +void SegaRaceTV::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) { + if (!init) + { + OutputDebugStringA("SegaRaceTV::FFBLoop"); + //enable IO calls + helpers->WriteIntPtr(0x8b3fe90, 0x1, true); + init = true; + } + + int ff = helpers->ReadInt32(0x8b44210, false); + + if (EnableDamper) + triggers->Damper(DamperStrength / 100.0); + if (EnableForceSpringEffect) + triggers->Springi(ForceSpringStrength / 100.0); + + if (ff > 0 && ff < 128) + { + double percentForce = ((128.0 - ff) / 127.0); + + std::ostringstream ss; + ss << "LEFT: " << percentForce << " FF: " << ff; + OutputDebugStringA(ss.str().c_str()); + + + + triggers->Rumble(0, percentForce, 100.0); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + else if (ff > 128) + { + double percentForce = ((ff - 128.0) / 127.0); + std::ostringstream ss; + ss << "RIGHT: " << percentForce << " FF: " << ff; + OutputDebugStringA(ss.str().c_str()); + triggers->Rumble(percentForce, 0, 100.0); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } +} \ No newline at end of file diff --git a/Game Files/SegaRaceTV.h b/Game Files/SegaRaceTV.h new file mode 100644 index 0000000..1bb39dd --- /dev/null +++ b/Game Files/SegaRaceTV.h @@ -0,0 +1,20 @@ +/*This file is part of FFB Arcade Plugin. +FFB Arcade Plugin is free software : you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. +FFB Arcade Plugin is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. +*/ + +#pragma once +#include "../Common Files/Game.h" +class SegaRaceTV : public Game { + +public: + void FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers); +}; \ No newline at end of file