changeset 13297:c2644b1a9d16 draft

(svn r17806) -Codechange: split CargoPacket's 'afterload' to a separate function
author rubidium <rubidium@openttd.org>
date Sun, 18 Oct 2009 17:47:38 +0000
parents 8d2363c9c7af
children f590f261c90a
files src/cargopacket.h src/saveload/afterload.cpp src/saveload/cargopacket_sl.cpp
diffstat 3 files changed, 53 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/src/cargopacket.h
+++ b/src/cargopacket.h
@@ -117,6 +117,7 @@
 
 	static void InvalidateAllFrom(SourceType src_type, SourceID src);
 	static void InvalidateAllFrom(StationID sid);
+	static void AfterLoad();
 };
 
 /**
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -1226,43 +1226,7 @@
 		}
 	}
 
-	if (CheckSavegameVersion(44)) {
-		Vehicle *v;
-		/* If we remove a station while cargo from it is still enroute, payment calculation will assume
-		 * 0, 0 to be the source of the cargo, resulting in very high payments usually. v->source_xy
-		 * stores the coordinates, preserving them even if the station is removed. However, if a game is loaded
-		 * where this situation exists, the cargo-source information is lost. in this case, we set the source
-		 * to the current tile of the vehicle to prevent excessive profits
-		 */
-		FOR_ALL_VEHICLES(v) {
-			const VehicleCargoList::List *packets = v->cargo.Packets();
-			for (VehicleCargoList::List::const_iterator it = packets->begin(); it != packets->end(); it++) {
-				CargoPacket *cp = *it;
-				cp->source_xy = Station::IsValidID(cp->source) ? Station::Get(cp->source)->xy : v->tile;
-				cp->loaded_at_xy = cp->source_xy;
-			}
-			v->cargo.InvalidateCache();
-		}
-
-		/* Store position of the station where the goods come from, so there
-		 * are no very high payments when stations get removed. However, if the
-		 * station where the goods came from is already removed, the source
-		 * information is lost. In that case we set it to the position of this
-		 * station */
-		Station *st;
-		FOR_ALL_STATIONS(st) {
-			for (CargoID c = 0; c < NUM_CARGO; c++) {
-				GoodsEntry *ge = &st->goods[c];
-
-				const StationCargoList::List *packets = ge->cargo.Packets();
-				for (StationCargoList::List::const_iterator it = packets->begin(); it != packets->end(); it++) {
-					CargoPacket *cp = *it;
-					cp->source_xy = Station::IsValidID(cp->source) ? Station::Get(cp->source)->xy : st->xy;
-					cp->loaded_at_xy = cp->source_xy;
-				}
-			}
-		}
-	}
+	CargoPacket::AfterLoad();
 
 	if (CheckSavegameVersion(45)) {
 		Vehicle *v;
@@ -1277,14 +1241,6 @@
 		}
 	}
 
-	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/saveload/cargopacket_sl.cpp
+++ b/src/saveload/cargopacket_sl.cpp
@@ -11,9 +11,60 @@
 
 #include "../stdafx.h"
 #include "../cargopacket.h"
+#include "../vehicle_base.h"
+#include "../station_base.h"
 
 #include "saveload.h"
 
+/* static */ void CargoPacket::AfterLoad()
+{
+	if (CheckSavegameVersion(44)) {
+		Vehicle *v;
+		/* If we remove a station while cargo from it is still enroute, payment calculation will assume
+			* 0, 0 to be the source of the cargo, resulting in very high payments usually. v->source_xy
+			* stores the coordinates, preserving them even if the station is removed. However, if a game is loaded
+			* where this situation exists, the cargo-source information is lost. in this case, we set the source
+			* to the current tile of the vehicle to prevent excessive profits
+			*/
+		FOR_ALL_VEHICLES(v) {
+			const VehicleCargoList::List *packets = v->cargo.Packets();
+			for (VehicleCargoList::List::const_iterator it = packets->begin(); it != packets->end(); it++) {
+				CargoPacket *cp = *it;
+				cp->source_xy = Station::IsValidID(cp->source) ? Station::Get(cp->source)->xy : v->tile;
+				cp->loaded_at_xy = cp->source_xy;
+			}
+			v->cargo.InvalidateCache();
+		}
+
+		/* Store position of the station where the goods come from, so there
+			* are no very high payments when stations get removed. However, if the
+			* station where the goods came from is already removed, the source
+			* information is lost. In that case we set it to the position of this
+			* station */
+		Station *st;
+		FOR_ALL_STATIONS(st) {
+			for (CargoID c = 0; c < NUM_CARGO; c++) {
+				GoodsEntry *ge = &st->goods[c];
+
+				const StationCargoList::List *packets = ge->cargo.Packets();
+				for (StationCargoList::List::const_iterator it = packets->begin(); it != packets->end(); it++) {
+					CargoPacket *cp = *it;
+					cp->source_xy = Station::IsValidID(cp->source) ? Station::Get(cp->source)->xy : st->xy;
+					cp->loaded_at_xy = cp->source_xy;
+				}
+			}
+		}
+	}
+
+	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;
+		}
+	}
+}
+
 /**
  * Wrapper function to get the CargoPacket's internal structure while
  * some of the variables itself are private.