OpenTTD
industry_sl.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * 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.
4  * 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.
5  * 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/>.
6  */
7 
10 #include "../stdafx.h"
11 #include "../industry.h"
12 
13 #include "saveload.h"
14 #include "newgrf_sl.h"
15 
16 #include "../safeguards.h"
17 
18 static OldPersistentStorage _old_ind_persistent_storage;
19 
20 static const SaveLoad _industry_desc[] = {
21  SLE_CONDVAR(Industry, location.tile, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_6),
22  SLE_CONDVAR(Industry, location.tile, SLE_UINT32, SLV_6, SL_MAX_VERSION),
23  SLE_VAR(Industry, location.w, SLE_FILE_U8 | SLE_VAR_U16),
24  SLE_VAR(Industry, location.h, SLE_FILE_U8 | SLE_VAR_U16),
25  SLE_REF(Industry, town, REF_TOWN),
28  SLE_CONDARR(Industry, produced_cargo, SLE_UINT8, 2, SLV_78, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
29  SLE_CONDARR(Industry, produced_cargo, SLE_UINT8, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
30  SLE_CONDARR(Industry, incoming_cargo_waiting, SLE_UINT16, 3, SLV_70, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
31  SLE_CONDARR(Industry, incoming_cargo_waiting, SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
32  SLE_CONDARR(Industry, produced_cargo_waiting, SLE_UINT16, 2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
33  SLE_CONDARR(Industry, produced_cargo_waiting, SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
34  SLE_CONDARR(Industry, production_rate, SLE_UINT8, 2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
35  SLE_CONDARR(Industry, production_rate, SLE_UINT8, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
37  SLE_CONDARR(Industry, accepts_cargo, SLE_UINT8, 3, SLV_78, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
38  SLE_CONDARR(Industry, accepts_cargo, SLE_UINT8, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
39  SLE_VAR(Industry, prod_level, SLE_UINT8),
40  SLE_CONDARR(Industry, this_month_production, SLE_UINT16, 2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
41  SLE_CONDARR(Industry, this_month_production, SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
42  SLE_CONDARR(Industry, this_month_transported, SLE_UINT16, 2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
43  SLE_CONDARR(Industry, this_month_transported, SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
44  SLE_CONDARR(Industry, last_month_pct_transported, SLE_UINT8, 2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
45  SLE_CONDARR(Industry, last_month_pct_transported, SLE_UINT8, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
46  SLE_CONDARR(Industry, last_month_production, SLE_UINT16, 2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
47  SLE_CONDARR(Industry, last_month_production, SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
48  SLE_CONDARR(Industry, last_month_transported, SLE_UINT16, 2, SL_MIN_VERSION, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
49  SLE_CONDARR(Industry, last_month_transported, SLE_UINT16, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
50 
51  SLE_VAR(Industry, counter, SLE_UINT16),
52 
53  SLE_VAR(Industry, type, SLE_UINT8),
54  SLE_VAR(Industry, owner, SLE_UINT8),
55  SLE_VAR(Industry, random_colour, SLE_UINT8),
56  SLE_CONDVAR(Industry, last_prod_year, SLE_FILE_U8 | SLE_VAR_I32, SL_MIN_VERSION, SLV_31),
57  SLE_CONDVAR(Industry, last_prod_year, SLE_INT32, SLV_31, SL_MAX_VERSION),
58  SLE_VAR(Industry, was_cargo_delivered, SLE_UINT8),
59 
60  SLE_CONDVAR(Industry, founder, SLE_UINT8, SLV_70, SL_MAX_VERSION),
61  SLE_CONDVAR(Industry, construction_date, SLE_INT32, SLV_70, SL_MAX_VERSION),
62  SLE_CONDVAR(Industry, construction_type, SLE_UINT8, SLV_70, SL_MAX_VERSION),
63  SLE_CONDVAR(Industry, last_cargo_accepted_at[0], SLE_INT32, SLV_70, SLV_EXTEND_INDUSTRY_CARGO_SLOTS),
64  SLE_CONDARR(Industry, last_cargo_accepted_at, SLE_INT32, 16, SLV_EXTEND_INDUSTRY_CARGO_SLOTS, SL_MAX_VERSION),
65  SLE_CONDVAR(Industry, selected_layout, SLE_UINT8, SLV_73, SL_MAX_VERSION),
66 
67  SLEG_CONDARR(_old_ind_persistent_storage.storage, SLE_UINT32, 16, SLV_76, SLV_161),
69 
70  SLE_CONDNULL(1, SLV_82, SLV_197), // random_triggers
71  SLE_CONDVAR(Industry, random, SLE_UINT16, SLV_82, SL_MAX_VERSION),
72 
73  SLE_CONDNULL(32, SLV_2, SLV_144), // old reserved space
74 
75  SLE_END()
76 };
77 
78 static void Save_INDY()
79 {
80  /* Write the industries */
81  for (Industry *ind : Industry::Iterate()) {
82  SlSetArrayIndex(ind->index);
83  SlObject(ind, _industry_desc);
84  }
85 }
86 
87 static void Save_IIDS()
88 {
89  Save_NewGRFMapping(_industry_mngr);
90 }
91 
92 static void Save_TIDS()
93 {
94  Save_NewGRFMapping(_industile_mngr);
95 }
96 
97 static void Load_INDY()
98 {
99  int index;
100 
102 
103  while ((index = SlIterateArray()) != -1) {
104  Industry *i = new (index) Industry();
105  SlObject(i, _industry_desc);
106 
107  /* Before savegame version 161, persistent storages were not stored in a pool. */
109  /* Store the old persistent storage. The GRFID will be added later. */
111  i->psa = new PersistentStorage(0, 0, 0);
112  memcpy(i->psa->storage, _old_ind_persistent_storage.storage, sizeof(_old_ind_persistent_storage.storage));
113  }
115  }
116 }
117 
118 static void Load_IIDS()
119 {
120  Load_NewGRFMapping(_industry_mngr);
121 }
122 
123 static void Load_TIDS()
124 {
125  Load_NewGRFMapping(_industile_mngr);
126 }
127 
128 static void Ptrs_INDY()
129 {
130  for (Industry *i : Industry::Iterate()) {
131  SlObject(i, _industry_desc);
132  }
133 }
134 
138  SLEG_END()
139 };
140 
142 static void LoadSave_IBLD()
143 {
144  SlGlobList(_industry_builder_desc);
145 }
146 
149  SLE_VAR(IndustryTypeBuildData, probability, SLE_UINT32),
150  SLE_VAR(IndustryTypeBuildData, min_number, SLE_UINT8),
151  SLE_VAR(IndustryTypeBuildData, target_count, SLE_UINT16),
152  SLE_VAR(IndustryTypeBuildData, max_wait, SLE_UINT16),
153  SLE_VAR(IndustryTypeBuildData, wait_count, SLE_UINT16),
154  SLE_END()
155 };
156 
158 static void Save_ITBL()
159 {
160  for (int i = 0; i < NUM_INDUSTRYTYPES; i++) {
161  SlSetArrayIndex(i);
162  SlObject(_industry_builder.builddata + i, _industrytype_builder_desc);
163  }
164 }
165 
167 static void Load_ITBL()
168 {
169  for (IndustryType it = 0; it < NUM_INDUSTRYTYPES; it++) {
171  }
172  int index;
173  while ((index = SlIterateArray()) != -1) {
174  if ((uint)index >= NUM_INDUSTRYTYPES) SlErrorCorrupt("Too many industry builder datas");
175  SlObject(_industry_builder.builddata + index, _industrytype_builder_desc);
176  }
177 }
178 
179 extern const ChunkHandler _industry_chunk_handlers[] = {
180  { 'INDY', Save_INDY, Load_INDY, Ptrs_INDY, nullptr, CH_ARRAY},
181  { 'IIDS', Save_IIDS, Load_IIDS, nullptr, nullptr, CH_ARRAY},
182  { 'TIDS', Save_TIDS, Load_TIDS, nullptr, nullptr, CH_ARRAY},
183  { 'IBLD', LoadSave_IBLD, LoadSave_IBLD, nullptr, nullptr, CH_RIFF},
184  { 'ITBL', Save_ITBL, Load_ITBL, nullptr, nullptr, CH_ARRAY | CH_LAST},
185 };
static void ResetIndustryCounts()
Resets industry counts.
Definition: industry.h:155
#define SLE_CONDNULL(length, from, to)
Empty space in some savegame versions.
Definition: saveload.h:642
static bool IsSavegameVersionBefore(SaveLoadVersion major, byte minor=0)
Checks whether the savegame is below major.
Definition: saveload.h:763
Code handling saving and loading of NewGRF mappings.
70 10541
Definition: saveload.h:126
IndustryBuildData _industry_builder
In-game manager of industries.
76 11139
Definition: saveload.h:133
2.0 0.3.0 2.1 0.3.1, 0.3.2
Definition: saveload.h:33
61 9892
Definition: saveload.h:115
#define SLEG_END()
End marker of global variables save or load.
Definition: saveload.h:755
#define SLE_CONDREF(base, variable, type, from, to)
Storage of a reference in some savegame versions.
Definition: saveload.h:544
void NORETURN SlErrorCorrupt(const char *msg)
Error handler for corrupt savegames.
Definition: saveload.cpp:354
static void Load_ITBL()
Load industry-type build data.
#define SLE_REF(base, variable, type)
Storage of a reference in every version of a savegame.
Definition: saveload.h:602
210 PR#7234 Company stations can serve industries with attached neutral stations. ...
Definition: saveload.h:295
Defines the internal data of a functional industry.
Definition: industry.h:40
82 11410
Definition: saveload.h:140
Load/save a reference to a town.
Definition: saveload.h:374
static void Save_ITBL()
Save industry-type build data.
#define SLEG_VAR(variable, type)
Storage of a global variable in every savegame version.
Definition: saveload.h:716
#define SLEG_CONDARR(variable, type, length, from, to)
Storage of a global array in some savegame versions.
Definition: saveload.h:690
Class for persistent storage of data.
Functions/types related to saving and loading games.
#define SLE_CONDVAR(base, variable, type, from, to)
Storage of a variable in some savegame versions.
Definition: saveload.h:534
PersistentStorage * psa
Persistent storage for NewGRF industries.
Definition: industry.h:74
Highest possible saveload version.
Definition: saveload.h:305
First savegame version.
Definition: saveload.h:30
202 PR#6867 Increase industry cargo slots to 16 in, 16 out
Definition: saveload.h:285
IndustryType type
type of industry.
Definition: industry.h:57
Load/save a reference to a station.
Definition: saveload.h:373
TYPE storage[SIZE]
Memory to for the storage array.
73 10903
Definition: saveload.h:129
Class for pooled persistent storage of data.
static void LoadSave_IBLD()
Load/save industry builder.
Data for managing the number of industries of a single industry type.
Definition: industry.h:171
6.0 1721 6.1 1768
Definition: saveload.h:45
int SlIterateArray()
Iterate through the elements of an array and read the whole thing.
Definition: saveload.cpp:637
Handlers and description of chunk.
Definition: saveload.h:356
static void IncIndustryTypeCount(IndustryType type)
Increment the count of industries for this type.
Definition: industry.h:126
void Reset()
Reset the entry.
static const SaveLoad _industrytype_builder_desc[]
Description of the data to save and load in IndustryTypeBuildData.
void Load_NewGRFMapping(OverrideManagerBase &mapping)
Load a GRF ID + local id -> OpenTTD&#39;s id mapping.
Definition: newgrf_sl.cpp:42
#define SLE_END()
End marker of a struct/class save or load.
Definition: saveload.h:651
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Definition: pool_type.hpp:340
144 20334
Definition: saveload.h:214
#define SLE_CONDARR(base, variable, type, length, from, to)
Storage of an array in some savegame versions.
Definition: saveload.h:555
static const IndustryType NUM_INDUSTRYTYPES
total number of industry types, new and old; limited to 240 because we need some special ids like INV...
Definition: industry_type.h:26
void SlObject(void *object, const SaveLoad *sld)
Main SaveLoad function.
Definition: saveload.cpp:1546
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function() ...
Definition: pool_type.hpp:261
static const SaveLoad _industry_builder_desc[]
Description of the data to save and load in IndustryBuildData.
uint32 wanted_inds
Number of wanted industries (bits 31-16), and a fraction (bits 15-0).
Definition: industry.h:188
void SlGlobList(const SaveLoadGlobVarList *sldg)
Save or Load (a list of) global variables.
Definition: saveload.cpp:1564
SaveLoad type struct.
Definition: saveload.h:496
#define SLE_VAR(base, variable, type)
Storage of a variable in every version of a savegame.
Definition: saveload.h:594
IndustryTypeBuildData builddata[NUM_INDUSTRYTYPES]
Industry build data for every industry type.
Definition: industry.h:187
78 11176
Definition: saveload.h:135
161 22567
Definition: saveload.h:235
void Save_NewGRFMapping(const OverrideManagerBase &mapping)
Save a GRF ID + local id -> OpenTTD&#39;s id mapping.
Definition: newgrf_sl.cpp:30
31 5999
Definition: saveload.h:79
197 27978 v1.8
Definition: saveload.h:279
Last chunk in this array.
Definition: saveload.h:391
Load/save a reference to a persistent storage.
Definition: saveload.h:380