Add log of game events since last load and overall

Add console command
Add to crashlog
pull/91/head
Jonathan G Rennison 5 years ago
parent ddd48b61a2
commit ec1e848a7f

@ -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 */

@ -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);

@ -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();
}

@ -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) {

@ -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;
}

@ -87,6 +87,24 @@ typedef SimpleTinyEnumT<PauseMode, byte> 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();

@ -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;

@ -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
};

@ -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

@ -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()
};

Loading…
Cancel
Save