/** * @brief Finishes the mission. * * @luaparam properly If true and the mission is unique it marks the mission * as completed. If false it deletes the mission but * doesn't mark it as completed. If the parameter isn't * passed it just ends the mission (without removing it * from the player's list of active missions). * @luafunc finish( properly ) */ static int misn_finish( lua_State *L ) { int b; Mission *cur_mission; if (lua_isboolean(L,1)) b = lua_toboolean(L,1); else { lua_pushstring(L, NLUA_DONE); lua_error(L); /* THERE IS NO RETURN */ return 0; } lua_pushboolean( L, 1 ); lua_setglobal( L, "__misn_delete" ); cur_mission = misn_getFromLua(L); if (b && mis_isFlag(cur_mission->data,MISSION_UNIQUE)) player_missionFinished( mission_getID( cur_mission->data->name ) ); lua_pushstring(L, NLUA_DONE); lua_error(L); /* shouldn't return */ return 0; }
/** * @brief Checks to see if a mission meets the requirements. * * @param mission ID of the mission to check. * @param faction Faction of the current planet. * @param planet Name of the current planet. * @param sysname Name of the current system. * @return 1 if requirements are met, 0 if they aren't. */ static int mission_meetReq( int mission, int faction, const char* planet, const char* sysname ) { MissionData* misn; int c; misn = mission_get( mission ); if (misn == NULL) /* In case it doesn't exist */ return 0; /* If planet, must match planet. */ if ((misn->avail.planet != NULL) && (strcmp(misn->avail.planet,planet)!=0)) return 0; /* If system, must match system. */ if ((misn->avail.system != NULL) && (strcmp(misn->avail.system,sysname)!=0)) return 0; /* Match faction. */ if ((faction >= 0) && !mission_matchFaction(misn,faction)) return 0; /* Must not be already done or running if unique. */ if (mis_isFlag(misn,MISSION_UNIQUE) && (player_missionAlreadyDone(mission) || mission_alreadyRunning(misn))) return 0; /* Must meet Lua condition. */ if (misn->avail.cond != NULL) { c = cond_check(misn->avail.cond); if (c < 0) { WARN("Conditional for mission '%s' failed to run", misn->name); return 0; } else if (!c) return 0; } /* Must meet previous mission requirements. */ if ((misn->avail.done != NULL) && (player_missionAlreadyDone( mission_getID(misn->avail.done) ) == 0)) return 0; return 1; }
/** * @brief Finishes the mission. * * @luaparam properly If true and the mission is unique it marks the mission * as completed. If false it deletes the mission but * doesn't mark it as completed. If the parameter isn't * passed it just ends the mission. * @luafunc finish( properly ) */ static int misn_finish( lua_State *L ) { int b; if (lua_isboolean(L,1)) b = lua_toboolean(L,1); 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->name ) ); lua_pushstring(L, "Mission Done"); lua_error(L); /* shouldn't return */ return 0; }