[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; } |  | ||||||
|   } |   } | ||||||
|   } |   /* Combat. */ | ||||||
|   /* Shoot primary weapon. BOOM BOOM. */ |   /* 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
	 Allanis
						Allanis