changeset 12001:2dd20683fcbb draft

(svn r16407) -Fix [FS#2913]: set CargoPacket::source to INVALID_STATION when source station is deleted
author smatz <smatz@openttd.org>
date Sat, 23 May 2009 19:43:09 +0000
parents 432a32fa1746
children f625db21b8e2
files src/economy.cpp src/saveload/afterload.cpp src/station.cpp
diffstat 3 files changed, 23 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -1016,9 +1016,7 @@
  */
 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 @@
 		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 @@
 	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) {
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -1275,6 +1275,14 @@
 		}
 	}
 
+	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)) {
--- a/src/station.cpp
+++ b/src/station.cpp
@@ -101,6 +101,12 @@
 	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;
+	}
 }