diff --git a/src/mission.c b/src/mission.c index cfcae6f..ede6249 100644 --- a/src/mission.c +++ b/src/mission.c @@ -13,11 +13,16 @@ Mission player_missions[MISSION_MAX]; // Mission stack. -//static Mission* mission_stack = NULL; // Unmuteable after creation. -//static int mission_nstack = 0; +static Mission* mission_stack = NULL; // Unmuteable after creation. +static int mission_nstack = 0; +// Extern. extern int misn_run(Mission* misn, char* func); +// Static. +static void mission_cleanup(Mission* misn); +static void mission_free(MissionData* mission); + // Create a mission. int mission_create(MissionData* misn) { int i; @@ -39,6 +44,36 @@ int mission_create(MissionData* misn) { return 0; } +// Clean up a mission. +static void mission_cleanup(Mission* misn) { + misn->data = NULL; + if(misn->title) free(misn->title); + if(misn->desc) free(misn->desc); + if(misn->reward) free(misn->reward); + lua_close(misn->L); +} + +// Free a mission. +static void mission_free(MissionData* mission) { + if(mission->name) { + free(mission->name); + mission->name = NULL; + } + if(mission->avail.planet) { + free(mission->avail.planet); + mission->avail.planet = NULL; + } + if(mission->avail.system) { + free(mission->avail.system); + mission->avail.system = NULL; + } + if(mission->avail.factions) { + free(mission->avail.factions); + mission->avail.factions = NULL; + mission->avail.nfactions = 0; + } +} + // Load/Free. int missions_load(void) { #if 0 @@ -63,6 +98,20 @@ int missions_load(void) { } void missions_free(void) { + int i; + // Free the mission data. + for(i = 0; i < mission_nstack; i++) + mission_free(&mission_stack[i]); + free(mission_stack); + mission_stack = NULL; + mission_nstack = 0; +} + +void missions_cleanup(void) { + int i; + + for(i = 0; i < MISSION_MAX; i++) + mission_cleanup(&player_missions[i]); } diff --git a/src/mission.h b/src/mission.h index 2d16d0d..c3504eb 100644 --- a/src/mission.h +++ b/src/mission.h @@ -48,4 +48,5 @@ extern Mission player_mission[MISSION_MAX]; // Load/Quit. int missions_load(void); void missions_free(void); +void missions_cleanup(void);