diff --git a/Game Files/M2Emulator.cpp b/Game Files/M2Emulator.cpp index d6e85be..a4da1c7 100644 --- a/Game Files/M2Emulator.cpp +++ b/Game Files/M2Emulator.cpp @@ -4,6 +4,36 @@ #include "math.h" #include "SDL.h" +static bool init = false; + +static bool __stdcall ExitHook(UINT uExitCode) +{ + TerminateProcess(GetCurrentProcess(), 0); + return 0; +} + +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 M2Emulator::FFBLoop(EffectConstants * constants, Helpers * helpers, EffectTriggers * triggers) { wchar_t *settingsFilename = TEXT(".\\FFBPlugin.ini"); @@ -31,7 +61,24 @@ void M2Emulator::FFBLoop(EffectConstants * constants, Helpers * helpers, EffectT HWND hWnd18 = FindWindowA(0, ("Sega Touring Car Championship")); HWND hWnd19 = FindWindowA(0, ("Sega Touring Car Championship (Rev B)")); HWND hWnd20 = FindWindowA(0, ("Over Rev (Model 2B)")); - + + + HMODULE hMod = GetModuleHandleA("KERNEL32.dll"); + if (hMod) + { + if (!init) + { + int hookLength = 6; + DWORD hookAddress = (DWORD)GetProcAddress(GetModuleHandle(L"KERNEL32.dll"), "ExitProcess"); + if (hookAddress) + { + jmpBackAddy = hookAddress + hookLength; + Hook((void*)hookAddress, ExitHook, hookLength); + init = true; + } + } + } + if (hWnd1 > NULL) { UINT8 ff = helpers->ReadByte(0x174CF4, /* isRelativeOffset*/ true); //SegaRallyChampionship @@ -656,8 +703,8 @@ void M2Emulator::FFBLoop(EffectConstants * constants, Helpers * helpers, EffectT } } - - + + UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //DaytonaUSA std::string ffs = std::to_string(ff); helpers->log((char *)ffs.c_str()); @@ -1217,8 +1264,8 @@ void M2Emulator::FFBLoop(EffectConstants * constants, Helpers * helpers, EffectT } } } - else if (hWnd7 > NULL) - { + else if (hWnd7 > NULL) + { if (DaytonaForcePanoramicAttract == 1) { @@ -1227,4836 +1274,4836 @@ void M2Emulator::FFBLoop(EffectConstants * constants, Helpers * helpers, EffectT helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); } - UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA '93 Edition - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) + UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA '93 Edition + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); } - else + else if ((ff > 0x1F) & (ff < 0x28)) { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); } } - else if (hWnd8 > NULL) + else { - if (DaytonaForcePanoramicAttract == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); - } - - if (DaytonaAIMultiplayerHack == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); - UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); - UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); - UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); - UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); - UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); - INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); - UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); - UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); - UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); - float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); - float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); - UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); - UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); - UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); - - - if (gamestate == 0x1A) + if ((ff > 0x09) & (ff < 0x18)) { - helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); } - - if (trackselect == 0x01) + else if ((ff > 0x1F) & (ff < 0x28)) { - helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); } - else if (trackselect == 0x02) + else if ((ff > 0x2F) & (ff < 0x3D)) { - helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); } - - if (linksize == 0x02) + else if ((ff > 0x3F) & (ff < 0x48)) { - if (linkID == 0x02) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); } - else if (linksize == 0x03) + else if ((ff > 0x4F) & (ff < 0x58)) { - if (linkID == 0x03) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); } - else if (linksize == 0x04) + else if ((ff > 0x5F) & (ff < 0x68)) { - if (linkID == 0x04) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - if (linkID == 0x03) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(350); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - } - - UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA (Saturn Ads) - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - else if (hWnd9 > NULL) - { - if (DaytonaForcePanoramicAttract == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); - } - - if (DaytonaAIMultiplayerHack == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); - UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); - UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); - UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); - UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); - UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); - INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); - UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); - UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); - UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); - float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); - float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); - UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); - UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); - UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); - - - if (gamestate == 0x1A) - { - helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); - } - - if (trackselect == 0x01) - { - helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); - } - else if (trackselect == 0x02) - { - helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); - } - - if (linksize == 0x02) - { - if (linkID == 0x02) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - else if (linksize == 0x03) - { - if (linkID == 0x03) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - else if (linksize == 0x04) - { - if (linkID == 0x04) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - if (linkID == 0x03) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(350); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - } - - UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA Special Edition - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - else if (hWnd10 > NULL) - { - if (DaytonaForcePanoramicAttract == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); - } - - if (DaytonaAIMultiplayerHack == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); - UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); - UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); - UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); - UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); - UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); - INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); - UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); - UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); - UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); - float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); - float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); - UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); - UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); - UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); - - - if (gamestate == 0x1A) - { - helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); - } - - if (trackselect == 0x01) - { - helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); - } - else if (trackselect == 0x02) - { - helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); - } - - if (linksize == 0x02) - { - if (linkID == 0x02) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - else if (linksize == 0x03) - { - if (linkID == 0x03) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - else if (linksize == 0x04) - { - if (linkID == 0x04) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - if (linkID == 0x03) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(350); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - } - - UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA Turbo - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - else if (hWnd11 > NULL) - { - if (DaytonaForcePanoramicAttract == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); - } - - if (DaytonaAIMultiplayerHack == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); - UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); - UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); - UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); - UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); - UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); - INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); - UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); - UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); - UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); - float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); - float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); - UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); - UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); - UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); - - - if (gamestate == 0x1A) - { - helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); - } - - if (trackselect == 0x01) - { - helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); - } - else if (trackselect == 0x02) - { - helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); - } - - if (linksize == 0x02) - { - if (linkID == 0x02) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - else if (linksize == 0x03) - { - if (linkID == 0x03) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - else if (linksize == 0x04) - { - if (linkID == 0x04) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - if (linkID == 0x03) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(350); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - } - - UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA Turbo (Rev A) - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - else if (hWnd12 > NULL) - { - if (DaytonaForcePanoramicAttract == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); - } - - if (DaytonaAIMultiplayerHack == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); - UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); - UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); - UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); - UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); - UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); - INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); - UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); - UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); - UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); - float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); - float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); - UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); - UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); - UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); - - - if (gamestate == 0x1A) - { - helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); - } - - if (trackselect == 0x01) - { - helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); - } - else if (trackselect == 0x02) - { - helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); - } - - if (linksize == 0x02) - { - if (linkID == 0x02) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - else if (linksize == 0x03) - { - if (linkID == 0x03) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - else if (linksize == 0x04) - { - if (linkID == 0x04) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - if (linkID == 0x03) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(350); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - } - - UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA: GTX 2004 - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - else if (hWnd13 > NULL) - { - if (DaytonaForcePanoramicAttract == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); - } - - if (DaytonaAIMultiplayerHack == 1) - { - INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); - INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); - UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); - UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); - UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); - UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); - UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); - UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); - INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); - UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); - UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); - UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); - float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); - float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); - UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); - UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); - UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); - - - if (gamestate == 0x1A) - { - helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); - } - - if (trackselect == 0x01) - { - helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); - } - else if (trackselect == 0x02) - { - helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); - } - - if (linksize == 0x02) - { - if (linkID == 0x02) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - else if (linksize == 0x03) - { - if (linkID == 0x03) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - else if (linksize == 0x04) - { - if (linkID == 0x04) - { - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(250); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - if (linkID == 0x03) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(350); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x02) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - Sleep(150); - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - } - else if (linkID == 0x01) - { - if ((gamestate == 0x1A) & (gamestatetimer < 100)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - else if ((gamestate == 0x1A) & (gamestatetimer > 100)) - { - Sleep(100); - helpers->WriteNop(0xC2130, true); - helpers->WriteNop(0xC2131, true); - helpers->WriteNop(0xC2132, true); - } - - if ((gamestate > 0x1A) & (gamestate < 0x1A)) - { - helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); - helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); - } - - if (gamestate > 0x07) - { - helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); - helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); - } - if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) - { - helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); - } - if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) - { - helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 - Sleep(50); - helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race - Sleep(50); - helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 - Sleep(50); - helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); - helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); - } - } - } - } - - UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA: To The Maxx - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 15) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x3D)) - { - //Centering - double percentForce = (ff - 47) / 13.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - if (hWnd14 > NULL) - { - UINT8 ff = helpers->ReadByte(0x174CF4, /* isRelativeOffset*/ true); //Sega Rally Championship (Rev B) - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0xBF) & (ff < 0xDF)) - { - helpers->log("moving wheel left"); - double percentForce = (ff - 191) / 31.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x7F) & (ff < 0x9F)) - { - helpers->log("moving wheel right"); - double percentForce = (ff - 127) / 31.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0xBF) & (ff < 0xDF)) - { - helpers->log("moving wheel left"); - double percentForce = (ff - 191) / 31.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x7F) & (ff < 0x9F)) - { - helpers->log("moving wheel right"); - double percentForce = (ff - 127) / 31.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - if (hWnd15 > NULL) - { - UINT8 ff = helpers->ReadByte(0x174CF4, /* isRelativeOffset*/ true); //Sega Rally Pro Drivin' - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0xBF) & (ff < 0xDF)) - { - helpers->log("moving wheel left"); - double percentForce = (ff - 191) / 31.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x7F) & (ff < 0x9F)) - { - helpers->log("moving wheel right"); - double percentForce = (ff - 127) / 31.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0xBF) & (ff < 0xDF)) - { - helpers->log("moving wheel left"); - double percentForce = (ff - 191) / 31.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x7F) & (ff < 0x9F)) - { - helpers->log("moving wheel right"); - double percentForce = (ff - 127) / 31.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - else if (hWnd16 > NULL) - { - UINT8 ff = helpers->ReadByte(0x17285B, /* isRelativeOffset*/ true); //Indianapolis 500 (Rev A, Twin, Newer rev) - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 10) / 14.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x38)) - { - //Centering - double percentForce = (ff - 47) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x37) & (ff < 0x40)) - { - //Centeringtestmenu - double percentForce = (ff - 55) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 10) / 14.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x38)) - { - //Centering - double percentForce = (ff - 47) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x37) & (ff < 0x40)) - { - //Centeringtestmenu - double percentForce = (ff - 55) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - else if (hWnd17 > NULL) - { - UINT8 ff = helpers->ReadByte(0x17285B, /* isRelativeOffset*/ true); //Indianapolis 500 (Rev A, Twin, Older rev) - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 10) / 14.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x38)) - { - //Centering - double percentForce = (ff - 47) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x37) & (ff < 0x40)) - { - //Centeringtestmenu - double percentForce = (ff - 55) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 10) / 14.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x38)) - { - //Centering - double percentForce = (ff - 47) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x37) & (ff < 0x40)) - { - //Centeringtestmenu - double percentForce = (ff - 55) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - else if (hWnd18 > NULL) - { - UINT8 ff = helpers->ReadByte(0x17285B, /* isRelativeOffset*/ true); //Sega Touring Car Championship - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 10) / 14.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x38)) - { - //Centering - double percentForce = (ff - 47) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x37) & (ff < 0x40)) - { - //Centeringtestmenu - double percentForce = (ff - 55) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 10) / 14.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x38)) - { - //Centering - double percentForce = (ff - 47) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x37) & (ff < 0x40)) - { - //Centeringtestmenu - double percentForce = (ff - 55) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - else if (hWnd19 > NULL) - { - UINT8 ff = helpers->ReadByte(0x17285B, /* isRelativeOffset*/ true); //Sega Touring Car Championship (Rev B) - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 10) / 14.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x38)) - { - //Centering - double percentForce = (ff - 47) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x37) & (ff < 0x40)) - { - //Centeringtestmenu - double percentForce = (ff - 55) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 10) / 14.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x38)) - { - //Centering - double percentForce = (ff - 47) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x37) & (ff < 0x40)) - { - //Centeringtestmenu - double percentForce = (ff - 55) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } - } - } - else if (hWnd20 > NULL) - { - UINT8 ff = helpers->ReadByte(0x17285B, /* isRelativeOffset*/ true); //Over Rev (Model 2B) - std::string ffs = std::to_string(ff); - helpers->log((char *)ffs.c_str()); - helpers->log("got value: "); - if (FFBMode == 0) - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 10) / 14.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x38)) - { - //Centering - double percentForce = (ff - 47) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x37) & (ff < 0x40)) - { - //Centeringtestmenu - double percentForce = (ff - 55) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, percentForce, percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(percentForce, 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); - } - } - else - { - if ((ff > 0x09) & (ff < 0x18)) - { - //Spring - double percentForce = (ff - 10) / 14.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x1F) & (ff < 0x28)) - { - //Clutch - double percentForce = (ff - 31) / 8.0; - double percentLength = 100; - triggers->Friction(percentForce); - } - else if ((ff > 0x2F) & (ff < 0x38)) - { - //Centering - double percentForce = (ff - 47) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x37) & (ff < 0x40)) - { - //Centeringtestmenu - double percentForce = (ff - 55) / 8.0; - double percentLength = 100; - triggers->Spring(percentForce); - } - else if ((ff > 0x3F) & (ff < 0x48)) - { - //Uncentering - double percentForce = (ff - 63) / 8.0; - double percentLength = 100; - triggers->Sine(70, 80, percentForce); - } - else if ((ff > 0x4F) & (ff < 0x58)) - { - //Roll Left - double percentForce = (ff - 79) / 8.0; - double percentLength = 100; - triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); - triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); - } - else if ((ff > 0x5F) & (ff < 0x68)) - { - //Roll Right - double percentForce = (ff - 95) / 8.0; - double percentLength = 100; - triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); - triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); - } + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); } } } + else if (hWnd8 > NULL) + { + if (DaytonaForcePanoramicAttract == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); + } + + if (DaytonaAIMultiplayerHack == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); + UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); + UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); + UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); + UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); + UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); + INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); + UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); + UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); + UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); + float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); + float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); + UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); + UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); + UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); + + + if (gamestate == 0x1A) + { + helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); + } + + if (trackselect == 0x01) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); + } + else if (trackselect == 0x02) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); + } + + if (linksize == 0x02) + { + if (linkID == 0x02) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x03) + { + if (linkID == 0x03) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x04) + { + if (linkID == 0x04) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + if (linkID == 0x03) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(350); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + } + + UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA (Saturn Ads) + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + else if (hWnd9 > NULL) + { + if (DaytonaForcePanoramicAttract == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); + } + + if (DaytonaAIMultiplayerHack == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); + UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); + UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); + UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); + UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); + UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); + INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); + UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); + UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); + UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); + float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); + float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); + UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); + UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); + UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); + + + if (gamestate == 0x1A) + { + helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); + } + + if (trackselect == 0x01) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); + } + else if (trackselect == 0x02) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); + } + + if (linksize == 0x02) + { + if (linkID == 0x02) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x03) + { + if (linkID == 0x03) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x04) + { + if (linkID == 0x04) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + if (linkID == 0x03) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(350); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + } + + UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA Special Edition + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + else if (hWnd10 > NULL) + { + if (DaytonaForcePanoramicAttract == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); + } + + if (DaytonaAIMultiplayerHack == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); + UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); + UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); + UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); + UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); + UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); + INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); + UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); + UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); + UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); + float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); + float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); + UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); + UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); + UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); + + + if (gamestate == 0x1A) + { + helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); + } + + if (trackselect == 0x01) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); + } + else if (trackselect == 0x02) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); + } + + if (linksize == 0x02) + { + if (linkID == 0x02) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x03) + { + if (linkID == 0x03) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x04) + { + if (linkID == 0x04) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + if (linkID == 0x03) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(350); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + } + + UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA Turbo + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + else if (hWnd11 > NULL) + { + if (DaytonaForcePanoramicAttract == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); + } + + if (DaytonaAIMultiplayerHack == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); + UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); + UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); + UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); + UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); + UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); + INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); + UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); + UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); + UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); + float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); + float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); + UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); + UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); + UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); + + + if (gamestate == 0x1A) + { + helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); + } + + if (trackselect == 0x01) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); + } + else if (trackselect == 0x02) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); + } + + if (linksize == 0x02) + { + if (linkID == 0x02) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x03) + { + if (linkID == 0x03) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x04) + { + if (linkID == 0x04) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + if (linkID == 0x03) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(350); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + } + + UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA Turbo (Rev A) + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + else if (hWnd12 > NULL) + { + if (DaytonaForcePanoramicAttract == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); + } + + if (DaytonaAIMultiplayerHack == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); + UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); + UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); + UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); + UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); + UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); + INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); + UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); + UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); + UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); + float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); + float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); + UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); + UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); + UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); + + + if (gamestate == 0x1A) + { + helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); + } + + if (trackselect == 0x01) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); + } + else if (trackselect == 0x02) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); + } + + if (linksize == 0x02) + { + if (linkID == 0x02) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x03) + { + if (linkID == 0x03) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x04) + { + if (linkID == 0x04) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + if (linkID == 0x03) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(350); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + } + + UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA: GTX 2004 + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + else if (hWnd13 > NULL) + { + if (DaytonaForcePanoramicAttract == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1070, 0x00, /* isRelativeOffset*/ false); + } + + if (DaytonaAIMultiplayerHack == 1) + { + INT_PTR Rambase = helpers->ReadIntPtr(0x1AA888, /* isRelativeOffset*/ true); + INT_PTR Rambase1 = helpers->ReadIntPtr(Rambase + 0x100, /* isRelativeOffset */ false); + UINT8 gamestate = helpers->ReadByte(Rambase1 + 0x10A4, /* isRelativeOffset*/ false); + UINT8 track = helpers->ReadByte(Rambase1 + 0x1460, /* isRelativeOffset*/ false); + UINT8 trackselect = helpers->ReadByte(Rambase1 + 0x1468, /* isRelativeOffset*/ false); + UINT8 countdown = helpers->ReadByte(Rambase1 + 0x1850, /* isRelativeOffset*/ false); + UINT8 linksize = helpers->ReadByte(Rambase1 + 0x40001, /* isRelativeOffset*/ false); + UINT8 linkID = helpers->ReadByte(Rambase1 + 0x40002, /* isRelativeOffset*/ false); + INT_PTR gamestatetimer = helpers->ReadIntPtr(Rambase1 + 0x10A8, /* isRelativeOffset*/ false); + UINT8 camhack = helpers->ReadByte(Rambase1 + 0x14A4, /* isRelativeOffset*/ false); + UINT8 carsinfront = helpers->ReadByte(Rambase1 + 0x51EC, /* isRelativeOffset*/ false); + UINT8 mpposition = helpers->ReadByte(Rambase1 + 0x51ED, /* isRelativeOffset*/ false); + float cary = helpers->ReadFloat32(Rambase1 + 0x519C, /* isRelativeOffset */ false); + float carx = helpers->ReadFloat32(Rambase1 + 0x51A4, /* isRelativeOffset */ false); + UINT8 nop1 = helpers->ReadByte(0xC2130, /* isRelativeOffset*/ true); + UINT8 nop2 = helpers->ReadByte(0xC2131, /* isRelativeOffset*/ true); + UINT8 nop3 = helpers->ReadByte(0xC2132, /* isRelativeOffset*/ true); + + + if (gamestate == 0x1A) + { + helpers->WriteByte(Rambase1 + 0x51ED, carsinfront, /* isRelativeOffset*/ false); + } + + if (trackselect == 0x01) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x02, /* isRelativeOffset*/ false); + } + else if (trackselect == 0x02) + { + helpers->WriteByte(Rambase1 + 0x1460, 0x01, /* isRelativeOffset*/ false); + } + + if (linksize == 0x02) + { + if (linkID == 0x02) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 0.0, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x03) + { + if (linkID == 0x03) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + else if (linksize == 0x04) + { + if (linkID == 0x04) + { + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(250); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC302CAF4, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37C0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + if (linkID == 0x03) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C40, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(350); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37CF3D0, /* isRelativeOffset */ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + helpers->WriteFloat32(Rambase1 + 0x519C, 450.0, /* isRelativeOffset */ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x02) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540C80, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x01, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + Sleep(150); + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02 || track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + } + else if (linkID == 0x01) + { + if ((gamestate == 0x1A) & (gamestatetimer < 100)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + else if ((gamestate == 0x1A) & (gamestatetimer > 100)) + { + Sleep(100); + helpers->WriteNop(0xC2130, true); + helpers->WriteNop(0xC2131, true); + helpers->WriteNop(0xC2132, true); + } + + if ((gamestate > 0x1A) & (gamestate < 0x1A)) + { + helpers->WriteByte(0xC2130, 0x88, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2131, 0x14, /* isRelativeOffset*/ true); + helpers->WriteByte(0xC2132, 0x01, /* isRelativeOffset*/ true); + } + + if (gamestate > 0x07) + { + helpers->WriteIntPtr(Rambase1 + 0x40004, 0x00540D00, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x40008, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteIntPtr(Rambase1 + 0x4000C, 0x00540CC0, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5484, 0x00, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5784, 0x02, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5A84, 0x03, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x5D84, 0x04, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6084, 0x05, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6384, 0x06, /* isRelativeOffset*/ false); + helpers->WriteByte(Rambase1 + 0x6684, 0x07, /* isRelativeOffset*/ false); + } + if ((gamestatetimer > 4294964133) & (gamestate == 0x12)) + { + helpers->WriteIntPtr(Rambase1 + 0x10A8, 0x3B6, /* isRelativeOffset*/ false); + } + if ((gamestate == 0x16) & (countdown == 0x00) & (track == 0x00)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + helpers->WriteByte(Rambase1 + 0x1850, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x01)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC2F195E8, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + else if ((gamestate == 0x14) & (trackselect == 0x00) & (track == 0x02)) + { + helpers->WriteByte(Rambase1 + 0x40000, 0x99, /* isRelativeOffset*/ false); // change to 99 + Sleep(50); + helpers->WriteByte(Rambase1 + 0x10A4, 0x13, /* isRelativeOffset*/ false); // restart race + Sleep(50); + helpers->WriteByte(Rambase1 + 0x40000, 0x01, /* isRelativeOffset*/ false); // change back to 1 + Sleep(50); + helpers->WriteIntPtr(Rambase1 + 0x51A4, 0xC37E0001, /* isRelativeOffset */ false); + helpers->WriteByte(Rambase1 + 0x1468, 0x01, /* isRelativeOffset*/ false); + } + } + } + } + + UINT8 ff = helpers->ReadByte(0x0057285B, /* isRelativeOffset*/ false); //Daytona USA: To The Maxx + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 15) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x3D)) + { + //Centering + double percentForce = (ff - 47) / 13.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + if (hWnd14 > NULL) + { + UINT8 ff = helpers->ReadByte(0x174CF4, /* isRelativeOffset*/ true); //Sega Rally Championship (Rev B) + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0xBF) & (ff < 0xDF)) + { + helpers->log("moving wheel left"); + double percentForce = (ff - 191) / 31.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x7F) & (ff < 0x9F)) + { + helpers->log("moving wheel right"); + double percentForce = (ff - 127) / 31.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0xBF) & (ff < 0xDF)) + { + helpers->log("moving wheel left"); + double percentForce = (ff - 191) / 31.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x7F) & (ff < 0x9F)) + { + helpers->log("moving wheel right"); + double percentForce = (ff - 127) / 31.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + if (hWnd15 > NULL) + { + UINT8 ff = helpers->ReadByte(0x174CF4, /* isRelativeOffset*/ true); //Sega Rally Pro Drivin' + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0xBF) & (ff < 0xDF)) + { + helpers->log("moving wheel left"); + double percentForce = (ff - 191) / 31.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x7F) & (ff < 0x9F)) + { + helpers->log("moving wheel right"); + double percentForce = (ff - 127) / 31.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0xBF) & (ff < 0xDF)) + { + helpers->log("moving wheel left"); + double percentForce = (ff - 191) / 31.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x7F) & (ff < 0x9F)) + { + helpers->log("moving wheel right"); + double percentForce = (ff - 127) / 31.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + else if (hWnd16 > NULL) + { + UINT8 ff = helpers->ReadByte(0x17285B, /* isRelativeOffset*/ true); //Indianapolis 500 (Rev A, Twin, Newer rev) + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 10) / 14.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x38)) + { + //Centering + double percentForce = (ff - 47) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x37) & (ff < 0x40)) + { + //Centeringtestmenu + double percentForce = (ff - 55) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 10) / 14.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x38)) + { + //Centering + double percentForce = (ff - 47) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x37) & (ff < 0x40)) + { + //Centeringtestmenu + double percentForce = (ff - 55) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + else if (hWnd17 > NULL) + { + UINT8 ff = helpers->ReadByte(0x17285B, /* isRelativeOffset*/ true); //Indianapolis 500 (Rev A, Twin, Older rev) + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 10) / 14.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x38)) + { + //Centering + double percentForce = (ff - 47) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x37) & (ff < 0x40)) + { + //Centeringtestmenu + double percentForce = (ff - 55) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 10) / 14.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x38)) + { + //Centering + double percentForce = (ff - 47) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x37) & (ff < 0x40)) + { + //Centeringtestmenu + double percentForce = (ff - 55) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + else if (hWnd18 > NULL) + { + UINT8 ff = helpers->ReadByte(0x17285B, /* isRelativeOffset*/ true); //Sega Touring Car Championship + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 10) / 14.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x38)) + { + //Centering + double percentForce = (ff - 47) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x37) & (ff < 0x40)) + { + //Centeringtestmenu + double percentForce = (ff - 55) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 10) / 14.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x38)) + { + //Centering + double percentForce = (ff - 47) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x37) & (ff < 0x40)) + { + //Centeringtestmenu + double percentForce = (ff - 55) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + else if (hWnd19 > NULL) + { + UINT8 ff = helpers->ReadByte(0x17285B, /* isRelativeOffset*/ true); //Sega Touring Car Championship (Rev B) + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 10) / 14.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x38)) + { + //Centering + double percentForce = (ff - 47) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x37) & (ff < 0x40)) + { + //Centeringtestmenu + double percentForce = (ff - 55) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 10) / 14.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x38)) + { + //Centering + double percentForce = (ff - 47) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x37) & (ff < 0x40)) + { + //Centeringtestmenu + double percentForce = (ff - 55) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } + else if (hWnd20 > NULL) + { + UINT8 ff = helpers->ReadByte(0x17285B, /* isRelativeOffset*/ true); //Over Rev (Model 2B) + std::string ffs = std::to_string(ff); + helpers->log((char *)ffs.c_str()); + helpers->log("got value: "); + if (FFBMode == 0) + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 10) / 14.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x38)) + { + //Centering + double percentForce = (ff - 47) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x37) & (ff < 0x40)) + { + //Centeringtestmenu + double percentForce = (ff - 55) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, percentForce, percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(percentForce, 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); + } + } + else + { + if ((ff > 0x09) & (ff < 0x18)) + { + //Spring + double percentForce = (ff - 10) / 14.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x1F) & (ff < 0x28)) + { + //Clutch + double percentForce = (ff - 31) / 8.0; + double percentLength = 100; + triggers->Friction(percentForce); + } + else if ((ff > 0x2F) & (ff < 0x38)) + { + //Centering + double percentForce = (ff - 47) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x37) & (ff < 0x40)) + { + //Centeringtestmenu + double percentForce = (ff - 55) / 8.0; + double percentLength = 100; + triggers->Spring(percentForce); + } + else if ((ff > 0x3F) & (ff < 0x48)) + { + //Uncentering + double percentForce = (ff - 63) / 8.0; + double percentLength = 100; + triggers->Sine(70, 80, percentForce); + } + else if ((ff > 0x4F) & (ff < 0x58)) + { + //Roll Left + double percentForce = (ff - 79) / 8.0; + double percentLength = 100; + triggers->LeftRight(0, pow(percentForce, 0.5), percentLength); + triggers->Constant(constants->DIRECTION_FROM_RIGHT, (pow(percentForce, 0.5))); + } + else if ((ff > 0x5F) & (ff < 0x68)) + { + //Roll Right + double percentForce = (ff - 95) / 8.0; + double percentLength = 100; + triggers->LeftRight(pow(percentForce, 0.5), 0, percentLength); + triggers->Constant(constants->DIRECTION_FROM_LEFT, (pow(percentForce, 0.5))); + } + } + } +} diff --git a/Includes/FFBPlugin.txt b/Includes/FFBPlugin.txt index e21a803..5fd73a8 100644 --- a/Includes/FFBPlugin.txt +++ b/Includes/FFBPlugin.txt @@ -1,6 +1,6 @@ ***FFB Arcade Plugin*** -Version 0.9a +Version 1.0 Created by Boomslangnz, Ducon2016 & Spazzy. @@ -10,6 +10,10 @@ While best efforts were made to try to resemble the real arcade force feedback, in some cases eg Mario Kart GP DX, Pokken Tournament and Battle Gear 4,effects were created entirely from scratch so are not using real force feedback values. Most games use correct ffb values however :) +***1.0 Changes*** + +- Fixed issue where M2 Emulator wouldn't close correctly while using FFB Plugin + ***0.9a Changes*** - Fixed issue where MAME plugins would not load