diff --git a/src/gamelog.cpp b/src/gamelog.cpp index b21823c95b..940d9a8247 100644 --- a/src/gamelog.cpp +++ b/src/gamelog.cpp @@ -75,6 +75,7 @@ void GamelogFree(LoggedAction *gamelog_action, uint gamelog_actions) for (uint j = 0; j < la->changes; j++) { const LoggedChange *lc = &la->change[j]; if (lc->ct == GLCT_SETTING) free(lc->setting.name); + if (lc->ct == GLCT_REVISION) free(lc->revision.text); } free(la->change); } @@ -414,8 +415,7 @@ void GamelogRevision() LoggedChange *lc = GamelogChange(GLCT_REVISION); if (lc == NULL) return; - memset(lc->revision.text, 0, sizeof(lc->revision.text)); - strecpy(lc->revision.text, _openttd_revision, lastof(lc->revision.text), true); + lc->revision.text = stredup(_openttd_revision); lc->revision.slver = SAVEGAME_VERSION; lc->revision.modified = _openttd_revision_modified; lc->revision.newgrf = _openttd_newgrf_version; diff --git a/src/gamelog_internal.h b/src/gamelog_internal.h index ad9921f4e8..daa5436968 100644 --- a/src/gamelog_internal.h +++ b/src/gamelog_internal.h @@ -42,7 +42,7 @@ struct LoggedChange { byte landscape; ///< landscape (temperate, arctic, ...) } mode; struct { - char text[NETWORK_REVISION_LENGTH]; ///< revision string, _openttd_revision + char *text; ///< revision string, _openttd_revision uint32 newgrf; ///< _openttd_newgrf_version uint16 slver; ///< _sl_version byte modified; ///< _openttd_revision_modified diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 3b3084427f..258a70bff2 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -71,6 +71,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_TEMPLATE_REPLACEMENT, XSCF_NULL, 1, 1, "template_replacement", NULL, NULL, "TRPL,TMPL" }, { XSLFI_MORE_RAIL_TYPES, XSCF_NULL, 1, 1, "more_rail_types", NULL, NULL, NULL }, { XSLFI_CARGO_TYPE_ORDERS, XSCF_NULL, 1, 1, "cargo_type_orders", NULL, NULL, "ORDX" }, + { XSLFI_EXTENDED_GAMELOG, XSCF_NULL, 1, 1, "extended_gamelog", NULL, NULL, NULL }, { XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker }; diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index 68b3a57e63..c339d8a8b7 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -45,6 +45,7 @@ enum SlXvFeatureIndex { XSLFI_TEMPLATE_REPLACEMENT, ///< Template-based train replacement XSLFI_MORE_RAIL_TYPES, ///< Increased number of rail types XSLFI_CARGO_TYPE_ORDERS, ///< Cargo-specific load/unload order flags + XSLFI_EXTENDED_GAMELOG, ///< Extended gamelog XSLFI_RIFF_HEADER_60_BIT, ///< Size field in RIFF chunk header is 60 bit XSLFI_HEIGHT_8_BIT, ///< Map tile height is 8 bit instead of 4 bit, but savegame version may be before this became true in trunk diff --git a/src/saveload/gamelog_sl.cpp b/src/saveload/gamelog_sl.cpp index f818eca137..1810c39fa2 100644 --- a/src/saveload/gamelog_sl.cpp +++ b/src/saveload/gamelog_sl.cpp @@ -28,8 +28,11 @@ static const SaveLoad _glog_mode_desc[] = { SLE_END() }; +static char old_revision_text[NETWORK_REVISION_LENGTH]; + static const SaveLoad _glog_revision_desc[] = { - SLE_ARR(LoggedChange, revision.text, SLE_UINT8, NETWORK_REVISION_LENGTH), + SLEG_CONDARR_X(old_revision_text, SLE_UINT8, NETWORK_REVISION_LENGTH, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_EXTENDED_GAMELOG, 0, 0)), + SLE_CONDSTR_X(LoggedChange, revision.text, SLE_STR, 0, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_EXTENDED_GAMELOG)), SLE_VAR(LoggedChange, revision.newgrf, SLE_UINT32), SLE_VAR(LoggedChange, revision.slver, SLE_UINT16), SLE_VAR(LoggedChange, revision.modified, SLE_UINT8), @@ -132,6 +135,9 @@ static void Load_GLOG_common(LoggedAction *&gamelog_action, uint &gamelog_action assert((uint)ct < GLCT_END); SlObject(lc, _glog_desc[ct]); + if (ct == GLCT_REVISION && SlXvIsFeatureMissing(XSLFI_EXTENDED_GAMELOG)) { + lc->revision.text = stredup(old_revision_text); + } } } }