Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions GeneralsMD/Code/GameEngine/Include/GameClient/InGameUI.h
Original file line number Diff line number Diff line change
Expand Up @@ -800,6 +800,8 @@ friend class Drawable; // for selection/deselection transactions
Coord2D m_gameTimePosition;
Color m_gameTimeColor;
Color m_gameTimeDropColor;
Int m_gameTimeReservedWidth;
Int m_gameTimeFrameReservedWidth;

struct PlayerInfoList
{
Expand Down
29 changes: 27 additions & 2 deletions GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1195,6 +1195,8 @@ InGameUI::InGameUI()
m_gameTimePosition.y = kHudAnchorY;
m_gameTimeColor = GameMakeColor( 255, 255, 255, 255 );
m_gameTimeDropColor = GameMakeColor( 0, 0, 0, 255 );
m_gameTimeReservedWidth = 0;
m_gameTimeFrameReservedWidth = 0;

m_playerInfoListFont = "Tahoma";
m_playerInfoListPointSize = TheGlobalData->m_playerInfoListFontSize;
Expand Down Expand Up @@ -6096,6 +6098,28 @@ void InGameUI::refreshGameTimeResources()
GameFont* gameTimeFont = TheWindowManager->winFindFont(m_gameTimeFont, adjustedGameTimeFontSize, m_gameTimeBold);
m_gameTimeString->setFont(gameTimeFont);
m_gameTimeFrameString->setFont(gameTimeFont);

// TheSuperHackers @fix bobtista 07/07/2026 Reserve widths from the widest digit so the clock does not jitter
Int maxDigitWidth = 0;
for (WideChar digit = L'0'; digit <= L'9'; ++digit)
{
UnicodeString digitString;
digitString.concat(digit);
m_gameTimeString->setText(digitString);
Int digitWidth = m_gameTimeString->getWidth();
if (digitWidth > maxDigitWidth)
{
maxDigitWidth = digitWidth;
}
}

m_gameTimeString->setText(UnicodeString(L":"));
Int colonWidth = m_gameTimeString->getWidth();
m_gameTimeString->setText(UnicodeString(L"."));
Int dotWidth = m_gameTimeString->getWidth();

m_gameTimeReservedWidth = 6 * maxDigitWidth + 2 * colonWidth;
m_gameTimeFrameReservedWidth = dotWidth + 2 * maxDigitWidth;
}

void InGameUI::refreshPlayerInfoListResources()
Expand Down Expand Up @@ -6287,8 +6311,9 @@ void InGameUI::drawGameTime()
m_gameTimeFrameString->setText(gameTimeFrameString);

// TheSuperHackers @info this implicitly offsets the game timer from the right instead of left of the screen
int horizontalTimerOffset = TheDisplay->getWidth() - (Int)m_gameTimePosition.x - m_gameTimeString->getWidth() - m_gameTimeFrameString->getWidth();
int horizontalFrameOffset = TheDisplay->getWidth() - (Int)m_gameTimePosition.x - m_gameTimeFrameString->getWidth();
// TheSuperHackers @fix bobtista 07/07/2026 Anchor timer left to reserved widths so it stops jittering; butt frame against its live right edge
int horizontalTimerOffset = TheDisplay->getWidth() - (Int)m_gameTimePosition.x - m_gameTimeReservedWidth - m_gameTimeFrameReservedWidth;
int horizontalFrameOffset = horizontalTimerOffset + m_gameTimeString->getWidth();

m_gameTimeString->draw(horizontalTimerOffset, m_gameTimePosition.y, m_gameTimeColor, m_gameTimeDropColor);
m_gameTimeFrameString->draw(horizontalFrameOffset, m_gameTimePosition.y, GameMakeColor(180,180,180,255), m_gameTimeDropColor);
Expand Down
Loading