1
0
mirror of synced 2025-02-20 20:20:59 +01:00

Fix issues with Demul

This commit is contained in:
Aaron M 2020-08-02 11:41:11 +12:00
parent 70f70aac8f
commit f85bab0f45
2 changed files with 269 additions and 193 deletions

View File

@ -854,6 +854,8 @@ EffectConstants effectConst;
Helpers hlp;
EffectTriggers t;
bool CustomStrength = false;
bool WaitForGame = false;
bool keepRunning = true;
float wheel = 0.0f;
@ -1955,201 +1957,249 @@ void WritePersistentMaxForce()
}
}
DWORD WINAPI AdjustFFBStrengthLoop(LPVOID lpParam)
static int StrengthLoopWaitEvent()
{
Sleep(3000);
CustomFFBStrengthSetup();
if (!WaitForGame)
{
if (configGameId != 26)
{
Sleep(4000);
WaitForGame = true;
}
}
else
{
if (!CustomStrength)
{
CustomFFBStrengthSetup();
CustomStrength = true;
}
while (SDL_WaitEvent(&e) != 0)
{
if (e.type == SDL_JOYBUTTONDOWN)
{
if (e.jbutton.which == joystick_index1)
{
if (e.jbutton.button == IncreaseFFBStrength)
{
if (AlternativeFFB == 1)
{
if ((configAlternativeMaxForceRight >= 0) && (configAlternativeMaxForceRight < 100))
{
configAlternativeMaxForceRight += StepFFBStrength;
configAlternativeMaxForceRight = max(0, min(100, configAlternativeMaxForceRight));
}
if ((configAlternativeMaxForceLeft <= 0) && (configAlternativeMaxForceLeft > -100))
{
configAlternativeMaxForceLeft -= StepFFBStrength;
configAlternativeMaxForceLeft = max(-100, min(0, configAlternativeMaxForceLeft));
}
}
else
{
if ((configMaxForce >= 0) && (configMaxForce < 100))
{
configMaxForce += StepFFBStrength;
configMaxForce = max(0, min(100, configMaxForce));
}
}
WritePersistentMaxForce();
}
if (e.jbutton.button == DecreaseFFBStrength)
{
if (AlternativeFFB == 1)
{
if ((configAlternativeMaxForceRight > 0) && (configAlternativeMaxForceRight <= 100))
{
configAlternativeMaxForceRight -= StepFFBStrength;
configAlternativeMaxForceRight = max(0, min(100, configAlternativeMaxForceRight));
}
if ((configAlternativeMaxForceLeft < 0) && (configAlternativeMaxForceLeft >= -100))
{
configAlternativeMaxForceLeft += StepFFBStrength;
configAlternativeMaxForceLeft = max(-100, min(0, configAlternativeMaxForceLeft));
}
}
else
{
if ((configMaxForce > 0) && (configMaxForce <= 100))
{
configMaxForce -= StepFFBStrength;
configMaxForce = max(0, min(100, configMaxForce));
}
}
WritePersistentMaxForce();
}
if (e.jbutton.button == ResetFFBStrength)
{
DefaultConfigValues();
WritePersistentMaxForce();
}
if (EnableFFBStrengthTextToSpeech == 1)
{
if ((e.jbutton.button == IncreaseFFBStrength) || (e.jbutton.button == DecreaseFFBStrength) || (e.jbutton.button == ResetFFBStrength))
{
if (AlternativeFFB == 1)
{
sprintf(FFBStrength1, "Max Force: %d", configAlternativeMaxForceRight);
}
else
{
sprintf(FFBStrength1, "Max Force: %d", configMaxForce);
}
hr = ::CoInitialize(nullptr);
hr = cpVoice.CoCreateInstance(CLSID_SpVoice);
mbstowcs(FFBStrength2, FFBStrength1, strlen(FFBStrength1) + 1);
LPWSTR ptr = FFBStrength2;
if (SUCCEEDED(hr))
{
hr = cpVoice->SetRate(3);
hr = cpVoice->SetOutput(NULL, TRUE);
hr = cpVoice->Speak(ptr, SPF_PURGEBEFORESPEAK, NULL);
::CoUninitialize();
}
}
}
}
}
}
}
return 0;
}
static int StrengthLoopNoWaitEvent()
{
if (!WaitForGame)
{
if (configGameId != 26)
{
Sleep(4000);
WaitForGame = true;
}
}
else
{
if (!CustomStrength)
{
CustomFFBStrengthSetup();
CustomStrength = true;
}
if (e.type == SDL_JOYBUTTONDOWN)
{
if (e.jbutton.which == joystick_index1)
{
if (e.jbutton.button == IncreaseFFBStrength)
{
if (AlternativeFFB == 1)
{
if ((configAlternativeMaxForceRight >= 0) && (configAlternativeMaxForceRight < 100))
{
configAlternativeMaxForceRight += StepFFBStrength;
configAlternativeMaxForceRight = max(0, min(100, configAlternativeMaxForceRight));
}
if ((configAlternativeMaxForceLeft <= 0) && (configAlternativeMaxForceLeft > -100))
{
configAlternativeMaxForceLeft -= StepFFBStrength;
configAlternativeMaxForceLeft = max(-100, min(0, configAlternativeMaxForceLeft));
}
}
else
{
if ((configMaxForce >= 0) && (configMaxForce < 100))
{
configMaxForce += StepFFBStrength;
configMaxForce = max(0, min(100, configMaxForce));
}
}
WritePersistentMaxForce();
}
if (e.jbutton.button == DecreaseFFBStrength)
{
if (AlternativeFFB == 1)
{
if ((configAlternativeMaxForceRight > 0) && (configAlternativeMaxForceRight <= 100))
{
configAlternativeMaxForceRight -= StepFFBStrength;
configAlternativeMaxForceRight = max(0, min(100, configAlternativeMaxForceRight));
}
if ((configAlternativeMaxForceLeft < 0) && (configAlternativeMaxForceLeft >= -100))
{
configAlternativeMaxForceLeft += StepFFBStrength;
configAlternativeMaxForceLeft = max(-100, min(0, configAlternativeMaxForceLeft));
}
}
else
{
if ((configMaxForce > 0) && (configMaxForce <= 100))
{
configMaxForce -= StepFFBStrength;
configMaxForce = max(0, min(100, configMaxForce));
}
}
WritePersistentMaxForce();
}
if (e.jbutton.button == ResetFFBStrength)
{
DefaultConfigValues();
WritePersistentMaxForce();
}
if (EnableFFBStrengthTextToSpeech == 1)
{
if ((e.jbutton.button == IncreaseFFBStrength) || (e.jbutton.button == DecreaseFFBStrength) || (e.jbutton.button == ResetFFBStrength))
{
if (AlternativeFFB == 1)
{
sprintf(FFBStrength1, "Max Force: %d", configAlternativeMaxForceRight);
}
else
{
sprintf(FFBStrength1, "Max Force: %d", configMaxForce);
}
hr = ::CoInitialize(nullptr);
hr = cpVoice.CoCreateInstance(CLSID_SpVoice);
mbstowcs(FFBStrength2, FFBStrength1, strlen(FFBStrength1) + 1);
LPWSTR ptr = FFBStrength2;
if (SUCCEEDED(hr))
{
hr = cpVoice->SetRate(3);
hr = cpVoice->SetOutput(NULL, TRUE);
hr = cpVoice->Speak(ptr, SPF_PURGEBEFORESPEAK, NULL);
::CoUninitialize();
}
}
}
}
}
}
return 0;
}
DWORD WINAPI AdjustFFBStrengthLoopWaitEvent(LPVOID lpParam)
{
while (true)
{
if ((InputDeviceWheelEnable != 1) && (configGameId == 1) || (configGameId == 9) || (configGameId == 12) || (configGameId == 28) || (configGameId == 29) || (configGameId == 35)) while (SDL_WaitEvent(&e) != 0)
{
if (e.type == SDL_JOYBUTTONDOWN)
{
if (e.jbutton.which == joystick_index1)
{
if (e.jbutton.button == IncreaseFFBStrength)
{
if (AlternativeFFB == 1)
{
if ((configAlternativeMaxForceRight >= 0) && (configAlternativeMaxForceRight < 100))
{
configAlternativeMaxForceRight += StepFFBStrength;
configAlternativeMaxForceRight = max(0, min(100, configAlternativeMaxForceRight));
}
if ((configAlternativeMaxForceLeft <= 0) && (configAlternativeMaxForceLeft > -100))
{
configAlternativeMaxForceLeft -= StepFFBStrength;
configAlternativeMaxForceLeft = max(-100, min(0, configAlternativeMaxForceLeft));
}
}
else
{
if ((configMaxForce >= 0) && (configMaxForce < 100))
{
configMaxForce += StepFFBStrength;
configMaxForce = max(0, min(100, configMaxForce));
}
}
WritePersistentMaxForce();
}
StrengthLoopWaitEvent();
Sleep(16);
}
}
if (e.jbutton.button == DecreaseFFBStrength)
{
if (AlternativeFFB == 1)
{
if ((configAlternativeMaxForceRight > 0) && (configAlternativeMaxForceRight <= 100))
{
configAlternativeMaxForceRight -= StepFFBStrength;
configAlternativeMaxForceRight = max(0, min(100, configAlternativeMaxForceRight));
}
if ((configAlternativeMaxForceLeft < 0) && (configAlternativeMaxForceLeft >= -100))
{
configAlternativeMaxForceLeft += StepFFBStrength;
configAlternativeMaxForceLeft = max(-100, min(0, configAlternativeMaxForceLeft));
}
}
else
{
if ((configMaxForce > 0) && (configMaxForce <= 100))
{
configMaxForce -= StepFFBStrength;
configMaxForce = max(0, min(100, configMaxForce));
}
}
WritePersistentMaxForce();
}
if (e.jbutton.button == ResetFFBStrength)
{
DefaultConfigValues();
WritePersistentMaxForce();
}
if (EnableFFBStrengthTextToSpeech == 1)
{
if ((e.jbutton.button == IncreaseFFBStrength) || (e.jbutton.button == DecreaseFFBStrength) || (e.jbutton.button == ResetFFBStrength))
{
if (AlternativeFFB == 1)
{
sprintf(FFBStrength1, "Max Force: %d", configAlternativeMaxForceRight);
}
else
{
sprintf(FFBStrength1, "Max Force: %d", configMaxForce);
}
hr = ::CoInitialize(nullptr);
hr = cpVoice.CoCreateInstance(CLSID_SpVoice);
mbstowcs(FFBStrength2, FFBStrength1, strlen(FFBStrength1) + 1);
LPWSTR ptr = FFBStrength2;
if (SUCCEEDED(hr))
{
hr = cpVoice->SetRate(3);
hr = cpVoice->SetOutput(NULL, TRUE);
hr = cpVoice->Speak(ptr, SPF_PURGEBEFORESPEAK, NULL);
::CoUninitialize();
}
}
}
}
}
}
else
{
if (e.type == SDL_JOYBUTTONDOWN)
{
if (e.jbutton.which == joystick_index1)
{
if (e.jbutton.button == IncreaseFFBStrength)
{
if (AlternativeFFB == 1)
{
if ((configAlternativeMaxForceRight >= 0) && (configAlternativeMaxForceRight < 100))
{
configAlternativeMaxForceRight += StepFFBStrength;
configAlternativeMaxForceRight = max(0, min(100, configAlternativeMaxForceRight));
}
if ((configAlternativeMaxForceLeft <= 0) && (configAlternativeMaxForceLeft > -100))
{
configAlternativeMaxForceLeft -= StepFFBStrength;
configAlternativeMaxForceLeft = max(-100, min(0, configAlternativeMaxForceLeft));
}
}
else
{
if ((configMaxForce >= 0) && (configMaxForce < 100))
{
configMaxForce += StepFFBStrength;
configMaxForce = max(0, min(100, configMaxForce));
}
}
WritePersistentMaxForce();
}
if (e.jbutton.button == DecreaseFFBStrength)
{
if (AlternativeFFB == 1)
{
if ((configAlternativeMaxForceRight > 0) && (configAlternativeMaxForceRight <= 100))
{
configAlternativeMaxForceRight -= StepFFBStrength;
configAlternativeMaxForceRight = max(0, min(100, configAlternativeMaxForceRight));
}
if ((configAlternativeMaxForceLeft < 0) && (configAlternativeMaxForceLeft >= -100))
{
configAlternativeMaxForceLeft += StepFFBStrength;
configAlternativeMaxForceLeft = max(-100, min(0, configAlternativeMaxForceLeft));
}
}
else
{
if ((configMaxForce > 0) && (configMaxForce <= 100))
{
configMaxForce -= StepFFBStrength;
configMaxForce = max(0, min(100, configMaxForce));
}
}
WritePersistentMaxForce();
}
if (e.jbutton.button == ResetFFBStrength)
{
DefaultConfigValues();
WritePersistentMaxForce();
}
if (EnableFFBStrengthTextToSpeech == 1)
{
if ((e.jbutton.button == IncreaseFFBStrength) || (e.jbutton.button == DecreaseFFBStrength) || (e.jbutton.button == ResetFFBStrength))
{
if (AlternativeFFB == 1)
{
sprintf(FFBStrength1, "Max Force: %d", configAlternativeMaxForceRight);
}
else
{
sprintf(FFBStrength1, "Max Force: %d", configMaxForce);
}
hr = ::CoInitialize(nullptr);
hr = cpVoice.CoCreateInstance(CLSID_SpVoice);
mbstowcs(FFBStrength2, FFBStrength1, strlen(FFBStrength1) + 1);
LPWSTR ptr = FFBStrength2;
if (SUCCEEDED(hr))
{
hr = cpVoice->SetRate(3);
hr = cpVoice->SetOutput(NULL, TRUE);
hr = cpVoice->Speak(ptr, SPF_PURGEBEFORESPEAK, NULL);
::CoUninitialize();
}
}
}
}
}
}
DWORD WINAPI AdjustFFBStrengthLoopNoWaitEvent(LPVOID lpParam)
{
while (true)
{
StrengthLoopNoWaitEvent();
Sleep(16);
}
}
@ -2169,7 +2219,7 @@ DWORD WINAPI FFBLoop(LPVOID lpParam)
{
if ((EnableFFBStrengthDynamicAdjustment != 1) && (InputDeviceWheelEnable != 1))
{
if ((configGameId != 1) && (configGameId != 9) && (configGameId != 12) && (configGameId != 26) && (configGameId != 28) && (configGameId != 29) && (configGameId != 30) && (configGameId != 31) && (configGameId != 35))
if ((configGameId != 1) && (configGameId != 9) && (configGameId != 12) && (configGameId != 28) && (configGameId != 29) && (configGameId != 35))
{
// Workaround for SDL_JoystickRumble rumble not stopping issue
SDL_CreateThread(WorkaroundToFixRumble, "WorkaroundToFixRumble", (void*)NULL);
@ -2372,7 +2422,21 @@ DWORD WINAPI FFBLoop(LPVOID lpParam)
if (EnableFFBStrengthDynamicAdjustment == 1)
{
CreateThread(NULL, 0, AdjustFFBStrengthLoop, NULL, 0, NULL);
if ((configGameId != 1) && (configGameId != 9) && (configGameId != 12) && (configGameId != 28) && (configGameId != 29) && (configGameId != 35))
{
CreateThread(NULL, 0, AdjustFFBStrengthLoopWaitEvent, NULL, 0, NULL);
}
else
{
if ((configGameId == 26) && (InputDeviceWheelEnable != 1))
{
CreateThread(NULL, 0, AdjustFFBStrengthLoopWaitEvent, NULL, 0, NULL);
}
else
{
CreateThread(NULL, 0, AdjustFFBStrengthLoopNoWaitEvent, NULL, 0, NULL);
}
}
}
hlp.log("Entering Game's FFBLoop loop");

View File

@ -45,6 +45,7 @@ static HINSTANCE gl_padDemul;
extern int joystick_index1;
extern int joystick_index2;
extern SDL_Joystick* GameController2;
extern bool WaitForGame;
static bool testbuttonA;
static bool servicebuttonA;
static bool startbuttonA;
@ -693,6 +694,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
romnameDemul = "Nascar";
WaitForGame = true;
NascarRunning = true;
WindowSearch = true;
}
@ -712,6 +714,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
romnameDemul = "Initial D Arcade Stage";
WaitForGame = true;
InitialDRunning = true;
WindowSearch = true;
}
@ -731,6 +734,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
romnameDemul = "Smashing Drive";
WaitForGame = true;
SmashingDriveRunning = true;
WindowSearch = true;
}
@ -750,6 +754,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
romnameDemul = "Maximum Speed";
WaitForGame = true;
MaximumSpeedRunning = true;
WindowSearch = true;
}
@ -769,6 +774,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
romnameDemul = "Faster Than Speed";
WaitForGame = true;
FasterThanSpeedRunning = true;
WindowSearch = true;
}
@ -788,6 +794,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
romnameDemul = "ATV Track";
WaitForGame = true;
ATVTrackRunning = true;
WindowSearch = true;
}
@ -798,6 +805,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
{
if (!FFBGameInit)
{
Sleep(5000);
aAddy2 = PatternScan("\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x72\x6F\x64\x75\x63\x65\x64\x20\x42\x79\x20", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
FFBAddress = (int)aAddy2 - 0x2F0;
CreateThread(NULL, 0, NascarRunningLoop, NULL, 0, NULL);
@ -853,7 +861,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
{
if (!InputFind)
{
aAddy = PatternScan("\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00", "xxxxxxxxxxxxxxxxxxxxxxxxxxxx");
aAddy = PatternScan("\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x20", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
UINT8 CheckaAddy = helpers->ReadByte((int)aAddy - 0x2A0, false);
if (CheckaAddy == 0x01)
{
@ -876,6 +884,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
{
if (!FFBGameInit)
{
Sleep(5000);
aAddy2 = PatternScan("\xC0\xF3\x51\x00\x60\x9A\x2C\x01", "xxxxxxxx");
UINT8 CheckAddy = helpers->ReadByte((int)aAddy2 - 0x0E, false);
@ -911,6 +920,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
{
if (!FFBGameInit)
{
Sleep(10000);
aAddy2 = PatternScan("\x48\x03\x00\x00\xE0\x01\x00\x00\x2C\x01\x00\x00\xB4\x00\x00\x00\x00\x00\x00\x00\x20\xFE\xFF\xFF", "xxxxxxxxxxxxxxxxxxxxxxxx");
UINT8 CheckAddy = helpers->ReadByte((int)aAddy2 + 0x21, false);
@ -949,6 +959,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
{
if (!FFBGameInit)
{
Sleep(10000);
aAddy2 = PatternScan("\x01\x00\x10\x00\x00\x00\x00\x00\x00\x2F\x76", "xxxxxxxxxxx");
UINT8 CheckAddy = helpers->ReadByte((int)aAddy2 + 0x0E, false);
@ -987,6 +998,7 @@ void Demul::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers
{
if (!FFBGameInit)
{
Sleep(15000);
aAddy2 = PatternScan("\x49\x55\x4C\x00\x00\x00\x05", "xxxxxxx");
UINT8 CheckAddy = helpers->ReadByte((int)aAddy2 - 0x04, false);
if (CheckAddy == 0x1E)