diff options
author | rubidium <rubidium@openttd.org> | 2009-10-06 17:23:15 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2009-10-06 17:23:15 +0000 |
commit | 5f59d0c5b4e85a3bb51936fa05b2c5493f571eca (patch) | |
tree | ca2af53f7c2c4af662725813b62d480a3748954d /src/saveload | |
parent | a4835e3f0b8c0d4f330fc8e91bdd529af60cc7a3 (diff) | |
download | openttd-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.cpp | 43 | ||||
-rw-r--r-- | src/saveload/oldloader_sl.cpp | 14 | ||||
-rw-r--r-- | src/saveload/station_sl.cpp | 7 | ||||
-rw-r--r-- | src/saveload/vehicle_sl.cpp | 5 |
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); } |