diff --git a/dat/missions/cargo.lua b/dat/missions/cargo.lua index 798511f..e342ce6 100644 --- a/dat/missions/cargo.lua +++ b/dat/missions/cargo.lua @@ -186,11 +186,19 @@ end -- Time hook. function timeup() if time.get() > misn_time then - player.msg(msg_msg[4]) - misn.finish(false) - end - misn.setDesc(string.format( misn_desc[11], planet:name(), system:name(), + misn.timerStart("failed", 2000) + else + misn.setDesc(string.format( misn_desc[11], planet:name(), system:name(), carg_mass, carg_type, time.str(misn_time), time.str(misn_time-time.get()))) + end +end + +function failed() + player.msg(msg_msg[4]) + if misn_type ~= "People" then + player.jetCargo(carg_id) + end + misn.finish(false) end diff --git a/src/misn_lua.c b/src/misn_lua.c index b54180e..07259ff 100644 --- a/src/misn_lua.c +++ b/src/misn_lua.c @@ -110,6 +110,7 @@ static int player_shipname(lua_State* L); static int player_freeSpace(lua_State* L); static int player_addCargo(lua_State* L); static int player_rmCargo(lua_State* L); +static int player_jetCargo(lua_State* L); static int player_pay(lua_State* L); static int player_msg(lua_State* L); static int player_modFaction(lua_State* L); @@ -124,6 +125,7 @@ static const luaL_reg player_methods[] = { { "freeCargo", player_freeSpace }, { "addCargo", player_addCargo }, { "rmCargo", player_rmCargo }, + { "jetCargo", player_jetCargo }, { "pay", player_pay }, { "msg", player_msg }, { "modFaction", player_modFaction }, @@ -751,7 +753,35 @@ static int player_rmCargo(lua_State* L) { else LLUA_INVALID_PARAMETER(); /* First try to remove the cargo from player. */ - if(pilot_rmMissionCargo(player, id) != 0) { + if(pilot_rmMissionCargo(player, id, 0) != 0) { + lua_pushboolean(L, 0); + return 1; + } + + /* Now unlink the mission cargo if it was successful. */ + ret = mission_unlinkCargo(cur_mission, id); + + lua_pushboolean(L, !ret); + return 1; +} + +/** + * @brief jetCargo(number cargoid) + * + * Jettison the mission cargo. + * @param cargoid ID of the cargo to jettison. + */ +static int player_jetCargo(lua_State* L) { + int ret; + unsigned int id; + + LLUA_MIN_ARGS(1); + + if(lua_isnumber(L, 1)) id = (unsigned int)lua_tonumber(L, 1); + else LLUA_INVALID_PARAMETER(); + + /* First try to remove the cargo from player. */ + if(pilot_rmMissionCargo(player, id, 0) != 0) { lua_pushboolean(L, 0); return 1; } diff --git a/src/mission.c b/src/mission.c index 431d784..de8dd83 100644 --- a/src/mission.c +++ b/src/mission.c @@ -393,7 +393,7 @@ void mission_cleanup(Mission* misn) { if(misn->cargo != NULL) { for(i = 0; i < misn->ncargo; i++) { /* Must unlink all the cargo. */ if(player != NULL) /* Only remove if player exists. */ - pilot_rmMissionCargo(player, misn->cargo[i]); + pilot_rmMissionCargo(player, misn->cargo[i], 0); mission_unlinkCargo(misn, misn->cargo[i]); } free(misn->cargo); diff --git a/src/pilot.c b/src/pilot.c index 1a0c348..9142011 100644 --- a/src/pilot.c +++ b/src/pilot.c @@ -1243,9 +1243,10 @@ unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity) * @brief Remove special mission cargo based on id. * @param pilot Pilot to remove cargo from. * @param cargo_id ID of the cargo to remove. + * @param jettison Should we jettison the cargo? * @return 0 on success (cargo removed). */ -int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id) { +int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id, int jettison) { int i; /* Check if pilot has it. */ @@ -1256,6 +1257,10 @@ int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id) { if(i >= pilot->ncommodities) return 1; /* Pilot doesn't have it. */ + if(jettison) + commodity_Jettison(pilot->id, pilot->commodities[i].commodity, + pilot->commodities[i].quantity); + /* Remove cargo. */ pilot->cargo_free += pilot->commodities[i].quantity; pilot->solid->mass -= pilot->commodities[i].quantity; diff --git a/src/pilot.h b/src/pilot.h index cd5ec99..e259947 100644 --- a/src/pilot.h +++ b/src/pilot.h @@ -263,7 +263,7 @@ int pilot_rmCargo(Pilot* pilot, Commodity* cargo, int quantity); int pilot_moveCargo(Pilot* dest, Pilot* src); /* Mission cargo - Not to be confused with normal cargo. */ unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity); -int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id); +int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id, int jettison); /* Creation. */