/** * @brief Makes the player jettison the currently selected cargo. * @param str Unused. */ static void cargo_jettison( unsigned int wid, char* str ) { (void)str; int pos; if (player->ncommodities==0) return; /* No cargo, redundant check */ pos = toolkit_getListPos( wid, "lstCargo" ); /* Remove the cargo */ commodity_Jettison( player->id, player->commodities[pos].commodity, player->commodities[pos].quantity ); pilot_rmCargo( player, player->commodities[pos].commodity, player->commodities[pos].quantity ); /* We reopen the menu to recreate the list now. */ window_destroy( wid ); info_cargo_menu(0, NULL); }
/** * @brief Removes 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 jettison the cargo? * @return 0 on success (cargo removed). */ int pilot_rmMissionCargo( Pilot* pilot, unsigned int cargo_id, int jettison ) { int i; /* check if pilot has it */ for (i=0; i<pilot->ncommodities; i++) if (pilot->commodities[i].id == cargo_id) break; 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->mass_cargo -= pilot->commodities[i].quantity; pilot->solid->mass -= pilot->stats.cargo_inertia * pilot->commodities[i].quantity; pilot->ncommodities--; if (pilot->ncommodities <= 0) { if (pilot->commodities != NULL) { free( pilot->commodities ); pilot->commodities = NULL; } pilot->ncommodities = 0; } else { memmove( &pilot->commodities[i], &pilot->commodities[i+1], sizeof(PilotCommodity) * (pilot->ncommodities-i) ); pilot->commodities = realloc( pilot->commodities, sizeof(PilotCommodity) * pilot->ncommodities ); } /* Update mass. */ pilot_updateMass( pilot ); gui_setGeneric( pilot ); return 0; }
/** * @brief Makes the player jettison the currently selected cargo. * @param str Unused. */ static void cargo_jettison( unsigned int wid, char* str ) { (void)str; int i, j, f, pos, ret; Mission *misn; if (player.p->ncommodities==0) return; /* No cargo, redundant check */ pos = toolkit_getListPos( wid, "lstCargo" ); /* Special case mission cargo. */ if (player.p->commodities[pos].id != 0) { if (!dialogue_YesNo( "Abort Mission", "Are you sure you want to abort this mission?" )) return; /* Get the mission. */ f = 0; for (i=0; i<MISSION_MAX; i++) { for (j=0; j<player_missions[i].ncargo; j++) { if (player_missions[i].cargo[j] == player.p->commodities[pos].id) { f = 1; break; } } if (f==1) break; } if (!f) { WARN("Cargo '%d' does not belong to any active mission.", player.p->commodities[pos].id); return; } misn = &player_missions[i]; /* 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[i+1], sizeof(Mission) * (MISSION_MAX-i-1) ); memset( &player_missions[MISSION_MAX-1], 0, sizeof(Mission) ); } /* Reset markers. */ mission_sysMark(); /* Reset claims. */ claim_activateAll(); /* Regenerate list. */ mission_menu_genList( info_windows[ INFO_WIN_MISN ] ,0); } else { /* Remove the cargo */ commodity_Jettison( player.p->id, player.p->commodities[pos].commodity, player.p->commodities[pos].quantity ); pilot_cargoRm( player.p, player.p->commodities[pos].commodity, player.p->commodities[pos].quantity ); } /* We reopen the menu to recreate the list now. */ ship_update( info_windows[ INFO_WIN_SHIP ] ); cargo_genList( wid ); }