summaryrefslogtreecommitdiff
path: root/src/saveload
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-10-18 17:47:38 +0000
committerrubidium <rubidium@openttd.org>2009-10-18 17:47:38 +0000
commit4ad30fecdee33708bc95a8e790b4c85814c36317 (patch)
treeadd505802b1e9bf6d90260df0b1f3277c8782e1f /src/saveload
parent8a34641f48d6c74ad0347a21567c7891a96a771d (diff)
downloadopenttd-4ad30fecdee33708bc95a8e790b4c85814c36317.tar.xz
(svn r17806) -Codechange: split CargoPacket's 'afterload' to a separate function
Diffstat (limited to 'src/saveload')
-rw-r--r--src/saveload/afterload.cpp46
-rw-r--r--src/saveload/cargopacket_sl.cpp51
2 files changed, 52 insertions, 45 deletions
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
index c08bba5ab..bcfa76885 100644
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -1226,43 +1226,7 @@ bool AfterLoadGame()
}
}
- 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 @@ 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/saveload/cargopacket_sl.cpp b/src/saveload/cargopacket_sl.cpp
index 86354f9c7..dc0d3cc95 100644
--- 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.