diff --git a/src/Features/Speedrun/SpeedrunTimer.cpp b/src/Features/Speedrun/SpeedrunTimer.cpp index e6adfaca..1e162594 100644 --- a/src/Features/Speedrun/SpeedrunTimer.cpp +++ b/src/Features/Speedrun/SpeedrunTimer.cpp @@ -592,6 +592,40 @@ static void recordDemoResult() { engine->demorecorder->RecordData(data.data(), data.size()); } +static std::vector buildIncompleteSummary() { + std::vector data({0x12}); + + appendI32(g_speedrun.splits.size(), data); + + for (SplitInfo split : g_speedrun.splits) { + appendStr(split.name, data); + appendI32(split.segments.size(), data); + for (Segment seg : split.segments) { + appendStr(seg.name, data); + appendI32(seg.ticks, data); + } + } + + // category rules + appendI32(1, data); + auto rules = SpeedrunTimer::GetCategoryRules(); + appendI32(rules.size(), data); + for (auto ruleName : rules) { + auto rule = SpeedrunTimer::GetRule(ruleName); + appendStr(ruleName, data); + appendStr(rule->Describe(), data); + } + + return data; +} + +void SpeedrunTimer::RecordIncompleteSummary() { + if (!SpeedrunTimer::IsRunning()) return; + + std::vector data = buildIncompleteSummary(); + engine->demorecorder->RecordData(data.data(), data.size()); +} + void SpeedrunTimer::Stop(std::string segName) { if (!g_speedrun.isRunning) { return; diff --git a/src/Features/Speedrun/SpeedrunTimer.hpp b/src/Features/Speedrun/SpeedrunTimer.hpp index 351921f0..f7443608 100644 --- a/src/Features/Speedrun/SpeedrunTimer.hpp +++ b/src/Features/Speedrun/SpeedrunTimer.hpp @@ -33,6 +33,8 @@ namespace SpeedrunTimer { bool IsRunning(); + void RecordIncompleteSummary(); + void OnLoad(); void CategoryChanged(); }; // namespace SpeedrunTimer diff --git a/src/Modules/EngineDemoPlayer.cpp b/src/Modules/EngineDemoPlayer.cpp index 45e08ea5..4f10fb38 100644 --- a/src/Modules/EngineDemoPlayer.cpp +++ b/src/Modules/EngineDemoPlayer.cpp @@ -172,6 +172,7 @@ std::string EngineDemoPlayer::GetLevelName() { // 0x0F: frametime cap detection // 0x10: queued commands // 0x11: VPK internal checksums +// 0x12: incomplete speedrun summary void EngineDemoPlayer::CustomDemoData(char *data, size_t length) { if (data[0] == 0x03 || data[0] == 0x04) { // Entity input data std::optional slot; diff --git a/src/Modules/EngineDemoRecorder.cpp b/src/Modules/EngineDemoRecorder.cpp index 0e6dbaf0..9e504c7b 100644 --- a/src/Modules/EngineDemoRecorder.cpp +++ b/src/Modules/EngineDemoRecorder.cpp @@ -171,6 +171,7 @@ DETOUR(EngineDemoRecorder::SetSignonState, int state) { needToRecordInitialVals = false; RecordTimestamp(); RecordQueuedCommands(); + SpeedrunTimer::RecordIncompleteSummary(); engine->ExecuteCommand("echo \"SAR " SAR_VERSION " (Built " SAR_BUILT ")\"", true); AddDemoFileChecksums(); AddDemoVpkChecksums();