diff --git a/dat/missions/cargo.lua b/dat/missions/cargo.lua index f60536a..c7cf434 100644 --- a/dat/missions/cargo.lua +++ b/dat/missions/cargo.lua @@ -108,6 +108,7 @@ end function accept() if player.freeCargo() < carg_mass then tk.msg(full_title, string.format(full_msg, carg_mass-player.freeCargo())) + misn.finish() elseif misn.accept() then -- Able to accept the mission, hooks BREAK after accepting. carg_id = player.addCargo(carg_type, carg_mass) @@ -120,6 +121,7 @@ function accept() end else tk.msg(toomany_title, toomany_msg) + misn.finish() end end diff --git a/dat/missions/es_cargo.lua b/dat/missions/es_cargo.lua index 088dcab..3154d58 100644 --- a/dat/missions/es_cargo.lua +++ b/dat/missions/es_cargo.lua @@ -72,6 +72,7 @@ end function accept() if player.freeCargo() < carg_mass then tk.msg(full_title, string.format(full_msg, carg_mass-player.freeCargo())) + misn.finish() elseif misn.accept() then -- Able to accept the mission, hooks BREAK after accepting. carg_id = player.addCargo(carg_type, carg_mass) tk.msg(accept_title, string.format( accept_msg, carg_mass, carg_type)) @@ -79,6 +80,7 @@ function accept() hook.time("timeup") else tk.msg(toomany_title, toomany_msg) + misn.finish() end end diff --git a/src/hook.c b/src/hook.c index c9ca63b..603960b 100644 --- a/src/hook.c +++ b/src/hook.c @@ -43,7 +43,7 @@ static int hook_run(Hook* hook) { } misn = &player_missions[i]; - if(misn_run(misn, hook->func)) + if(misn_run(misn, hook->func) < 0) // Error has accured. WARN("Hook [%s] '%d' -> '%s' failed", hook->stack, hook->id, hook->func); diff --git a/src/land.c b/src/land.c index 6cc167e..5c069bc 100644 --- a/src/land.c +++ b/src/land.c @@ -855,11 +855,13 @@ static void misn_accept(char* str) { "Are you sure you want to accept this mission?")) { pos = toolkit_getListPos(secondary_wid, "lstMission"); misn = &mission_computer[pos]; - mission_accept(misn); - memmove(misn, &mission_computer[pos+1], - sizeof(Mission) * (mission_ncomputer-pos-1)); - mission_ncomputer--; - misn_genList(0); + if(mission_accept(misn)) { + // Success is accepting the mission. + memmove(misn, &mission_computer[pos+1], + sizeof(Mission) * (mission_ncomputer-pos-1)); + mission_ncomputer--; + misn_genList(0); + } } } diff --git a/src/misn_lua.c b/src/misn_lua.c index d870e47..07273d1 100644 --- a/src/misn_lua.c +++ b/src/misn_lua.c @@ -188,6 +188,8 @@ int misn_loadLibs(lua_State* L) { } // Run a mission function. +// +// -1 on error, 1 on misn.finish() call and 0 normally. int misn_run(Mission* misn, char* func) { int i, ret; char* err; @@ -199,10 +201,10 @@ int misn_run(Mission* misn, char* 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; - if(strcmp(err, "Mission Finished")) + if(strcmp(err, "Mission Done")) WARN("Mission '%s' -> '%s' : %s", cur_mission->data->name, func, (err) ? err : "Unknown Error"); - else ret = 0; + else ret = 1; } // Mission is finished. @@ -302,14 +304,18 @@ static int misn_finish(lua_State* L) { int b; if(lua_isboolean(L, -1)) b = lua_toboolean(L, -1); - else return 0; // With no argument it won't delete the mission. + else { + lua_pushstring(L, "Mission Done"); + lua_error(L); // THERE IS NO RETURN! + return 0; + } misn_delete = 1; if(b && mis_isFlag(cur_mission->data, MISSION_UNIQUE)) player_missionFinished(mission_getID(cur_mission->data)); - lua_pushstring(L, "Mission Finished"); + lua_pushstring(L, "Mission Done"); lua_error(L); // Should not return.. return 0; diff --git a/src/mission.c b/src/mission.c index ccfd8ac..7b312ed 100644 --- a/src/mission.c +++ b/src/mission.c @@ -100,8 +100,11 @@ static int mission_init(Mission* mission, MissionData* misn) { } // Small wrapper for misn_run. -void mission_accept(Mission* mission) { - misn_run(mission, "accept"); +int mission_accept(Mission* mission) { + int ret; + ret = misn_run(mission, "accept"); + if(ret == 0) return 1; + return 0; } // Check to see if mission is already running. diff --git a/src/mission.h b/src/mission.h index 8892105..f41073e 100644 --- a/src/mission.h +++ b/src/mission.h @@ -64,7 +64,7 @@ extern Mission player_missions[MISSION_MAX]; // For mission computer. Mission* missions_computer(int* n, int faction, char* planet, char* system); // Player accepted mission - mission computer. -void mission_accept(Mission* mission); +int mission_accept(Mission* mission); void missions_bar(int faction, char* planet, char* system); // Misc.