Fixed double-controls.

This commit is contained in:
Layla Marchant 2020-07-27 11:41:40 -04:00
parent ca11cdea27
commit cf7a82515d
3 changed files with 145 additions and 127 deletions

View File

@ -266,7 +266,6 @@ void engine_setMode()
int radioLife = DEFAULT_RADIO_LIFE; int radioLife = DEFAULT_RADIO_LIFE;
char lang[STRMAX_SHORT]; char lang[STRMAX_SHORT];
int i; int i;
int use_gc;
strcpy(lang, "default"); strcpy(lang, "default");
@ -333,22 +332,24 @@ void engine_setMode()
SDL_EventState(SDL_MOUSEMOTION, SDL_DISABLE); SDL_EventState(SDL_MOUSEMOTION, SDL_DISABLE);
// Determine if the GameController API can be used // Determine if the GameController API can be used
use_gc = 1; engine.useController = 1;
for (i=0; i<SDL_NumJoysticks(); i++) { for (i=0; i<SDL_NumJoysticks(); i++) {
if (!SDL_IsGameController(i)) { if (!SDL_IsGameController(i)) {
use_gc = 0; engine.useController = 0;
break; break;
} }
} }
if (use_gc) if (engine.useController) {
SDL_GameControllerEventState(SDL_ENABLE); SDL_GameControllerEventState(SDL_ENABLE);
else }
else {
SDL_JoystickEventState(SDL_ENABLE); SDL_JoystickEventState(SDL_ENABLE);
}
// Open controllers // Open controllers
for (i=0; i<SDL_NumJoysticks(); i++) { for (i=0; i<SDL_NumJoysticks(); i++) {
if (use_gc) if (engine.useController)
SDL_GameControllerOpen(i); SDL_GameControllerOpen(i);
else else
SDL_JoystickOpen(i); SDL_JoystickOpen(i);

View File

@ -97,6 +97,8 @@ typedef struct Engine_ {
int keyState[KEY_LAST]; int keyState[KEY_LAST];
double xaxis; double xaxis;
double yaxis; double yaxis;
int useController;
int cheat; // overall cheat int cheat; // overall cheat
int cheatShield; int cheatShield;

View File

@ -287,148 +287,163 @@ void player_getInput()
case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONDOWN:
case SDL_JOYBUTTONUP: case SDL_JOYBUTTONUP:
switch (engine.event.jbutton.button) if (!engine.useController)
{ {
case 0: switch (engine.event.jbutton.button)
case 3: {
engine.keyState[KEY_ALTFIRE] = CSDLP( case 0:
engine.event.jbutton.state); case 3:
break; engine.keyState[KEY_ALTFIRE] = CSDLP(
case 1: engine.event.jbutton.state);
case 2: break;
engine.keyState[KEY_FIRE] = CSDLP( case 1:
engine.event.jbutton.state); case 2:
break; engine.keyState[KEY_FIRE] = CSDLP(
case 4: engine.event.jbutton.state);
case 6: break;
engine.keyState[KEY_ESCAPE] = CSDLP( case 4:
engine.event.jbutton.state); case 6:
break; engine.keyState[KEY_ESCAPE] = CSDLP(
case 5: engine.event.jbutton.state);
case 7: break;
case 8: case 5:
engine.keyState[KEY_SWITCH] = CSDLP( case 7:
engine.event.jbutton.state); case 8:
break; engine.keyState[KEY_SWITCH] = CSDLP(
case 9: engine.event.jbutton.state);
engine.keyState[KEY_PAUSE] = CSDLP( break;
engine.event.jbutton.state); case 9:
break; engine.keyState[KEY_PAUSE] = CSDLP(
engine.event.jbutton.state);
break;
}
} }
break; break;
case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONDOWN:
case SDL_CONTROLLERBUTTONUP: case SDL_CONTROLLERBUTTONUP:
switch (engine.event.cbutton.button) if (engine.useController)
{ {
case SDL_CONTROLLER_BUTTON_A: switch (engine.event.cbutton.button)
case SDL_CONTROLLER_BUTTON_Y: {
engine.keyState[KEY_ALTFIRE] = CSDLP( case SDL_CONTROLLER_BUTTON_A:
engine.event.cbutton.state); case SDL_CONTROLLER_BUTTON_Y:
break; engine.keyState[KEY_ALTFIRE] = CSDLP(
case SDL_CONTROLLER_BUTTON_B: engine.event.cbutton.state);
case SDL_CONTROLLER_BUTTON_X: break;
engine.keyState[KEY_FIRE] = CSDLP( case SDL_CONTROLLER_BUTTON_B:
engine.event.cbutton.state); case SDL_CONTROLLER_BUTTON_X:
break; engine.keyState[KEY_FIRE] = CSDLP(
case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: engine.event.cbutton.state);
engine.keyState[KEY_ESCAPE] = CSDLP( break;
engine.event.cbutton.state); case SDL_CONTROLLER_BUTTON_LEFTSHOULDER:
break; engine.keyState[KEY_ESCAPE] = CSDLP(
case SDL_CONTROLLER_BUTTON_BACK: engine.event.cbutton.state);
case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: break;
engine.keyState[KEY_SWITCH] = CSDLP( case SDL_CONTROLLER_BUTTON_BACK:
engine.event.cbutton.state); case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER:
break; engine.keyState[KEY_SWITCH] = CSDLP(
case SDL_CONTROLLER_BUTTON_START: engine.event.cbutton.state);
engine.keyState[KEY_PAUSE] = CSDLP( break;
engine.event.cbutton.state); case SDL_CONTROLLER_BUTTON_START:
break; engine.keyState[KEY_PAUSE] = CSDLP(
case SDL_CONTROLLER_BUTTON_DPAD_UP: engine.event.cbutton.state);
engine.keyState[KEY_UP] = CSDLP( break;
engine.event.cbutton.state); case SDL_CONTROLLER_BUTTON_DPAD_UP:
break; engine.keyState[KEY_UP] = CSDLP(
case SDL_CONTROLLER_BUTTON_DPAD_DOWN: engine.event.cbutton.state);
engine.keyState[KEY_DOWN] = CSDLP( break;
engine.event.cbutton.state); case SDL_CONTROLLER_BUTTON_DPAD_DOWN:
break; engine.keyState[KEY_DOWN] = CSDLP(
case SDL_CONTROLLER_BUTTON_DPAD_LEFT: engine.event.cbutton.state);
engine.keyState[KEY_LEFT] = CSDLP( break;
engine.event.cbutton.state); case SDL_CONTROLLER_BUTTON_DPAD_LEFT:
break; engine.keyState[KEY_LEFT] = CSDLP(
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: engine.event.cbutton.state);
engine.keyState[KEY_RIGHT] = CSDLP( break;
engine.event.cbutton.state); case SDL_CONTROLLER_BUTTON_DPAD_RIGHT:
break; engine.keyState[KEY_RIGHT] = CSDLP(
engine.event.cbutton.state);
break;
}
} }
break; break;
case SDL_JOYHATMOTION: case SDL_JOYHATMOTION:
engine.keyState[KEY_UP] = (engine.event.jhat.value & SDL_HAT_UP ? 1 : 0); if (!engine.useController)
engine.keyState[KEY_DOWN] = (engine.event.jhat.value & SDL_HAT_DOWN ? 1 : 0); {
engine.keyState[KEY_LEFT] = (engine.event.jhat.value & SDL_HAT_LEFT ? 1 : 0); engine.keyState[KEY_UP] = (engine.event.jhat.value & SDL_HAT_UP ? 1 : 0);
engine.keyState[KEY_RIGHT] = (engine.event.jhat.value & SDL_HAT_RIGHT ? 1 : 0); engine.keyState[KEY_DOWN] = (engine.event.jhat.value & SDL_HAT_DOWN ? 1 : 0);
engine.keyState[KEY_LEFT] = (engine.event.jhat.value & SDL_HAT_LEFT ? 1 : 0);
engine.keyState[KEY_RIGHT] = (engine.event.jhat.value & SDL_HAT_RIGHT ? 1 : 0);
}
break; break;
case SDL_JOYAXISMOTION: case SDL_JOYAXISMOTION:
if (engine.gameSection == SECTION_TITLE) { if (!engine.useController)
if (engine.event.jaxis.axis == 0) { {
joyleft = engine.event.jaxis.value < -16384; if (engine.gameSection == SECTION_TITLE) {
joyright = engine.event.jaxis.value >= 16384; if (engine.event.jaxis.axis == 0) {
if (joyleft != prevjoyleft) joyleft = engine.event.jaxis.value < -16384;
engine.keyState[KEY_LEFT] = prevjoyleft = joyleft; joyright = engine.event.jaxis.value >= 16384;
if (joyright != prevjoyright) if (joyleft != prevjoyleft)
engine.keyState[KEY_RIGHT] = prevjoyright = joyright; engine.keyState[KEY_LEFT] = prevjoyleft = joyleft;
} else if (engine.event.jaxis.axis == 1) { if (joyright != prevjoyright)
joyup = engine.event.jaxis.value < -16384; engine.keyState[KEY_RIGHT] = prevjoyright = joyright;
joydown = engine.event.jaxis.value >= 16384; } else if (engine.event.jaxis.axis == 1) {
if (joyup != prevjoyup) joyup = engine.event.jaxis.value < -16384;
engine.keyState[KEY_UP] = prevjoyup = joyup; joydown = engine.event.jaxis.value >= 16384;
if (joydown != prevjoydown) if (joyup != prevjoyup)
engine.keyState[KEY_DOWN] = prevjoydown = joydown; engine.keyState[KEY_UP] = prevjoyup = joyup;
} if (joydown != prevjoydown)
} else { engine.keyState[KEY_DOWN] = prevjoydown = joydown;
val = MIN(1, (double)(abs(engine.event.jaxis.value)) / JS_MAX); }
if (val < JS_DEADZONE) } else {
val = 0; val = MIN(1, (double)(abs(engine.event.jaxis.value)) / JS_MAX);
if (val < JS_DEADZONE)
val = 0;
if (engine.event.jaxis.axis == 0) if (engine.event.jaxis.axis == 0)
engine.xaxis = copysign(val, engine.event.jaxis.value); engine.xaxis = copysign(val, engine.event.jaxis.value);
else if (engine.event.jaxis.axis == 1) else if (engine.event.jaxis.axis == 1)
engine.yaxis = copysign(val, engine.event.jaxis.value); engine.yaxis = copysign(val, engine.event.jaxis.value);
}
} }
break; break;
case SDL_CONTROLLERAXISMOTION: case SDL_CONTROLLERAXISMOTION:
if (engine.gameSection == SECTION_TITLE) { if (engine.useController)
if (engine.event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX) {
{ if (engine.gameSection == SECTION_TITLE) {
joyleft = engine.event.caxis.value < -16384; if (engine.event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX)
joyright = engine.event.caxis.value >= 16384; {
if (joyleft != prevjoyleft) joyleft = engine.event.caxis.value < -16384;
engine.keyState[KEY_LEFT] = prevjoyleft = joyleft; joyright = engine.event.caxis.value >= 16384;
if (joyright != prevjoyright) if (joyleft != prevjoyleft)
engine.keyState[KEY_RIGHT] = prevjoyright = joyright; engine.keyState[KEY_LEFT] = prevjoyleft = joyleft;
} if (joyright != prevjoyright)
else if (engine.event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTY) engine.keyState[KEY_RIGHT] = prevjoyright = joyright;
{ }
joyup = engine.event.caxis.value < -16384; else if (engine.event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTY)
joydown = engine.event.caxis.value >= 16384; {
if (joyup != prevjoyup) joyup = engine.event.caxis.value < -16384;
engine.keyState[KEY_UP] = prevjoyup = joyup; joydown = engine.event.caxis.value >= 16384;
if (joydown != prevjoydown) if (joyup != prevjoyup)
engine.keyState[KEY_DOWN] = prevjoydown = joydown; engine.keyState[KEY_UP] = prevjoyup = joyup;
} if (joydown != prevjoydown)
} else { engine.keyState[KEY_DOWN] = prevjoydown = joydown;
val = MIN(1, (double)(abs(engine.event.caxis.value)) / JS_MAX); }
if (val < JS_DEADZONE) } else {
val = 0; val = MIN(1, (double)(abs(engine.event.caxis.value)) / JS_MAX);
if (val < JS_DEADZONE)
val = 0;
if (engine.event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX) if (engine.event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX)
engine.xaxis = copysign(val, engine.event.caxis.value); engine.xaxis = copysign(val, engine.event.caxis.value);
else if (engine.event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTY) else if (engine.event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTY)
engine.yaxis = copysign(val, engine.event.caxis.value); engine.yaxis = copysign(val, engine.event.caxis.value);
}
} }
break; break;