[Add] Implementing auto navigation.

This commit is contained in:
Allanis 2013-12-14 14:58:31 +00:00
parent 5cfecb8f81
commit 980282f655
5 changed files with 62 additions and 9 deletions

View File

@ -30,13 +30,20 @@ static Keybind** input_keybinds; /**< Contains the players keybindings. */
/* Name of each keybinding. */ /* Name of each keybinding. */
const char* keybindNames[] = { const char* keybindNames[] = {
"accel", "left", "right", "reverse", /* Movement. */ /* Movement. */
"target", "target_nearest", "target_hostile", /* Targetting. */ "accel", "left", "right", "reverse",
"primary", "face", "board", /* Fighting. */ /* Targetting. */
"secondary", "secondary_next", /* Secondary weapons. */ "target", "target_nearest", "target_hostile",
"target_planet", "land", "thyperspace","starmap", "jump", /* Navigation. */ /* Fighting. */
"mapzoomin", "mapzoomout", "screenshot", "pause", "menu", "info", /* Misc. */ "primary", "face", "board",
"end" }; /* Must terminate at the end. */ /* Secondary weapons. */
"secondary", "secondary_next",
/* Space Navigation. */
"autonav", "target_planet", "land", "thyperspace","starmap", "jump",
/* Misc. */
"mapzoomin", "mapzoomout", "screenshot", "pause", "menu", "info",
"end" /* Must terminate at the end. */
};
/* Accel hacks. */ /* Accel hacks. */
static unsigned int input_accelLast = 0; /**< Used to see if double tap. */ static unsigned int input_accelLast = 0; /**< Used to see if double tap. */
@ -71,6 +78,7 @@ void input_setDefault(void) {
input_setKeybind("secondary", KEYBIND_KEYBOARD, SDLK_LSHIFT, 0); input_setKeybind("secondary", KEYBIND_KEYBOARD, SDLK_LSHIFT, 0);
input_setKeybind("secondary_next", KEYBIND_KEYBOARD, SDLK_e, 0); input_setKeybind("secondary_next", KEYBIND_KEYBOARD, SDLK_e, 0);
/* Space */ /* Space */
input_setKeybind("autonav", KEYBIND_KEYBOARD, SDLK_n, 0);
input_setKeybind("target_planet", KEYBIND_KEYBOARD, SDLK_p, 0); input_setKeybind("target_planet", KEYBIND_KEYBOARD, SDLK_p, 0);
input_setKeybind("land", KEYBIND_KEYBOARD, SDLK_l, 0); input_setKeybind("land", KEYBIND_KEYBOARD, SDLK_l, 0);
input_setKeybind("thyperspace", KEYBIND_KEYBOARD, SDLK_h, 0); input_setKeybind("thyperspace", KEYBIND_KEYBOARD, SDLK_h, 0);
@ -177,6 +185,7 @@ static void input_key(int keynum, double value, int kabs) {
/* Accelerating. */ /* Accelerating. */
if(KEY("accel")) { if(KEY("accel")) {
player_abortAutonav();
if(kabs)player_accel(value); if(kabs)player_accel(value);
else { else {
/* Prevent it from getting stuck. */ /* Prevent it from getting stuck. */
@ -196,6 +205,7 @@ static void input_key(int keynum, double value, int kabs) {
} }
/* Turning left. */ /* Turning left. */
else if(KEY("left")) { else if(KEY("left")) {
player_abortAutonav();
/* Set flags for facing correction. */ /* Set flags for facing correction. */
if(value == KEY_PRESS) { player_setFlag(PLAYER_TURN_LEFT); } if(value == KEY_PRESS) { player_setFlag(PLAYER_TURN_LEFT); }
else if(value == KEY_RELEASE) { player_rmFlag(PLAYER_TURN_LEFT); } else if(value == KEY_RELEASE) { player_rmFlag(PLAYER_TURN_LEFT); }
@ -206,6 +216,7 @@ static void input_key(int keynum, double value, int kabs) {
} }
/* Turning right. */ /* Turning right. */
else if(KEY("right")) { else if(KEY("right")) {
player_abortAutonav();
/* Set flags for facing correction. */ /* Set flags for facing correction. */
if(value == KEY_PRESS) { player_setFlag(PLAYER_TURN_RIGHT); } if(value == KEY_PRESS) { player_setFlag(PLAYER_TURN_RIGHT); }
else if(value == KEY_RELEASE) { player_rmFlag(PLAYER_TURN_RIGHT); } else if(value == KEY_RELEASE) { player_rmFlag(PLAYER_TURN_RIGHT); }
@ -217,6 +228,7 @@ static void input_key(int keynum, double value, int kabs) {
} }
/* Turn around to face vel. */ /* Turn around to face vel. */
else if(KEY("reverse")) { else if(KEY("reverse")) {
player_abortAutonav();
if(value == KEY_PRESS) { player_setFlag(PLAYER_REVERSE); } if(value == KEY_PRESS) { player_setFlag(PLAYER_REVERSE); }
else if(value == KEY_RELEASE) { else if(value == KEY_RELEASE) {
player_rmFlag(PLAYER_REVERSE); player_rmFlag(PLAYER_REVERSE);
@ -227,6 +239,7 @@ static void input_key(int keynum, double value, int kabs) {
} }
/* Shoot primary weapon. BOOM BOOM. */ /* Shoot primary weapon. BOOM BOOM. */
else if(KEY("primary")) { else if(KEY("primary")) {
player_abortAutonav();
if(value == KEY_PRESS) { player_setFlag(PLAYER_PRIMARY); } if(value == KEY_PRESS) { player_setFlag(PLAYER_PRIMARY); }
else if(value == KEY_RELEASE) { player_rmFlag(PLAYER_PRIMARY); } else if(value == KEY_RELEASE) { player_rmFlag(PLAYER_PRIMARY); }
} }
@ -242,6 +255,7 @@ static void input_key(int keynum, double value, int kabs) {
} }
/* Face the target. */ /* Face the target. */
else if(KEY("face")) { else if(KEY("face")) {
player_abortAutonav();
if(value == KEY_PRESS) { player_setFlag(PLAYER_FACE); } if(value == KEY_PRESS) { player_setFlag(PLAYER_FACE); }
else if(value == KEY_RELEASE) { else if(value == KEY_RELEASE) {
player_rmFlag(PLAYER_FACE); player_rmFlag(PLAYER_FACE);
@ -254,6 +268,7 @@ static void input_key(int keynum, double value, int kabs) {
} }
/* Board those ships. */ /* Board those ships. */
else if(KEY("board") && INGAME() && NOHYP()) { else if(KEY("board") && INGAME() && NOHYP()) {
player_abortAutonav();
if(value == KEY_PRESS) player_board(); if(value == KEY_PRESS) player_board();
} }
/* Shooting secondary weapon. */ /* Shooting secondary weapon. */
@ -266,21 +281,27 @@ static void input_key(int keynum, double value, int kabs) {
if(value == KEY_PRESS) player_secondaryNext(); if(value == KEY_PRESS) player_secondaryNext();
} }
/* Space. */ /* Space. */
else if(KEY("autonav") && INGAME() && NOHYP()) {
if(value == KEY_PRESS) player_startAutonav();
}
/* Target planet (cycles just like target). */ /* Target planet (cycles just like target). */
else if(KEY("target_planet") && INGAME() && NOHYP()) { else if(KEY("target_planet") && INGAME() && NOHYP()) {
if(value == KEY_PRESS) player_targetPlanet(); if(value == KEY_PRESS) player_targetPlanet();
} }
/* Target nearest planet or attempt to land. */ /* Target nearest planet or attempt to land. */
else if(KEY("land") && INGAME() && NOHYP()) { else if(KEY("land") && INGAME() && NOHYP()) {
player_abortAutonav();
if(value == KEY_PRESS) player_land(); if(value == KEY_PRESS) player_land();
} }
else if(KEY("thyperspace") && INGAME() && NOHYP()) { else if(KEY("thyperspace") && INGAME() && NOHYP()) {
player_abortAutonav();
if(value == KEY_PRESS) player_targetHyperspace(); if(value == KEY_PRESS) player_targetHyperspace();
} }
else if(KEY("starmap") && NOHYP()) { else if(KEY("starmap") && NOHYP()) {
if(value == KEY_PRESS) map_open(); if(value == KEY_PRESS) map_open();
} }
else if(KEY("jump") && INGAME()) { else if(KEY("jump") && INGAME()) {
player_abortAutonav();
if(value == KEY_PRESS) player_jump(); if(value == KEY_PRESS) player_jump();
} }
/* Zoom in. */ /* Zoom in. */

View File

@ -25,7 +25,7 @@ static double map_xpos = 0.; /* Map position. */
static double map_ypos = 0.; static double map_ypos = 0.;
static int map_selected = -1; static int map_selected = -1;
static StarSystem** map_path = NULL; /* The path to current selected system. */ static StarSystem** map_path = NULL; /* The path to current selected system. */
static int map_npath = 0; int map_npath = 0;
static int map_drag = 0; /* Is the user dragging the map? */ static int map_drag = 0; /* Is the user dragging the map? */

View File

@ -38,6 +38,7 @@ static int pilot_mstack = 0; /** Memory allocated for pilot_stack. */
extern Pilot* player; extern Pilot* player;
extern unsigned int player_crating; /**< Players combat rating. */ extern unsigned int player_crating; /**< Players combat rating. */
extern void player_abortAutonav(void);
/* Stack of fleets. */ /* Stack of fleets. */
static Fleet* fleet_stack = NULL; /** Fleet stack. */ static Fleet* fleet_stack = NULL; /** Fleet stack. */
@ -371,6 +372,9 @@ void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter,
/* Calculate the damage. */ /* Calculate the damage. */
outfit_calcDamage(&damage_shield, &damage_armour, &knockback, dtype, damage); outfit_calcDamage(&damage_shield, &damage_armour, &knockback, dtype, damage);
if(p->id == PLAYER_ID)
player_abortAutonav();
if(p->shield - damage_shield > 0.) { /* Shields take the whole blow. */ if(p->shield - damage_shield > 0.) { /* Shields take the whole blow. */
p->shield -= damage_shield; p->shield -= damage_shield;
dam_mod = damage_shield/p->shield_max; dam_mod = damage_shield/p->shield_max;

View File

@ -95,6 +95,9 @@ extern int pilot_nstack;
/* Space stuff for GUI. */ /* Space stuff for GUI. */
extern StarSystem* systems_stack; extern StarSystem* systems_stack;
/* Map stuff for autonav. */
extern int map_npath;
/** /**
* @struct Radar * @struct Radar
* *
@ -1466,8 +1469,16 @@ void gui_free(void) {
free(msg_stack); free(msg_stack);
} }
/**
* @fn void player_startAutonav(void)
*
* @brief Start autonav.
*/
void player_startAutonav(void) { void player_startAutonav(void) {
player_message("Autonav continuing."); if(hyperspace_target == -1)
return;
player_message("Autonav initialized");
player_setFlag(PLAYER_AUTONAV); player_setFlag(PLAYER_AUTONAV);
} }
@ -1505,6 +1516,10 @@ void player_think(Pilot* pplayer) {
if(space_canHyperspace(pplayer)) if(space_canHyperspace(pplayer))
player_jump(); player_jump();
else {
pilot_face(pplayer, VANGLE(pplayer->solid->pos));
player_acc = 1.;
}
} }
/* PLAYER_FACE will take over navigation. */ /* PLAYER_FACE will take over navigation. */
@ -1795,6 +1810,17 @@ void player_brokeHyperspace(void) {
/* Update the map. */ /* Update the map. */
map_jump(); map_jump();
/* Disable autonavigation if arrived. */
if(player_isFlag(PLAYER_AUTONAV)) {
if(hyperspace_target == -1) {
player_message("Autonav arrived at destination.");
player_rmFlag(PLAYER_AUTONAV);
} else {
player_message("Autonav continuing until destination (%d jumps left).",
map_npath);
}
}
/* Run the jump hooks. */ /* Run the jump hooks. */
hooks_run("jump"); hooks_run("jump");
hooks_run("enter"); hooks_run("enter");

View File

@ -86,4 +86,6 @@ void player_afterburn(void);
void player_afterburnOver(void); void player_afterburnOver(void);
void player_accel(double acc); void player_accel(double acc);
void player_accelOver(void); void player_accelOver(void);
void player_startAutonav(void);
void player_abortAutonav(void);