Add "special events" log. Add console command, include in crash logs.

This commit is contained in:
Jonathan G Rennison
2021-10-04 20:54:12 +01:00
parent 2e022d5194
commit 6f16655e6e
8 changed files with 96 additions and 0 deletions

View File

@@ -10,6 +10,10 @@
#include "stdafx.h"
#include "event_logs.h"
#include "string_func.h"
#include "date_func.h"
#include "company_func.h"
#include <array>
#include <string>
#include "safeguards.h"
@@ -35,3 +39,66 @@ char *DumpGameEventFlags(GameEventFlags events, char *b, const char *last)
dump('v', GEF_VIRT_TRAIN);
return b;
}
struct SpecialEventLogEntry {
std::string msg;
Date date;
DateFract date_fract;
uint8 tick_skip_counter;
CompanyID current_company;
CompanyID local_company;
SpecialEventLogEntry() { }
SpecialEventLogEntry(std::string msg)
: msg(std::move(msg)), date(_date), date_fract(_date_fract), tick_skip_counter(_tick_skip_counter),
current_company(_current_company), local_company(_local_company) { }
};
struct SpecialEventLog {
std::array<SpecialEventLogEntry, 64> log;
unsigned int count = 0;
unsigned int next = 0;
void Reset()
{
this->count = 0;
this->next = 0;
}
};
static SpecialEventLog _special_event_log;
void AppendSpecialEventsLogEntry(std::string message)
{
_special_event_log.log[_special_event_log.next] = SpecialEventLogEntry(std::move(message));
_special_event_log.next = (_special_event_log.next + 1) % _special_event_log.log.size();
_special_event_log.count++;
}
char *DumpSpecialEventsLog(char *buffer, const char *last)
{
const unsigned int count = std::min<unsigned int>(_special_event_log.count, 64);
buffer += seprintf(buffer, last, "Special Events Log:\n Showing most recent %u of %u events\n", count, _special_event_log.count);
unsigned int log_index = _special_event_log.next;
for (unsigned int i = 0 ; i < count; i++) {
if (log_index > 0) {
log_index--;
} else {
log_index = (uint)_special_event_log.log.size() - 1;
}
const SpecialEventLogEntry &entry = _special_event_log.log[log_index];
YearMonthDay ymd;
ConvertDateToYMD(entry.date, &ymd);
buffer += seprintf(buffer, last, " %3u | %4i-%02i-%02i, %2i, %3i | cc: %3u, lc: %3u | %s\n",
i, ymd.year, ymd.month + 1, ymd.day, entry.date_fract, entry.tick_skip_counter, (uint) entry.current_company, (uint) entry.local_company, entry.msg.c_str());
}
return buffer;
}
void ClearSpecialEventsLog()
{
_special_event_log.Reset();
}