[Add] 'f' key to face target.

This commit is contained in:
Allanis 2013-02-14 20:52:24 +00:00
parent 2f1618ee81
commit 263256974d
2 changed files with 53 additions and 12 deletions

4
README
View File

@ -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:

View File

@ -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--