summaryrefslogtreecommitdiff
path: root/src/saveload/cargopacket_sl.cpp
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/cargopacket_sl.cpp
parent8a34641f48d6c74ad0347a21567c7891a96a771d (diff)
downloadopenttd-4ad30fecdee33708bc95a8e790b4c85814c36317.tar.xz
(svn r17806) -Codechange: split CargoPacket's 'afterload' to a separate function
Diffstat (limited to 'src/saveload/cargopacket_sl.cpp')
-rw-r--r--src/saveload/cargopacket_sl.cpp51
1 files changed, 51 insertions, 0 deletions
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.