[Change] Much better handling of joystick axes.

This commit is contained in:
Allanis 2014-05-30 20:11:37 +01:00
parent 521514ba7e
commit a4861de89f
5 changed files with 115 additions and 111 deletions

View File

@ -105,7 +105,7 @@ int conf_loadConfig(const char* file) {
double d; double d;
char* str, *mod; char* str, *mod;
SDLKey key; SDLKey key;
int type, reverse; int type;
int w, h, fsaa; int w, h, fsaa;
SDLMod m; SDLMod m;
@ -230,17 +230,6 @@ int conf_loadConfig(const char* file) {
} }
lua_pop(L, 1); lua_pop(L, 1);
/* Is it reversed? Only used for axis. */
lua_pushstring(L, "reverse");
lua_gettable(L, -2);
if(lua_isnumber(L, -1))
reverse = !!(int)lua_tonumber(L, -1);
else if(lua_isboolean(L, -1))
reverse = lua_toboolean(L, -1);
else
reverse = 0;
lua_pop(L, 1);
/* Get the modifier. */ /* Get the modifier. */
lua_pushstring(L, "mod"); lua_pushstring(L, "mod");
lua_gettable(L, -2); lua_gettable(L, -2);
@ -254,7 +243,8 @@ int conf_loadConfig(const char* file) {
/* Then the keybind is valid. Get the type. */ /* Then the keybind is valid. Get the type. */
if(strcmp(str, "null") ==0) type = KEYBIND_NULL; if(strcmp(str, "null") ==0) type = KEYBIND_NULL;
else if(strcmp(str, "keyboard") ==0) type = KEYBIND_KEYBOARD; else if(strcmp(str, "keyboard") ==0) type = KEYBIND_KEYBOARD;
else if(strcmp(str, "jaxis") ==0) type = KEYBIND_JAXIS; else if(strcmp(str, "jaxispos") ==0) type = KEYBIND_JAXISPOS;
else if(strcmp(str, "jaxisneg") ==0) type = KEYBIND_JAXISNEG;
else if(strcmp(str, "jbutton") ==0) type = KEYBIND_JBUTTON; else if(strcmp(str, "jbutton") ==0) type = KEYBIND_JBUTTON;
else { else {
WARN("Unknown keybinding of type %s", str); WARN("Unknown keybinding of type %s", str);
@ -280,7 +270,7 @@ int conf_loadConfig(const char* file) {
} else m = KMOD_NONE; } else m = KMOD_NONE;
/* Set the keybind. */ /* Set the keybind. */
input_setKeybind((char*)keybindNames[i], type, key, m, reverse); input_setKeybind((char*)keybindNames[i], type, key, m);
} else { } else {
WARN("Malformed keybind for %s in '%s'", keybindNames[i], file); WARN("Malformed keybind for %s in '%s'", keybindNames[i], file);
} }

View File

