summaryrefslogtreecommitdiff
path: root/src/saveload
diff options
context:
space:
mode:
authorterkhen <terkhen@openttd.org>2011-06-12 20:47:45 +0000
committerterkhen <terkhen@openttd.org>2011-06-12 20:47:45 +0000
commit00e5c1df18449992cc974b99c61a44d1385bf4a7 (patch)
tree7433db92049848236fe05f18b99d6f80c99442c6 /src/saveload
parent9f55abf51aac0f408e60d905fb2ac1b8a1405bb9 (diff)
downloadopenttd-00e5c1df18449992cc974b99c61a44d1385bf4a7.tar.xz
(svn r22567) -Codechange: Store persistent storages inside a pool.
Diffstat (limited to 'src/saveload')
-rw-r--r--src/saveload/afterload.cpp52
-rw-r--r--src/saveload/industry_sl.cpp14
-rw-r--r--src/saveload/saveload.cpp16
-rw-r--r--src/saveload/saveload.h1
-rw-r--r--src/saveload/station_sl.cpp15
-rw-r--r--src/saveload/storage_sl.cpp50
6 files changed, 142 insertions, 6 deletions
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
index 33cff5aa3..7f6a7f700 100644
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -2595,6 +2595,58 @@ bool AfterLoadGame()
}
}
+ if (IsSavegameVersionBefore(161)) {
+ /* Before savegame version 161, persistent storages were not stored in a pool. */
+
+ if (!IsSavegameVersionBefore(76)) {
+ Industry *ind;
+ FOR_ALL_INDUSTRIES(ind) {
+ assert(ind->psa != NULL);
+
+ /* Check if the old storage was empty. */
+ bool is_empty = true;
+ for (uint i = 0; i < sizeof(ind->psa->storage); i++) {
+ if (ind->psa->GetValue(i) != 0) {
+ is_empty = false;
+ break;
+ }
+ }
+
+ if (!is_empty) {
+ ind->psa->grfid = _industry_mngr.GetGRFID(ind->type);
+ } else {
+ delete ind->psa;
+ ind->psa = NULL;
+ }
+ }
+ }
+
+ if (!IsSavegameVersionBefore(145)) {
+ Station *st;
+ FOR_ALL_STATIONS(st) {
+ if (!st->facilities & FACIL_AIRPORT) continue;
+ assert(st->airport.psa != NULL);
+
+ /* Check if the old storage was empty. */
+ bool is_empty = true;
+ for (uint i = 0; i < sizeof(st->airport.psa->storage); i++) {
+ if (st->airport.psa->GetValue(i) != 0) {
+ is_empty = false;
+ break;
+ }
+ }
+
+ if (!is_empty) {
+ st->airport.psa->grfid = _airport_mngr.GetGRFID(st->airport.type);
+ } else {
+ delete st->airport.psa;
+ st->airport.psa = NULL;
+
+ }
+ }
+ }
+ }
+
/* Road stops is 'only' updating some caches */
AfterLoadRoadStops();
AfterLoadLabelMaps();
diff --git a/src/saveload/industry_sl.cpp b/src/saveload/industry_sl.cpp
index 2ba07a1a6..cfd87c728 100644
--- a/src/saveload/industry_sl.cpp
+++ b/src/saveload/industry_sl.cpp
@@ -11,10 +11,13 @@
#include "../stdafx.h"
#include "../industry.h"
+#include "../newgrf.h"
#include "saveload.h"
#include "newgrf_sl.h"
+static OldPersistentStorage _old_ind_persistent_storage;
+
static const SaveLoad _industry_desc[] = {
SLE_CONDVAR(Industry, location.tile, SLE_FILE_U16 | SLE_VAR_U32, 0, 5),
SLE_CONDVAR(Industry, location.tile, SLE_UINT32, 6, SL_MAX_VERSION),
@@ -50,7 +53,8 @@ static const SaveLoad _industry_desc[] = {
SLE_CONDVAR(Industry, last_cargo_accepted_at, SLE_INT32, 70, SL_MAX_VERSION),
SLE_CONDVAR(Industry, selected_layout, SLE_UINT8, 73, SL_MAX_VERSION),
- SLE_CONDARR(Industry, psa.storage, SLE_UINT32, 16, 76, SL_MAX_VERSION),
+ SLEG_CONDARR(_old_ind_persistent_storage.storage, SLE_UINT32, 16, 76, 160),
+ SLE_CONDREF(Industry, psa, REF_STORAGE, 161, SL_MAX_VERSION),
SLE_CONDVAR(Industry, random_triggers, SLE_UINT8, 82, SL_MAX_VERSION),
SLE_CONDVAR(Industry, random, SLE_UINT16, 82, SL_MAX_VERSION),
@@ -90,6 +94,14 @@ static void Load_INDY()
while ((index = SlIterateArray()) != -1) {
Industry *i = new (index) Industry();
SlObject(i, _industry_desc);
+
+ /* Before savegame version 161, persistent storages were not stored in a pool. */
+ if (IsSavegameVersionBefore(161) && !IsSavegameVersionBefore(76)) {
+ /* Store the old persistent storage. The GRFID will be added later. */
+ assert(PersistentStorage::CanAllocateItem());
+ i->psa = new PersistentStorage(0);
+ memcpy(i->psa->storage, _old_ind_persistent_storage.storage, sizeof(i->psa->storage));
+ }
Industry::IncIndustryTypeCount(i->type);
}
}
diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp
index 11d49297e..4dac04384 100644
--- a/src/saveload/saveload.cpp
+++ b/src/saveload/saveload.cpp
@@ -225,8 +225,9 @@
* 158 21933
* 159 21962
* 160 21974
+ * 161 22567
*/
-extern const uint16 SAVEGAME_VERSION = 160; ///< Current savegame version of OpenTTD.
+extern const uint16 SAVEGAME_VERSION = 161; ///< Current savegame version of OpenTTD.
SavegameType _savegame_type; ///< type of savegame we are loading
@@ -404,6 +405,7 @@ extern const ChunkHandler _autoreplace_chunk_handlers[];
extern const ChunkHandler _labelmaps_chunk_handlers[];
extern const ChunkHandler _airport_chunk_handlers[];
extern const ChunkHandler _object_chunk_handlers[];
+extern const ChunkHandler _persistent_storage_chunk_handlers[];
/** Array of all chunks in a savegame, \c NULL terminated. */
static const ChunkHandler * const _chunk_handlers[] = {
@@ -434,6 +436,7 @@ static const ChunkHandler * const _chunk_handlers[] = {
_labelmaps_chunk_handlers,
_airport_chunk_handlers,
_object_chunk_handlers,
+ _persistent_storage_chunk_handlers,
NULL,
};
@@ -1173,9 +1176,10 @@ static size_t ReferenceToInt(const void *obj, SLRefType rt)
case REF_TOWN: return ((const Town*)obj)->index + 1;
case REF_ORDER: return ((const Order*)obj)->index + 1;
case REF_ROADSTOPS: return ((const RoadStop*)obj)->index + 1;
- case REF_ENGINE_RENEWS: return ((const EngineRenew*)obj)->index + 1;
- case REF_CARGO_PACKET: return ((const CargoPacket*)obj)->index + 1;
- case REF_ORDERLIST: return ((const OrderList*)obj)->index + 1;
+ case REF_ENGINE_RENEWS: return ((const EngineRenew*)obj)->index + 1;
+ case REF_CARGO_PACKET: return ((const CargoPacket*)obj)->index + 1;
+ case REF_ORDERLIST: return ((const OrderList*)obj)->index + 1;
+ case REF_STORAGE: return ((const PersistentStorage*)obj)->index + 1;
default: NOT_REACHED();
}
}
@@ -1245,6 +1249,10 @@ static void *IntToReference(size_t index, SLRefType rt)
if (CargoPacket::IsValidID(index)) return CargoPacket::Get(index);
SlErrorCorrupt("Referencing invalid CargoPacket");
+ case REF_STORAGE:
+ if (PersistentStorage::IsValidID(index)) return PersistentStorage::Get(index);
+ SlErrorCorrupt("Referencing invalid PersistentStorage");
+
default: NOT_REACHED();
}
}
diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h
index b5fb0010e..88d9d6cd9 100644
--- a/src/saveload/saveload.h
+++ b/src/saveload/saveload.h
@@ -88,6 +88,7 @@ enum SLRefType {
REF_ENGINE_RENEWS = 6, ///< Load/save a reference to an engine renewal (autoreplace).
REF_CARGO_PACKET = 7, ///< Load/save a reference to a cargo packet.
REF_ORDERLIST = 8, ///< Load/save a reference to an orderlist.
+ REF_STORAGE = 9, ///< Load/save a reference to a persistent storage.
};
/** Highest possible savegame version. */
diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp
index 5cd2196dd..78277d4bd 100644
--- a/src/saveload/station_sl.cpp
+++ b/src/saveload/station_sl.cpp
@@ -15,6 +15,7 @@
#include "../roadstop_base.h"
#include "../vehicle_base.h"
#include "../newgrf_station.h"
+#include "../newgrf.h"
#include "saveload.h"
#include "table/strings.h"
@@ -344,6 +345,8 @@ static const SaveLoad _base_station_desc[] = {
SLE_END()
};
+static OldPersistentStorage _old_st_persistent_storage;
+
static const SaveLoad _station_desc[] = {
SLE_WRITEBYTE(Station, facilities, FACIL_NONE),
SLE_ST_INCLUDE(),
@@ -362,7 +365,8 @@ static const SaveLoad _station_desc[] = {
SLE_CONDVAR(Station, airport.layout, SLE_UINT8, 145, SL_MAX_VERSION),
SLE_VAR(Station, airport.flags, SLE_UINT64),
SLE_CONDVAR(Station, airport.rotation, SLE_UINT8, 145, SL_MAX_VERSION),
- SLE_CONDARR(Station, airport.psa.storage, SLE_UINT32, 16, 145, SL_MAX_VERSION),
+ SLEG_CONDARR(_old_st_persistent_storage.storage, SLE_UINT32, 16, 145, 160),
+ SLE_CONDREF(Station, airport.psa, REF_STORAGE, 161, SL_MAX_VERSION),
SLE_VAR(Station, indtype, SLE_UINT8),
@@ -437,6 +441,15 @@ static void Load_STNN()
if (!waypoint) {
Station *st = Station::From(bst);
+
+ /* Before savegame version 161, persistent storages were not stored in a pool. */
+ if (IsSavegameVersionBefore(161) && !IsSavegameVersionBefore(145) && st->facilities & FACIL_AIRPORT) {
+ /* Store the old persistent storage. The GRFID will be added later. */
+ assert(PersistentStorage::CanAllocateItem());
+ st->airport.psa = new PersistentStorage(0);
+ memcpy(st->airport.psa->storage, _old_st_persistent_storage.storage, sizeof(st->airport.psa->storage));
+ }
+
for (CargoID i = 0; i < NUM_CARGO; i++) {
SlObject(&st->goods[i], GetGoodsDesc());
}
diff --git a/src/saveload/storage_sl.cpp b/src/saveload/storage_sl.cpp
new file mode 100644
index 000000000..4cfab44c5
--- /dev/null
+++ b/src/saveload/storage_sl.cpp
@@ -0,0 +1,50 @@
+/* $Id$ */
+
+/*
+ * This file is part of OpenTTD.
+ * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** @file persistent_storage_sl.cpp Code handling saving and loading of persistent storages. */
+
+#include "../stdafx.h"
+#include "../newgrf_storage.h"
+#include "saveload.h"
+
+/** Description of the data to save and load in #PersistentStorage. */
+static const SaveLoad _storage_desc[] = {
+ SLE_CONDVAR(PersistentStorage, grfid, SLE_UINT32, 6, SL_MAX_VERSION),
+ SLE_CONDARR(PersistentStorage, storage, SLE_UINT32, 16, 161, SL_MAX_VERSION),
+ SLE_END()
+};
+
+/** Load persistent storage data. */
+static void Load_PSAC()
+{
+ int index;
+
+ while ((index = SlIterateArray()) != -1) {
+ assert(PersistentStorage::CanAllocateItem());
+ PersistentStorage *ps = new (index) PersistentStorage(0);
+ SlObject(ps, _storage_desc);
+ }
+}
+
+/** Save persistent storage data. */
+static void Save_PSAC()
+{
+ PersistentStorage *ps;
+
+ /* Write the industries */
+ FOR_ALL_STORAGES(ps) {
+ SlSetArrayIndex(ps->index);
+ SlObject(ps, _storage_desc);
+ }
+}
+
+/** Chunk handler for persistent storages. */
+extern const ChunkHandler _persistent_storage_chunk_handlers[] = {
+ { 'PSAC', Save_PSAC, Load_PSAC, NULL, NULL, CH_ARRAY | CH_LAST},
+};