diff --git a/Config/FFBPlugin.ini b/Config/FFBPlugin.ini
index ed1308b..ea4e2bd 100644
--- a/Config/FFBPlugin.ini
+++ b/Config/FFBPlugin.ini
@@ -1043,6 +1043,47 @@ BridgeRumble=1
BridgeRumbleStrength=40
HideCursor=0
+[Mario Kart Arcade GP DX v118 Custom]
+GameId=72
+DefaultCentering=-1
+FeedbackLength=80
+EnableDamper=0
+DamperStrength=100
+ConstantEffectForSteering=1
+ConstantEffectForSteeringStrength=128
+WeaponRumble=1
+WeaponRumbleStrength=30
+CoinRumble=1
+CoinRumbleStrength=20
+DriftRumble=1
+DriftRumbleControllerStrengthMultiplier=100
+HitGroundRumble=1
+HitGroundRumbleStrength=15
+BoostRumble=1
+BoostRumbleStrength=50
+MainShakeRumble=1
+MainShakeRumbleStrength=100
+DirtRumble=1
+DirtRumbleStrength=30
+GrassRumble=1
+GrassRumbleStrength=20
+SandRumble=1
+SandRumbleStrength=10
+WaterRumble=1
+WaterRumbleWheelStrength=65
+WaterRumbleControllerStrengthMultiplier=100
+TileRumble=1
+TileRumbleStrength=20
+CarpetRumble=1
+CarpetRumbleStrength=20
+SpeedBumpRumble=1
+SpeedBumpRumbleStrength=20
+RoughTrackRumble=1
+RoughTrackRumbleStrength=10
+BridgeRumble=1
+BridgeRumbleStrength=40
+HideCursor=0
+
[Mario Kart Arcade GP DX USA Custom]
GameId=51
DefaultCentering=-1
diff --git a/Dinput8Wrapper.vcxproj b/Dinput8Wrapper.vcxproj
index ab496c4..d1d59d5 100644
--- a/Dinput8Wrapper.vcxproj
+++ b/Dinput8Wrapper.vcxproj
@@ -44,6 +44,7 @@
+
@@ -109,6 +110,7 @@
+
diff --git a/Dinput8Wrapper.vcxproj.filters b/Dinput8Wrapper.vcxproj.filters
index f29dc8c..b9911b0 100644
--- a/Dinput8Wrapper.vcxproj.filters
+++ b/Dinput8Wrapper.vcxproj.filters
@@ -156,6 +156,7 @@
+
@@ -387,6 +388,9 @@
Common Header Files
+
+ Common Header Files
+
diff --git a/DllMain.cpp b/DllMain.cpp
index c9e494c..13dcb12 100644
--- a/DllMain.cpp
+++ b/DllMain.cpp
@@ -61,6 +61,7 @@ along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>.
#include "Game Files/MarioKartGPDXCustom.h"
#include "Game Files/MarioKartGPDX1.10Custom.h"
#include "Game Files/MarioKartGPDX1.10Real.h"
+#include "Game Files/MarioKartGPDX1.18Custom.h"
#include "Game Files/MarioKartGPDX1.18Real.h"
#include "Game Files/MarioKartGPDXUSACustom.h"
#include "Game Files/MarioKartGPDXUSAReal.h"
@@ -1056,6 +1057,7 @@ const int MARIO_KART_GPDX_118_REAL = 68;
const int MARIO_KART_GPDX_110_REAL = 69;
const int MARIO_KART_GPDX_USA_REAL = 70;
const int GRID_Custom = 71;
+const int MARIO_KART_GPDX_118_CUSTOM = 72;
HINSTANCE Get_hInstance()
{
@@ -2461,6 +2463,9 @@ DWORD WINAPI FFBLoop(LPVOID lpParam)
case MARIO_KART_GPDX_110_CUSTOM:
game = new MarioKartGPDX110Custom;
break;
+ case MARIO_KART_GPDX_118_CUSTOM:
+ game = new MarioKartGPDX118Custom;
+ break;
case MARIO_KART_GPDX_USA_CUSTOM:
game = new MarioKartGPDXUSACustom;
break;
diff --git a/Game Files/MarioKartGPDX1.10Custom.cpp b/Game Files/MarioKartGPDX1.10Custom.cpp
index dac882d..ee63ead 100644
--- a/Game Files/MarioKartGPDX1.10Custom.cpp
+++ b/Game Files/MarioKartGPDX1.10Custom.cpp
@@ -54,23 +54,23 @@ static int BridgeRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("B
void MarioKartGPDX110Custom::FFBLoop(EffectConstants *constants, Helpers *helpers, EffectTriggers* triggers) {
- INT_PTR ff1 = helpers->ReadIntPtr(0xA46974, /* isRelativeOffset */ true); //shake
- INT_PTR ff2 = helpers->ReadIntPtr(0x00A416E4,/* isRelativeOffset */ true);
- UINT8 ff3 = helpers->ReadByte(ff2 + 0x628, /* isRelativeOffset */ false); // terrain data
- UINT8 ff5 = helpers->ReadByte(ff2 + 0x658, /* isRelativeOffset */ false); //kart flying or on ground
- INT_PTR ff6 = helpers->ReadIntPtr(0x00A309A0,/* isRelativeOffset */ true);
- INT_PTR ff7 = helpers->ReadIntPtr(ff6 + 0x304, /* isRelativeOffset */ false);
- INT_PTR ff8 = helpers->ReadIntPtr(ff7 + 0xE8, /* isRelativeOffset */ false);
- INT_PTR ff9 = helpers->ReadIntPtr(ff8 + 0x64, /* isRelativeOffset */ false);
- INT_PTR ff10 = helpers->ReadIntPtr(ff9 + 0x38, /* isRelativeOffset */ false);
- UINT8 ff11 = helpers->ReadByte(ff10 + 0x4C4, /* isRelativeOffset */ false); // 1 during race only
- float Speed = helpers->ReadFloat32(ff2 + 0x558, /* isRelativeOffset */ false); //Speed of Kart
- UINT8 ff13 = helpers->ReadByte(0xA39690, /* isRelativeOffset */ true); //picking up coins
- UINT8 ff14 = helpers->ReadByte(0xA4528D, /* isRelativeOffset */ true); //picking up weapon box
- UINT8 Wheel = helpers->ReadByte(0xA4652D, /* isRelativeOffset */ true); //0-255 steering
- INT_PTR ff16 = helpers->ReadIntPtr(0x00A2E284, /* isRelativeOffset*/ true);
- UINT8 ff17 = helpers->ReadByte(ff2 + 0x674, /* isRelativeOffset */ false); // Drift
- UINT8 ff18 = helpers->ReadByte(ff16 + 0x3A4, /* isRelativeOffset */ false); // Boost
+ INT_PTR ff1 = helpers->ReadIntPtr(0xA46974, true); //shake
+ INT_PTR ff2 = helpers->ReadIntPtr(0x00A416E4, true);
+ UINT8 ff3 = helpers->ReadByte(ff2 + 0x628, false); // terrain data
+ UINT8 ff5 = helpers->ReadByte(ff2 + 0x658, false); //kart flying or on ground
+ INT_PTR ff6 = helpers->ReadIntPtr(0x00A309A0, true);
+ INT_PTR ff7 = helpers->ReadIntPtr(ff6 + 0x304, false);
+ INT_PTR ff8 = helpers->ReadIntPtr(ff7 + 0xE8, false);
+ INT_PTR ff9 = helpers->ReadIntPtr(ff8 + 0x64, false);
+ INT_PTR ff10 = helpers->ReadIntPtr(ff9 + 0x38, false);
+ UINT8 ff11 = helpers->ReadByte(ff10 + 0x4C4, false); // 1 during race only
+ float Speed = helpers->ReadFloat32(ff2 + 0x558, false); //Speed of Kart
+ UINT8 ff13 = helpers->ReadByte(0xA39690, true); //picking up coins
+ UINT8 ff14 = helpers->ReadByte(0xA4528D, true); //picking up weapon box
+ UINT8 Wheel = helpers->ReadByte(0xA4652D, true); //0-255 steering
+ INT_PTR ff16 = helpers->ReadIntPtr(0x00A2E284, true);
+ UINT8 ff17 = helpers->ReadByte(ff2 + 0x674, false); // Drift
+ UINT8 ff18 = helpers->ReadByte(ff16 + 0x3A4, false); // Boost
int static oldcoins = 0;
int newcoins = ff13;
@@ -82,10 +82,8 @@ void MarioKartGPDX110Custom::FFBLoop(EffectConstants *constants, Helpers *helper
std::string ffs = std::to_string(ff1);
helpers->log((char *)ffs.c_str()); helpers->log("got value: ");
- if (EnableDamper == 1)
- {
+ if (EnableDamper)
triggers->Damper(DamperStrength / 100.0);
- }
if ((ConstantEffectForSteering == 1) && (ff11 == 1))
{
diff --git a/Game Files/MarioKartGPDX1.18Custom.cpp b/Game Files/MarioKartGPDX1.18Custom.cpp
new file mode 100644
index 0000000..58129f0
--- /dev/null
+++ b/Game Files/MarioKartGPDX1.18Custom.cpp
@@ -0,0 +1,264 @@
+/*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 "MarioKartGPDX1.18Custom.h"
+
+extern int EnableDamper;
+extern int DamperStrength;
+
+static wchar_t* settingsFilename = TEXT(".\\FFBPlugin.ini");
+static int ConstantEffectForSteering = GetPrivateProfileInt(TEXT("Settings"), TEXT("ConstantEffectForSteering"), 0, settingsFilename);
+static int ConstantEffectForSteeringStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("ConstantEffectForSteeringStrength"), 0, settingsFilename);
+static int WeaponRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("WeaponRumble"), 0, settingsFilename);
+static int WeaponRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("WeaponRumbleStrength"), 0, settingsFilename);
+static int CoinRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("CoinRumble"), 0, settingsFilename);
+static int CoinRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("CoinRumbleStrength"), 0, settingsFilename);
+static int DriftRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("DriftRumble"), 0, settingsFilename);
+static int DriftRumbleControllerStrengthMultiplier = GetPrivateProfileInt(TEXT("Settings"), TEXT("DriftRumbleControllerStrengthMultiplier"), 0, settingsFilename);
+static int HitGroundRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("HitGroundRumble"), 0, settingsFilename);
+static int HitGroundRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("HitGroundRumbleStrength"), 0, settingsFilename);
+static int BoostRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("BoostRumble"), 0, settingsFilename);
+static int BoostRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("BoostRumbleStrength"), 0, settingsFilename);
+static int MainShakeRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("MainShakeRumble"), 0, settingsFilename);
+static int MainShakeRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("MainShakeRumbleStrength"), 0, settingsFilename);
+static int DirtRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("DirtRumble"), 0, settingsFilename);
+static int DirtRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("DirtRumbleStrength"), 0, settingsFilename);
+static int GrassRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("GrassRumble"), 0, settingsFilename);
+static int GrassRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("GrassRumbleStrength"), 0, settingsFilename);
+static int SandRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("SandRumble"), 0, settingsFilename);
+static int SandRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("SandRumbleStrength"), 0, settingsFilename);
+static int WaterRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("WaterRumble"), 0, settingsFilename);
+static int WaterRumbleWheelStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("WaterRumbleWheelStrength"), 0, settingsFilename);
+static int WaterRumbleControllerStrengthMultiplier = GetPrivateProfileInt(TEXT("Settings"), TEXT("WaterRumbleControllerStrengthMultiplier"), 0, settingsFilename);
+static int TileRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("TileRumble"), 0, settingsFilename);
+static int TileRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("TileRumbleStrength"), 0, settingsFilename);
+static int CarpetRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("CarpetRumble"), 0, settingsFilename);
+static int CarpetRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("CarpetRumbleStrength"), 0, settingsFilename);
+static int SpeedBumpRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("SmallBumpRumble"), 0, settingsFilename);
+static int SpeedBumpRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("SmallBumpRumbleStrength"), 0, settingsFilename);
+static int RoughTrackRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("RoughTrackRumble"), 0, settingsFilename);
+static int RoughTrackRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("RoughTrackRumbleStrength"), 0, settingsFilename);
+static int BridgeRumble = GetPrivateProfileInt(TEXT("Settings"), TEXT("BridgeRumble"), 0, settingsFilename);
+static int BridgeRumbleStrength = GetPrivateProfileInt(TEXT("Settings"), TEXT("BridgeRumbleStrength"), 0, settingsFilename);
+
+void MarioKartGPDX118Custom::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) {
+
+ INT_PTR ff1 = helpers->ReadIntPtr(0xAC72F4, true); //shake
+ INT_PTR ff2 = helpers->ReadIntPtr(0xAC2A30, true);//??
+ UINT8 ff3 = helpers->ReadByte(ff2 + 0x66C, false); // terrain data
+ UINT8 ff5 = helpers->ReadByte(ff2 + 0x69C, false); //kart flying or on ground
+ INT_PTR ff6 = helpers->ReadIntPtr(0xAAFAB8, true);
+ INT_PTR ff7 = helpers->ReadIntPtr(ff6 + 0x44,false);
+ INT_PTR ff8 = helpers->ReadIntPtr(ff7 + 0x70, false);
+ INT_PTR ff9 = helpers->ReadIntPtr(ff8 + 0x108, false);
+ INT_PTR ff10 = helpers->ReadIntPtr(ff9 + 0x98, false);
+ UINT8 ff11 = helpers->ReadByte(ff10 + 0x4C4, false); // 1 during race only
+ float Speed = helpers->ReadFloat32(ff2 + 0x580, false); //Speed of Kart
+ UINT8 ff13 = helpers->ReadByte(0xAB9110, true); //picking up coins
+ UINT8 ff14 = helpers->ReadByte(0xAC5C0D, true); //picking up weapon box
+ UINT8 Wheel = helpers->ReadByte(0xAC6EAD, true); //0-255 steering
+ INT_PTR ff16 = helpers->ReadIntPtr(0xAAD0BC, true);
+ UINT8 ff17 = helpers->ReadByte(ff2 + 0x6B8, false); // Drift
+ UINT8 ff18 = helpers->ReadByte(ff16 + 0x3A4, false); // Boost
+
+ int static oldcoins = 0;
+ int newcoins = ff13;
+ int static oldweapon = 0;
+ int newweapon = ff14;
+ int static oldhitground = 0;
+ int newhitground = ff5;
+ helpers->log("got value: ");
+ std::string ffs = std::to_string(ff1);
+ helpers->log((char*)ffs.c_str()); helpers->log("got value: ");
+
+ if (EnableDamper)
+ triggers->Damper(DamperStrength / 100.0);
+
+ if ((ConstantEffectForSteering == 1) && (ff11 == 1))
+ {
+ if ((Wheel >= 0) && (Wheel < 128))
+ {
+ double percentForce = ((128 - Wheel) / (ConstantEffectForSteeringStrength / 1.0));
+ double percentLength = 100;
+ triggers->Rumble(percentForce, 0, percentLength);
+ triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce);
+ }
+ else if ((Wheel > 127) && (Wheel < 256))
+ {
+ double percentForce = ((Wheel - 127) / (ConstantEffectForSteeringStrength / 1.0));
+ double percentLength = 100;
+ triggers->Rumble(0, percentForce, percentLength);
+ triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce);
+ }
+ }
+ if ((MainShakeRumble == 1) && (4194308 == ff1) && (ff11 == 1))
+ {
+ // Large Shake when hitting walls, other karts or getting hit by items
+ double percentForce = ((MainShakeRumbleStrength) / 100.0);
+ double percentLength = (500);
+ triggers->Rumble(percentForce, percentForce, percentLength);
+ triggers->Sine(200, 200, percentForce);
+ }
+
+ if ((BoostRumble == 1) && (ff18 == 1) && (ff11 == 1))
+ {
+ // Shake when Boost
+ double percentForce = ((BoostRumbleStrength) / 100.0);
+ double percentLength = (100);
+ triggers->Rumble(percentForce, percentForce, percentLength);
+ triggers->Sine(60, 60, percentForce);
+ }
+
+ if ((DriftRumble == 1) && (ff17 == 1) && (Wheel >= 0) && (Wheel < 128) && (ff11 == 1))
+ {
+ // Drift Effect including steering left
+ double percentForce = (((128 - Wheel) / 128.0) * (DriftRumbleControllerStrengthMultiplier / 100.0));
+ double percentLength = (100);
+ triggers->Rumble(percentForce, 0, percentLength);
+ triggers->Friction(percentForce);
+ }
+
+ if ((DriftRumble == 1) && (ff17 == 1) && (Wheel > 127) && (Wheel < 256) && (ff11 == 1))
+ {
+ // Drift Effect including steering right
+ double percentForce = (((Wheel - 127) / 128.0) * (DriftRumbleControllerStrengthMultiplier / 100.0));
+ double percentLength = (100);
+ triggers->Rumble(0, percentForce, percentLength);
+ triggers->Friction(percentForce);
+ }
+
+ if ((HitGroundRumble == 1) && (oldhitground != newhitground) && (ff5 == 1) && (ff11 == 1))
+ {
+ // Shake when hitting ground
+ double percentForce = ((HitGroundRumbleStrength) / 100.0);
+ double percentLength = (100);
+ triggers->Rumble(percentForce, percentForce, percentLength);
+ triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce);
+ Sleep(50);
+ triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce);
+ }
+
+ if ((WeaponRumble == 1) && (oldweapon != newweapon) && (ff11 == 1))
+ {
+ // Shake when picking up new weapons or using them
+ double percentForce = ((WeaponRumbleStrength) / 100.0);
+ double percentLength = (300);
+ triggers->Rumble(percentForce, percentForce, percentLength);
+ triggers->Sine(80, 50, percentForce);
+ }
+
+ if ((CoinRumble == 1) && (oldcoins != newcoins) && (ff11 == 1))
+ {
+ // Shake when picking up coins
+ double percentForce = ((CoinRumbleStrength) / 100.0);
+ double percentLength = (200);
+ triggers->Rumble(percentForce, percentForce, percentLength);
+ triggers->Sine(50, 50, percentForce);
+ }
+
+ if ((DirtRumble == 1) && (3 == ff3) && (ff11 == 1) && (ff5 == 1) && (Speed > 0.1))
+ {
+ // small friction when driving on dirt while moving
+ double percentForce = ((DirtRumbleStrength) / 100.0);
+ double percentLength = (100);
+ triggers->Rumble(percentForce, 0, percentLength);
+ triggers->Friction(percentForce);
+ }
+
+ if ((SpeedBumpRumble == 1) && (10 == ff3) && (ff11 == 1) && (ff5 == 1) && (Speed > 0.1))
+ {
+ // Small constant when hitting bumps
+ double percentForce = ((SpeedBumpRumbleStrength) / 100.0);
+ double percentLength = (50);
+ triggers->Rumble(percentForce, percentForce, percentLength);
+ triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce);
+ triggers->Constant(constants->DIRECTION_FROM_RIGHT, 0);
+ }
+
+ if ((GrassRumble == 1) && (4 == ff3) && (ff11 == 1) && (ff5 == 1) && (Speed > 0.1))
+ {
+ // Wheel rumbles while driving on grass
+ double percentForce = ((GrassRumbleStrength) / 100.0);
+ double percentLength = (50);
+ triggers->Rumble(0, percentForce, percentLength);
+ triggers->Sine(50, 50, percentForce);
+ }
+
+ if ((CarpetRumble == 1) && (9 == ff3) && (ff11 == 1) && (ff5 == 1) && (Speed > 0.1))
+ {
+ // Wheel rumbles while driving on carpet
+ double percentForce = ((CarpetRumbleStrength) / 100.0);
+ double percentLength = (50);
+ triggers->Rumble(0, percentForce, percentLength);
+ triggers->Sine(50, 50, percentForce);
+ }
+
+ if ((WaterRumble == 1) && (7 == ff3) && (ff11 == 1) && (ff5 == 1) && (Speed > 0.1) && (Wheel >= 0) && (Wheel < 128))
+ {
+ //wheel hard to turn while driving through water
+ double percentForce = ((WaterRumbleWheelStrength) / 100.0);
+ double percentForce1 = ((128 - Wheel / 128.0) * (WaterRumbleControllerStrengthMultiplier / 100.0));
+ double percentLength = (100);
+ triggers->Rumble(percentForce1, 0, percentLength);
+ triggers->Friction(percentForce);
+ }
+
+ if ((WaterRumble == 1) && (7 == ff3) && (ff11 == 1) && (ff5 == 1) && (Speed > 0.1) && (Wheel > 127))
+ {
+ double percentForce = ((WaterRumbleWheelStrength) / 100.0);
+ double percentForce1 = ((Wheel - 127 / 128.0) * (WaterRumbleControllerStrengthMultiplier / 100.0));
+ double percentLength = (100);
+ triggers->Rumble(0, percentForce1, percentLength);
+ triggers->Friction(percentForce);
+ }
+
+ if ((TileRumble == 1) && (12 == ff3) && (ff11 == 1) && (ff5 == 1) && (Speed > 0.1))
+ {
+ //Wheel rumbles lightly when driving over tiles
+ double percentForce = ((TileRumbleStrength) / 100.0);
+ double percentLength = (150);
+ triggers->Rumble(0, percentForce, percentLength);
+ triggers->Friction(percentForce);
+ }
+
+ if ((SandRumble == 1) && (14 == ff3) && (ff11 == 1) && (ff5 == 1) && (Speed > 0.1))
+ {
+ //Wheel rumbles lightly when driving over sand
+ double percentForce = ((SandRumbleStrength) / 100.0);
+ double percentLength = (50);
+ triggers->Rumble(percentForce, 0, percentLength);
+ triggers->Sine(70, 70, percentForce);
+ }
+
+ if ((RoughTrackRumble == 1) && (11 == ff3) && (ff11 == 1) && (ff5 == 1) && (Speed > 0.1))
+ {
+ //Wheel rumbles lightly when driving over rough part of track
+ double percentForce = ((RoughTrackRumbleStrength) / 100.0);
+ double percentLength = (100);
+ triggers->Rumble(0, percentForce, percentLength);
+ triggers->Sine(40, 50, percentForce);
+ }
+
+ if ((BridgeRumble == 1) && (8 == ff3) && (ff11 == 1) && (ff5 == 1) && (Speed > 0.1))
+ {
+ //Wheel rumbles moderately when driving over wooden bridges
+ double percentForce = ((BridgeRumbleStrength) / 100.0);
+ double percentLength = (100);
+ triggers->Rumble(percentForce, percentForce, percentLength);
+ triggers->Sine(120, 120, percentForce);
+ }
+ oldcoins = newcoins;
+ oldweapon = newweapon;
+ oldhitground = newhitground;
+}
\ No newline at end of file
diff --git a/Game Files/MarioKartGPDX1.18Custom.h b/Game Files/MarioKartGPDX1.18Custom.h
new file mode 100644
index 0000000..30637d1
--- /dev/null
+++ b/Game Files/MarioKartGPDX1.18Custom.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 MarioKartGPDX118Custom : public Game {
+
+public:
+ void FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers);
+};