OpenTTD Source 20260711-master-g3fb3006dff
gamelog_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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#include "../stdafx.h"
11
12#include "saveload.h"
14
15#include "../gamelog_internal.h"
16#include "../fios.h"
17#include "../string_func.h"
18
19#include "../safeguards.h"
20
21
22class SlGamelogMode : public DefaultSaveLoadHandler<SlGamelogMode, LoggedChange> {
23public:
24 static inline const SaveLoad description[] = {
25 SLE_VARNAME(LoggedChangeMode, mode, "mode.mode", VarTypes::U8),
26 SLE_VARNAME(LoggedChangeMode, landscape, "mode.landscape", VarTypes::U8),
27 };
28 static inline const SaveLoadCompatTable compat_description = _gamelog_mode_sl_compat;
29
30 void Save(LoggedChange *lc) const override
31 {
32 if (lc->ct != GamelogChangeType::Mode) return;
33 SlObject(lc, this->GetDescription());
34 }
35
36 void Load(LoggedChange *lc) const override
37 {
38 if (lc->ct != GamelogChangeType::Mode) return;
39 SlObject(lc, this->GetLoadDescription());
40 }
41
42 void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
43};
44
45class SlGamelogRevision : public DefaultSaveLoadHandler<SlGamelogRevision, LoggedChange> {
46public:
47 static const size_t GAMELOG_REVISION_LENGTH = 15;
48 static char revision_text[GAMELOG_REVISION_LENGTH];
49
50 static inline const SaveLoad description[] = {
51 SLEG_CONDARR("revision.text", SlGamelogRevision::revision_text, VarTypes::U8, GAMELOG_REVISION_LENGTH, SaveLoadVersion::MinVersion, SaveLoadVersion::StringGamelog),
53 SLE_VARNAME(LoggedChangeRevision, newgrf, "revision.newgrf", VarTypes::U32),
54 SLE_VARNAME(LoggedChangeRevision, slver, "revision.slver", VarTypes::U16),
55 SLE_VARNAME(LoggedChangeRevision, modified, "revision.modified", VarTypes::U8),
56 };
57 static inline const SaveLoadCompatTable compat_description = _gamelog_revision_sl_compat;
58
59 void Save(LoggedChange *lc) const override
60 {
61 if (lc->ct != GamelogChangeType::Revision) return;
62 SlObject(lc, this->GetDescription());
63 }
64
65 void Load(LoggedChange *lc) const override
66 {
67 if (lc->ct != GamelogChangeType::Revision) return;
68 SlObject(lc, this->GetLoadDescription());
69
71 static_cast<LoggedChangeRevision *>(lc)->text = StrMakeValid(std::string_view(std::begin(SlGamelogRevision::revision_text), std::end(SlGamelogRevision::revision_text)));
72 }
73 }
74
75 void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
76};
77
78/* static */ char SlGamelogRevision::revision_text[GAMELOG_REVISION_LENGTH];
79
80class SlGamelogOldver : public DefaultSaveLoadHandler<SlGamelogOldver, LoggedChange> {
81public:
82 static inline const SaveLoad description[] = {
84 SLE_VARNAME(LoggedChangeOldVersion, version, "oldver.version", VarTypes::U32),
85 };
86 static inline const SaveLoadCompatTable compat_description = _gamelog_oldver_sl_compat;
87
88 void Save(LoggedChange *lc) const override
89 {
90 if (lc->ct != GamelogChangeType::OldVer) return;
91 SlObject(lc, this->GetDescription());
92 }
93
94 void Load(LoggedChange *lc) const override
95 {
96 if (lc->ct != GamelogChangeType::OldVer) return;
97 SlObject(lc, this->GetLoadDescription());
98 }
99
100 void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
101};
102
103class SlGamelogSetting : public DefaultSaveLoadHandler<SlGamelogSetting, LoggedChange> {
104public:
105 static inline const SaveLoad description[] = {
107 SLE_VARNAME(LoggedChangeSettingChanged, oldval, "setting.oldval", VarTypes::I32),
108 SLE_VARNAME(LoggedChangeSettingChanged, newval, "setting.newval", VarTypes::I32),
109 };
110 static inline const SaveLoadCompatTable compat_description = _gamelog_setting_sl_compat;
111
112 void Save(LoggedChange *lc) const override
113 {
114 if (lc->ct != GamelogChangeType::Setting) return;
115 SlObject(lc, this->GetDescription());
116 }
117
118 void Load(LoggedChange *lc) const override
119 {
120 if (lc->ct != GamelogChangeType::Setting) return;
121 SlObject(lc, this->GetLoadDescription());
122 }
123
124 void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
125};
126
127class SlGamelogGrfadd : public DefaultSaveLoadHandler<SlGamelogGrfadd, LoggedChange> {
128public:
129 static inline const SaveLoad description[] = {
130 SLE_VARNAME(LoggedChangeGRFAdd, grfid, "grfadd.grfid", VarTypes::U32 ),
131 SLE_ARRNAME(LoggedChangeGRFAdd, md5sum, "grfadd.md5sum", VarTypes::U8, 16),
132 };
133 static inline const SaveLoadCompatTable compat_description = _gamelog_grfadd_sl_compat;
134
135 void Save(LoggedChange *lc) const override
136 {
137 if (lc->ct != GamelogChangeType::GRFAdd) return;
138 SlObject(lc, this->GetDescription());
139 }
140
141 void Load(LoggedChange *lc) const override
142 {
143 if (lc->ct != GamelogChangeType::GRFAdd) return;
144 SlObject(lc, this->GetLoadDescription());
145 }
146
147 void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
148};
149
150class SlGamelogGrfrem : public DefaultSaveLoadHandler<SlGamelogGrfrem, LoggedChange> {
151public:
152 static inline const SaveLoad description[] = {
153 SLE_VARNAME(LoggedChangeGRFRemoved, grfid, "grfrem.grfid", VarTypes::U32),
154 };
155 static inline const SaveLoadCompatTable compat_description = _gamelog_grfrem_sl_compat;
156
157 void Save(LoggedChange *lc) const override
158 {
159 if (lc->ct != GamelogChangeType::GRFRem) return;
160 SlObject(lc, this->GetDescription());
161 }
162
163 void Load(LoggedChange *lc) const override
164 {
165 if (lc->ct != GamelogChangeType::GRFRem) return;
166 SlObject(lc, this->GetLoadDescription());
167 }
168
169 void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
170};
171
172class SlGamelogGrfcompat : public DefaultSaveLoadHandler<SlGamelogGrfcompat, LoggedChange> {
173public:
174 static inline const SaveLoad description[] = {
175 SLE_VARNAME(LoggedChangeGRFChanged, grfid, "grfcompat.grfid", VarTypes::U32 ),
176 SLE_ARRNAME(LoggedChangeGRFChanged, md5sum, "grfcompat.md5sum", VarTypes::U8, 16),
177 };
178 static inline const SaveLoadCompatTable compat_description = _gamelog_grfcompat_sl_compat;
179
180 void Save(LoggedChange *lc) const override
181 {
182 if (lc->ct != GamelogChangeType::GRFCompat) return;
183 SlObject(lc, this->GetDescription());
184 }
185
186 void Load(LoggedChange *lc) const override
187 {
188 if (lc->ct != GamelogChangeType::GRFCompat) return;
189 SlObject(lc, this->GetLoadDescription());
190 }
191
192 void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
193};
194
195class SlGamelogGrfparam : public DefaultSaveLoadHandler<SlGamelogGrfparam, LoggedChange> {
196public:
197 static inline const SaveLoad description[] = {
199 };
200 static inline const SaveLoadCompatTable compat_description = _gamelog_grfparam_sl_compat;
201
202 void Save(LoggedChange *lc) const override
203 {
204 if (lc->ct != GamelogChangeType::GRFParam) return;
205 SlObject(lc, this->GetDescription());
206 }
207
208 void Load(LoggedChange *lc) const override
209 {
210 if (lc->ct != GamelogChangeType::GRFParam) return;
211 SlObject(lc, this->GetLoadDescription());
212 }
213
214 void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
215};
216
217class SlGamelogGrfmove : public DefaultSaveLoadHandler<SlGamelogGrfmove, LoggedChange> {
218public:
219 static inline const SaveLoad description[] = {
220 SLE_VARNAME(LoggedChangeGRFMoved, grfid, "grfmove.grfid", VarTypes::U32),
221 SLE_VARNAME(LoggedChangeGRFMoved, offset, "grfmove.offset", VarTypes::I32),
222 };
223 static inline const SaveLoadCompatTable compat_description = _gamelog_grfmove_sl_compat;
224
225 void Save(LoggedChange *lc) const override
226 {
227 if (lc->ct != GamelogChangeType::GRFMove) return;
228 SlObject(lc, this->GetDescription());
229 }
230
231 void Load(LoggedChange *lc) const override
232 {
233 if (lc->ct != GamelogChangeType::GRFMove) return;
234 SlObject(lc, this->GetLoadDescription());
235 }
236
237 void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
238};
239
240class SlGamelogGrfbug : public DefaultSaveLoadHandler<SlGamelogGrfbug, LoggedChange> {
241public:
242 static inline const SaveLoad description[] = {
243 SLE_VARNAME(LoggedChangeGRFBug, data, "grfbug.data", VarTypes::U64),
244 SLE_VARNAME(LoggedChangeGRFBug, grfid, "grfbug.grfid", VarTypes::U32),
245 SLE_VARNAME(LoggedChangeGRFBug, bug, "grfbug.bug", VarTypes::U8),
246 };
247 static inline const SaveLoadCompatTable compat_description = _gamelog_grfbug_sl_compat;
248
249 void Save(LoggedChange *lc) const override
250 {
251 if (lc->ct != GamelogChangeType::GRFBug) return;
252 SlObject(lc, this->GetDescription());
253 }
254
255 void Load(LoggedChange *lc) const override
256 {
257 if (lc->ct != GamelogChangeType::GRFBug) return;
258 SlObject(lc, this->GetLoadDescription());
259 }
260
261 void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
262};
263
264static bool _is_emergency_save = true;
265
266class SlGamelogEmergency : public DefaultSaveLoadHandler<SlGamelogEmergency, LoggedChange> {
267public:
269 static inline const SaveLoad description[] = {
271 };
272 static inline const SaveLoadCompatTable compat_description = _gamelog_emergency_sl_compat;
273
274 void Save(LoggedChange *lc) const override
275 {
276 if (lc->ct != GamelogChangeType::Emergency) return;
277
278 _is_emergency_save = true;
279 SlObject(lc, this->GetDescription());
280 }
281
282 void Load(LoggedChange *lc) const override
283 {
284 if (lc->ct != GamelogChangeType::Emergency) return;
285
286 SlObject(lc, this->GetLoadDescription());
287 }
288
289 void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
290};
291
292static std::unique_ptr<LoggedChange> MakeLoggedChange(GamelogChangeType type)
293{
294 switch (type) {
295 case GamelogChangeType::Mode: return std::make_unique<LoggedChangeMode>();
296 case GamelogChangeType::Revision: return std::make_unique<LoggedChangeRevision>();
297 case GamelogChangeType::OldVer: return std::make_unique<LoggedChangeOldVersion>();
298 case GamelogChangeType::Setting: return std::make_unique<LoggedChangeSettingChanged>();
299 case GamelogChangeType::GRFAdd: return std::make_unique<LoggedChangeGRFAdd>();
300 case GamelogChangeType::GRFRem: return std::make_unique<LoggedChangeGRFRemoved>();
301 case GamelogChangeType::GRFCompat: return std::make_unique<LoggedChangeGRFChanged>();
302 case GamelogChangeType::GRFParam: return std::make_unique<LoggedChangeGRFParameterChanged>();
303 case GamelogChangeType::GRFMove: return std::make_unique<LoggedChangeGRFMoved>();
304 case GamelogChangeType::GRFBug: return std::make_unique<LoggedChangeGRFBug>();
305 case GamelogChangeType::Emergency: return std::make_unique<LoggedChangeEmergencySave>();
308 default:
309 SlErrorCorrupt("Invalid gamelog action type");
310 }
311}
312
313class SlGamelogAction : public DefaultSaveLoadHandler<SlGamelogAction, LoggedAction> {
314public:
315 static inline const SaveLoad description[] = {
317 SLEG_STRUCT("mode", SlGamelogMode),
318 SLEG_STRUCT("revision", SlGamelogRevision),
319 SLEG_STRUCT("oldver", SlGamelogOldver),
320 SLEG_STRUCT("setting", SlGamelogSetting),
321 SLEG_STRUCT("grfadd", SlGamelogGrfadd),
322 SLEG_STRUCT("grfrem", SlGamelogGrfrem),
323 SLEG_STRUCT("grfcompat", SlGamelogGrfcompat),
324 SLEG_STRUCT("grfparam", SlGamelogGrfparam),
325 SLEG_STRUCT("grfmove", SlGamelogGrfmove),
326 SLEG_STRUCT("grfbug", SlGamelogGrfbug),
327 SLEG_STRUCT("emergency", SlGamelogEmergency),
328 };
329 static inline const SaveLoadCompatTable compat_description = _gamelog_action_sl_compat;
330
331 void Save(LoggedAction *la) const override
332 {
333 SlSetStructListLength(la->change.size());
334
335 for (auto &lc : la->change) {
336 assert(lc->ct < GamelogChangeType::End);
337 SlObject(lc.get(), this->GetDescription());
338 }
339 }
340
341 void LoadChange(LoggedAction *la, GamelogChangeType type) const
342 {
343 std::unique_ptr<LoggedChange> lc = MakeLoggedChange(type);
344 SlObject(lc.get(), this->GetLoadDescription());
345 la->change.push_back(std::move(lc));
346 }
347
348 void Load(LoggedAction *la) const override
349 {
352 while ((type = static_cast<GamelogChangeType>(SlReadByte())) != GamelogChangeType::None) {
353 if (type >= GamelogChangeType::End) SlErrorCorrupt("Invalid gamelog change type");
354 LoadChange(la, (GamelogChangeType)type);
355 }
356 return;
357 }
358
359 size_t length = SlGetStructListLength(UINT32_MAX);
360 la->change.reserve(length);
361
362 for (size_t i = 0; i < length; i++) {
363 LoadChange(la, (GamelogChangeType)SlReadByte());
364 }
365 }
366
367 void LoadCheck(LoggedAction *la) const override { this->Load(la); }
368};
369
370static const SaveLoad _gamelog_desc[] = {
375};
376
377struct GLOGChunkHandler : ChunkHandler {
378 GLOGChunkHandler() : ChunkHandler('GLOG', ChunkType::Table) {}
379
380 void LoadCommon(Gamelog &gamelog) const
381 {
382 assert(gamelog.data->action.empty());
383
384 const std::vector<SaveLoad> slt = SlCompatTableHeader(_gamelog_desc, _gamelog_sl_compat);
385
388 while ((type = static_cast<GamelogActionType>(SlReadByte())) != GamelogActionType::None) {
389 if (type >= GamelogActionType::End) SlErrorCorrupt("Invalid gamelog action type");
390
391 LoggedAction &la = gamelog.data->action.emplace_back();
393 SlObject(&la, slt);
394 }
395 return;
396 }
397
398 while (SlIterateArray() != -1) {
399 LoggedAction &la = gamelog.data->action.emplace_back();
400 SlObject(&la, slt);
401 }
402 }
403
404 void Save() const override
405 {
406 SlTableHeader(_gamelog_desc);
407
408 uint i = 0;
409 for (LoggedAction &la : _gamelog.data->action) {
410 SlSetArrayIndex(i++);
411 SlObject(&la, _gamelog_desc);
412 }
413 }
414
415 void Load() const override
416 {
417 this->LoadCommon(_gamelog);
418 }
419
420 void LoadCheck(size_t) const override
421 {
422 this->LoadCommon(_load_check_data.gamelog);
423 }
424};
425
426static const GLOGChunkHandler GLOG;
427static const ChunkHandlerRef gamelog_chunk_handlers[] = {
428 GLOG,
429};
430
431extern const ChunkHandlerTable _gamelog_chunk_handlers(gamelog_chunk_handlers);
Default handler for saving/loading an object to/from disk.
Definition saveload.h:606
SaveLoadTable GetDescription() const override
Definition saveload.h:608
SaveLoadTable GetLoadDescription() const
Get the description for how to load the chunk.
void Save(LoggedAction *la) const override
Save the object to disk.
void Load(LoggedAction *la) const override
Load the object from disk.
void LoadCheck(LoggedAction *la) const override
Similar to load, but used only to validate savegames.
static const SaveLoad description[]
We need to store something, so store a "true" value.
void Save(LoggedChange *lc) const override
Save the object to disk.
void LoadCheck(LoggedChange *lc) const override
Similar to load, but used only to validate savegames.
void Load(LoggedChange *lc) const override
Load the object from disk.
void LoadCheck(LoggedChange *lc) const override
Similar to load, but used only to validate savegames.
void Load(LoggedChange *lc) const override
Load the object from disk.
void Save(LoggedChange *lc) const override
Save the object to disk.
void Load(LoggedChange *lc) const override
Load the object from disk.
void Save(LoggedChange *lc) const override
Save the object to disk.
void LoadCheck(LoggedChange *lc) const override
Similar to load, but used only to validate savegames.
void LoadCheck(LoggedChange *lc) const override
Similar to load, but used only to validate savegames.
void Load(LoggedChange *lc) const override
Load the object from disk.
void Save(LoggedChange *lc) const override
Save the object to disk.
void LoadCheck(LoggedChange *lc) const override
Similar to load, but used only to validate savegames.
void Load(LoggedChange *lc) const override
Load the object from disk.
void Save(LoggedChange *lc) const override
Save the object to disk.
void LoadCheck(LoggedChange *lc) const override
Similar to load, but used only to validate savegames.
void Load(LoggedChange *lc) const override
Load the object from disk.
void Save(LoggedChange *lc) const override
Save the object to disk.
void Save(LoggedChange *lc) const override
Save the object to disk.
void Load(LoggedChange *lc) const override
Load the object from disk.
void LoadCheck(LoggedChange *lc) const override
Similar to load, but used only to validate savegames.
void Load(LoggedChange *lc) const override
Load the object from disk.
void LoadCheck(LoggedChange *lc) const override
Similar to load, but used only to validate savegames.
void Save(LoggedChange *lc) const override
Save the object to disk.
void LoadCheck(LoggedChange *lc) const override
Similar to load, but used only to validate savegames.
void Save(LoggedChange *lc) const override
Save the object to disk.
void Load(LoggedChange *lc) const override
Load the object from disk.
void Load(LoggedChange *lc) const override
Load the object from disk.
void Save(LoggedChange *lc) const override
Save the object to disk.
void LoadCheck(LoggedChange *lc) const override
Similar to load, but used only to validate savegames.
void Load(LoggedChange *lc) const override
Load the object from disk.
void Save(LoggedChange *lc) const override
Save the object to disk.
void LoadCheck(LoggedChange *lc) const override
Similar to load, but used only to validate savegames.
Declarations for savegames operations.
LoadCheckData _load_check_data
Data loaded from save during SL_LOAD_CHECK.
Definition fios_gui.cpp:41
Gamelog _gamelog
Gamelog instance.
Definition gamelog.cpp:31
GamelogChangeType
Type of logged change.
Definition gamelog.h:30
@ GRFCompat
Loading compatible GRF.
Definition gamelog.h:37
@ GRFAdd
Removed GRF.
Definition gamelog.h:35
@ Revision
Changed game revision string.
Definition gamelog.h:32
@ GRFParam
GRF parameter changed.
Definition gamelog.h:38
@ Setting
Non-networksafe setting value changed.
Definition gamelog.h:34
@ GRFRem
Added GRF.
Definition gamelog.h:36
@ GRFMove
GRF order changed.
Definition gamelog.h:39
@ Mode
Scenario editor x Game, different landscape.
Definition gamelog.h:31
@ None
In savegames, end of list.
Definition gamelog.h:43
@ End
End marker.
Definition gamelog.h:42
@ Emergency
Emergency savegame.
Definition gamelog.h:41
@ GRFBug
GRF bug triggered.
Definition gamelog.h:40
@ OldVer
Loaded from savegame without logged data.
Definition gamelog.h:33
GamelogActionType
The actions we log.
Definition gamelog.h:17
@ None
No logging active; in savegames, end of list.
Definition gamelog.h:26
@ End
End marker.
Definition gamelog.h:25
Declaration shared among gamelog.cpp and saveload/gamelog_sl.cpp.
Loading for gamelog chunks before table headers were added.
const SaveLoadCompat _gamelog_emergency_sl_compat[]
Original field order for SlGamelogEmergency.
const SaveLoadCompat _gamelog_mode_sl_compat[]
Original field order for SlGamelogMode.
const SaveLoadCompat _gamelog_grfmove_sl_compat[]
Original field order for SlGamelogGrfmove.
const SaveLoadCompat _gamelog_action_sl_compat[]
Original field order for SlGamelogAction.
const SaveLoadCompat _gamelog_oldver_sl_compat[]
Original field order for SlGamelogOldver.
const SaveLoadCompat _gamelog_revision_sl_compat[]
Original field order for SlGamelogRevision.
const SaveLoadCompat _gamelog_sl_compat[]
Original field order for _gamelog_desc.
const SaveLoadCompat _gamelog_setting_sl_compat[]
Original field order for SlGamelogSetting.
const SaveLoadCompat _gamelog_grfrem_sl_compat[]
Original field order for SlGamelogGrfrem.
const SaveLoadCompat _gamelog_grfbug_sl_compat[]
Original field order for SlGamelogGrfbug.
const SaveLoadCompat _gamelog_grfadd_sl_compat[]
Original field order for SlGamelogGrfadd.
const SaveLoadCompat _gamelog_grfcompat_sl_compat[]
Original field order for SlGamelogGrfcompat.
const SaveLoadCompat _gamelog_grfparam_sl_compat[]
Original field order for SlGamelogGrfparam.
A number of safeguards to prevent using unsafe methods.
std::vector< SaveLoad > SlCompatTableHeader(const SaveLoadTable &slt, const SaveLoadCompatTable &slct)
Load a table header in a savegame compatible way.
size_t SlGetStructListLength(size_t limit)
Get the length of this list; if it exceeds the limit, error out.
int SlIterateArray()
Iterate through the elements of an array and read the whole thing.
Definition saveload.cpp:734
void SlErrorCorrupt(const std::string &msg)
Error handler for corrupt savegames.
Definition saveload.cpp:369
uint8_t SlReadByte()
Wrapper for reading a byte from the buffer.
Definition saveload.cpp:410
void SlObject(void *object, const SaveLoadTable &slt)
Main SaveLoad function.
std::vector< SaveLoad > SlTableHeader(const SaveLoadTable &slt)
Save or Load a table header.
void SlSetStructListLength(size_t length)
Set the length of this list.
Functions/types related to saving and loading games.
@ U64
A 64 bit unsigned int.
Definition saveload.h:686
#define SLEG_CONDARR(name, variable, type, length, from, to)
Storage of a global fixed-size array of SaveLoadType::Variable elements in some savegame versions.
Definition saveload.h:1145
@ U16
A 16 bit unsigned int.
Definition saveload.h:664
#define SLEG_STRUCTLIST(name, handler)
Storage of a list of structs in every savegame version.
Definition saveload.h:1256
#define SLE_CONDSSTRNAME(base, variable, name, type, from, to)
Storage of a std::string in some savegame versions.
Definition saveload.h:969
#define SLE_SSTRNAME(base, variable, name, type)
Storage of a std::string in every savegame version.
Definition saveload.h:1070
#define SLEG_CONDVAR(name, variable, type, from, to)
Storage of a global variable in some savegame versions.
Definition saveload.h:1124
#define SLE_VARNAME(base, variable, name, type)
Storage of a variable in every version of a savegame.
Definition saveload.h:1026
std::reference_wrapper< const ChunkHandler > ChunkHandlerRef
A reference to ChunkHandler.
Definition saveload.h:530
#define SLE_ARRNAME(base, variable, name, type, length)
Storage of fixed-size array of SaveLoadType::Variable elements in every version of a savegame.
Definition saveload.h:1053
std::span< const ChunkHandlerRef > ChunkHandlerTable
A table of ChunkHandler entries.
Definition saveload.h:533
#define SLE_SAVEBYTE(base, variable)
Only write byte during saving; never read it during loading.
Definition saveload.h:1098
std::span< const struct SaveLoadCompat > SaveLoadCompatTable
A table of SaveLoadCompat entries.
Definition saveload.h:539
#define SLEG_STRUCT(name, handler)
Storage of a structs in every savegame version.
Definition saveload.h:1233
#define SLE_CONDVAR(base, variable, type, from, to)
Storage of a variable in some savegame versions.
Definition saveload.h:904
bool IsSavegameVersionBefore(SaveLoadVersion major, uint8_t minor=0)
Checks whether the savegame is below major.
Definition saveload.h:1278
@ StringGamelog
Saveload version: 314, GitHub pull request: 10801 Use std::string in gamelog.
Definition saveload.h:356
@ U64TickCounter
Saveload version: 300, GitHub pull request: 10035 Make tick counter 64bit to avoid wrapping.
Definition saveload.h:340
@ MinVersion
First savegame version.
Definition saveload.h:31
@ MaxVersion
Highest possible saveload version.
Definition saveload.h:421
@ RiffToArray
Saveload version: 294, GitHub pull request: 9375 Changed many ChunkType::Riff chunks to ChunkType::A...
Definition saveload.h:332
@ Table
An Array with a header describing the elements.
Definition saveload.h:475
Definition of base types and functions in a cross-platform compatible way.
static void StrMakeValid(Builder &builder, StringConsumer &consumer, StringValidationSettings settings)
Copies the valid (UTF-8) characters from consumer to the builder.
Definition string.cpp:119
Functions related to low-level strings.
ChunkType type
Type of the chunk.
Definition saveload.h:485
void LoadCheck(size_t) const override
Load the chunk for game preview.
void Save() const override
Save the chunk.
void Load() const override
Load the chunk.
Contains information about one logged action that caused at least one logged change.
std::vector< std::unique_ptr< LoggedChange > > change
Logged changes in this action.
GamelogActionType at
Type of action.
A log entry for a NewGRF that was added.
A log entry for a NewGRF bug.
A log entry for a NewGRF that was changed.
A log entry for a NewGRF that was moved.
A log entry for a NewGRF for which a parameter was changed.
A log entry for a NewGRF that was removed.
Log element for the change of the game mode and landscape.
A log entry for loading a really old savegame.
A log entry for a change in OpenTTD version.
A log entry for changing a setting.
Container for any change that we deem needs to be logged.
GamelogChangeType ct
The type of change.
SaveLoad type struct.
Definition saveload.h:787
static constexpr VarType U16
Store a 16 bits unsigned int.
Definition saveload.h:754
static constexpr VarType U8
Store a 8 bits unsigned int.
Definition saveload.h:752
static constexpr VarType STR
Store string.
Definition saveload.h:760
static constexpr VarType U64
Store a 64 bits unsigned int.
Definition saveload.h:758
static constexpr VarType U32
Store a 32 bits unsigned int.
Definition saveload.h:756
static constexpr VarType I32
Store a 32 bits signed int.
Definition saveload.h:755
static constexpr VarType BOOL
Store a boolean (as int8).
Definition saveload.h:750