From 21fee81ce1e9352f4fffd0a52e7944b76a0f426b Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sun, 8 Feb 2026 23:41:54 +0100 Subject: [PATCH 1/6] Added logic for an additional column. --- .../GUI/GUICallbacks/Menus/ReplayMenu.cpp | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp index e8c130c4d31..3d5add97f75 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp @@ -241,6 +241,7 @@ void PopulateReplayFileListbox(GameWindow *listbox) GadgetListBoxReset(listbox); const Int listboxLength = GadgetListBoxGetListLength(listbox); + const Int columns = GadgetListBoxGetNumColumns(listbox); // TheSuperHackers @tweak xezon 08/06/2025 Now shows missing maps in red color. enum { @@ -291,8 +292,16 @@ void PopulateReplayFileListbox(GameWindow *listbox) UnicodeString replayNameToShow = createReplayName(asciistr); // TheSuperHackers @tweak Caball009 07/02/2025 Display both time and date instead of only time. + const UnicodeString displayTimeBuffer = getUnicodeTimeBuffer(header.timeVal); + const UnicodeString displayDateBuffer = getUnicodeDateBuffer(header.timeVal); + UnicodeString displayDateTimeBuffer; - displayDateTimeBuffer.format(L"%s %s", getUnicodeTimeBuffer(header.timeVal).str(), getUnicodeDateBuffer(header.timeVal).str()); + if (columns == 4) + { + // TheSuperHackers @info Caball009 09/02/2025 The original replay window menu has only 4 columns. + // Concatenate time and date for a single column if there aren't two dedicated columns for time and date. + displayDateTimeBuffer.format(L"%s %s", displayTimeBuffer.str(), displayDateBuffer.str()); + } // version (no-op) @@ -353,9 +362,19 @@ void PopulateReplayFileListbox(GameWindow *listbox) const Int insertionIndex = GadgetListBoxAddEntryText(listbox, replayNameToShow, color, -1, 0); DEBUG_ASSERTCRASH(insertionIndex >= 0, ("Expects valid index")); - GadgetListBoxAddEntryText(listbox, displayDateTimeBuffer, color, insertionIndex, 1); - GadgetListBoxAddEntryText(listbox, header.versionString, color, insertionIndex, 2); - GadgetListBoxAddEntryText(listbox, mapStr, mapColor, insertionIndex, 3); + if (columns == 4) + { + GadgetListBoxAddEntryText(listbox, displayDateTimeBuffer, color, insertionIndex, 1); + GadgetListBoxAddEntryText(listbox, header.versionString, color, insertionIndex, 2); + GadgetListBoxAddEntryText(listbox, mapStr, mapColor, insertionIndex, 3); + } + else if (columns == 5) + { + GadgetListBoxAddEntryText(listbox, displayTimeBuffer, color, insertionIndex, 1); + GadgetListBoxAddEntryText(listbox, displayDateBuffer, color, insertionIndex, 2); + GadgetListBoxAddEntryText(listbox, header.versionString, color, insertionIndex, 3); + GadgetListBoxAddEntryText(listbox, mapStr, mapColor, insertionIndex, 4); + } // TheSuperHackers @performance Now stops processing when the list is full. if (insertionIndex == listboxLength - 1) From eab7fee3fa2fdd67f8040b79e112a50ba5838281 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sun, 8 Feb 2026 23:44:30 +0100 Subject: [PATCH 2/6] Changed comment. --- .../Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp index 3d5add97f75..610f350ce0f 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp @@ -298,7 +298,7 @@ void PopulateReplayFileListbox(GameWindow *listbox) UnicodeString displayDateTimeBuffer; if (columns == 4) { - // TheSuperHackers @info Caball009 09/02/2025 The original replay window menu has only 4 columns. + // TheSuperHackers @info Caball009 09/02/2025 The original replay window menu has only four columns. // Concatenate time and date for a single column if there aren't two dedicated columns for time and date. displayDateTimeBuffer.format(L"%s %s", displayTimeBuffer.str(), displayDateBuffer.str()); } From 1e43fa14b2723bb98ce483757c00dd3991d2e953 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 9 Feb 2026 19:42:26 +0100 Subject: [PATCH 3/6] Added assertion for unexpected column counts. --- .../Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp index 610f350ce0f..af0d2ba8230 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp @@ -375,6 +375,10 @@ void PopulateReplayFileListbox(GameWindow *listbox) GadgetListBoxAddEntryText(listbox, header.versionString, color, insertionIndex, 3); GadgetListBoxAddEntryText(listbox, mapStr, mapColor, insertionIndex, 4); } + else + { + DEBUG_CRASH(("Replay menu uses %d columns; expected either 4 or 5", columns)); + } // TheSuperHackers @performance Now stops processing when the list is full. if (insertionIndex == listboxLength - 1) From acb68e382c9f71c2c6a6a4966922df71fc90d9fd Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 9 Feb 2026 20:07:14 +0100 Subject: [PATCH 4/6] Optimized code. --- .../GUI/GUICallbacks/Menus/ReplayMenu.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp index af0d2ba8230..e55933394b6 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp @@ -295,14 +295,6 @@ void PopulateReplayFileListbox(GameWindow *listbox) const UnicodeString displayTimeBuffer = getUnicodeTimeBuffer(header.timeVal); const UnicodeString displayDateBuffer = getUnicodeDateBuffer(header.timeVal); - UnicodeString displayDateTimeBuffer; - if (columns == 4) - { - // TheSuperHackers @info Caball009 09/02/2025 The original replay window menu has only four columns. - // Concatenate time and date for a single column if there aren't two dedicated columns for time and date. - displayDateTimeBuffer.format(L"%s %s", displayTimeBuffer.str(), displayDateBuffer.str()); - } - // version (no-op) // map @@ -364,6 +356,11 @@ void PopulateReplayFileListbox(GameWindow *listbox) DEBUG_ASSERTCRASH(insertionIndex >= 0, ("Expects valid index")); if (columns == 4) { + // TheSuperHackers @info Caball009 09/02/2025 The original replay window menu has only four columns. + // Concatenate time and date for a single column if there aren't two dedicated columns for time and date. + UnicodeString displayDateTimeBuffer; + displayDateTimeBuffer.format(L"%s %s", displayTimeBuffer.str(), displayDateBuffer.str()); + GadgetListBoxAddEntryText(listbox, displayDateTimeBuffer, color, insertionIndex, 1); GadgetListBoxAddEntryText(listbox, header.versionString, color, insertionIndex, 2); GadgetListBoxAddEntryText(listbox, mapStr, mapColor, insertionIndex, 3); From ecfd2b491e2bdca8168c15c31466a75b134edb5c Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 9 Feb 2026 23:14:44 +0100 Subject: [PATCH 5/6] Moved and improved comment. --- .../Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp index e55933394b6..aa8ad467cc8 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp @@ -354,10 +354,11 @@ void PopulateReplayFileListbox(GameWindow *listbox) const Int insertionIndex = GadgetListBoxAddEntryText(listbox, replayNameToShow, color, -1, 0); DEBUG_ASSERTCRASH(insertionIndex >= 0, ("Expects valid index")); + + // TheSuperHackers @info Caball009 09/02/2026 Original replay menu has 4 columns; the code now supports a future 5-column layout. + // If there aren't two columns for time and date, concatenate them for a single column. if (columns == 4) { - // TheSuperHackers @info Caball009 09/02/2025 The original replay window menu has only four columns. - // Concatenate time and date for a single column if there aren't two dedicated columns for time and date. UnicodeString displayDateTimeBuffer; displayDateTimeBuffer.format(L"%s %s", displayTimeBuffer.str(), displayDateBuffer.str()); From fb09c12accd625a4a314ef828d5bb709d0a8022a Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Tue, 10 Feb 2026 00:04:25 +0100 Subject: [PATCH 6/6] Replicated in Generals. --- .../GUI/GUICallbacks/Menus/ReplayMenu.cpp | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp index 1ff279c2b28..af536f42ef0 100644 --- a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp @@ -241,6 +241,7 @@ void PopulateReplayFileListbox(GameWindow *listbox) GadgetListBoxReset(listbox); const Int listboxLength = GadgetListBoxGetListLength(listbox); + const Int columns = GadgetListBoxGetNumColumns(listbox); // TheSuperHackers @tweak xezon 08/06/2025 Now shows missing maps in red color. enum { @@ -291,8 +292,8 @@ void PopulateReplayFileListbox(GameWindow *listbox) UnicodeString replayNameToShow = createReplayName(asciistr); // TheSuperHackers @tweak Caball009 07/02/2025 Display both time and date instead of only time. - UnicodeString displayDateTimeBuffer; - displayDateTimeBuffer.format(L"%s %s", getUnicodeTimeBuffer(header.timeVal).str(), getUnicodeDateBuffer(header.timeVal).str()); + const UnicodeString displayTimeBuffer = getUnicodeTimeBuffer(header.timeVal); + const UnicodeString displayDateBuffer = getUnicodeDateBuffer(header.timeVal); // version (no-op) @@ -353,9 +354,29 @@ void PopulateReplayFileListbox(GameWindow *listbox) const Int insertionIndex = GadgetListBoxAddEntryText(listbox, replayNameToShow, color, -1, 0); DEBUG_ASSERTCRASH(insertionIndex >= 0, ("Expects valid index")); - GadgetListBoxAddEntryText(listbox, displayDateTimeBuffer, color, insertionIndex, 1); - GadgetListBoxAddEntryText(listbox, header.versionString, color, insertionIndex, 2); - GadgetListBoxAddEntryText(listbox, mapStr, mapColor, insertionIndex, 3); + + // TheSuperHackers @info Caball009 09/02/2026 Original replay menu has 4 columns; the code now supports a future 5-column layout. + // If there aren't two columns for time and date, concatenate them for a single column. + if (columns == 4) + { + UnicodeString displayDateTimeBuffer; + displayDateTimeBuffer.format(L"%s %s", displayTimeBuffer.str(), displayDateBuffer.str()); + + GadgetListBoxAddEntryText(listbox, displayDateTimeBuffer, color, insertionIndex, 1); + GadgetListBoxAddEntryText(listbox, header.versionString, color, insertionIndex, 2); + GadgetListBoxAddEntryText(listbox, mapStr, mapColor, insertionIndex, 3); + } + else if (columns == 5) + { + GadgetListBoxAddEntryText(listbox, displayTimeBuffer, color, insertionIndex, 1); + GadgetListBoxAddEntryText(listbox, displayDateBuffer, color, insertionIndex, 2); + GadgetListBoxAddEntryText(listbox, header.versionString, color, insertionIndex, 3); + GadgetListBoxAddEntryText(listbox, mapStr, mapColor, insertionIndex, 4); + } + else + { + DEBUG_CRASH(("Replay menu uses %d columns; expected either 4 or 5", columns)); + } // TheSuperHackers @performance Now stops processing when the list is full. if (insertionIndex == listboxLength - 1)