--- SDL_mmjoystick.c 2012-01-19 01:30:06 -0500 +++ SDL_mmjoystick_n.c 2014-12-11 21:55:27 -0500 @@ -274,7 +274,7 @@ void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick) { MMRESULT result; - int i; + int i, j; DWORD flags[MAX_AXES] = { JOY_RETURNX, JOY_RETURNY, JOY_RETURNZ, JOY_RETURNR, JOY_RETURNU, JOY_RETURNV }; DWORD pos[MAX_AXES]; @@ -302,9 +302,11 @@ pos[5] = joyinfo.dwVpos; transaxis = joystick->hwdata->transaxis; - for (i = 0; i < joystick->naxes; i++) { - if (joyinfo.dwFlags & flags[i]) { - value = (int)(((float)pos[i] + transaxis[i].offset) * transaxis[i].scale); + for (i = 0, j = 0; i < joystick->naxes; i++, j++) { + if (i == 2 && !(SYS_Joystick[joystick->index].wCaps & JOYCAPS_HASZ)) //map down later axes if Z is undefined + j++; + if (joyinfo.dwFlags & flags[j]) { + value = (int)(((float)pos[j] + transaxis[j].offset) * transaxis[j].scale); change = (value - joystick->axes[i]); if ( (change < -JOY_AXIS_THRESHOLD) || (change > JOY_AXIS_THRESHOLD) ) { SDL_PrivateJoystickAxis(joystick, (Uint8)i, (Sint16)value);