diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 266621149a..a6fd6b343f 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -37,6 +37,8 @@ #include "event_logs.h" #include "scope.h" #include "progress.h" +#include "settings_type.h" +#include "settings_internal.h" #include "ai/ai_info.hpp" #include "game/game.hpp" @@ -508,6 +510,31 @@ char *CrashLog::LogCommandLog(char *buffer, const char *last) const return buffer; } +/** + * Writes the non-default settings to the buffer. + * @param buffer The begin where to write at. + * @param last The last position in the buffer to write to. + * @return the position of the \c '\0' character after the buffer. + */ +char *CrashLog::LogSettings(char *buffer, const char *last) const +{ + buffer += seprintf(buffer, last, "Non-default settings:"); + + IterateSettingsTables([&](const SettingTable &table, void *object) { + for (auto &sd : table) { + /* Skip any old settings we no longer save/load. */ + if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; + + if (sd->IsDefaultValue(object)) continue; + buffer += seprintf(buffer, last, "\n %s: ", sd->name); + buffer = sd->FormatValue(buffer, last, object); + } + }); + + buffer += seprintf(buffer, last, "\n\n"); + return buffer; +} + /** * Fill the crash log buffer with all data of a crash log. * @param buffer The begin where to write at. @@ -618,6 +645,9 @@ char *CrashLog::FillCrashLog(char *buffer, const char *last) buffer = this->TryCrashLogFaultSection(buffer, last, "command log", [](CrashLog *self, char *buffer, const char *last) -> char * { return self->LogCommandLog(buffer, last); }); + buffer = this->TryCrashLogFaultSection(buffer, last, "settings", [](CrashLog *self, char *buffer, const char *last) -> char * { + return self->LogSettings(buffer, last); + }); buffer += seprintf(buffer, last, "*** End of OpenTTD Crash Report ***\n"); this->StopCrashLogFaultHandler(); @@ -682,6 +712,7 @@ char *CrashLog::FillDesyncCrashLog(char *buffer, const char *last, const DesyncE buffer = this->LogGamelog(buffer, last); buffer = this->LogRecentNews(buffer, last); buffer = this->LogCommandLog(buffer, last); + buffer = this->LogSettings(buffer, last); buffer = DumpDesyncMsgLog(buffer, last); bool have_cache_log = false; @@ -744,6 +775,7 @@ char *CrashLog::FillInconsistencyLog(char *buffer, const char *last, const Incon buffer = this->LogGamelog(buffer, last); buffer = this->LogRecentNews(buffer, last); buffer = this->LogCommandLog(buffer, last); + buffer = this->LogSettings(buffer, last); buffer = DumpDesyncMsgLog(buffer, last); if (!info.check_caches_result.empty()) { diff --git a/src/crashlog.h b/src/crashlog.h index 3afc7b8fa3..2790a08524 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -134,6 +134,7 @@ protected: char *LogGamelog(char *buffer, const char *last) const; char *LogRecentNews(char *buffer, const char *list) const; char *LogCommandLog(char *buffer, const char *last) const; + char *LogSettings(char *buffer, const char *last) const; virtual void StartCrashLogFaultHandler(); virtual void StopCrashLogFaultHandler();