From ec1e848a7f2564816762b43e6094588c4b94b24d Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 16 May 2019 20:15:44 +0100 Subject: [PATCH] Add log of game events since last load and overall Add console command Add to crashlog --- src/console_cmds.cpp | 16 ++++++++++++++++ src/crashlog.cpp | 8 ++++++++ src/economy.cpp | 2 ++ src/misc.cpp | 2 ++ src/openttd.cpp | 18 ++++++++++++++++++ src/openttd.h | 18 ++++++++++++++++++ src/saveload/afterload.cpp | 2 ++ src/saveload/extended_ver_sl.cpp | 1 + src/saveload/extended_ver_sl.h | 1 + src/saveload/misc_sl.cpp | 2 ++ 10 files changed, 70 insertions(+) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index aae093c7cf..471b9eb986 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -1982,6 +1982,21 @@ DEF_CONSOLE_CMD(ConVehicleStats) return true; } +DEF_CONSOLE_CMD(ConDumpGameEvents) +{ + if (argc == 0) { + IConsoleHelp("Dump game events."); + return true; + } + + char buffer[256]; + DumpGameEventFlags(_game_events_since_load, buffer, lastof(buffer)); + IConsolePrintF(CC_DEFAULT, "Since load: %s", buffer); + DumpGameEventFlags(_game_events_overall, buffer, lastof(buffer)); + IConsolePrintF(CC_DEFAULT, "Overall: %s", buffer); + return true; +} + DEF_CONSOLE_CMD(ConCheckCaches) { if (argc == 0) { @@ -2253,6 +2268,7 @@ void IConsoleStdLibRegister() IConsoleCmdRegister("dump_inflation", ConDumpInflation, nullptr, true); IConsoleCmdRegister("dump_cpdp_stats", ConDumpCpdpStats, nullptr, true); IConsoleCmdRegister("dump_veh_stats", ConVehicleStats, nullptr, true); + IConsoleCmdRegister("dump_game_events", ConDumpGameEvents, nullptr, true); IConsoleCmdRegister("check_caches", ConCheckCaches, nullptr, true); /* NewGRF development stuff */ diff --git a/src/crashlog.cpp b/src/crashlog.cpp index d03483d664..f876ecbe40 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -320,6 +320,14 @@ char *CrashLog::LogLibraries(char *buffer, const char *last) const */ char *CrashLog::LogGamelog(char *buffer, const char *last) const { + if (_game_events_since_load || _game_events_overall) { + buffer += seprintf(buffer, last, "Events: "); + buffer = DumpGameEventFlags(_game_events_since_load, buffer, last); + buffer += seprintf(buffer, last, ", "); + buffer = DumpGameEventFlags(_game_events_overall, buffer, last); + buffer += seprintf(buffer, last, "\n\n"); + } + CrashLog::gamelog_buffer = buffer; CrashLog::gamelog_last = last; GamelogPrint(&CrashLog::GamelogFillCrashLog); diff --git a/src/economy.cpp b/src/economy.cpp index 8b9f00fec4..6d3bda9454 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -599,6 +599,8 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner) cur_company.Restore(); + RegisterGameEvents(new_owner != INVALID_OWNER ? GEF_COMPANY_MERGE : GEF_COMPANY_DELETE); + MarkWholeScreenDirty(); } diff --git a/src/misc.cpp b/src/misc.cpp index 9fd08a2d0f..0768ddbbc0 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -79,6 +79,8 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin _tick_skip_counter = 0; _cur_tileloop_tile = 1; _thd.redsq = INVALID_TILE; + _game_events_since_load = (GameEventFlags) 0; + _game_events_overall = (GameEventFlags) 0; if (reset_settings) MakeNewgameSettingsLive(); if (reset_date) { diff --git a/src/openttd.cpp b/src/openttd.cpp index 2733eda102..062c8a0bfe 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -94,6 +94,9 @@ extern Company *DoStartupNewCompany(bool is_ai, CompanyID company = INVALID_COMP extern void ShowOSErrorBox(const char *buf, bool system); extern char *_config_file; +GameEventFlags _game_events_since_load; +GameEventFlags _game_events_overall; + /** * Error handling for fatal user errors. * @param s the string to print. @@ -377,6 +380,9 @@ static void ShutdownGame() InvalidateVehicleTickCaches(); ClearVehicleTickCaches(); ClearCommandLog(); + + _game_events_since_load = (GameEventFlags) 0; + _game_events_overall = (GameEventFlags) 0; } /** @@ -1698,3 +1704,15 @@ void GameLoop() SoundDriver::GetInstance()->MainLoop(); MusicLoop(); } + +char *DumpGameEventFlags(GameEventFlags events, char *b, const char *last) +{ + if (b <= last) *b = 0; + auto dump = [&](char c, GameEventFlags ev) { + if (events & ev) b += seprintf(b, last, "%c", c); + }; + dump('d', GEF_COMPANY_DELETE); + dump('m', GEF_COMPANY_MERGE); + dump('n', GEF_RELOAD_NEWGRF); + return b; +} diff --git a/src/openttd.h b/src/openttd.h index 8e0f3366a5..4828b7bfb1 100644 --- a/src/openttd.h +++ b/src/openttd.h @@ -87,6 +87,24 @@ typedef SimpleTinyEnumT PauseModeByte; /** The current pause mode */ extern PauseModeByte _pause_mode; +enum GameEventFlags : uint32 { + GEF_COMPANY_DELETE = 1 << 0, ///< (d) A company has been deleted + GEF_COMPANY_MERGE = 1 << 1, ///< (m) A company has been bought by another + GEF_RELOAD_NEWGRF = 1 << 2, ///< (n) ReloadNewGRFData() has been called +}; +DECLARE_ENUM_AS_BIT_SET(GameEventFlags) + +extern GameEventFlags _game_events_since_load; +extern GameEventFlags _game_events_overall; + +inline void RegisterGameEvents(GameEventFlags events) +{ + _game_events_since_load |= events; + _game_events_overall |= events; +} + +char *DumpGameEventFlags(GameEventFlags events, char *b, const char *last); + void AskExitGame(); void AskExitToGameMenu(); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index d4f9406edc..1a333eff71 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3746,6 +3746,8 @@ bool AfterLoadGame() */ void ReloadNewGRFData() { + RegisterGameEvents(GEF_RELOAD_NEWGRF); + RailTypeLabel rail_type_label_map[RAILTYPE_END]; for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) { rail_type_label_map[rt] = GetRailTypeInfo(rt)->label; diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 770c4de77e..3905aa59e2 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -105,6 +105,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_SAVEGAME_UNIQUE_ID, XSCF_IGNORABLE_ALL, 1, 1, "savegame_unique_id", nullptr, nullptr, nullptr }, { XSLFI_RV_OVERTAKING, XSCF_NULL, 1, 1, "roadveh_overtaking", nullptr, nullptr, nullptr }, { XSLFI_LINKGRAPH_MODES, XSCF_NULL, 1, 1, "linkgraph_modes", nullptr, nullptr, nullptr }, + { XSLFI_GAME_EVENTS, XSCF_NULL, 1, 1, "game_events", nullptr, nullptr, nullptr }, { XSLFI_NULL, XSCF_NULL, 0, 0, nullptr, nullptr, nullptr, nullptr },// This is the end marker }; diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index d4da2269d7..f0bb6fe095 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -72,6 +72,7 @@ enum SlXvFeatureIndex { XSLFI_SAVEGAME_UNIQUE_ID, ///< Savegame unique ID XSLFI_RV_OVERTAKING, ///< Roadvehicle overtaking XSLFI_LINKGRAPH_MODES, ///< Linkgraph additional distribution modes + XSLFI_GAME_EVENTS, ///< Game event flags 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/misc_sl.cpp b/src/saveload/misc_sl.cpp index 130d149a1b..1a5e565c24 100644 --- a/src/saveload/misc_sl.cpp +++ b/src/saveload/misc_sl.cpp @@ -92,6 +92,7 @@ static const SaveLoadGlobVarList _date_desc[] = { SLEG_CONDVAR(_next_competitor_start, SLE_UINT32, SLV_109, SL_MAX_VERSION), SLEG_VAR(_trees_tick_ctr, SLE_UINT8), SLEG_CONDVAR(_pause_mode, SLE_UINT8, SLV_4, SL_MAX_VERSION), + SLEG_CONDVAR_X(_game_events_overall, SLE_UINT32, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_GAME_EVENTS)), SLE_CONDNULL(4, SLV_11, SLV_120), SLEG_END() }; @@ -118,6 +119,7 @@ static const SaveLoadGlobVarList _date_check_desc[] = { SLE_CONDNULL(4, SLV_109, SL_MAX_VERSION), // _next_competitor_start SLE_NULL(1), // _trees_tick_ctr SLE_CONDNULL(1, SLV_4, SL_MAX_VERSION), // _pause_mode + SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_GAME_EVENTS)), // _game_events_overall SLE_CONDNULL(4, SLV_11, SLV_120), SLEG_END() };