summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2009-05-23 19:43:09 +0000
committersmatz <smatz@openttd.org>2009-05-23 19:43:09 +0000
commit7854e68b95951979445bb485f1d377a358c6d204 (patch)
tree287bcea15d830067e7e4fcd842388e7c0151a1b6
parent4bf70602a116f957ffdbb599d0de6f92a7df0a28 (diff)
downloadopenttd-7854e68b95951979445bb485f1d377a358c6d204.tar.xz
(svn r16407) -Fix [FS#2913]: set CargoPacket::source to INVALID_STATION when source station is deleted
-rw-r--r--src/economy.cpp18
-rw-r--r--src/saveload/afterload.cpp8
-rw-r--r--src/station.cpp6
3 files changed, 23 insertions, 9 deletions
diff --git a/src/economy.cpp b/src/economy.cpp
index 90732b78b..b31c3dc59 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -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)
{
- bool subsidised;
- Station *s_from, *s_to;
- Money profit;
+ bool subsidised = false;
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);
}
- /* Get station pointers. */
- s_from = Station::Get(source);
- s_to = Station::Get(dest);
+ const Station *s_to = Station::Get(dest);
- /* Check if a subsidy applies. */
- subsidised = CheckSubsidised(s_from, s_to, cargo_type);
+ if (source != INVALID_STATION) {
+ 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 */
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);
/* 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 */
if (subsidised) {
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
index bc3aa436a..d55b821e3 100644
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -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
* be OWNER_NONE. So replace OWNER_NONE with OWNER_WATER. */
if (CheckSavegameVersion(46)) {
diff --git a/src/station.cpp b/src/station.cpp
index b8946aeb4..57c9f150f 100644
--- a/src/station.cpp
+++ b/src/station.cpp
@@ -101,6 +101,12 @@ Station::~Station()
for (CargoID c = 0; c < NUM_CARGO; c++) {
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;
+ }
}