--- a/src/GameSrc/movekeys.c +++ b/src/GameSrc/movekeys.c @@ -44,6 +44,12 @@ extern bool gKeypadOverride; uchar parse_motion_key(ushort code, short *cnum, short *cval); +#ifdef __ANDROID__ +// Set every frame by android/app/src/main/cpp/xr_input.c. +float qs_cyber_pitch_scale = 1.0f; +float qs_cyber_bank_scale = 1.0f; +#endif + uchar parse_motion_key_cyber(ushort code, short *cnum, short *cval); void init_motion_polling(void); @@ -173,6 +179,20 @@ *cnum = -1; *cval = 0; +#ifdef __ANDROID__ + // Pitch and bank strength, scaled by the controller thumbstick's + // deflection (see android/app/src/main/cpp/xr_input.c); 1.0 for a key. + short pitchMax = (short)(CONTROL_MAX_VAL * qs_cyber_pitch_scale + 0.5f); + short bankMax = (short)(CONTROL_MAX_VAL * qs_cyber_bank_scale + 0.5f); + if (pitchMax < 1) + pitchMax = 1; + if (bankMax < 1) + bankMax = 1; +#else + short pitchMax = CONTROL_MAX_VAL; + short bankMax = CONTROL_MAX_VAL; +#endif + while (MoveCyberKeybinds[i].code != 255) { if (code == MoveCyberKeybinds[i].code) { move = MoveCyberKeybinds[i].move; @@ -189,22 +209,22 @@ case M_CLIMB: *cnum = CONTROL_YVEL; - *cval = -CONTROL_MAX_VAL; + *cval = -pitchMax; break; case M_BANKLEFT: *cnum = CONTROL_XYROT; - *cval = -CONTROL_MAX_VAL; + *cval = -bankMax; break; case M_BANKRIGHT: *cnum = CONTROL_XYROT; - *cval = CONTROL_MAX_VAL; + *cval = bankMax; break; case M_DIVE: *cnum = CONTROL_YVEL; - *cval = CONTROL_MAX_VAL; + *cval = pitchMax; break; case M_ROLLRIGHT: @@ -219,38 +239,38 @@ case M_CLIMBLEFT: *cnum = CONTROL_YVEL; - *cval = -CONTROL_MAX_VAL; + *cval = -pitchMax; if (abs(poll_controls[*cnum]) < abs(*cval)) poll_controls[*cnum] = *cval; *cnum = CONTROL_XYROT; - *cval = -CONTROL_MAX_VAL; + *cval = -bankMax; break; case M_CLIMBRIGHT: *cnum = CONTROL_YVEL; - *cval = -CONTROL_MAX_VAL; + *cval = -pitchMax; if (abs(poll_controls[*cnum]) < abs(*cval)) poll_controls[*cnum] = *cval; *cnum = CONTROL_XYROT; - *cval = CONTROL_MAX_VAL; + *cval = bankMax; break; case M_DIVERIGHT: *cnum = CONTROL_YVEL; - *cval = CONTROL_MAX_VAL; + *cval = pitchMax; if (abs(poll_controls[*cnum]) < abs(*cval)) poll_controls[*cnum] = *cval; *cnum = CONTROL_XYROT; - *cval = CONTROL_MAX_VAL; + *cval = bankMax; break; case M_DIVELEFT: *cnum = CONTROL_YVEL; - *cval = CONTROL_MAX_VAL; + *cval = pitchMax; if (abs(poll_controls[*cnum]) < abs(*cval)) poll_controls[*cnum] = *cval; *cnum = CONTROL_XYROT; - *cval = -CONTROL_MAX_VAL; + *cval = -bankMax; break; default: // Unhandled movement. What I gonna do?