diff --git a/README b/README index e0d8bbc..29aa854 100644 --- a/README +++ b/README @@ -43,10 +43,14 @@ Keys: Combat: -- Space : Primary weapons. -- Tab : Target. + -- 'r' : Target closest hostile ship. + -- 'f' : Faces the target. + -- 'b' : Board the target. GUI: -- UP : Zoom in. -- DOWN : Zoom out. + -- F12 : Take a screenshot. -------------------------------- Developers: diff --git a/src/player.c b/src/player.c index 0b0ab63..bc830b4 100644 --- a/src/player.c +++ b/src/player.c @@ -22,12 +22,18 @@ #define pow2(x) ((x)*(x)) -#define GFX_GUI_FRAME "../gfx/gui/frame.png" -#define GFX_GUI_TARG_PILOT "../gfx/gui/pilot.png" -#define GFX_GUI_TARG_PLANET "../gfx/gui/planet.png" +// Flag definitions. +#define PLAYER_TURN_LEFT (1<<0) // Player is turning left. +#define PLAYER_TURN_RIGHT (1<<1) // Player is turning right. +#define PLAYER_FACE (1<<2) // Player is facing target. -#define KEY_PRESS 1. -#define KEY_RELEASE -1. +// Flag functions. +#define player_isFlag(f) (player_flags & f) +#define player_setFlag(f) (player_flags |= f) +#define player_rmFlag(f) (player_flags ^= f) + +#define KEY_PRESS ( 1.) +#define KEY_RELEASE (-1.) // Keybind structure. typedef struct { @@ -39,12 +45,13 @@ typedef struct { static Keybind** player_input; // Contains the players keybindings. // Name of each keybinding. const char* keybindNames[] = { "accel", "left", "right", // Movement. - "primary", "target", "target_nearest", "board", // Combat. + "primary", "target", "target_nearest", "face", "board", // Combat. "mapzoomin", "mapzoomout", "screenshot", "end" }; // Misc. // Player stuff. Pilot* player = NULL; // extern in pilot.h unsigned int credits = 0; +static int player_flags = 0; // Player flags. static double player_turn = 0.; // Turn velocity from input. static double player_acc = 0.; // Accel velocity from input. static int player_primary = 0; // Player is shooting primary weapon. @@ -139,6 +146,7 @@ static int gui_parse(const xmlNodePtr parent, const char* name); static void gui_renderPilot(const Pilot* p); static void gui_renderBar(const glColor* c, const Vec2* p, const Rect* r, const double w); +// Keybinds. static void player_board(void); static void player_screenshot(void); @@ -731,6 +739,13 @@ void gui_free(void) { // Used in pilot.c // Basically uses keyboard input instead of AI input. void player_think(Pilot* player) { + if(player_isFlag(PLAYER_FACE) && (player_target != PLAYER_ID)) { + double diff = angle_diff(player->solid->dir, + vect_angle(&player->solid->pos, &pilot_get(player_target)->solid->pos)); + player_turn = -10.*diff; + if(player_turn > 1.) player_turn = 1.; + else if(player_turn < -1.) player_turn = -1.; + } player->solid->dir_vel = 0.; if(player_turn) player->solid->dir_vel -= player->ship->turn * player_turn; @@ -786,6 +801,7 @@ void input_setDefault(void) { input_setKeybind("primary", KEYBIND_KEYBOARD, SDLK_SPACE, 0); input_setKeybind("target", KEYBIND_KEYBOARD, SDLK_TAB, 0); input_setKeybind("target_nearest", KEYBIND_KEYBOARD, SDLK_r, 0); + input_setKeybind("face", KEYBIND_KEYBOARD, SDLK_f, 0); input_setKeybind("board", KEYBIND_KEYBOARD, SDLK_b, 0); input_setKeybind("mapzoomin", KEYBIND_KEYBOARD, SDLK_UP, 0); input_setKeybind("mapzoomout", KEYBIND_KEYBOARD, SDLK_DOWN, 0); @@ -836,17 +852,32 @@ void input_setKeybind(char* keybind, KeybindType type, int key, int reverse) { // abs : Whether or not it's an abs value (For those pesky joysticks. // ===================================================================== static void input_key(int keynum, double value, int abs) { + // Accelerating. if(strcmp(player_input[keynum]->name, "accel")==0) { if(abs)player_acc = value; else player_acc += value; + player_acc = ABS(player_acc); // Make sure value is sane. } + // Turning left. else if(strcmp(player_input[keynum]->name, "left")==0) { + // Set flags for facing correction. + if(value == KEY_PRESS) player_setFlag(PLAYER_TURN_LEFT); + else if(value == KEY_RELEASE) player_rmFlag(PLAYER_TURN_LEFT); + if(abs)player_turn = -value; else player_turn -= value; + if(player_turn < -1.) player_turn = -1.; // Make sure value is sane. } + // Turning right. else if(strcmp(player_input[keynum]->name, "right")==0) { + // Set flags for facing correction. + if(value == KEY_PRESS) player_setFlag(PLAYER_TURN_RIGHT); + else if(value == KEY_RELEASE) player_rmFlag(PLAYER_TURN_RIGHT); + if(abs) player_turn = value; else player_turn += value; + + if(player_turn < -1.) player_turn = -1.; // Make sure value is sane. } // Shoot primary weapon. BOOM BOOM. else if(strcmp(player_input[keynum]->name, "primary")==0) { @@ -860,6 +891,18 @@ static void input_key(int keynum, double value, int abs) { else if(strcmp(player_input[keynum]->name, "target_nearest")==0) { if(value == KEY_PRESS) player_target = pilot_getHostile(); } + // Face the target. + else if(strcmp(player_input[keynum]->name, "face")==0) { + if(value == KEY_PRESS) player_setFlag(PLAYER_FACE); + else if(value == KEY_RELEASE) { + 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. else if(strcmp(player_input[keynum]->name, "board")==0) { if(value == KEY_PRESS) player_board(); @@ -877,12 +920,6 @@ static void input_key(int keynum, double value, int abs) { else if(strcmp(player_input[keynum]->name, "screenshot")==0) { if(value == KEY_PRESS) player_screenshot(); } - - //Make sure values are sane. - player_acc = ABS(player_acc); - if(player_acc > 1.) player_acc = 1.; - if(player_turn > 1.) player_turn = 1.; - else if(player_turn < -1.) player_turn = -1.; } // --Events--