(svn r16407) -Fix [FS#2913]: set CargoPacket::source to INVALID_STATION when source station is deleted

replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
smatz 15 years ago
parent 4bf70602a1
commit 7854e68b95

@ -1016,9 +1016,7 @@ static void DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, int nu
*/ */
static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID source, StationID dest, TileIndex source_tile, byte days_in_transit, SmallIndustryList *industry_set) static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID source, StationID dest, TileIndex source_tile, byte days_in_transit, SmallIndustryList *industry_set)
{ {
bool subsidised; bool subsidised = false;
Station *s_from, *s_to;
Money profit;
assert(num_pieces > 0); assert(num_pieces > 0);
@ -1029,12 +1027,14 @@ static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID source,
SetBit(c->cargo_types, cargo_type); SetBit(c->cargo_types, cargo_type);
} }
/* Get station pointers. */ const Station *s_to = Station::Get(dest);
s_from = Station::Get(source);
s_to = Station::Get(dest);
/* Check if a subsidy applies. */ if (source != INVALID_STATION) {
subsidised = CheckSubsidised(s_from, s_to, cargo_type); const Station *s_from = Station::Get(source);
/* Check if a subsidy applies. */
subsidised = CheckSubsidised(s_from, s_to, cargo_type);
}
/* Increase town's counter for some special goods types */ /* Increase town's counter for some special goods types */
const CargoSpec *cs = GetCargo(cargo_type); const CargoSpec *cs = GetCargo(cargo_type);
@ -1045,7 +1045,7 @@ static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID source,
DeliverGoodsToIndustry(s_to, cargo_type, num_pieces, industry_set); DeliverGoodsToIndustry(s_to, cargo_type, num_pieces, industry_set);
/* Determine profit */ /* Determine profit */
profit = GetTransportedGoodsIncome(num_pieces, DistanceManhattan(source_tile, s_to->xy), days_in_transit, cargo_type); Money profit = GetTransportedGoodsIncome(num_pieces, DistanceManhattan(source_tile, s_to->xy), days_in_transit, cargo_type);
/* Modify profit if a subsidy is in effect */ /* Modify profit if a subsidy is in effect */
if (subsidised) { if (subsidised) {

@ -1275,6 +1275,14 @@ bool AfterLoadGame()
} }
} }
if (CheckSavegameVersion(120)) {
/* CargoPacket's source should be either INVALID_STATION or a valid station */
CargoPacket *cp;
FOR_ALL_CARGOPACKETS(cp) {
if (!Station::IsValidID(cp->source)) cp->source = INVALID_STATION;
}
}
/* Buoys do now store the owner of the previous water tile, which can never /* Buoys do now store the owner of the previous water tile, which can never
* be OWNER_NONE. So replace OWNER_NONE with OWNER_WATER. */ * be OWNER_NONE. So replace OWNER_NONE with OWNER_WATER. */
if (CheckSavegameVersion(46)) { if (CheckSavegameVersion(46)) {

@ -101,6 +101,12 @@ Station::~Station()
for (CargoID c = 0; c < NUM_CARGO; c++) { for (CargoID c = 0; c < NUM_CARGO; c++) {
goods[c].cargo.Truncate(0); goods[c].cargo.Truncate(0);
} }
CargoPacket *cp;
FOR_ALL_CARGOPACKETS(cp) {
/* Don't allow cargo packets with invalid source station */
if (cp->source == this->index) cp->source = INVALID_STATION;
}
} }

Loading…
Cancel
Save