|
@@ -14,6 +14,7 @@
|
|
|
|
|
|
#include "../gamelog_internal.h"
|
|
|
#include "../fios.h"
|
|
|
#include "../string_func.h"
|
|
|
|
|
|
#include "../safeguards.h"
|
|
|
|
|
@@ -21,8 +22,8 @@
|
|
|
class SlGamelogMode : public DefaultSaveLoadHandler<SlGamelogMode, LoggedChange> {
|
|
|
public:
|
|
|
inline static const SaveLoad description[] = {
|
|
|
SLE_VAR(LoggedChange, mode.mode, SLE_UINT8),
|
|
|
SLE_VAR(LoggedChange, mode.landscape, SLE_UINT8),
|
|
|
SLE_VARNAME(LoggedChangeMode, mode, "mode.mode", SLE_UINT8),
|
|
|
SLE_VARNAME(LoggedChangeMode, landscape, "mode.landscape", SLE_UINT8),
|
|
|
};
|
|
|
inline const static SaveLoadCompatTable compat_description = _gamelog_mode_sl_compat;
|
|
|
|
|
@@ -43,11 +44,15 @@ public:
|
|
|
|
|
|
class SlGamelogRevision : public DefaultSaveLoadHandler<SlGamelogRevision, LoggedChange> {
|
|
|
public:
|
|
|
static const size_t GAMELOG_REVISION_LENGTH = 15;
|
|
|
static char revision_text[GAMELOG_REVISION_LENGTH];
|
|
|
|
|
|
inline static const SaveLoad description[] = {
|
|
|
SLE_ARR(LoggedChange, revision.text, SLE_UINT8, GAMELOG_REVISION_LENGTH),
|
|
|
SLE_VAR(LoggedChange, revision.newgrf, SLE_UINT32),
|
|
|
SLE_VAR(LoggedChange, revision.slver, SLE_UINT16),
|
|
|
SLE_VAR(LoggedChange, revision.modified, SLE_UINT8),
|
|
|
SLEG_CONDARR("revision.text", SlGamelogRevision::revision_text, SLE_UINT8, GAMELOG_REVISION_LENGTH, SL_MIN_VERSION, SLV_STRING_GAMELOG),
|
|
|
SLE_CONDSSTRNAME(LoggedChangeRevision, text, "revision.text", SLE_STR, SLV_STRING_GAMELOG, SL_MAX_VERSION),
|
|
|
SLE_VARNAME(LoggedChangeRevision, newgrf, "revision.newgrf", SLE_UINT32),
|
|
|
SLE_VARNAME(LoggedChangeRevision, slver, "revision.slver", SLE_UINT16),
|
|
|
SLE_VARNAME(LoggedChangeRevision, modified, "revision.modified", SLE_UINT8),
|
|
|
};
|
|
|
inline const static SaveLoadCompatTable compat_description = _gamelog_revision_sl_compat;
|
|
|
|
|
@@ -61,16 +66,23 @@ public:
|
|
|
{
|
|
|
if (lc->ct != GLCT_REVISION) return;
|
|
|
SlObject(lc, this->GetLoadDescription());
|
|
|
|
|
|
if (IsSavegameVersionBefore(SLV_STRING_GAMELOG)) {
|
|
|
StrMakeValidInPlace(SlGamelogRevision::revision_text, lastof(SlGamelogRevision::revision_text));
|
|
|
static_cast<LoggedChangeRevision *>(lc)->text = SlGamelogRevision::revision_text;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
|
|
|
};
|
|
|
|
|
|
/* static */ char SlGamelogRevision::revision_text[GAMELOG_REVISION_LENGTH];
|
|
|
|
|
|
class SlGamelogOldver : public DefaultSaveLoadHandler<SlGamelogOldver, LoggedChange> {
|
|
|
public:
|
|
|
inline static const SaveLoad description[] = {
|
|
|
SLE_VAR(LoggedChange, oldver.type, SLE_UINT32),
|
|
|
SLE_VAR(LoggedChange, oldver.version, SLE_UINT32),
|
|
|
SLE_VARNAME(LoggedChangeOldVersion, type, "oldver.type", SLE_UINT32),
|
|
|
SLE_VARNAME(LoggedChangeOldVersion, version, "oldver.version", SLE_UINT32),
|
|
|
};
|
|
|
inline const static SaveLoadCompatTable compat_description = _gamelog_oldver_sl_compat;
|
|
|
|
|
@@ -92,9 +104,9 @@ public:
|
|
|
class SlGamelogSetting : public DefaultSaveLoadHandler<SlGamelogSetting, LoggedChange> {
|
|
|
public:
|
|
|
inline static const SaveLoad description[] = {
|
|
|
SLE_STR(LoggedChange, setting.name, SLE_STR, 128),
|
|
|
SLE_VAR(LoggedChange, setting.oldval, SLE_INT32),
|
|
|
SLE_VAR(LoggedChange, setting.newval, SLE_INT32),
|
|
|
SLE_SSTRNAME(LoggedChangeSettingChanged, name, "setting.name", SLE_STR),
|
|
|
SLE_VARNAME(LoggedChangeSettingChanged, oldval, "setting.oldval", SLE_INT32),
|
|
|
SLE_VARNAME(LoggedChangeSettingChanged, newval, "setting.newval", SLE_INT32),
|
|
|
};
|
|
|
inline const static SaveLoadCompatTable compat_description = _gamelog_setting_sl_compat;
|
|
|
|
|
@@ -116,8 +128,8 @@ public:
|
|
|
class SlGamelogGrfadd : public DefaultSaveLoadHandler<SlGamelogGrfadd, LoggedChange> {
|
|
|
public:
|
|
|
inline static const SaveLoad description[] = {
|
|
|
SLE_VAR(LoggedChange, grfadd.grfid, SLE_UINT32 ),
|
|
|
SLE_ARR(LoggedChange, grfadd.md5sum, SLE_UINT8, 16),
|
|
|
SLE_VARNAME(LoggedChangeGRFAdd, grfid, "grfadd.grfid", SLE_UINT32 ),
|
|
|
SLE_ARRNAME(LoggedChangeGRFAdd, md5sum, "grfadd.md5sum", SLE_UINT8, 16),
|
|
|
};
|
|
|
inline const static SaveLoadCompatTable compat_description = _gamelog_grfadd_sl_compat;
|
|
|
|
|
@@ -139,7 +151,7 @@ public:
|
|
|
class SlGamelogGrfrem : public DefaultSaveLoadHandler<SlGamelogGrfrem, LoggedChange> {
|
|
|
public:
|
|
|
inline static const SaveLoad description[] = {
|
|
|
SLE_VAR(LoggedChange, grfrem.grfid, SLE_UINT32),
|
|
|
SLE_VARNAME(LoggedChangeGRFRemoved, grfid, "grfrem.grfid", SLE_UINT32),
|
|
|
};
|
|
|
inline const static SaveLoadCompatTable compat_description = _gamelog_grfrem_sl_compat;
|
|
|
|
|
@@ -161,8 +173,8 @@ public:
|
|
|
class SlGamelogGrfcompat : public DefaultSaveLoadHandler<SlGamelogGrfcompat, LoggedChange> {
|
|
|
public:
|
|
|
inline static const SaveLoad description[] = {
|
|
|
SLE_VAR(LoggedChange, grfcompat.grfid, SLE_UINT32 ),
|
|
|
SLE_ARR(LoggedChange, grfcompat.md5sum, SLE_UINT8, 16),
|
|
|
SLE_VARNAME(LoggedChangeGRFChanged, grfid, "grfcompat.grfid", SLE_UINT32 ),
|
|
|
SLE_ARRNAME(LoggedChangeGRFChanged, md5sum, "grfcompat.md5sum", SLE_UINT8, 16),
|
|
|
};
|
|
|
inline const static SaveLoadCompatTable compat_description = _gamelog_grfcompat_sl_compat;
|
|
|
|
|
@@ -184,7 +196,7 @@ public:
|
|
|
class SlGamelogGrfparam : public DefaultSaveLoadHandler<SlGamelogGrfparam, LoggedChange> {
|
|
|
public:
|
|
|
inline static const SaveLoad description[] = {
|
|
|
SLE_VAR(LoggedChange, grfparam.grfid, SLE_UINT32),
|
|
|
SLE_VARNAME(LoggedChangeGRFParameterChanged, grfid, "grfparam.grfid", SLE_UINT32),
|
|
|
};
|
|
|
inline const static SaveLoadCompatTable compat_description = _gamelog_grfparam_sl_compat;
|
|
|
|
|
@@ -206,8 +218,8 @@ public:
|
|
|
class SlGamelogGrfmove : public DefaultSaveLoadHandler<SlGamelogGrfmove, LoggedChange> {
|
|
|
public:
|
|
|
inline static const SaveLoad description[] = {
|
|
|
SLE_VAR(LoggedChange, grfmove.grfid, SLE_UINT32),
|
|
|
SLE_VAR(LoggedChange, grfmove.offset, SLE_INT32),
|
|
|
SLE_VARNAME(LoggedChangeGRFMoved, grfid, "grfmove.grfid", SLE_UINT32),
|
|
|
SLE_VARNAME(LoggedChangeGRFMoved, offset, "grfmove.offset", SLE_INT32),
|
|
|
};
|
|
|
inline const static SaveLoadCompatTable compat_description = _gamelog_grfmove_sl_compat;
|
|
|
|
|
@@ -229,9 +241,9 @@ public:
|
|
|
class SlGamelogGrfbug : public DefaultSaveLoadHandler<SlGamelogGrfbug, LoggedChange> {
|
|
|
public:
|
|
|
inline static const SaveLoad description[] = {
|
|
|
SLE_VAR(LoggedChange, grfbug.data, SLE_UINT64),
|
|
|
SLE_VAR(LoggedChange, grfbug.grfid, SLE_UINT32),
|
|
|
SLE_VAR(LoggedChange, grfbug.bug, SLE_UINT8),
|
|
|
SLE_VARNAME(LoggedChangeGRFBug, data, "grfbug.data", SLE_UINT64),
|
|
|
SLE_VARNAME(LoggedChangeGRFBug, grfid, "grfbug.grfid", SLE_UINT32),
|
|
|
SLE_VARNAME(LoggedChangeGRFBug, bug, "grfbug.bug", SLE_UINT8),
|
|
|
};
|
|
|
inline const static SaveLoadCompatTable compat_description = _gamelog_grfbug_sl_compat;
|
|
|
|
|
@@ -278,6 +290,27 @@ public:
|
|
|
void LoadCheck(LoggedChange *lc) const override { this->Load(lc); }
|
|
|
};
|
|
|
|
|
|
static std::unique_ptr<LoggedChange> MakeLoggedChange(GamelogChangeType type)
|
|
|
{
|
|
|
switch (type) {
|
|
|
case GLCT_MODE: return std::make_unique<LoggedChangeMode>();
|
|
|
case GLCT_REVISION: return std::make_unique<LoggedChangeRevision>();
|
|
|
case GLCT_OLDVER: return std::make_unique<LoggedChangeOldVersion>();
|
|
|
case GLCT_SETTING: return std::make_unique<LoggedChangeSettingChanged>();
|
|
|
case GLCT_GRFADD: return std::make_unique<LoggedChangeGRFAdd>();
|
|
|
case GLCT_GRFREM: return std::make_unique<LoggedChangeGRFRemoved>();
|
|
|
case GLCT_GRFCOMPAT: return std::make_unique<LoggedChangeGRFChanged>();
|
|
|
case GLCT_GRFPARAM: return std::make_unique<LoggedChangeGRFParameterChanged>();
|
|
|
case GLCT_GRFMOVE: return std::make_unique<LoggedChangeGRFMoved>();
|
|
|
case GLCT_GRFBUG: return std::make_unique<LoggedChangeGRFBug>();
|
|
|
case GLCT_EMERGENCY: return std::make_unique<LoggedChangeEmergencySave>();
|
|
|
case GLCT_END:
|
|
|
case GLCT_NONE:
|
|
|
default:
|
|
|
SlErrorCorrupt("Invalid gamelog action type");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class SlGamelogAction : public DefaultSaveLoadHandler<SlGamelogAction, LoggedAction> {
|
|
|
public:
|
|
|
inline static const SaveLoad description[] = {
|
|
@@ -301,22 +334,25 @@ public:
|
|
|
SlSetStructListLength(la->change.size());
|
|
|
|
|
|
for (auto &lc : la->change) {
|
|
|
assert((uint)lc.ct < GLCT_END);
|
|
|
SlObject(&lc, this->GetDescription());
|
|
|
assert(lc->ct < GLCT_END);
|
|
|
SlObject(lc.get(), this->GetDescription());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void LoadChange(LoggedAction *la, GamelogChangeType type) const
|
|
|
{
|
|
|
std::unique_ptr<LoggedChange> lc = MakeLoggedChange(type);
|
|
|
SlObject(lc.get(), this->GetLoadDescription());
|
|
|
la->change.push_back(std::move(lc));
|
|
|
}
|
|
|
|
|
|
void Load(LoggedAction *la) const override
|
|
|
{
|
|
|
if (IsSavegameVersionBefore(SLV_RIFF_TO_ARRAY)) {
|
|
|
byte type;
|
|
|
while ((type = SlReadByte()) != GLCT_NONE) {
|
|
|
if (type >= GLCT_END) SlErrorCorrupt("Invalid gamelog change type");
|
|
|
GamelogChangeType ct = (GamelogChangeType)type;
|
|
|
|
|
|
LoggedChange &lc = la->change.emplace_back();
|
|
|
lc.ct = ct;
|
|
|
SlObject(&lc, this->GetLoadDescription());
|
|
|
LoadChange(la, (GamelogChangeType)type);
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
@@ -325,9 +361,7 @@ public:
|
|
|
la->change.reserve(length);
|
|
|
|
|
|
for (size_t i = 0; i < length; i++) {
|
|
|
LoggedChange &lc = la->change.emplace_back();
|
|
|
lc.ct = (GamelogChangeType)SlReadByte();
|
|
|
SlObject(&lc, this->GetLoadDescription());
|
|
|
LoadChange(la, (GamelogChangeType)SlReadByte());
|
|
|
}
|
|
|
}
|
|
|
|