Skip to content

Commit

Permalink
Turn player_missions in an array of pointers
Browse files Browse the repository at this point in the history
  • Loading branch information
Deiz committed Mar 19, 2015
1 parent 47eac6c commit 74b9a08
Show file tree
Hide file tree
Showing 9 changed files with 96 additions and 64 deletions.
4 changes: 2 additions & 2 deletions src/hook.c
Original file line number Diff line number Diff line change
Expand Up @@ -837,8 +837,8 @@ static Mission *hook_getMission( Hook *hook )
{
int i;
for (i=0; i<MISSION_MAX; i++)
if (player_missions[i].id == hook->u.misn.parent)
return &player_missions[i];
if (player_missions[i]->id == hook->u.misn.parent)
return player_missions[i];

return NULL;
}
Expand Down
26 changes: 12 additions & 14 deletions src/info.c
Original file line number Diff line number Diff line change
Expand Up @@ -785,8 +785,8 @@ static void cargo_jettison( unsigned int wid, char* str )
/* Get the mission. */
f = 0;
for (i=0; i<MISSION_MAX; i++) {
for (j=0; j<player_missions[i].ncargo; j++) {
if (player_missions[i].cargo[j] == player.p->commodities[pos].id) {
for (j=0; j<player_missions[i]->ncargo; j++) {
if (player_missions[i]->cargo[j] == player.p->commodities[pos].id) {
f = 1;
break;
}
Expand All @@ -799,17 +799,15 @@ static void cargo_jettison( unsigned int wid, char* str )
player.p->commodities[pos].id);
return;
}
misn = &player_missions[i];
misn = player_missions[i];

/* We run the "abort" function if it's found. */
ret = misn_tryRun( misn, "abort" );

/* Now clean up mission. */
if (ret != 2) {
mission_cleanup( misn );
memmove( misn, &player_missions[i+1],
sizeof(Mission) * (MISSION_MAX-i-1) );
memset( &player_missions[MISSION_MAX-1], 0, sizeof(Mission) );
mission_shift(pos);
}

/* Reset markers. */
Expand Down Expand Up @@ -1005,8 +1003,10 @@ static void mission_menu_genList( unsigned int wid, int first )
misn_names = malloc(sizeof(char*) * MISSION_MAX);
j = 0;
for (i=0; i<MISSION_MAX; i++)
if (player_missions[i].id != 0)
misn_names[j++] = (player_missions[i].title!=NULL) ? strdup(player_missions[i].title) : NULL;
if (player_missions[i]->id != 0)
misn_names[j++] = (player_missions[i]->title != NULL) ?
strdup(player_missions[i]->title) : NULL;

if (j==0) { /* no missions */
misn_names[0] = strdup("No Missions");
j = 1;
Expand Down Expand Up @@ -1035,7 +1035,7 @@ static void mission_menu_update( unsigned int wid, char* str )
}

/* Modify the text. */
misn = &player_missions[ toolkit_getListPos(wid, "lstMission" ) ];
misn = player_missions[ toolkit_getListPos(wid, "lstMission" ) ];
window_modifyText( wid, "txtReward", misn->reward );
window_modifyText( wid, "txtDesc", misn->desc );
window_enableButton( wid, "btnAbortMission" );
Expand All @@ -1052,25 +1052,23 @@ static void mission_menu_abort( unsigned int wid, char* str )
{
(void)str;
int pos;
Mission* misn;
Mission *misn;
int ret;

if (dialogue_YesNo( "Abort Mission",
"Are you sure you want to abort this mission?" )) {

/* Get the mission. */
pos = toolkit_getListPos(wid, "lstMission" );
misn = &player_missions[pos];
misn = player_missions[pos];

/* We run the "abort" function if it's found. */
ret = misn_tryRun( misn, "abort" );

/* Now clean up mission. */
if (ret != 2) {
mission_cleanup( misn );
memmove( misn, &player_missions[pos+1],
sizeof(Mission) * (MISSION_MAX-pos-1) );
memset( &player_missions[MISSION_MAX-1], 0, sizeof(Mission) );
mission_shift(pos);
}

/* Reset markers. */
Expand Down
2 changes: 1 addition & 1 deletion src/land.c
Original file line number Diff line number Diff line change
Expand Up @@ -900,7 +900,7 @@ static void misn_accept( unsigned int wid, char* str )

/* Make sure player can accept the mission. */
for (i=0; i<MISSION_MAX; i++)
if (player_missions[i].data == NULL) break;
if (player_missions[i]->data == NULL) break;
if (i >= MISSION_MAX) {
dialogue_alert("You have too many active missions.");
return;
Expand Down
97 changes: 65 additions & 32 deletions src/mission.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
* current player missions
*/
static unsigned int mission_id = 0; /**< Mission ID generator. */
Mission player_missions[MISSION_MAX]; /**< Player's active missions. */
Mission *player_missions[MISSION_MAX]; /**< Player's active missions. */


/*
Expand Down Expand Up @@ -95,7 +95,7 @@ static unsigned int mission_genID (void)

/* we save mission ids, so check for collisions with player's missions */
for (i=0; i<MISSION_MAX; i++)
if (id == player_missions[i].id) /* mission id was loaded from save */
if (id == player_missions[i]->id) /* mission id was loaded from save */
return mission_genID(); /* recursively try again */
return id;
}
Expand Down Expand Up @@ -240,7 +240,7 @@ int mission_alreadyRunning( MissionData* misn )
{
int i;
for (i=0; i<MISSION_MAX; i++)
if (player_missions[i].data==misn)
if (player_missions[i]->data == misn)
return 1;
return 0;
}
Expand Down Expand Up @@ -416,15 +416,15 @@ void mission_sysMark (void)

for (i=0; i<MISSION_MAX; i++) {
/* Must be a valid player mission. */
if (player_missions[i].id == 0)
if (player_missions[i]->id == 0)
continue;
/* Must have markers. */
if (player_missions[i].markers == NULL)
if (player_missions[i]->markers == NULL)
continue;

n = array_size( player_missions[i].markers );
n = array_size( player_missions[i]->markers );
for (j=0; j<n; j++) {
m = &player_missions[i].markers[j];
m = &player_missions[i]->markers[j];

/* Add the individual markers. */
space_addMarker( m->sys, m->type );
Expand Down Expand Up @@ -561,6 +561,30 @@ void mission_cleanup( Mission* misn )
}


/**
* @brief Puts the specified mission at the end of the player_missions array.
*
* @param pos Mission's position within player_missions
*/
void mission_shift( int pos )
{
Mission *misn;

if (pos >= (MISSION_MAX-1))
return;

/* Store specified mission. */
misn = player_missions[pos];

/* Move other missions down. */
memmove( &player_missions[pos], &player_missions[pos+1],
sizeof(Mission*) * (MISSION_MAX - pos - 1) );

/* Put the specified mission at the end of the array. */
player_missions[MISSION_MAX - 1] = misn;
}


/**
* @brief Frees MissionData.
*
Expand Down Expand Up @@ -622,8 +646,8 @@ void missions_activateClaims (void)
int i;

for (i=0; i<MISSION_MAX; i++)
if (player_missions[i].claims != NULL)
claim_activate( player_missions[i].claims );
if (player_missions[i]->claims != NULL)
claim_activate( player_missions[i]->claims );
}


Expand Down Expand Up @@ -869,9 +893,14 @@ static int mission_parse( MissionData* temp, const xmlNodePtr parent )
*/
int missions_load (void)
{
int m;
int i, m;
uint32_t bufsize;
char *buf = ndata_read( MISSION_DATA_PATH, &bufsize );
char *buf;

for (i=0; i<MISSION_MAX; i++)
player_missions[i] = calloc(1, sizeof(Mission));

buf = ndata_read( MISSION_DATA_PATH, &bufsize );

xmlNodePtr node;
xmlDocPtr doc = xmlParseMemory( buf, bufsize );
Expand Down Expand Up @@ -933,6 +962,10 @@ void missions_free (void)
free( mission_stack );
mission_stack = NULL;
mission_nstack = 0;

/* Free the player mission stack. */
for (i=0; i<MISSION_MAX; i++)
free(player_missions[i]);
}


Expand All @@ -944,7 +977,7 @@ void missions_cleanup (void)
int i;

for (i=0; i<MISSION_MAX; i++)
mission_cleanup( &player_missions[i] );
mission_cleanup( player_missions[i] );
}


Expand All @@ -963,46 +996,46 @@ int missions_saveActive( xmlTextWriterPtr writer )
xmlw_startElem(writer,"missions");

for (i=0; i<MISSION_MAX; i++) {
if (player_missions[i].id != 0) {
if (player_missions[i]->id != 0) {
xmlw_startElem(writer,"mission");

/* data and id are attributes because they must be loaded first */
xmlw_attr(writer,"data","%s",player_missions[i].data->name);
xmlw_attr(writer,"id","%u",player_missions[i].id);
xmlw_attr(writer,"data","%s",player_missions[i]->data->name);
xmlw_attr(writer,"id","%u",player_missions[i]->id);

xmlw_elem(writer,"title","%s",player_missions[i].title);
xmlw_elem(writer,"desc","%s",player_missions[i].desc);
xmlw_elem(writer,"reward","%s",player_missions[i].reward);
xmlw_elem(writer,"title","%s",player_missions[i]->title);
xmlw_elem(writer,"desc","%s",player_missions[i]->desc);
xmlw_elem(writer,"reward","%s",player_missions[i]->reward);

/* Markers. */
xmlw_startElem( writer, "markers" );
if (player_missions[i].markers != NULL) {
n = array_size( player_missions[i].markers );
if (player_missions[i]->markers != NULL) {
n = array_size( player_missions[i]->markers );
for (j=0; j<n; j++) {
xmlw_startElem(writer,"marker");
xmlw_attr(writer,"id","%d",player_missions[i].markers[j].id);
xmlw_attr(writer,"type","%d",player_missions[i].markers[j].type);
xmlw_str(writer,"%s", system_getIndex(player_missions[i].markers[j].sys)->name);
xmlw_attr(writer,"id","%d",player_missions[i]->markers[j].id);
xmlw_attr(writer,"type","%d",player_missions[i]->markers[j].type);
xmlw_str(writer,"%s", system_getIndex(player_missions[i]->markers[j].sys)->name);
xmlw_endElem(writer); /* "marker" */
}
}
xmlw_endElem( writer ); /* "markers" */

/* Cargo */
xmlw_startElem(writer,"cargos");
for (j=0; j<player_missions[i].ncargo; j++)
xmlw_elem(writer,"cargo","%u", player_missions[i].cargo[j]);
for (j=0; j<player_missions[i]->ncargo; j++)
xmlw_elem(writer,"cargo","%u", player_missions[i]->cargo[j]);
xmlw_endElem(writer); /* "cargos" */

/* OSD. */
if (player_missions[i].osd > 0) {
if (player_missions[i]->osd > 0) {
xmlw_startElem(writer,"osd");

/* Save attributes. */
items = osd_getItems(player_missions[i].osd, &nitems);
xmlw_attr(writer,"title","%s",osd_getTitle(player_missions[i].osd));
items = osd_getItems(player_missions[i]->osd, &nitems);
xmlw_attr(writer,"title","%s",osd_getTitle(player_missions[i]->osd));
xmlw_attr(writer,"nitems","%d",nitems);
xmlw_attr(writer,"active","%d",osd_getActive(player_missions[i].osd));
xmlw_attr(writer,"active","%d",osd_getActive(player_missions[i]->osd));

/* Save messages. */
for (j=0; j<nitems; j++)
Expand All @@ -1013,12 +1046,12 @@ int missions_saveActive( xmlTextWriterPtr writer )

/* Claims. */
xmlw_startElem(writer,"claims");
claim_xmlSave( writer, player_missions[i].claims );
claim_xmlSave( writer, player_missions[i]->claims );
xmlw_endElem(writer); /* "claims" */

/* Write Lua magic */
xmlw_startElem(writer,"lua");
nxml_persistLua( player_missions[i].L, writer );
nxml_persistLua( player_missions[i]->L, writer );
xmlw_endElem(writer); /* "lua" */

xmlw_endElem(writer); /* "mission" */
Expand Down Expand Up @@ -1078,7 +1111,7 @@ static int missions_parseActive( xmlNodePtr parent )
node = parent->xmlChildrenNode;
do {
if (xml_isNode(node,"mission")) {
misn = &player_missions[m];
misn = player_missions[m];

/* process the attributes to create the mission */
xmlr_attr(node,"data",buf);
Expand Down
3 changes: 2 additions & 1 deletion src/mission.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ typedef struct Mission_ {
* current player missions
*/
#define MISSION_MAX 12 /**< No sense in allowing the player have infinite missions. */
extern Mission player_missions[MISSION_MAX]; /**< Player's active missions. */
extern Mission *player_missions[MISSION_MAX]; /**< Player's active missions. */


/*
Expand Down Expand Up @@ -165,6 +165,7 @@ int mission_unlinkCargo( Mission* misn, unsigned int cargo_id );
*/
int missions_load (void);
void mission_cleanup( Mission* misn );
void mission_shift( int pos );
void missions_free (void);
void missions_cleanup (void);

Expand Down
2 changes: 1 addition & 1 deletion src/nlua_hook.c
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ static unsigned int hook_generic( lua_State *L, const char* stack, double ms, in
if (running_mission != NULL) {
/* make sure mission is a player mission */
for (i=0; i<MISSION_MAX; i++)
if (player_missions[i].id == running_mission->id)
if (player_missions[i]->id == running_mission->id)
break;
if (i>=MISSION_MAX) {
WARN("Mission not in stack trying to hook, forgot to run misn.accept()?");
Expand Down
18 changes: 9 additions & 9 deletions src/nlua_misn.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,13 +283,13 @@ int misn_runFunc( Mission *misn, const char *func, int nargs )
if (misn_delete) {
ret = 2;
mission_cleanup( cur_mission );
for (i=0; i<MISSION_MAX; i++)
if (cur_mission == &player_missions[i]) {
memmove( &player_missions[i], &player_missions[i+1],
sizeof(Mission) * (MISSION_MAX-i-1) );
memset( &player_missions[MISSION_MAX-1], 0, sizeof(Mission) );
break;
}
for (i=0; i<MISSION_MAX; i++) {
if (cur_mission != player_missions[i])
continue;

mission_shift(i);
break;
}
}

return ret;
Expand Down Expand Up @@ -609,7 +609,7 @@ static int misn_accept( lua_State *L )

/* find last mission */
for (i=0; i<MISSION_MAX; i++)
if (player_missions[i].data == NULL)
if (player_missions[i]->data == NULL)
break;

cur_mission = misn_getFromLua(L);
Expand All @@ -622,7 +622,7 @@ static int misn_accept( lua_State *L )
else { /* copy it over */
memcpy( &player_missions[i], cur_mission, sizeof(Mission) );
memset( cur_mission, 0, sizeof(Mission) );
cur_mission = &player_missions[i];
cur_mission = player_missions[i];
cur_mission->accepted = 1; /* Mark as accepted. */

/* Need to change pointer. */
Expand Down
2 changes: 1 addition & 1 deletion src/npc.c
Original file line number Diff line number Diff line change
Expand Up @@ -559,7 +559,7 @@ static int npc_approach_giver( NPC_t *npc )

/* Make sure player can accept the mission. */
for (i=0; i<MISSION_MAX; i++)
if (player_missions[i].data == NULL)
if (player_missions[i]->data == NULL)
break;
if (i >= MISSION_MAX) {
dialogue_alert("You have too many active missions.");
Expand Down
Loading

0 comments on commit 74b9a08

Please sign in to comment.