Skip to content

Commit 4703308

Browse files
authored
feat: running summary of splits in demos (#354)
1 parent be920de commit 4703308

4 files changed

Lines changed: 38 additions & 0 deletions

File tree

src/Features/Speedrun/SpeedrunTimer.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,40 @@ static void recordDemoResult() {
592592
engine->demorecorder->RecordData(data.data(), data.size());
593593
}
594594

595+
static std::vector<uint8_t> buildIncompleteSummary() {
596+
std::vector<uint8_t> data({0x12});
597+
598+
appendI32(g_speedrun.splits.size(), data);
599+
600+
for (SplitInfo split : g_speedrun.splits) {
601+
appendStr(split.name, data);
602+
appendI32(split.segments.size(), data);
603+
for (Segment seg : split.segments) {
604+
appendStr(seg.name, data);
605+
appendI32(seg.ticks, data);
606+
}
607+
}
608+
609+
// category rules
610+
appendI32(1, data);
611+
auto rules = SpeedrunTimer::GetCategoryRules();
612+
appendI32(rules.size(), data);
613+
for (auto ruleName : rules) {
614+
auto rule = SpeedrunTimer::GetRule(ruleName);
615+
appendStr(ruleName, data);
616+
appendStr(rule->Describe(), data);
617+
}
618+
619+
return data;
620+
}
621+
622+
void SpeedrunTimer::RecordIncompleteSummary() {
623+
if (!SpeedrunTimer::IsRunning()) return;
624+
625+
std::vector<uint8_t> data = buildIncompleteSummary();
626+
engine->demorecorder->RecordData(data.data(), data.size());
627+
}
628+
595629
void SpeedrunTimer::Stop(std::string segName) {
596630
if (!g_speedrun.isRunning) {
597631
return;

src/Features/Speedrun/SpeedrunTimer.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ namespace SpeedrunTimer {
3333

3434
bool IsRunning();
3535

36+
void RecordIncompleteSummary();
37+
3638
void OnLoad();
3739
void CategoryChanged();
3840
}; // namespace SpeedrunTimer

src/Modules/EngineDemoPlayer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ std::string EngineDemoPlayer::GetLevelName() {
172172
// 0x0F: frametime cap detection
173173
// 0x10: queued commands
174174
// 0x11: VPK internal checksums
175+
// 0x12: incomplete speedrun summary
175176
void EngineDemoPlayer::CustomDemoData(char *data, size_t length) {
176177
if (data[0] == 0x03 || data[0] == 0x04) { // Entity input data
177178
std::optional<int> slot;

src/Modules/EngineDemoRecorder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ DETOUR(EngineDemoRecorder::SetSignonState, int state) {
171171
needToRecordInitialVals = false;
172172
RecordTimestamp();
173173
RecordQueuedCommands();
174+
SpeedrunTimer::RecordIncompleteSummary();
174175
engine->ExecuteCommand("echo \"SAR " SAR_VERSION " (Built " SAR_BUILT ")\"", true);
175176
AddDemoFileChecksums();
176177
AddDemoVpkChecksums();

0 commit comments

Comments
 (0)