summaryrefslogtreecommitdiff
path: root/src/saveload
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-10-06 17:23:15 +0000
committerrubidium <rubidium@openttd.org>2009-10-06 17:23:15 +0000
commit5f59d0c5b4e85a3bb51936fa05b2c5493f571eca (patch)
treeca2af53f7c2c4af662725813b62d480a3748954d /src/saveload
parenta4835e3f0b8c0d4f330fc8e91bdd529af60cc7a3 (diff)
downloadopenttd-5f59d0c5b4e85a3bb51936fa05b2c5493f571eca.tar.xz
(svn r17720) -Codechange: guard the CargoPacket variables that are cached in CargoLists so they cannot be written from outside the CargoList class (based on patch by fonsinchen)
Diffstat (limited to 'src/saveload')
-rw-r--r--src/saveload/cargopacket_sl.cpp43
-rw-r--r--src/saveload/oldloader_sl.cpp14
-rw-r--r--src/saveload/station_sl.cpp7
-rw-r--r--src/saveload/vehicle_sl.cpp5
4 files changed, 36 insertions, 33 deletions
diff --git a/src/saveload/cargopacket_sl.cpp b/src/saveload/cargopacket_sl.cpp
index 3f91e807d..86354f9c7 100644
--- a/src/saveload/cargopacket_sl.cpp
+++ b/src/saveload/cargopacket_sl.cpp
@@ -14,21 +14,30 @@
#include "saveload.h"
-static const SaveLoad _cargopacket_desc[] = {
- SLE_VAR(CargoPacket, source, SLE_UINT16),
- SLE_VAR(CargoPacket, source_xy, SLE_UINT32),
- SLE_VAR(CargoPacket, loaded_at_xy, SLE_UINT32),
- SLE_VAR(CargoPacket, count, SLE_UINT16),
- SLE_VAR(CargoPacket, days_in_transit, SLE_UINT8),
- SLE_VAR(CargoPacket, feeder_share, SLE_INT64),
- SLE_CONDVAR(CargoPacket, source_type, SLE_UINT8, 125, SL_MAX_VERSION),
- SLE_CONDVAR(CargoPacket, source_id, SLE_UINT16, 125, SL_MAX_VERSION),
-
- /* Used to be paid_for, but that got changed. */
- SLE_CONDNULL(1, 0, 120),
-
- SLE_END()
-};
+/**
+ * Wrapper function to get the CargoPacket's internal structure while
+ * some of the variables itself are private.
+ * @return the saveload description for CargoPackets.
+ */
+const SaveLoad *GetCargoPacketDesc()
+{
+ static const SaveLoad _cargopacket_desc[] = {
+ SLE_VAR(CargoPacket, source, SLE_UINT16),
+ SLE_VAR(CargoPacket, source_xy, SLE_UINT32),
+ SLE_VAR(CargoPacket, loaded_at_xy, SLE_UINT32),
+ SLE_VAR(CargoPacket, count, SLE_UINT16),
+ SLE_VAR(CargoPacket, days_in_transit, SLE_UINT8),
+ SLE_VAR(CargoPacket, feeder_share, SLE_INT64),
+ SLE_CONDVAR(CargoPacket, source_type, SLE_UINT8, 125, SL_MAX_VERSION),
+ SLE_CONDVAR(CargoPacket, source_id, SLE_UINT16, 125, SL_MAX_VERSION),
+
+ /* Used to be paid_for, but that got changed. */
+ SLE_CONDNULL(1, 0, 120),
+
+ SLE_END()
+ };
+ return _cargopacket_desc;
+}
static void Save_CAPA()
{
@@ -36,7 +45,7 @@ static void Save_CAPA()
FOR_ALL_CARGOPACKETS(cp) {
SlSetArrayIndex(cp->index);
- SlObject(cp, _cargopacket_desc);
+ SlObject(cp, GetCargoPacketDesc());
}
}
@@ -46,7 +55,7 @@ static void Load_CAPA()
while ((index = SlIterateArray()) != -1) {
CargoPacket *cp = new (index) CargoPacket();
- SlObject(cp, _cargopacket_desc);
+ SlObject(cp, GetCargoPacketDesc());
}
}
diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp
index a0c8d06af..900cbd4ab 100644
--- a/src/saveload/oldloader_sl.cpp
+++ b/src/saveload/oldloader_sl.cpp
@@ -698,10 +698,8 @@ static bool LoadOldGood(LoadgameState *ls, int num)
SB(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE, 1, HasBit(_waiting_acceptance, 15));
SB(ge->acceptance_pickup, GoodsEntry::PICKUP, 1, _cargo_source != 0xFF);
if (GB(_waiting_acceptance, 0, 12) != 0) {
- CargoPacket *cp = new CargoPacket();
- cp->source = (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source;
- cp->count = GB(_waiting_acceptance, 0, 12);
- cp->days_in_transit = _cargo_days;
+ CargoPacket *cp = new CargoPacket(GB(_waiting_acceptance, 0, 12), _cargo_days);
+ cp->source = (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source;
ge->cargo.Append(cp);
}
@@ -1332,8 +1330,12 @@ bool LoadOldVehicle(LoadgameState *ls, int num)
v->next = (Vehicle *)(size_t)_old_next_ptr;
if (_cargo_count != 0) {
- CargoPacket *cp = new CargoPacket((_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source, _cargo_count);
- cp->days_in_transit = _cargo_days;
+ CargoPacket *cp = new CargoPacket(_cargo_count, _cargo_days);
+ cp->source = (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source;
+ cp->source_xy = (cp->source != INVALID_STATION) ? Station::Get(cp->source)->xy : 0;
+ cp->loaded_at_xy = cp->source_xy;
+ cp->source_type = ST_INDUSTRY;
+ cp->source_id = INVALID_SOURCE;
v->cargo.Append(cp);
}
}
diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp
index 5ddb9f69f..5e11c04c5 100644
--- a/src/saveload/station_sl.cpp
+++ b/src/saveload/station_sl.cpp
@@ -239,15 +239,10 @@ static void Load_STNS()
SB(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE, 1, HasBit(_waiting_acceptance, 15));
if (GB(_waiting_acceptance, 0, 12) != 0) {
/* Don't construct the packet with station here, because that'll fail with old savegames */
- CargoPacket *cp = new CargoPacket();
+ CargoPacket *cp = new CargoPacket(GB(_waiting_acceptance, 0, 12), _cargo_days, _cargo_feeder_share);
/* In old versions, enroute_from used 0xFF as INVALID_STATION */
cp->source = (CheckSavegameVersion(7) && _cargo_source == 0xFF) ? INVALID_STATION : _cargo_source;
- cp->count = GB(_waiting_acceptance, 0, 12);
- cp->days_in_transit = _cargo_days;
- cp->feeder_share = _cargo_feeder_share;
cp->source_xy = _cargo_source_xy;
- cp->days_in_transit = _cargo_days;
- cp->feeder_share = _cargo_feeder_share;
SB(ge->acceptance_pickup, GoodsEntry::PICKUP, 1, 1);
ge->cargo.Append(cp);
}
diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp
index b6043f62b..fbca9332f 100644
--- a/src/saveload/vehicle_sl.cpp
+++ b/src/saveload/vehicle_sl.cpp
@@ -719,12 +719,9 @@ void Load_VEHS()
if (_cargo_count != 0 && IsCompanyBuildableVehicleType(v)) {
/* Don't construct the packet with station here, because that'll fail with old savegames */
- CargoPacket *cp = new CargoPacket();
+ CargoPacket *cp = new CargoPacket(_cargo_count, _cargo_days, _cargo_feeder_share);
cp->source = _cargo_source;
cp->source_xy = _cargo_source_xy;
- cp->count = _cargo_count;
- cp->days_in_transit = _cargo_days;
- cp->feeder_share = _cargo_feeder_share;
cp->loaded_at_xy = _cargo_loaded_at_xy;
v->cargo.Append(cp);
}