@ -29,7 +29,6 @@ typedef struct Keybind_ {
char* name; /**< Keybinding name, taken from keybindNames[] */ char* name; /**< Keybinding name, taken from keybindNames[] */
KeybindType type; /**< type, defined in player.h. */ KeybindType type; /**< type, defined in player.h. */
SDLKey key; /**< Key/axis/button event number. */ SDLKey key; /**< Key/axis/button event number. */
double reverse; /**< 1. if normal, -1 if reversed, only useful for joystick axis. */
SDLMod mod; /**< Key modifiers (where applicable). */ SDLMod mod; /**< Key modifiers (where applicable). */
} Keybind; } Keybind;
@ -110,8 +109,8 @@ const char* keybindDescription[] = {
static unsigned int input_accelLast = 0; /**< Used to see if double tap. */ static unsigned int input_accelLast = 0; /**< Used to see if double tap. */
unsigned int input_afterburnSensibility = 200; /**< ms between taps to afterburn. */ unsigned int input_afterburnSensibility = 200; /**< ms between taps to afterburn. */
/* From player.c */ extern double player_left; /**< player.c */
extern double player_turn; extern double player_right; /**< player.c */
#if SDL_VERSION_ATLEAST(1,3,0) #if SDL_VERSION_ATLEAST(1,3,0)
# define INPUT_NUMKEYS SDL_NUM_SCANCODES /**< Number of keys available. */ # define INPUT_NUMKEYS SDL_NUM_SCANCODES /**< Number of keys available. */
@ -128,46 +127,46 @@ static void input_keyConvDestroy(void);
*/ */
void input_setDefault(void) { void input_setDefault(void) {
/* Movement. */ /* Movement. */
input_setKeybind("accel", KEYBIND_KEYBOARD, SDLK_w, KMOD_ALL, 0); input_setKeybind("accel", KEYBIND_KEYBOARD, SDLK_w, KMOD_ALL);
input_setKeybind("afterburn", KEYBIND_NULL, SDLK_UNKNOWN, KMOD_NONE, 0); input_setKeybind("afterburn", KEYBIND_NULL, SDLK_UNKNOWN, KMOD_NONE);
input_setKeybind("left", KEYBIND_KEYBOARD, SDLK_a, KMOD_ALL, 0); input_setKeybind("left", KEYBIND_KEYBOARD, SDLK_a, KMOD_ALL);
input_setKeybind("right", KEYBIND_KEYBOARD, SDLK_d, KMOD_ALL, 0); input_setKeybind("right", KEYBIND_KEYBOARD, SDLK_d, KMOD_ALL);
input_setKeybind("reverse", KEYBIND_KEYBOARD, SDLK_s, KMOD_ALL, 0); input_setKeybind("reverse", KEYBIND_KEYBOARD, SDLK_s, KMOD_ALL);
/* Targetting. */ /* Targetting. */
input_setKeybind("target", KEYBIND_KEYBOARD, SDLK_TAB, KMOD_NONE, 0); input_setKeybind("target", KEYBIND_KEYBOARD, SDLK_TAB, KMOD_NONE);
input_setKeybind("target_prev", KEYBIND_KEYBOARD, SDLK_TAB, KMOD_RCTRL, 0); input_setKeybind("target_prev", KEYBIND_KEYBOARD, SDLK_TAB, KMOD_RCTRL);
input_setKeybind("target_nearest", KEYBIND_KEYBOARD, SDLK_t, KMOD_NONE, 0); input_setKeybind("target_nearest", KEYBIND_KEYBOARD, SDLK_t, KMOD_NONE);
input_setKeybind("target_hostile", KEYBIND_KEYBOARD, SDLK_r, KMOD_NONE, 0); input_setKeybind("target_hostile", KEYBIND_KEYBOARD, SDLK_r, KMOD_NONE);
/* Combat. */ /* Combat. */
input_setKeybind("primary", KEYBIND_KEYBOARD, SDLK_SPACE, KMOD_ALL, 0); input_setKeybind("primary", KEYBIND_KEYBOARD, SDLK_SPACE, KMOD_ALL);
input_setKeybind("face", KEYBIND_KEYBOARD, SDLK_f, KMOD_NONE, 0); input_setKeybind("face", KEYBIND_KEYBOARD, SDLK_f, KMOD_NONE);
input_setKeybind("board", KEYBIND_KEYBOARD, SDLK_b, KMOD_NONE, 0); input_setKeybind("board", KEYBIND_KEYBOARD, SDLK_b, KMOD_NONE);
/* Escorts. */ /* Escorts. */
input_setKeybind("e_attack", KEYBIND_KEYBOARD, SDLK_1, KMOD_NONE, 0); input_setKeybind("e_attack", KEYBIND_KEYBOARD, SDLK_1, KMOD_NONE);
input_setKeybind("e_hold", KEYBIND_KEYBOARD, SDLK_2, KMOD_NONE, 0); input_setKeybind("e_hold", KEYBIND_KEYBOARD, SDLK_2, KMOD_NONE);
input_setKeybind("e_return", KEYBIND_KEYBOARD, SDLK_3, KMOD_NONE, 0); input_setKeybind("e_return", KEYBIND_KEYBOARD, SDLK_3, KMOD_NONE);
input_setKeybind("e_clear", KEYBIND_KEYBOARD, SDLK_4, KMOD_NONE, 0); input_setKeybind("e_clear", KEYBIND_KEYBOARD, SDLK_4, KMOD_NONE);
/* Secondary weapon. */ /* Secondary weapon. */
input_setKeybind("secondary", KEYBIND_KEYBOARD, SDLK_LALT, KMOD_ALL, 0); input_setKeybind("secondary", KEYBIND_KEYBOARD, SDLK_LALT, KMOD_ALL);
input_setKeybind("secondary_next", KEYBIND_KEYBOARD, SDLK_e, KMOD_NONE, 0); input_setKeybind("secondary_next", KEYBIND_KEYBOARD, SDLK_e, KMOD_NONE);
input_setKeybind("secondary_prev", KEYBIND_KEYBOARD, SDLK_e, KMOD_LCTRL, 0); input_setKeybind("secondary_prev", KEYBIND_KEYBOARD, SDLK_e, KMOD_LCTRL);
/* Space */ /* Space */
input_setKeybind("autonav", KEYBIND_KEYBOARD, SDLK_j, KMOD_LCTRL, 0); input_setKeybind("autonav", KEYBIND_KEYBOARD, SDLK_j, KMOD_LCTRL);
input_setKeybind("target_planet", KEYBIND_KEYBOARD, SDLK_p, KMOD_NONE, 0); input_setKeybind("target_planet", KEYBIND_KEYBOARD, SDLK_p, KMOD_NONE);
input_setKeybind("land", KEYBIND_KEYBOARD, SDLK_l, KMOD_NONE, 0); input_setKeybind("land", KEYBIND_KEYBOARD, SDLK_l, KMOD_NONE);
input_setKeybind("thyperspace", KEYBIND_KEYBOARD, SDLK_h, KMOD_NONE, 0); input_setKeybind("thyperspace", KEYBIND_KEYBOARD, SDLK_h, KMOD_NONE);
input_setKeybind("starmap", KEYBIND_KEYBOARD, SDLK_m, KMOD_NONE, 0); input_setKeybind("starmap", KEYBIND_KEYBOARD, SDLK_m, KMOD_NONE);
input_setKeybind("jump", KEYBIND_KEYBOARD, SDLK_j, KMOD_NONE, 0); input_setKeybind("jump", KEYBIND_KEYBOARD, SDLK_j, KMOD_NONE);
/* Communication. */ /* Communication. */
input_setKeybind("hail", KEYBIND_KEYBOARD, SDLK_y, KMOD_NONE, 0); input_setKeybind("hail", KEYBIND_KEYBOARD, SDLK_y, KMOD_NONE);
/* Misc. */ /* Misc. */
input_setKeybind("mapzoomin", KEYBIND_KEYBOARD, SDLK_KP_PLUS, KMOD_ALL, 0); input_setKeybind("mapzoomin", KEYBIND_KEYBOARD, SDLK_KP_PLUS, KMOD_ALL);
input_setKeybind("mapzoomout", KEYBIND_KEYBOARD, SDLK_KP_MINUS, KMOD_ALL, 0); input_setKeybind("mapzoomout", KEYBIND_KEYBOARD, SDLK_KP_MINUS, KMOD_ALL);
input_setKeybind("screenshot", KEYBIND_KEYBOARD, SDLK_KP_MULTIPLY, KMOD_ALL, 0); input_setKeybind("screenshot", KEYBIND_KEYBOARD, SDLK_KP_MULTIPLY, KMOD_ALL);
input_setKeybind("pause", KEYBIND_KEYBOARD, SDLK_F1, KMOD_NONE, 0); input_setKeybind("pause", KEYBIND_KEYBOARD, SDLK_F1, KMOD_NONE);
input_setKeybind("speed", KEYBIND_KEYBOARD, SDLK_BACKQUOTE, KMOD_ALL, 0); input_setKeybind("speed", KEYBIND_KEYBOARD, SDLK_BACKQUOTE, KMOD_ALL);
input_setKeybind("menu", KEYBIND_KEYBOARD, SDLK_ESCAPE, KMOD_ALL, 0); input_setKeybind("menu", KEYBIND_KEYBOARD, SDLK_ESCAPE, KMOD_ALL);
input_setKeybind("info", KEYBIND_KEYBOARD, SDLK_i, KMOD_NONE, 0); input_setKeybind("info", KEYBIND_KEYBOARD, SDLK_i, KMOD_NONE);
} }
/** /**
@ -218,7 +217,6 @@ void input_init(void) {
tmp->type = KEYBIND_NULL; tmp->type = KEYBIND_NULL;
tmp->key = SDLK_UNKNOWN; tmp->key = SDLK_UNKNOWN;
tmp->mod = KMOD_NONE; tmp->mod = KMOD_NONE;
tmp->reverse = 1.;
input_keybinds[i] = tmp; input_keybinds[i] = tmp;
} }
@ -305,10 +303,8 @@ SDLKey input_keyConv(char* name) {
* @param type The type of the keybind. * @param type The type of the keybind.
* @param key The key to bind to. * @param key The key to bind to.
* @param mod Modifiers to check for. * @param mod Modifiers to check for.
* @param reverse Whether to reverse it or not.
*/ */
void input_setKeybind(char* keybind, KeybindType type, int key, void input_setKeybind(char* keybind, KeybindType type, int key, SDLMod mod) {
SDLMod mod, int reverse) {
int i; int i;
for(i = 0; strcmp(keybindNames[i], "end"); i++) for(i = 0; strcmp(keybindNames[i], "end"); i++)
if(strcmp(keybind, input_keybinds[i]->name)==0) { if(strcmp(keybind, input_keybinds[i]->name)==0) {
@ -316,7 +312,6 @@ void input_setKeybind(char* keybind, KeybindType type, int key,
input_keybinds[i]->key = key; input_keybinds[i]->key = key;
/* Non-keyboards get mod KMOD_ALL to always match. */ /* Non-keyboards get mod KMOD_ALL to always match. */
input_keybinds[i]->mod = (type == KEYBIND_KEYBOARD) ? mod : KMOD_ALL; input_keybinds[i]->mod = (type == KEYBIND_KEYBOARD) ? mod : KMOD_ALL;
input_keybinds[i]->reverse = reverse ? -1. : 1.;
return; return;
} }
WARN("Unable to set keybind '%s', That command does not exist.", keybind); WARN("Unable to set keybind '%s', That command does not exist.", keybind);
@ -324,14 +319,17 @@ void input_setKeybind(char* keybind, KeybindType type, int key,
/** /**
* @brief Get the value of a keybind. * @brief Get the value of a keybind.
* @param keybind Name of the keybinding to get.
* @param[out] type Store the type of the keybinding.
* @param[out] mod Store the modifiers used with the keybinding.
* @return The key assosciated with the keybinding.
*/ */
SDLKey input_getKeybind(const char* keybind, KeybindType* type, SDLMod* mod, int* reverse) { SDLKey input_getKeybind(const char* keybind, KeybindType* type, SDLMod* mod) {
int i; int i;
for(i = 0; strcmp(keybindNames[i], "end"); i++) for(i = 0; strcmp(keybindNames[i], "end"); i++)
if(strcmp(keybind, input_keybinds[i]->name)==0) { if(strcmp(keybind, input_keybinds[i]->name)==0) {
if(type != NULL) (*type) = input_keybinds[i]->type; if(type != NULL) (*type) = input_keybinds[i]->type;
if(mod != NULL) (*mod) = input_keybinds[i]->mod; if(mod != NULL) (*mod) = input_keybinds[i]->mod;
if(reverse != NULL) (*reverse) = input_keybinds[i]->reverse;
return input_keybinds[i]->key; return input_keybinds[i]->key;
} }
@ -364,9 +362,9 @@ const char* input_getKeybindDescription(char* keybind) {
* @brief Run the input command. * @brief Run the input command.
* @param keynum The index of the keybind. * @param keynum The index of the keybind.
* @param value The value of the keypress (defined above). * @param value The value of the keypress (defined above).
* @param kabs Whether or not it's an absolute value (for the joystick). * @param kabs The absolute value.
*/ */
static void input_key(int keynum, double value, int kabs) { static void input_key(int keynum, double value, double kabs) {
unsigned int t; unsigned int t;
/* Accelerating. */ /* Accelerating. */
@ -403,37 +401,41 @@ static void input_key(int keynum, double value, int kabs) {
} }
/* Turning left. */ /* Turning left. */
else if(KEY("left")) { else if(KEY("left")) {
if(kabs) if(kabs) {
player_turn = -value; player_abortAutonav(NULL);
else { player_setFlag(PLAYER_TURN_LEFT);
player_left = value;
} else {
/* Set flags for facing correction. */ /* Set flags for facing correction. */
if(value == KEY_PRESS) { if(value == KEY_PRESS) {
player_abortAutonav(NULL); player_abortAutonav(NULL);
player_setFlag(PLAYER_TURN_LEFT); player_setFlag(PLAYER_TURN_LEFT);
player_left = 1.;
} }
else if(value == KEY_RELEASE) else if(value == KEY_RELEASE) {
player_rmFlag(PLAYER_TURN_LEFT); player_rmFlag(PLAYER_TURN_LEFT);
player_turn -= value; player_left = 0.;
}
} }
/* Make sure the value is sane. */
if(player_turn < -1.) player_turn = -1.;
} }
/* Turning right. */ /* Turning right. */
else if(KEY("right")) { else if(KEY("right")) {
if(kabs) if(kabs) {
player_turn = value; player_abortAutonav(NULL);
else { player_setFlag(PLAYER_TURN_RIGHT);
player_right = value;
} else {
/* Set flags for facing correction. */ /* Set flags for facing correction. */
if(value == KEY_PRESS) { if(value == KEY_PRESS) {
player_abortAutonav(NULL); player_abortAutonav(NULL);
player_setFlag(PLAYER_TURN_RIGHT); player_setFlag(PLAYER_TURN_RIGHT);
player_right = 1.;
} }
else if(value == KEY_RELEASE) else if(value == KEY_RELEASE) {
player_rmFlag(PLAYER_TURN_RIGHT); player_rmFlag(PLAYER_TURN_RIGHT);
player_turn += value; player_right = 0.;
}
} }
/* Make sure the value is sane. */
if(player_turn > 1.) player_turn = 1.;
} }
/* Turn around to face vel. */ /* Turn around to face vel. */
else if(KEY("reverse")) { else if(KEY("reverse")) {
@ -441,14 +443,11 @@ static void input_key(int keynum, double value, int kabs) {
player_abortAutonav(NULL); player_abortAutonav(NULL);
player_setFlag(PLAYER_REVERSE); player_setFlag(PLAYER_REVERSE);
} }
else if((value == KEY_RELEASE) && player_isFlag(PLAYER_REVERSE)) { else if((value == KEY_RELEASE) && player_isFlag(PLAYER_REVERSE))
player_rmFlag(PLAYER_REVERSE); player_rmFlag(PLAYER_REVERSE);
player_turn = 0; /* Turning corrections. */
if(player_isFlag(PLAYER_TURN_LEFT)) { player_turn -= 1; }
if(player_isFlag(PLAYER_TURN_RIGHT)) { player_turn += 1; }
}
} }
/* Shoot primary weapon. BOOM BOOM. */ /* Combat. */
/* Shooting primary weapon. */
else if(KEY("primary")) { else if(KEY("primary")) {
if(value == KEY_PRESS) { if(value == KEY_PRESS) {
player_abortAutonav(NULL); player_abortAutonav(NULL);
@ -475,14 +474,8 @@ static void input_key(int keynum, double value, int kabs) {
player_abortAutonav(NULL); player_abortAutonav(NULL);
player_setFlag(PLAYER_FACE); player_setFlag(PLAYER_FACE);
} }
else if((value == KEY_RELEASE) && player_isFlag(PLAYER_FACE)) { else if((value == KEY_RELEASE) && player_isFlag(PLAYER_FACE))
player_rmFlag(PLAYER_FACE); player_rmFlag(PLAYER_FACE);
/* Turning corrections. */
player_turn = 0;
if(player_isFlag(PLAYER_TURN_LEFT)) { player_turn -= 1; }
if(player_isFlag(PLAYER_TURN_RIGHT)) { player_turn += 1; }
}
} }
/* Board those ships. */ /* Board those ships. */
else if(KEY("board") && INGAME() && NOHYP()) { else if(KEY("board") && INGAME() && NOHYP()) {
@ -609,11 +602,23 @@ static void input_keyevent(const int event, const SDLKey key, const SDLMod mod);
* @param value Value of the axis. * @param value Value of the axis.
*/ */
static void input_joyaxis(const SDLKey axis, const int value) { static void input_joyaxis(const SDLKey axis, const int value) {
int i; int i, k;
for(i = 0; strcmp(keybindNames[i], "end"); i++) for(i = 0; strcmp(keybindNames[i], "end"); i++) {
if(input_keybinds[i]->type == KEYBIND_JAXIS && if(input_keybinds[i]->key == axis) {
input_keybinds[i]->key == axis) /* Positive axis keybinding. */
input_key(i, -(input_keybinds[i]->reverse) * (double)value / 32767., 1); if((input_keybinds[i]->type == KEYBIND_JAXISPOS)
&& (value >= 0)) {
k = (value > 0) ? KEY_PRESS : KEY_RELEASE;
input_key(i, k, fabs(((double)value)/32767.));
}
/* Negative axis keybinding. */
if((input_keybinds[i]->type == KEYBIND_JAXISNEG)
&& (value <= 0)) {
k = (value < 0) ? KEY_PRESS : KEY_RELEASE;
input_key(i, k, fabs(((double)value)/32767.));
}
}
}
} }
/** /**
@ -626,7 +631,7 @@ static void input_joyevent(const int event, const SDLKey button) {
for(i = 0; strcmp(keybindNames[i], "end");i++) for(i = 0; strcmp(keybindNames[i], "end");i++)
if(input_keybinds[i]->type == KEYBIND_JBUTTON && if(input_keybinds[i]->type == KEYBIND_JBUTTON &&
input_keybinds[i]->key == button) input_keybinds[i]->key == button)
input_key(i, event, 0); input_key(i, event, 0.);
} }
/* Keyboard. */ /* Keyboard. */
@ -650,7 +655,7 @@ static void input_keyevent(const int event, SDLKey key, const SDLMod mod) {
if((input_keybinds[i]->mod == mod_filtered) || if((input_keybinds[i]->mod == mod_filtered) ||
(input_keybinds[i]->mod == KMOD_ALL) || (input_keybinds[i]->mod == KMOD_ALL) ||
(event == KEY_RELEASE)) /**< Release always gets through. */ (event == KEY_RELEASE)) /**< Release always gets through. */
input_key(i, event, 0); input_key(i, event, 0.);
/* No break so all keys get pressed if needed. */ /* No break so all keys get pressed if needed. */
} }
} }

View File

@ -5,17 +5,18 @@
/* Input types. */ /* Input types. */
typedef enum { typedef enum {
KEYBIND_NULL, KEYBIND_NULL, /**< Null keybinding. */
KEYBIND_KEYBOARD, KEYBIND_KEYBOARD, /**< Keyboard keybinding. */
KEYBIND_JAXIS, KEYBIND_JAXISPOS, /**< Joystick axis positive side keybinding. */
KEYBIND_JAXISNEG, /**< Joystick axis negative side keybinding. */
KEYBIND_JBUTTON KEYBIND_JBUTTON
} KeybindType; } KeybindType;
/* Set input. */ /* Set input. */
void input_setDefault(void); void input_setDefault(void);
SDLKey input_keyConv(char* name); SDLKey input_keyConv(char* name);
void input_setKeybind(char* keybind, KeybindType type, int key, SDLMod mod, int reverse); void input_setKeybind(char* keybind, KeybindType type, int key, SDLMod mod);
SDLKey input_getKeybind(const char* keybind, KeybindType* type, SDLMod* mod, int* reverse); SDLKey input_getKeybind(const char* keybind, KeybindType* type, SDLMod* mod);
const char* input_getKeybindDescription(char* keybind); const char* input_getKeybindDescription(char* keybind);
/* Handle the events. */ /* Handle the events. */

View File

@ -44,7 +44,6 @@ void opt_menuKeybinds(void) {
SDLKey key; SDLKey key;
KeybindType type; KeybindType type;
SDLMod mod; SDLMod mod;
int reverse;
/* Create the window. */ /* Create the window. */
wid = window_create("Keybindings", -1, -1, KEYBINDS_WIDTH, KEYBINDS_HEIGHT); wid = window_create("Keybindings", -1, -1, KEYBINDS_WIDTH, KEYBINDS_HEIGHT);
@ -63,7 +62,7 @@ void opt_menuKeybinds(void) {
str = malloc(sizeof(char*) * i); str = malloc(sizeof(char*) * i);
for(j = 0; j < i; j++) { for(j = 0; j < i; j++) {
str[j] = malloc(sizeof(char) * 64); str[j] = malloc(sizeof(char) * 64);
key = input_getKeybind(keybindNames[j], &type, &mod, &reverse); key = input_getKeybind(keybindNames[j], &type, &mod);
switch(type) { switch(type) {
case KEYBIND_KEYBOARD: case KEYBIND_KEYBOARD:
/* SDL_GetKeyName returns lowercase which is ugly. */ /* SDL_GetKeyName returns lowercase which is ugly. */
@ -72,11 +71,13 @@ void opt_menuKeybinds(void) {
else else
snprintf(str[j], 64, "%s <%s>", keybindNames[j], SDL_GetKeyName(key)); snprintf(str[j], 64, "%s <%s>", keybindNames[j], SDL_GetKeyName(key));
break; break;
case KEYBIND_JAXIS: case KEYBIND_JAXISPOS:
snprintf(str[j], 64, "%s <jb%d>", keybindNames[j], key); snprintf(str[j], 64, "%s <ja+%d>", keybindNames[j], key);
break; break;
case KEYBIND_JAXISNEG:
snprintf(str[j], 64, "%s <jb-%d>", keybindNames[j], key);
case KEYBIND_JBUTTON: case KEYBIND_JBUTTON:
snprintf(str[j], 64, "%s <ja%d>", keybindNames[j], key); snprintf(str[j], 64, "%s <jb%d>", keybindNames[j], key);
break; break;
default: default:
snprintf(str[j], 64, "%s", keybindNames[j]); snprintf(str[j], 64, "%s", keybindNames[j]);
@ -124,7 +125,6 @@ static void menuKeybinds_update(unsigned int wid, char* name) {
SDLKey key; SDLKey key;
KeybindType type; KeybindType type;
SDLMod mod; SDLMod mod;
int reverse;
char buf[1024]; char buf[1024];
char bind[32]; char bind[32];
@ -139,7 +139,7 @@ static void menuKeybinds_update(unsigned int wid, char* name) {
/* Get information. */ /* Get information. */
desc = input_getKeybindDescription(keybind); desc = input_getKeybindDescription(keybind);
key = input_getKeybind(keybind, &type, &mod, &reverse); key = input_getKeybind(keybind, &type, &mod);
/* Create the text. */ /* Create the text. */
switch(type) { switch(type) {
@ -159,9 +159,11 @@ static void menuKeybinds_update(unsigned int wid, char* name) {
(mod != KMOD_NONE) ? " + " : "", (mod != KMOD_NONE) ? " + " : "",
SDL_GetKeyName(key)); SDL_GetKeyName(key));
break; break;
case KEYBIND_JAXIS: case KEYBIND_JAXISPOS:
snprintf(bind, 64, "joy axis: <%d>%s", key, (reverse) ? " rev" : ""); snprintf(bind, 64, "joy axis pos: <%d>", key);
break; break;
case KEYBIND_JAXISNEG:
snprintf(bind, 64, "joy axis neg: <%d>", key);
case KEYBIND_JBUTTON: case KEYBIND_JBUTTON:
snprintf(bind, 64, "joy button: <%d>", key); snprintf(bind, 64, "joy button: <%d>", key);
break; break;

View File

@ -89,7 +89,8 @@ double player_crating = 0; /**< Player combar rating. */
unsigned int player_flags = 0; /**< Player flags. */ unsigned int player_flags = 0; /**< Player flags. */
/* Input.c */ /* Input.c */
double player_turn = 0.; /**< Turn velocity from input. */ double player_left = 0.; /**< Player left turn velocity from input.c. */
double player_right = 0.; /**< Player right turn velocity from input.c */
static double player_acc = 0.; /**< Accel velocity from input. */ static double player_acc = 0.; /**< Accel velocity from input. */
/* Internal */ /* Internal */
@ -1804,6 +1805,7 @@ void player_abortAutonav(char* reason) {
void player_think(Pilot* pplayer) { void player_think(Pilot* pplayer) {
Pilot* target; Pilot* target;
double d; double d;
double turn;
/* Last I checked, the dead didn't think.. */ /* Last I checked, the dead didn't think.. */
if(pilot_isFlag(pplayer, PILOT_DEAD)) { if(pilot_isFlag(pplayer, PILOT_DEAD)) {
@ -1864,11 +1866,15 @@ void player_think(Pilot* pplayer) {
pilot_face(pplayer, VANGLE(player->solid->vel) + M_PI); pilot_face(pplayer, VANGLE(player->solid->vel) + M_PI);
} }
/* Normal navigation sheme. */ /* Normal turning sheme. */
else { else {
pplayer->solid->dir_vel = 0.; pplayer->solid->dir_vel = 0.;
if(player_turn) turn = 0;
pplayer->solid->dir_vel -= player->turn * player_turn; if(player_isFlag(PLAYER_TURN_LEFT))
turn -= player_left;
if(player_isFlag(PLAYER_TURN_RIGHT))
turn += player_right;
pplayer->solid->dir_vel -= pplayer->turn * turn;
} }
/* Weapon shooting stuff. */ /* Weapon shooting stuff. */