diff --git a/dat/missions/cargo.lua b/dat/missions/cargo.lua index e342ce6..9a004f4 100644 --- a/dat/missions/cargo.lua +++ b/dat/missions/cargo.lua @@ -202,3 +202,9 @@ function failed() misn.finish(false) end +function abort() + if misn_type ~= "People" then + player.jetCargo(carg_id) + end +end + diff --git a/dat/missions/es_cargo.lua b/dat/missions/es_cargo.lua index d781243..a0d7d2a 100644 --- a/dat/missions/es_cargo.lua +++ b/dat/missions/es_cargo.lua @@ -141,3 +141,9 @@ function failed() misn_finish(false) end +function abort() + if misn_type ~= "People" then + player.jetCargo(carg_id) + end +end + diff --git a/src/menu.c b/src/menu.c index 94375a2..04347a7 100644 --- a/src/menu.c +++ b/src/menu.c @@ -569,16 +569,28 @@ static void mission_menu_abort(unsigned int wid, char* str) { char* selected_misn; int pos; Mission* misn; + int ret; selected_misn = toolkit_getList(wid, "lstMission"); 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]; - mission_cleanup(misn); - memmove(misn, &player_missions[pos+1], - sizeof(Mission) * (MISSION_MAX-pos-1)); + + /* 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)); + } + + /* Regenerate list. */ mission_menu_genList(wid, 0); } } diff --git a/src/misn_lua.c b/src/misn_lua.c index 07259ff..c12dcd5 100644 --- a/src/misn_lua.c +++ b/src/misn_lua.c @@ -55,6 +55,7 @@ static int misn_delete = 0; /* If 1 delete current mission. */ static int var_add(misn_var* var); static void var_free(misn_var* var); static unsigned int hook_generic(lua_State* L, char* stack); +static int misn_runTopStack(Mission* misn, char* func); /* Extern. */ int misn_run(Mission* misn, char* func); int var_save(xmlTextWriterPtr writer); @@ -245,18 +246,41 @@ int lua_loadDiff(lua_State* L, int readonly) { return 0; } +/** + * @brief Tries to run a mission, but doesn't err if it fails. + * @param misn Mission that owns the function. + * @param func Name of the function to call. + * @return -1 on error, 1 on misn.finish() call, 2 if mission got deleted + * and 0 normally. + */ +int misn_tryRun(Mission* misn, char* func) { + /* Get the function to run. */ + lua_getglobal(misn->L, func); + if(lua_isnil(misn->L, -1)) + return 0; + return misn_runTopStack(misn, func); +} + /* * Run a mission function. - * -1 on error, 1 on misn.finish() call and 0 normally. + * -1 on error, 1 on misn.finish() call, 2 if mission got deleted and 0 normally. */ int misn_run(Mission* misn, char* func) { + /* Run the function. */ + lua_getglobal(misn->L, func); + return misn_runTopStack(misn, func); +} + +/** + * + */ +static int misn_runTopStack(Mission* misn, char* func) { int i, ret; char* err; cur_mission = misn; misn_delete = 0; - lua_getglobal(misn->L, func); if((ret = lua_pcall(misn->L, 0, 0, 0))) { /* Did an oops. */ err = (lua_isstring(misn->L, -1)) ? (char*) lua_tostring(misn->L, -1) : NULL; diff --git a/src/mission.c b/src/mission.c index de8dd83..b00d786 100644 --- a/src/mission.c +++ b/src/mission.c @@ -36,9 +36,6 @@ static int mission_nstack = 0; extern StarSystem* systems_stack; extern int systems_nstack; -/* Extern. */ -extern int misn_run(Mission* misn, char* func); - /* Static. */ static unsigned int mission_genID(void); static int mission_init(Mission* mission, MissionData* misn, int load); diff --git a/src/mission.h b/src/mission.h index d9e31c7..3598ab9 100644 --- a/src/mission.h +++ b/src/mission.h @@ -94,3 +94,6 @@ void mission_cleanup(Mission* misn); void missions_free(void); void missions_cleanup(void); +int misn_tryRun(Mission* misn, char* func); +int misn_run(Mission* misn, char* func); +