@@ -152,6 +152,9 @@ static int g_coopLastSyncTick;
152
152
// Orange only - the tick we synced, as reported by the engine
153
153
static int g_coopLastSyncEngineTick;
154
154
155
+ static std::string g_chatTextFormat = " !seg -> !tt (!st)" ;
156
+ static Color g_chatTextColor = Color{255 , 176 , 0 };
157
+
155
158
static void handleCoopPacket (const void *data, size_t size) {
156
159
if (!engine->IsOrange ()) return ;
157
160
@@ -445,7 +448,10 @@ void SpeedrunTimer::Start() {
445
448
g_speedrun.visitedMaps .push_back (map);
446
449
447
450
sendCoopPacket (PacketType::START);
448
- toastHud.AddToast (SPEEDRUN_TOAST_TAG, " Speedrun started!" );
451
+ if (!sar_mtrigger_legacy.GetBool ())
452
+ toastHud.AddToast (SPEEDRUN_TOAST_TAG, " Speedrun started!" );
453
+ else
454
+ client->Chat (g_chatTextColor, " Speedrun started!" );
449
455
450
456
ghostLeaderboard.SpeedrunStart (g_speedrun.saved );
451
457
}
@@ -582,6 +588,14 @@ void SpeedrunTimer::Stop(std::string segName) {
582
588
});
583
589
}
584
590
591
+ bool replace (std::string &str, const std::string &from, const std::string &to) {
592
+ size_t start_pos = str.find (from);
593
+ if (start_pos == std::string::npos)
594
+ return false ;
595
+ str.replace (start_pos, from.length (), to);
596
+ return true ;
597
+ }
598
+
585
599
void SpeedrunTimer::Split (bool newSplit, std::string segName, bool requested) {
586
600
if (!g_speedrun.isRunning ) {
587
601
return ;
@@ -621,8 +635,21 @@ void SpeedrunTimer::Split(bool newSplit, std::string segName, bool requested) {
621
635
setTimerAction (TimerAction::SPLIT);
622
636
float totalTime = SpeedrunTimer::GetTotalTicks () * *engine->interval_per_tick ;
623
637
float splitTime = g_speedrun.splits .back ().ticks * *engine->interval_per_tick ;
624
- std::string text = Utils::ssprintf (" %s\n %s (%s)" , segName.c_str (), SpeedrunTimer::Format (totalTime).c_str (), SpeedrunTimer::Format (splitTime).c_str ());
625
- toastHud.AddToast (SPEEDRUN_TOAST_TAG, text);
638
+ if (!sar_mtrigger_legacy.GetBool ()) {
639
+ std::string text = Utils::ssprintf (" %s\n %s (%s)" , segName.c_str (), SpeedrunTimer::Format (totalTime).c_str (), SpeedrunTimer::Format (splitTime).c_str ());
640
+ toastHud.AddToast (SPEEDRUN_TOAST_TAG, text);
641
+ } else {
642
+ std::string cleanSegName = segName;
643
+ replace (cleanSegName, GetCategoryName () + " - " , " " );
644
+
645
+ std::string formattedString = g_chatTextFormat;
646
+ replace (formattedString, " !map" , GetCategoryName ());
647
+ replace (formattedString, " !seg" , cleanSegName);
648
+ replace (formattedString, " !tt" , SpeedrunTimer::Format (totalTime));
649
+ replace (formattedString, " !st" , SpeedrunTimer::Format (splitTime));
650
+
651
+ client->Chat (g_chatTextColor, formattedString.c_str ());
652
+ }
626
653
}
627
654
}
628
655
@@ -762,6 +789,8 @@ Variable sar_speedrun_start_on_load("sar_speedrun_start_on_load", "0", 0, 2, "Au
762
789
Variable sar_speedrun_offset (" sar_speedrun_offset" , " 0" , 0 , " Start speedruns with this time on the timer.\n " , 0 );
763
790
Variable sar_speedrun_autostop (" sar_speedrun_autostop" , " 0" , 0 , 2 , " Automatically stop recording demos when a speedrun finishes. If 2, automatically append the run time to the demo name.\n " );
764
791
792
+ Variable sar_mtrigger_legacy (" sar_mtrigger_legacy" , " 0" , 0 , 1 , " \n " );
793
+
765
794
CON_COMMAND (sar_speedrun_start, " sar_speedrun_start - start the speedrun timer\n " ) {
766
795
SpeedrunTimer::Start ();
767
796
}
@@ -1035,3 +1064,32 @@ ON_EVENT(PRE_TICK) {
1035
1064
engine->ExecuteCommand (" restart_level" );
1036
1065
}
1037
1066
}
1067
+
1068
+ CON_COMMAND (sar_mtrigger_legacy_format, " sar_mtrigger_legacy_format <string format> - formatting of the text that is displayed in the chat (!map - for map name, !seg - for segment name, !tt - for total time, !st - for split time). ( def. \" !seg -> !tt (!st)\" )\n " ) {
1069
+ if (args.ArgC () != 2 ) {
1070
+ console->Print (sar_mtrigger_legacy_format.ThisPtr ()->m_pszHelpString );
1071
+ return ;
1072
+ }
1073
+
1074
+ g_chatTextFormat = args[1 ];
1075
+ }
1076
+
1077
+ CON_COMMAND (sar_mtrigger_legacy_textcolor, " sar_mtrigger_legacy_textcolor <hex code> - the color of the text that is displayed in the chat.\n " ) {
1078
+ if (args.ArgC () != 2 ) {
1079
+ console->Print (sar_mtrigger_legacy_textcolor.ThisPtr ()->m_pszHelpString );
1080
+ return ;
1081
+ }
1082
+
1083
+ const char *color = args[1 ];
1084
+ if (color[0 ] == ' #' ) {
1085
+ ++color;
1086
+ }
1087
+
1088
+ int r, g, b;
1089
+ int end;
1090
+ if (sscanf (color, " %2x%2x%2x%n" , &r, &g, &b, &end) != 3 || end != 6 ) {
1091
+ return console->Print (" Invalid color code!\n " );
1092
+ }
1093
+
1094
+ g_chatTextColor = Color{(uint8_t )r, (uint8_t )g, (uint8_t )b};
1095
+ }
0 commit comments