[Change] Moving to target on pilot structure.

This commit is contained in:
Allanis 2013-12-29 22:13:28 +00:00
parent 4e1fee762b
commit 8b0fbb8772
6 changed files with 58 additions and 52 deletions

View File

@ -102,14 +102,14 @@ static int ai_accel(lua_State* L); /* Accelerate. */
static void ai_run(lua_State* L, const char* funcname);
static int ai_loadProfile(char* filename);
static void ai_freetask(Task* t);
static void ai_setmemory(void);
static void ai_setMemory(void);
static void ai_create(Pilot* pilot, char* param);
/* External C routines. */
void ai_attacked(Pilot* attacked, const unsigned int attacker); /* weapon.c */
/* C routines made external. */
int ai_pinit(Pilot* p, char* ai);
void ai_destroy(Pilot* p);
void ai_think(Pilot* pilot);
int ai_pinit(Pilot* p, char* ai); /* pilot.c */
void ai_destroy(Pilot* p); /* pilot.c */
void ai_think(Pilot* pilot); /* escort.c */
/* Ai routines for Lua. */
/* Tasks. */
@ -235,7 +235,6 @@ static Pilot* cur_pilot = NULL; /**< Current pilot. All functions use this.
static double pilot_acc = 0.; /**< Current pilots acceleration. */
static double pilot_turn = 0.; /**< Current pilots turning. */
static int pilot_flags = 0; /**< Handle stuff like weapon firing. */
static int pilot_target = 0; /**< Indicate the target to aim at for the pilot. */
/* Ai status: 'Create' functions that can't be used elsewhere. */
#define AI_STATUS_NORMAL 1 /**< Normal AI function behaviour. */
@ -243,11 +242,11 @@ static int pilot_target = 0; /**< Indicate the target to aim at for the p
static int ai_status = AI_STATUS_NORMAL; /**< Current AI run statis. */
/**
* @fn static void ai_setmemory(void)
* @fn static void ai_setMemory(void)
*
* @brief Set the cur_pilots ai.
*/
static void ai_setmemory(void) {
static void ai_setMemory(void) {
lua_State* L;
L = cur_pilot->ai->L;
@ -257,6 +256,16 @@ static void ai_setmemory(void) {
lua_setglobal(L, "mem");
}
/**
* @fn void ai_setPilot(Pilot* p)
*
* @brief Set the pilot for further AI calls.
*/
void ai_setPilot(Pilot* p) {
cur_pilot = p;
ai_setMemory();
}
/**
* @fn static void ai_run(lua_State* L, const char* funcname)
*
@ -266,9 +275,6 @@ static void ai_setmemory(void) {
* @param[in] funcname Function to run.
*/
static void ai_run(lua_State* L, const char* funcname) {
/* Set the pilot's memory. */
ai_setmemory();
lua_getglobal(L, funcname);
if(lua_pcall(L, 0, 0, 0))
/* Errors accured. */
@ -492,14 +498,14 @@ void ai_exit(void) {
void ai_think(Pilot* pilot) {
lua_State* L;
cur_pilot = pilot; /* Set current pilot being processed. */
ai_setPilot(pilot);
L = cur_pilot->ai->L; /* Set the AI profile to the current pilot's. */
/* Clean up some variables. */
pilot_acc = 0.;
pilot_turn = 0.;
pilot_flags = 0;
pilot_target = 0;
cur_pilot->target = cur_pilot->id;
/* Control function if pilot is idle or tick is up. */
if((cur_pilot->tcontrol < SDL_GetTicks()) || (cur_pilot->task == NULL)) {
@ -523,8 +529,8 @@ void ai_think(Pilot* pilot) {
cur_pilot->solid->dir);
/* Fire weapons if needs be. */
if(ai_isFlag(AI_PRIMARY)) pilot_shoot(pilot, pilot_target, 0); /* Primary. */
if(ai_isFlag(AI_SECONDARY)) pilot_shoot(pilot, pilot_target, 1); /* Secondary. */
if(ai_isFlag(AI_PRIMARY)) pilot_shoot(pilot, cur_pilot->target, 0); /* Primary. */
if(ai_isFlag(AI_SECONDARY)) pilot_shoot(pilot, cur_pilot->target, 1); /* Secondary. */
}
/**
@ -538,7 +544,7 @@ void ai_think(Pilot* pilot) {
void ai_attacked(Pilot* attacked, const unsigned int attacker) {
lua_State* L;
cur_pilot = attacked;
ai_setPilot(attacked);
L = cur_pilot->ai->L;
lua_getglobal(L, "attacked");
lua_pushnumber(L, attacker);
@ -559,12 +565,9 @@ void ai_attacked(Pilot* attacked, const unsigned int attacker) {
static void ai_create(Pilot* pilot, char* param) {
lua_State* L;
cur_pilot = pilot;
ai_setPilot(pilot);
L = cur_pilot->ai->L;
/* Set the pilots memory. */
ai_setmemory();
/* Set creation mode. */
ai_status = AI_STATUS_CREATE;
@ -1179,7 +1182,7 @@ static int ai_settarget(lua_State* L) {
LLUA_MIN_ARGS(1);
if(lua_isnumber(L,1)) {
pilot_target = (int)lua_tonumber(L,1);
cur_pilot->target = (int)lua_tonumber(L,1);
return 1;
}

View File

@ -12,8 +12,6 @@
#define BOARDING_WIDTH 300 /** Boarding window width. */
#define BOARDING_HEIGHT 200 /** boarding window height. */
extern unsigned int player_target;
static unsigned int board_wid = 0; /** Boarding window identifier. */
static void board_exit(char* str);
@ -32,12 +30,12 @@ static void board_update(void);
void player_board(void) {
Pilot* p;
if(player_target == PLAYER_ID) {
if(player->target == PLAYER_ID) {
player_message("You need a target to board first!");
return;
}
p = pilot_get(player_target);
p = pilot_get(player->target);
if(!pilot_isDisabled(p)) {
player_message("You cannot board a ship that is not disabled!");
@ -110,7 +108,7 @@ static void board_stealCreds(char* str) {
(void)str;
Pilot* p;
p = pilot_get(player_target);
p = pilot_get(player->target);
if(p->credits == 0) {
/* Can't steal from the poor. ;) */
@ -137,7 +135,7 @@ static void board_stealCargo(char* str) {
int q;
Pilot* p;
p = pilot_get(player_target);
p = pilot_get(player->target);
if(p->ncommodities==0) {
/* No cargo. */
@ -173,7 +171,7 @@ static void board_stealCargo(char* str) {
static int board_fail(void) {
Pilot* p;
p = pilot_get(player_target);
p = pilot_get(player->target);
/* Fail chance. */
if(RNG(0, 100) > (int)(50. *
@ -203,7 +201,7 @@ static void board_update(void) {
char cred[10];
Pilot* p;
p = pilot_get(player_target);
p = pilot_get(player->target);
credits2str(cred, p->credits, 2);

View File

@ -1206,6 +1206,7 @@ void pilot_init(Pilot* pilot, Ship* ship, char* name, int faction,
else
pilot->id = ++pilot_id; /* New unique pilot id based on pilot_id, Can't be 0. */
/* Basic information. */
pilot->ship = ship;
pilot->name = strdup((name == NULL) ? ship->name : name);
@ -1260,6 +1261,7 @@ void pilot_init(Pilot* pilot, Ship* ship, char* name, int faction,
pilot->update = pilot_update;
/* AI. */
pilot->target = pilot->id; /* Self = no target. */
if(ai != NULL)
ai_pinit(pilot, ai); /* Must run before ai_create. */
}

View File

@ -162,7 +162,13 @@ typedef struct Pilot_ {
int hook_type[PILOT_HOOKS]; /**< Type of the hook atached to the pilot. */
int hook[PILOT_HOOKS]; /**< Hook id. */
/* Escort stuff. */
unsigned int parent; /**< Pilots parent. */
unsigned int* escort; /**< Pilots escorts. */
int nescorts; /**< Number of pilot escorts. */
/* AI. */
unsigned int target; /**< AI target. */
AI_Profile* ai; /**< Ai personality profile. */
unsigned int tcontrol; /**< Timer for control tick. */
unsigned int timer[MAX_AI_TIMERS]; /**< Timers for AI. */

View File

@ -74,7 +74,6 @@ unsigned int player_flags = 0; /**< Player flags. */
/* Input.c */
double player_turn = 0.; /**< Turn velocity from input. */
static double player_acc = 0.; /**< Accel velocity from input. */
unsigned int player_target = PLAYER_ID; /**< Targetted pilot. PLAYER_ID is none. */
/* Internal */
int planet_target = -1; /**< Targetted planet. -1 is none. */
@ -675,7 +674,8 @@ void player_warp(const double x, const double y) {
* @brief Clear the targets.
*/
void player_clear(void) {
player_target = PLAYER_ID;
if(player != NULL)
player->target = PLAYER_ID;
planet_target = -1;
hyperspace_target = -1;
}
@ -800,10 +800,10 @@ void player_render(void) {
if((player != NULL) && !player_isFlag(PLAYER_CREATING)) {
/* Render the player target graphics. */
if(player_target != PLAYER_ID) p = pilot_get(player_target);
if(player->target != PLAYER_ID) p = pilot_get(player->target);
else p = NULL;
if((p == NULL) || pilot_isFlag(p, PILOT_DEAD))
player_target = PLAYER_ID; /* No more pilot target. */
player->target = PLAYER_ID; /* No more pilot target. */
else {
/* There is still a pilot target. */
if(pilot_isDisabled(p)) c = &cInert;
@ -900,7 +900,7 @@ void player_renderGUI(void) {
/* Render the pilots. */
for(j = 0, i = 1; i < pilot_nstack; i++) {
/* Skip the player. */
if(pilot_stack[i]->id == player_target) j = i;
if(pilot_stack[i]->id == player->target) j = i;
else gui_renderPilot(pilot_stack[i]);
}
/* Render the targetted pilot. */
@ -1016,8 +1016,8 @@ void player_renderGUI(void) {
}
/* Target. */
if(player_target != PLAYER_ID) {
p = pilot_get(player_target);
if(player->target != PLAYER_ID) {
p = pilot_get(player->target);
/* Blit the pilot target. */
gl_blitStatic(p->ship->gfx_target, gui.target.x, gui.target.y, NULL);
@ -1161,7 +1161,7 @@ static void gui_renderPilot(const Pilot* p) {
glBegin(GL_QUADS);
/* Colours. */
if(p->id == player_target) col = &cRadar_targ;
if(p->id == player->target) col = &cRadar_targ;
else if(pilot_isDisabled(p)) col = &cInert;
else if(pilot_isFlag(p, PILOT_HOSTILE)) col = &cHostile;
else col = faction_getColour(p->faction);
@ -1539,10 +1539,10 @@ void player_think(Pilot* pplayer) {
/* PLAYER_FACE will take over navigation. */
if(player_isFlag(PLAYER_FACE)) {
if(player_target != PLAYER_ID)
if(player->target != PLAYER_ID)
pilot_face(pplayer,
vect_angle(&player->solid->pos,
&pilot_get(player_target)->solid->pos));
&pilot_get(player->target)->solid->pos));
else if(planet_target != -1)
pilot_face(pplayer,
vect_angle(&player->solid->pos,
@ -1564,7 +1564,7 @@ void player_think(Pilot* pplayer) {
/* Primary weapon. */
if(player_isFlag(PLAYER_PRIMARY)) {
pilot_shoot(pplayer, player_target, 0);
pilot_shoot(pplayer, player->target, 0);
player_setFlag(PLAYER_PRIMARY_L);
}
else if(player_isFlag(PLAYER_PRIMARY_L)) {
@ -1580,7 +1580,7 @@ void player_think(Pilot* pplayer) {
outfit_isBeam(pplayer->secondary->outfit)) {
pilot_shootStop(pplayer, 1);
} else
pilot_shoot(pplayer, player_target, 1);
pilot_shoot(pplayer, player->target, 1);
player_setFlag(PLAYER_SECONDARY_L);
}
else if(player_isFlag(PLAYER_SECONDARY_L)) {
@ -1939,10 +1939,10 @@ void player_targetHostile(void) {
}
}
if((tp != PLAYER_ID) && (tp != player_target))
if((tp != PLAYER_ID) && (tp != player->target))
player_playSound(snd_target, 1);
player_target = tp;
player->target = tp;
}
/**
@ -1951,9 +1951,9 @@ void player_targetHostile(void) {
* @brief Cycles to next target.
*/
void player_targetNext(void) {
player_target = pilot_getNextID(player_target);
player->target = pilot_getNextID(player->target);
if(player_target != PLAYER_ID)
if(player->target != PLAYER_ID)
player_playSound(snd_target, 1);
}
@ -1965,10 +1965,10 @@ void player_targetNext(void) {
void player_targetNearest(void) {
unsigned int t;
t = player_target;
player_target = pilot_getNearestPilot(player);
t = player->target;
player->target = pilot_getNearestPilot(player);
if((player_target != PLAYER_ID) && (t != player_target))
if((player->target != PLAYER_ID) && (t != player->target))
player_playSound(snd_target, 1);
}

View File

@ -41,9 +41,6 @@ extern double gui_xoff, gui_yoff;
extern Pilot** pilot_stack;
extern int pilot_nstack;
/* Player stuff. */
extern unsigned int player_target;
/* Ai stuff. */
/**< Triggers the 'attacked' function in the ai. */
extern void ai_attacked(Pilot* attacked, const unsigned int attacker);
@ -598,7 +595,7 @@ static void weapon_update(Weapon* w, const double dt, WeaponLayer layer) {
static void weapon_hit(Weapon* w, Pilot* p, WeaponLayer layer, Vec2* pos) {
/* Someone should let the ai know it's been attacked. */
if(!pilot_isPlayer(p)) {
if((player_target == p->id) || (RNGF() > 0.33)) { /* 33% chance. */
if((player->target == p->id) || (RNGF() > 0.33)) { /* 33% chance. */
if((w->parent == PLAYER_ID) &&
(!pilot_isFlag(p, PILOT_HOSTILE) || (RNGF() < 0.5))) { /* 50% chance. */
faction_modPlayer(p->faction, -1); /* Slowly lower faction. */
@ -637,7 +634,7 @@ static void weapon_hitBeam(Weapon* w, Pilot* p, WeaponLayer layer,
/* Inform the ai it has been attacked, useless if player. */
if(!pilot_isPlayer(p)) {
if((player_target == p->id) || (RNGF() < 0.30*dt)) { /* 30% chance per second. */
if((player->target == p->id) || (RNGF() < 0.30*dt)) { /* 30% chance per second. */
if((w->parent == PLAYER_ID) &&
(!pilot_isFlag(p, PILOT_HOSTILE) || (RNGF() < 0.5))) { /* 50% chance. */
faction_modPlayer(p->faction, -1); /* Slowly lower faction. */