[Fix] Proper hook cleanup, tried to impove mission computer a little.
This commit is contained in:
parent
4a504e0228
commit
853a07cf19
@ -16,8 +16,7 @@ function create()
|
||||
misn_reward = carg_mass * 1000 + rnd.int(0, 5000)
|
||||
misn.setReward(string.format("%d Scred", misn_reward))
|
||||
|
||||
-- Set the hooks.
|
||||
hook.land("land")
|
||||
|
||||
end
|
||||
|
||||
function accept()
|
||||
@ -25,6 +24,7 @@ function accept()
|
||||
toolkit.msg("Mission Accepted",
|
||||
string.format("The workers load the %d tons of %s onto your ship.",
|
||||
carg_mass, carg_type))
|
||||
|
||||
end
|
||||
|
||||
function land()
|
||||
@ -33,6 +33,9 @@ function land()
|
||||
player.pay(misn_reward)
|
||||
toolkit.msg("Mission Accomplished",
|
||||
string.format("The workers unload the %s at the docks.", carg_type))
|
||||
|
||||
-- Set the hooks.
|
||||
hook.land("land")
|
||||
end
|
||||
end
|
||||
|
||||
|
40
src/land.c
40
src/land.c
@ -103,6 +103,7 @@ static void news_close(char* str);
|
||||
static void misn(void);
|
||||
static void misn_close(char* str);
|
||||
static void misn_accept(char* str);
|
||||
static void misn_genList(int first);
|
||||
static void misn_update(char* str);
|
||||
|
||||
// The local market.
|
||||
@ -810,8 +811,7 @@ static void misn(void) {
|
||||
window_addList(secondary_wid, 20, -40,
|
||||
300, MISSION_HEIGHT-60,
|
||||
"lstMission", misn_names, mission_ncomputer, 0, misn_update);
|
||||
|
||||
misn_update(NULL);
|
||||
misn_genList(1);
|
||||
}
|
||||
|
||||
static void misn_close(char* str) {
|
||||
@ -820,7 +820,38 @@ static void misn_close(char* str) {
|
||||
}
|
||||
|
||||
static void misn_accept(char* str) {
|
||||
char* misn_name;
|
||||
(void)str;
|
||||
|
||||
misn_name = toolkit_getList(secondary_wid, "lstMission");
|
||||
}
|
||||
|
||||
static void misn_genList(int first) {
|
||||
int i, j;
|
||||
char** misn_names;
|
||||
|
||||
if(!first)
|
||||
window_destroyWidget(secondary_wid, "lstMission");
|
||||
|
||||
// List.
|
||||
if(mission_ncomputer != 0) {
|
||||
// there are missions.
|
||||
misn_names = malloc(sizeof(char*) * mission_ncomputer);
|
||||
j = 0;
|
||||
for(i = 0; i < mission_ncomputer; i++)
|
||||
if(mission_computer[i].title)
|
||||
misn_names[j++] = strdup(mission_computer[i].title);
|
||||
} else {
|
||||
// No missions.
|
||||
misn_names = malloc(sizeof(char*));
|
||||
misn_names[0] = strdup("No Missions");
|
||||
}
|
||||
|
||||
window_addList(secondary_wid, 20, -40,
|
||||
300, MISSION_HEIGHT-60,
|
||||
"lstMission", misn_names, j, 0, misn_update);
|
||||
|
||||
misn_update(NULL);
|
||||
}
|
||||
|
||||
static void misn_update(char* str) {
|
||||
@ -837,7 +868,8 @@ static void misn_update(char* str) {
|
||||
return;
|
||||
}
|
||||
for(i = 0; i < mission_ncomputer; i++)
|
||||
if(strcmp(active_misn, mission_computer[i].title)==0) {
|
||||
if(mission_computer[i].title &&
|
||||
(strcmp(active_misn, mission_computer[i].title)==0)) {
|
||||
window_modifyText(secondary_wid, "txtReward", mission_computer[i].reward);
|
||||
window_modifyText(secondary_wid, "txtDesc", mission_computer[i].desc);
|
||||
return;
|
||||
@ -938,7 +970,7 @@ void takeoff(void) {
|
||||
|
||||
// Cleanup mission computer.
|
||||
for(i = 0; i < mission_ncomputer; i++)
|
||||
mission_free(&mission_computer[i]);
|
||||
mission_cleanup(&mission_computer[i]);
|
||||
free(mission_computer);
|
||||
mission_computer = NULL;
|
||||
mission_ncomputer = 0;
|
||||
|
@ -36,7 +36,6 @@ extern int misn_run(Mission* misn, char* func);
|
||||
|
||||
// Static.
|
||||
static int mission_init(Mission* mission, MissionData* misn);
|
||||
static void mission_cleanup(Mission* misn);
|
||||
static void mission_freeData(MissionData* mission);
|
||||
static int mission_matchFaction(MissionData* misn, int faction);
|
||||
static int mission_location(char* loc);
|
||||
@ -100,63 +99,23 @@ int mission_add(Mission* mission) {
|
||||
}
|
||||
|
||||
// Clean up a mission.
|
||||
static void mission_cleanup(Mission* misn) {
|
||||
void mission_cleanup(Mission* misn) {
|
||||
hook_rmParent(misn->id); // Remove existing hooks.
|
||||
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);
|
||||
memset(misn, 0, sizeof(Mission));
|
||||
}
|
||||
|
||||
// Free a mission.
|
||||
static void mission_freeData(MissionData* mission) {
|
||||
if(mission->name) {
|
||||
free(mission->name);
|
||||
mission->name = NULL;
|
||||
}
|
||||
if(mission->lua) {
|
||||
free(mission->lua);
|
||||
mission->lua = 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;
|
||||
}
|
||||
}
|
||||
|
||||
// Free an active mission.
|
||||
void mission_free(Mission* mission) {
|
||||
if(mission->id == 0) return;
|
||||
|
||||
if(mission->title) {
|
||||
free(mission->title);
|
||||
mission->title = NULL;
|
||||
}
|
||||
|
||||
if(mission->desc) {
|
||||
free(mission->desc);
|
||||
mission->desc = NULL;
|
||||
}
|
||||
|
||||
if(mission->reward) {
|
||||
free(mission->reward);
|
||||
mission->reward = NULL;
|
||||
}
|
||||
|
||||
if(mission->L) {
|
||||
lua_close(mission->L);
|
||||
mission->L = NULL;
|
||||
}
|
||||
if(mission->name) free(mission->name);
|
||||
if(mission->lua) free(mission->lua);
|
||||
if(mission->avail.planet) free(mission->avail.planet);
|
||||
if(mission->avail.system) free(mission->avail.system);
|
||||
if(mission->avail.factions) free(mission->avail.factions);
|
||||
memset(mission, 0, sizeof(MissionData));
|
||||
}
|
||||
|
||||
// Does mission match faction requirement?
|
||||
|
@ -62,7 +62,7 @@ void mission_accept(Mission* misn);
|
||||
|
||||
// Load/Quit.
|
||||
int missions_load(void);
|
||||
void mission_free(Mission* mission);
|
||||
void mission_cleanup(Mission* misn);
|
||||
void missions_free(void);
|
||||
void missions_cleanup(void);
|
||||
|
||||
|
@ -493,6 +493,7 @@ static void widget_cleanup(Widget* widget) {
|
||||
case WIDGET_LIST: // Must clear the list.
|
||||
if(widget->dat.lst.options) {
|
||||
for(i = 0; i < widget->dat.lst.noptions; i++)
|
||||
if(widget->dat.lst.options[i])
|
||||
free(widget->dat.lst.options[i]);
|
||||
free(widget->dat.lst.options);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user