Skip to content

Commit 27691a7

Browse files
committed
Auto-press stick once, improve screenshot, disable auto-press stick in driving mode and change Pro controller rumble
1 parent d400d4b commit 27691a7

File tree

4 files changed

+87
-66
lines changed

4 files changed

+87
-66
lines changed

README.RU.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
Сброс чувствительности прицеливания | `PS + RS` | `Capture + RS` | -
6666
Изменение силы вибрации или её отключение | `PS + Options` | `Capture + Плюс` | `ALT + </>`
6767
Выключение и включение нажатия тачпада для переключения режимов (Sony) | `PS + Share` | - | `ALT + W`
68-
Автонажатие стика при определённом наклоне стика (значение в конфигурационном файле), а также инвертирование | `PS + LS` | `HOME + LS` | `ALT + S`
68+
Автонажатие стика при определённом наклоне (значение в конфигурационном файле), единажды или постоянно | `PS + LS` | `HOME + LS` | `ALT + S`
6969
Режимы скриншота: Игровая панель Xbox, Steam, Игровая панель Xbox + Steam, заданная кнопка в конфиге (параметру `MicCustomKey` задать [нужное значение кнопки](https://github.com/r57zone/DSAdvance/blob/master/BINDINGS.RU.md) | - | - | `ALT + X`
7070
Выключение подсветки (Sony) | `PS + L1` или 2 раза нажмите на область яркости тапада и проведите пальцем влево или вправо. Если изменение яркости заблокировано `LockChangeBrightness`, то подсветка будет выключаться по двойному клику. | - | `ALT + B`
7171

@@ -114,7 +114,7 @@
114114

115115

116116
**Не работает вибрация на Nintendo Pro контроллере**<br>
117-
Пока не поддерживается, решения ищуться.
117+
В режиме USB вибрация отключена из-за проблем, в беспроводном на совместимых контроллерах работает, на оригинальных не проверено.
118118

119119
## Благодарности
120120
* Sony и Nintendo за самые продвинутые геймпады и инвестирование в инновации, а также за продвижение инноваций в игры.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ Change aiming sensitivity: increase and then decrease | `PS + △` | `Capture +
6666
Reset aiming sensitivity | `PS + RS` | `Capture + RS` | -
6767
Change rumble strength or disable it | `PS + Options` | `Capture + Plus` | `ALT + </>`
6868
Enable/disable touchpad press for mode switching (Sony) | `PS + Share` | - | `ALT + W`
69-
Auto-stick press at a certain tilt angle (value set in the config file), as well as inversion | `PS + LS` | `HOME + LS` | `ALT + S`
69+
Auto stick press when tilted at a certain angle (value set in the configuration file), either once or continuously | `PS + LS` | `HOME + LS` | `ALT + S`
7070
Screenshot modes: Xbox Game Bar, Steam, Xbox Game Bar + Steam, custom-configured button (`MicCustomKey` parameter should be set to [the desired key](https://github.com/r57zone/DSAdvance/blob/master/BINDINGS.md)) | - | - | `ALT + X`
7171
Turn off light bar (Sony) | `PS + L1` or double-tap the brightness area of the touchpad and swipe left or right. If brightness adjustment is locked (`LockChangeBrightness`), the light bar will turn off with a double tap. | - | `ALT + B`
7272

@@ -115,7 +115,7 @@ In some games, for example, Max Payne or Crysis 2, unfortunately, this don'n wor
115115

116116

117117
**Rumble don't work on Nintendo Pro controller**<br>
118-
Not supported yet, solutions are being explored.
118+
In USB mode, rumble is disabled due to issues, it works in wireless mode on compatible controllers, but hasn't been tested on original ones.
119119

120120
## Credits
121121
* Sony and Nintendo for the most advanced gamepads and investment in innovation, and for driving innovation in games.

Source/DSAdvance/DSAdvance.cpp

Lines changed: 80 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@
2121
#pragma comment(lib, "winmm.lib")
2222

2323
void GamepadSearch() {
24-
//PrimaryGamepad.ControllerType = EMPTY_CONTROLLER;
25-
//SecondaryGamepad.ControllerType = EMPTY_CONTROLLER;
26-
2724
struct hid_device_info *cur_dev;
2825

2926
// Sony controllers
@@ -113,12 +110,29 @@ void GamepadSearch() {
113110
hid_set_nonblocking(PrimaryGamepad.HidHandle, 1);
114111
PrimaryGamepad.USBConnection = true;
115112

116-
// BT detection
117-
unsigned char buf[64];
118-
memset(buf, 0, sizeof(buf));
119-
int bytesRead = hid_read_timeout(PrimaryGamepad.HidHandle, buf, sizeof(buf), 100);
120-
if (bytesRead > 0 && buf[0] == 0x11)
113+
// Conflict with JoyShock Library ???
114+
unsigned char buf[64] = {};
115+
buf[0] = 0x80;
116+
buf[1] = 0x01;
117+
118+
// Some compatible gamepads
119+
int written = hid_write(PrimaryGamepad.HidHandle, buf, 2);
120+
if (written > 0) {
121+
PrimaryGamepad.USBConnection = true;
122+
123+
unsigned char buf[64];
124+
memset(buf, 0, sizeof(buf));
125+
int bytesRead = hid_read_timeout(PrimaryGamepad.HidHandle, buf, sizeof(buf), 100);
126+
if (bytesRead > 0 && (buf[0] == 0x81 || buf[0] == 0x21 || buf[0] == 0x30))
127+
PrimaryGamepad.USBConnection = true;
128+
}
129+
else
121130
PrimaryGamepad.USBConnection = false;
131+
//hid_set_nonblocking(PrimaryGamepad.HidHandle, 1);
132+
133+
//if (PrimaryGamepad.USBConnection) printf("USB\n"); else printf("BT");
134+
//PrimaryGamepad.USBConnection = (cur_dev->serial_number != NULL);
135+
//hid_set_nonblocking(PrimaryGamepad.HidHandle, 1);
122136
}
123137
cur_dev = cur_dev->next;
124138
}
@@ -260,10 +274,13 @@ void GamepadSetState(InputOutState OutState)
260274
hid_write(PrimaryGamepad.HidHandle2, outputReport, 10);
261275
}*/
262276

277+
PrimaryGamepad.PacketCounter++;
278+
if (PrimaryGamepad.PacketCounter > 0xf) PrimaryGamepad.PacketCounter = 0;
279+
263280
// Left JoyCon
264281
unsigned char outputReportLeft[64] = { 0 };
265282
outputReportLeft[0] = 0x10;
266-
outputReportLeft[1] = (++PrimaryGamepad.PacketCounter) & 0xF; if (PrimaryGamepad.PacketCounter > 0xF) PrimaryGamepad.PacketCounter = 0x0;
283+
outputReportLeft[1] = PrimaryGamepad.PacketCounter;
267284
outputReportLeft[2] = (unsigned int)OutState.SmallMotor * PrimaryGamepad.RumbleStrength * 90 / 10000; // std::clamp(OutState.SmallMotor - 0, 0, 229); // It seems that it is not recommended to use the Nintendo Switch motors at 100 % , there is a risk of damaging them, so we will limit ourselves to 90%
268285
outputReportLeft[3] = 0x00;
269286
outputReportLeft[4] = OutState.SmallMotor == 0 ? 0x00 : 0x01;
@@ -275,7 +292,7 @@ void GamepadSetState(InputOutState OutState)
275292
if (PrimaryGamepad.HidHandle2 != NULL) {
276293
unsigned char outputReportRight[64] = { 0 };
277294
outputReportRight[0] = 0x10;
278-
outputReportRight[1] = (PrimaryGamepad.PacketCounter) & 0xF;
295+
outputReportRight[1] = PrimaryGamepad.PacketCounter;
279296
outputReportRight[2] = 0x00;
280297
outputReportRight[3] = 0x00;
281298
outputReportRight[4] = OutState.LargeMotor == 0 ? 0x00 : 0x01;
@@ -285,46 +302,37 @@ void GamepadSetState(InputOutState OutState)
285302
hid_write(PrimaryGamepad.HidHandle2, outputReportRight, 64);
286303
}
287304

288-
if (OutState.SmallMotor == 0 && OutState.LargeMotor == 0) PrimaryGamepad.RumbleOffCounter = 2; // Looks like Nintendo needs some "0" rumble packets to stop it
305+
if (PrimaryGamepad.RumbleOffCounter == 0 && OutState.SmallMotor == 0 && OutState.LargeMotor == 0) PrimaryGamepad.RumbleOffCounter = 2; // Looks like Nintendo needs some "0" rumble packets to stop it
289306
}
290-
} else if (PrimaryGamepad.ControllerType == NINTENDO_SWITCH_PRO) { // Working only one motor :(
307+
}
308+
else if (PrimaryGamepad.ControllerType == NINTENDO_SWITCH_PRO && !PrimaryGamepad.USBConnection) { // Working only one motor :(
309+
//printf("rumble\n");
291310
if (PrimaryGamepad.RumbleStrength != 0) {
292311
unsigned char outputReport[64] = { 0 };
293312

294-
/* // BT ???
295-
if (!PrimaryGamepad.USBConnection) {
296-
outputReport[0] = 0x80; // Заголовок для Bluetooth
297-
outputReport[1] = 0x92; // Команда вибрации для Bluetooth
298-
outputReport[3] = 0x31; // Подкоманда для вибрации
299-
outputReport[8] = 0x10; // Дополнительные данные для Bluetooth
300-
}*/
301-
302-
outputReport[0] = 0x10;
303-
outputReport[1] = (++PrimaryGamepad.PacketCounter) & 0xF; if (PrimaryGamepad.PacketCounter > 0xF) PrimaryGamepad.PacketCounter = 0x0;
304-
305313
// Amplitudes
306314
unsigned char hf = 0x20; // High frequency
307315
unsigned char lf = 0x28; // Low frequency
308316
unsigned char h_amp = (unsigned int)OutState.SmallMotor * PrimaryGamepad.RumbleStrength * 90 / 10000; // std::clamp(OutState.SmallMotor * 2 / 229, 0, 255); // It seems that it is not recommended to use the Nintendo Switch motors at 100 % , there is a risk of damaging them, so we will limit ourselves to 90%
309-
unsigned char l_amp1 = (unsigned int)OutState.LargeMotor * PrimaryGamepad.RumbleStrength * 90 / 10000; // std::clamp(OutState.LargeMotor / 229, 0, 255);
317+
//unsigned char l_amp1 = (unsigned int)OutState.LargeMotor * PrimaryGamepad.RumbleStrength * 90 / 10000; // The way is correct, but work only one motor
318+
unsigned char l_amp1 = OutState.LargeMotor != 0 ? (unsigned int)OutState.LargeMotor * PrimaryGamepad.RumbleStrength * 90 / 10000 : (unsigned int)OutState.SmallMotor * PrimaryGamepad.RumbleStrength * 90 / 10000; // Wrong way, temporary solution
310319
unsigned char l_amp2 = ((l_amp1 % 2) * 128);
311320
l_amp1 = (l_amp1 / 2) + 64;
312321

322+
PrimaryGamepad.PacketCounter++;
323+
if (PrimaryGamepad.PacketCounter > 0xf) PrimaryGamepad.PacketCounter = 0;
324+
325+
// ?????
326+
outputReport[0] = 0x10;
327+
outputReport[1] = PrimaryGamepad.PacketCounter;
313328
outputReport[2] = hf;
314329
outputReport[3] = h_amp;
315330
outputReport[4] = lf + l_amp2;
316331
outputReport[5] = l_amp1;
317332

318-
if (!PrimaryGamepad.USBConnection) {
319-
outputReport[0] = 0x80;
320-
outputReport[1] = 0x92;
321-
outputReport[3] = 0x31;
322-
outputReport[8] = 0x10;
323-
}
324-
325333
hid_write(PrimaryGamepad.HidHandle, outputReport, 64);
326334

327-
if (OutState.SmallMotor == 0 && OutState.LargeMotor == 0) PrimaryGamepad.RumbleOffCounter = 2; // Looks like Nintendo needs some "0" rumble packets to stop it
335+
if (PrimaryGamepad.RumbleOffCounter == 0 && OutState.SmallMotor == 0 && OutState.LargeMotor == 0) PrimaryGamepad.RumbleOffCounter = 2; // Looks like Nintendo needs some "0" rumble packets to stop it
328336
}
329337
} else {
330338
//if (JslGetControllerType(0) == JS_TYPE_DS || JslGetControllerType(0) == JS_TYPE_DS4)
@@ -378,13 +386,13 @@ void GetBatteryInfo() {
378386
}
379387
}
380388

381-
void ExternalPedalsDInputSearch() {
389+
// wMid - Vendor id, wPid - Product id
390+
void ExternalPedalsDInputSearch() {
382391
ExternalPedalsConnected = false;
383392
for (int JoyID = 0; JoyID < 4; ++JoyID) { // JOYSTICKID4 - 3
384393
if (joyGetPosEx(JoyID, &AppStatus.ExternalPedalsJoyInfo) == JOYERR_NOERROR && // JoyID - JOYSTICKID1..4
385-
joyGetDevCaps(JoyID, &AppStatus.ExternalPedalsJoyCaps, sizeof(AppStatus.ExternalPedalsJoyCaps)) == JOYERR_NOERROR &&
386-
(AppStatus.ExternalPedalsJoyCaps.wMid != 1406 ||
387-
(AppStatus.ExternalPedalsJoyCaps.wPid != 8198 && AppStatus.ExternalPedalsJoyCaps.wPid != 8199)) && // Exclude Pro Controller и JoyCon
394+
joyGetDevCaps(JoyID, &AppStatus.ExternalPedalsJoyCaps, sizeof(AppStatus.ExternalPedalsJoyCaps)) == JOYERR_NOERROR &&
395+
(AppStatus.ExternalPedalsJoyCaps.wMid != 1406) && // Exclude Pro Controller и JoyCon
388396
AppStatus.ExternalPedalsJoyCaps.wNumButtons == 16) { // DualSense - 15, DigiJoy - 16
389397
AppStatus.ExternalPedalsJoyIndex = JoyID;
390398
AppStatus.ExternalPedalsDInputConnected = true;
@@ -617,11 +625,11 @@ void DefaultMainText() {
617625
printf(" %s touchpad press for mode switching - \"ALT + W\" or \"PS + Share\" (Sony only).\n", AppStatus.ChangeModesWithClick ? "Disable" : "Enable");
618626

619627
if (AppStatus.LeftStickMode == LeftStickDefaultMode)
620-
printf(" Left stick mode: Default");
628+
printf(" Left stick mode: default");
621629
else if (AppStatus.LeftStickMode == LeftStickAutoPressMode)
622-
printf(" Left stick mode: Auto pressing by value");
623-
else if (AppStatus.LeftStickMode == LeftStickInvertPressMode)
624-
printf(" Left stick mode: Invert pressed");
630+
printf(" Left stick mode: auto-press based on value");
631+
else if (AppStatus.LeftStickMode == LeftStickPressOnceMode)
632+
printf(" Left stick mode: single press based on value");
625633
printf(", press \"ALT + S\" or \"PS/Home + LS\" to switch.\n");
626634

627635
if (AppStatus.ScreenshotMode == ScreenShotCustomKeyMode)
@@ -743,8 +751,8 @@ void RussianMainText() {
743751
printf(" Режим левого стика: по умолчанию");
744752
else if (AppStatus.LeftStickMode == LeftStickAutoPressMode)
745753
printf(" Режим левого стика: автонажатие по значению");
746-
else if (AppStatus.LeftStickMode == LeftStickInvertPressMode)
747-
printf(" Режим левого стика: инверсия нажатия");
754+
else if (AppStatus.LeftStickMode == LeftStickPressOnceMode)
755+
printf(" Режим левого стика: разовое нажатие по значению");
748756
printf(", нажмите \"ALT + S\" или \"PS/Home + L1\" для переключения.\n");
749757

750758
if (AppStatus.ScreenshotMode == ScreenShotCustomKeyMode)
@@ -869,7 +877,7 @@ LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
869877

870878
int main(int argc, char **argv)
871879
{
872-
SetConsoleTitle("DSAdvance 1.3");
880+
SetConsoleTitle("DSAdvance 1.4");
873881
WindowToCenter();
874882

875883
// if (false)
@@ -944,6 +952,15 @@ int main(int argc, char **argv)
944952
PrimaryGamepad.KMEmu.StickValuePressKey = IniFile.ReadFloat("KeyboardMouse", "StickValuePressKey", 0.2f);
945953
PrimaryGamepad.KMEmu.TriggerValuePressKey = IniFile.ReadFloat("KeyboardMouse", "TriggerValuePressKey", 0.2f);
946954

955+
AppStatus.MicCustomKeyName = IniFile.ReadString("Gamepad", "MicCustomKey", "NONE");
956+
AppStatus.MicCustomKey = KeyNameToKeyCode(AppStatus.MicCustomKeyName);
957+
if (AppStatus.MicCustomKey == 0)
958+
AppStatus.ScreenshotMode = ScreenShotXboxGameBarMode; // If not set, then hide this mode
959+
else
960+
AppStatus.ScreenShotKey = AppStatus.MicCustomKey;
961+
AppStatus.SteamScrKeyName = IniFile.ReadString("Gamepad", "SteamScrKey", "NONE");
962+
AppStatus.SteamScrKey = KeyNameToKeyCode(AppStatus.SteamScrKeyName);
963+
947964
bool SecondaryGamepadEnabled = IniFile.ReadBoolean("SecondaryGamepad", "Enabled", false);
948965
SecondaryGamepad.Sticks.DeadZoneLeftX = IniFile.ReadFloat("SecondaryGamepad", "DeadZoneLeftStickX", 0);
949966
SecondaryGamepad.Sticks.DeadZoneLeftY = IniFile.ReadFloat("SecondaryGamepad", "DeadZoneLeftStickY", 0);
@@ -956,16 +973,6 @@ int main(int argc, char **argv)
956973
SecondaryGamepad.DefaultModeColor = WebColorToRGB(IniFile.ReadString("SecondaryGamepad", "DefaultModeColor", "00ff00"));
957974
SecondaryGamepad.LEDColor = SecondaryGamepad.DefaultModeColor;
958975

959-
AppStatus.MicCustomKeyName = IniFile.ReadString("Gamepad", "MicCustomKey", "NONE");
960-
AppStatus.MicCustomKey = KeyNameToKeyCode(AppStatus.MicCustomKeyName);
961-
if (AppStatus.MicCustomKey == 0)
962-
AppStatus.ScreenshotMode = ScreenShotXboxGameBarMode; // If not set, then hide this mode
963-
else
964-
AppStatus.ScreenShotKey = AppStatus.MicCustomKey;
965-
966-
AppStatus.SteamScrKeyName = IniFile.ReadString("Gamepad", "SteamScrKey", "NONE");
967-
AppStatus.SteamScrKey = KeyNameToKeyCode(AppStatus.SteamScrKeyName);
968-
969976
// External pedals
970977
AppStatus.ExternalPedalsDInputSearch = IniFile.ReadBoolean("ExternalPedals", "DInput", false);
971978
AppStatus.ExternalPedalsCOMPort = IniFile.ReadInteger("ExternalPedals", "COMPort", 0);
@@ -1467,8 +1474,21 @@ int main(int argc, char **argv)
14671474
report.sThumbRY = PrimaryGamepad.Sticks.InvertRightY == false ? DeadZoneAxis(PrimaryGamepad.InputState.stickRY, PrimaryGamepad.Sticks.DeadZoneRightY) * 32767 : DeadZoneAxis(-PrimaryGamepad.InputState.stickRY, PrimaryGamepad.Sticks.DeadZoneRightY) * 32767;
14681475

14691476
// Auto stick pressing when value is exceeded
1470-
if (AppStatus.LeftStickMode == LeftStickAutoPressMode && ( sqrt(PrimaryGamepad.InputState.stickLX * PrimaryGamepad.InputState.stickLX + PrimaryGamepad.InputState.stickLY * PrimaryGamepad.InputState.stickLY) >= PrimaryGamepad.AutoPressStickValue))
1471-
report.wButtons |= JSMASK_LCLICK;
1477+
if (PrimaryGamepad.GamepadActionMode != MotionDrivingMode) { // Exclude driving mode
1478+
if (AppStatus.LeftStickMode != LeftStickDefaultMode && (sqrt(PrimaryGamepad.InputState.stickLX * PrimaryGamepad.InputState.stickLX + PrimaryGamepad.InputState.stickLY * PrimaryGamepad.InputState.stickLY) >= PrimaryGamepad.AutoPressStickValue)) {
1479+
if (AppStatus.LeftStickMode == LeftStickAutoPressMode)
1480+
report.wButtons |= JSMASK_LCLICK;
1481+
else { // LeftStickPressOnceMode
1482+
if (AppStatus.LeftStickPressOnce == false) {
1483+
report.wButtons |= JSMASK_LCLICK;
1484+
AppStatus.LeftStickPressOnce = true;
1485+
//printf(" LeftStickPressOnce\n");
1486+
}
1487+
}
1488+
}
1489+
else
1490+
AppStatus.LeftStickPressOnce = false;
1491+
}
14721492

14731493
report.bLeftTrigger = DeadZoneAxis(PrimaryGamepad.InputState.lTrigger, PrimaryGamepad.Triggers.DeadZoneLeft) * 255;
14741494
report.bRightTrigger = DeadZoneAxis(PrimaryGamepad.InputState.rTrigger, PrimaryGamepad.Triggers.DeadZoneRight) * 255;
@@ -1560,10 +1580,7 @@ int main(int argc, char **argv)
15601580
if (!(PrimaryGamepad.InputState.buttons & JSMASK_PS && PrimaryGamepad.InputState.buttons & JSMASK_CAPTURE && PrimaryGamepad.InputState.buttons & JSMASK_CAPTURE)) { // During special functions, nothing is pressed in the game
15611581
report.wButtons |= PrimaryGamepad.InputState.buttons & JSMASK_L ? XINPUT_GAMEPAD_LEFT_SHOULDER : 0;
15621582
report.wButtons |= PrimaryGamepad.InputState.buttons & JSMASK_R ? XINPUT_GAMEPAD_RIGHT_SHOULDER : 0;
1563-
if (AppStatus.LeftStickMode != LeftStickInvertPressMode) // Invert stick mode
1564-
report.wButtons |= PrimaryGamepad.InputState.buttons & JSMASK_LCLICK ? XINPUT_GAMEPAD_LEFT_THUMB : 0;
1565-
else
1566-
report.wButtons |= PrimaryGamepad.InputState.buttons & JSMASK_LCLICK ? 0 : XINPUT_GAMEPAD_LEFT_THUMB;
1583+
report.wButtons |= PrimaryGamepad.InputState.buttons & JSMASK_LCLICK ? XINPUT_GAMEPAD_LEFT_THUMB : 0;
15671584
report.wButtons |= PrimaryGamepad.InputState.buttons & JSMASK_RCLICK ? XINPUT_GAMEPAD_RIGHT_THUMB : 0;
15681585
report.wButtons |= PrimaryGamepad.InputState.buttons & JSMASK_UP ? XINPUT_GAMEPAD_DPAD_UP : 0;
15691586
report.wButtons |= PrimaryGamepad.InputState.buttons & JSMASK_DOWN ? XINPUT_GAMEPAD_DPAD_DOWN : 0;
@@ -1642,7 +1659,10 @@ int main(int argc, char **argv)
16421659
}
16431660

16441661
if (PrimaryGamepad.ShareOnlyCheckCount > 0) { // Checking start
1645-
if (IsSharePressed == false) PrimaryGamepad.ShareCheckUnpressed = true;
1662+
if (IsSharePressed == false) {
1663+
PrimaryGamepad.ShareCheckUnpressed = true;
1664+
PrimaryGamepad.ShareOnlyCheckCount = 1; // Skip timeout if button is released
1665+
}
16461666

16471667
if (PrimaryGamepad.ShareOnlyCheckCount == 1) {
16481668
// Screenshot

Source/DSAdvance/DSAdvance.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@
7171
#define ExPedalsDependentMode 1
7272

7373
#define LeftStickDefaultMode 0
74-
#define LeftStickAutoPressMode 1
75-
#define LeftStickInvertPressMode 2
74+
#define LeftStickPressOnceMode 1
75+
#define LeftStickAutoPressMode 2
7676
#define LeftStickMaxModes 2
7777

7878
#define ScreenShotCustomKeyMode 0
@@ -298,6 +298,7 @@ struct _AppStatus {
298298
bool XboxGamepadAttached = true;
299299
bool AimMode = false;
300300
int LeftStickMode = 0;
301+
bool LeftStickPressOnce = false;
301302
bool ChangeModesWithClick = false;
302303
bool ChangeModesWithoutAreas = false;
303304
bool ShowBatteryStatus = false;

0 commit comments

Comments
 (0)