[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. */
const char* keybindNames[] = {
"accel", "left", "right", "reverse", /* Movement. */
"target", "target_nearest", "target_hostile", /* Targetting. */
"primary", "face", "board", /* Fighting. */
"secondary", "secondary_next", /* Secondary weapons. */
"target_planet", "land", "thyperspace","starmap", "jump", /* Navigation. */
"mapzoomin", "mapzoomout", "screenshot", "pause", "menu", "info", /* Misc. */
"end" }; /* Must terminate at the end. */
/* Movement. */
"accel", "left", "right", "reverse",
/* Targetting. */
"target", "target_nearest", "target_hostile",
/* Fighting. */
"primary", "face", "board",
/* 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. */
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_next", KEYBIND_KEYBOARD, SDLK_e, 0);
/* Space */
input_setKeybind("autonav", KEYBIND_KEYBOARD, SDLK_n, 0);
input_setKeybind("target_planet", KEYBIND_KEYBOARD, SDLK_p, 0);
input_setKeybind("land", KEYBIND_KEYBOARD, SDLK_l, 0);
input_setKeybind("thyperspace", KEYBIND_KEYBOARD, SDLK_h, 0);
@ -177,6 +185,7 @@ static void input_key(int keynum, double value, int kabs) {
/* Accelerating. */
if(KEY("accel")) {
player_abortAutonav();
if(kabs)player_accel(value);
else {
/* Prevent it from getting stuck. */
@ -196,6 +205,7 @@ static void input_key(int keynum, double value, int kabs) {
}
/* Turning left. */
else if(KEY("left")) {
player_abortAutonav();
/* Set flags for facing correction. */
if(value == KEY_PRESS) { player_setFlag(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. */
else if(KEY("right")) {
player_abortAutonav();
/* Set flags for facing correction. */
if(value == KEY_PRESS) { player_setFlag(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. */
else if(KEY("reverse")) {
player_abortAutonav();
if(value == KEY_PRESS) { player_setFlag(PLAYER_REVERSE); }
else if(value == KEY_RELEASE) {
player_rmFlag(PLAYER_REVERSE);
@ -227,6 +239,7 @@ static void input_key(int keynum, double value, int kabs) {
}
/* Shoot primary weapon. BOOM BOOM. */
else if(KEY("primary")) {
player_abortAutonav();
if(value == KEY_PRESS) { player_setFlag(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. */
else if(KEY("face")) {
player_abortAutonav();
if(value == KEY_PRESS) { player_setFlag(PLAYER_FACE); }
else if(value == KEY_RELEASE) {
player_rmFlag(PLAYER_FACE);
@ -254,6 +268,7 @@ static void input_key(int keynum, double value, int kabs) {
}
/* Board those ships. */
else if(KEY("board") && INGAME() && NOHYP()) {
player_abortAutonav();
if(value == KEY_PRESS) player_board();
}
/* Shooting secondary weapon. */
@ -266,21 +281,27 @@ static void input_key(int keynum, double value, int kabs) {
if(value == KEY_PRESS) player_secondaryNext();
}
/* Space. */
else if(KEY("autonav") && INGAME() && NOHYP()) {
if(value == KEY_PRESS) player_startAutonav();
}
/* Target planet (cycles just like target). */
else if(KEY("target_planet") && INGAME() && NOHYP()) {
if(value == KEY_PRESS) player_targetPlanet();
}
/* Target nearest planet or attempt to land. */
else if(KEY("land") && INGAME() && NOHYP()) {
player_abortAutonav();
if(value == KEY_PRESS) player_land();
}
else if(KEY("thyperspace") && INGAME() && NOHYP()) {
player_abortAutonav();
if(value == KEY_PRESS) player_targetHyperspace();
}
else if(KEY("starmap") && NOHYP()) {
if(value == KEY_PRESS) map_open();
}
else if(KEY("jump") && INGAME()) {
player_abortAutonav();
if(value == KEY_PRESS) player_jump();
}
/* Zoom in. */

View File

@ -25,7 +25,7 @@ static double map_xpos = 0.; /* Map position. */
static double map_ypos = 0.;
static int map_selected = -1;
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? */

View File

@ -38,6 +38,7 @@ static int pilot_mstack = 0; /** Memory allocated for pilot_stack. */
extern Pilot* player;
extern unsigned int player_crating; /**< Players combat rating. */
extern void player_abortAutonav(void);
/* Stack of fleets. */
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. */
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. */
p->shield -= damage_shield;
dam_mod = damage_shield/p->shield_max;

View File

@ -95,6 +95,9 @@ extern int pilot_nstack;
/* Space stuff for GUI. */
extern StarSystem* systems_stack;
/* Map stuff for autonav. */
extern int map_npath;
/**
* @struct Radar
*
@ -1466,8 +1469,16 @@ void gui_free(void) {
free(msg_stack);
}
/**
* @fn void player_startAutonav(void)
*
* @brief Start autonav.
*/
void player_startAutonav(void) {
player_message("Autonav continuing.");
if(hyperspace_target == -1)
return;
player_message("Autonav initialized");
player_setFlag(PLAYER_AUTONAV);
}
@ -1505,6 +1516,10 @@ void player_think(Pilot* pplayer) {
if(space_canHyperspace(pplayer))
player_jump();
else {
pilot_face(pplayer, VANGLE(pplayer->solid->pos));
player_acc = 1.;
}
}
/* PLAYER_FACE will take over navigation. */
@ -1795,6 +1810,17 @@ void player_brokeHyperspace(void) {
/* Update the map. */
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. */
hooks_run("jump");
hooks_run("enter");

View File

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