[Change] Much better handling of joystick axes.
This commit is contained in:
parent
521514ba7e
commit
a4861de89f
18
src/conf.c
18
src/conf.c
@ -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);
|
||||||
}
|
}
|
||||||
|
163
src/input.c
163
src/input.c
@ -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. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
11
src/input.h
11
src/input.h
@ -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. */
|
||||||
|
@ -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;
|
||||||
|
14
src/player.c
14
src/player.c
@ -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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user