将游戏HUD重构为左右双栏布局并修复信息遮挡

This commit is contained in:
2026-04-25 20:34:22 +08:00
parent f6eb64f6ac
commit 200ee86962
2 changed files with 193 additions and 246 deletions
+2 -2
View File
@@ -12,10 +12,10 @@ constexpr int nGameHeight = 20;
constexpr int nWidth = 16;
constexpr int nHeight = 22;
constexpr int WINDOW_PADDING = 28;
constexpr int SIDE_PANEL_WIDTH = 320;
constexpr int SIDE_PANEL_WIDTH = 280;
constexpr int SIDE_PANEL_GAP = 28;
constexpr int SIDE_PANEL_HEIGHT = 760;
constexpr int WINDOW_CLIENT_WIDTH = WINDOW_PADDING * 2 + nGameWidth * GRID + SIDE_PANEL_GAP + SIDE_PANEL_WIDTH;
constexpr int WINDOW_CLIENT_WIDTH = WINDOW_PADDING * 2 + nGameWidth * GRID + SIDE_PANEL_GAP * 2 + SIDE_PANEL_WIDTH * 2;
constexpr int BOARD_CLIENT_HEIGHT = WINDOW_PADDING * 2 + nGameHeight * GRID + 20;
constexpr int WINDOW_CLIENT_HEIGHT = (BOARD_CLIENT_HEIGHT > SIDE_PANEL_HEIGHT) ? BOARD_CLIENT_HEIGHT : SIDE_PANEL_HEIGHT;
+191 -244
View File
@@ -45,15 +45,23 @@ void TDrawScreen(HDC hdc, HWND hWnd)
int boardWidth = grid * nGameWidth;
int boardHeight = grid * nGameHeight;
const RECT gameRect =
const RECT leftPanelRect =
{
SX(WINDOW_PADDING),
SY(WINDOW_PADDING),
SX(WINDOW_PADDING) + boardWidth,
SX(WINDOW_PADDING) + panelWidth,
SY(WINDOW_PADDING) + panelHeight
};
const RECT gameRect =
{
leftPanelRect.right + panelGap,
SY(WINDOW_PADDING),
leftPanelRect.right + panelGap + boardWidth,
SY(WINDOW_PADDING) + boardHeight
};
const RECT panelRect =
const RECT rightPanelRect =
{
gameRect.right + panelGap,
SY(WINDOW_PADDING),
@@ -397,7 +405,8 @@ void TDrawScreen(HDC hdc, HWND hWnd)
oldBrush = (HBRUSH)SelectObject(hdc, gameCardBrush);
RoundRect(hdc, gameRect.left - SS(10), gameRect.top - SS(10), gameRect.right + SS(10), gameRect.bottom + SS(10), SS(28), SS(28));
SelectObject(hdc, panelBrush);
RoundRect(hdc, panelRect.left, panelRect.top, panelRect.right, panelRect.bottom, SS(30), SS(30));
RoundRect(hdc, leftPanelRect.left, leftPanelRect.top, leftPanelRect.right, leftPanelRect.bottom, SS(30), SS(30));
RoundRect(hdc, rightPanelRect.left, rightPanelRect.top, rightPanelRect.right, rightPanelRect.bottom, SS(30), SS(30));
SelectObject(hdc, oldBrush);
SelectObject(hdc, oldPen);
DeleteObject(gameCardBrush);
@@ -574,12 +583,14 @@ void TDrawScreen(HDC hdc, HWND hWnd)
HFONT oldFont = (HFONT)SelectObject(hdc, titleFont);
SetTextColor(hdc, titleColor);
TextOut(hdc, panelRect.left + SS(24), panelRect.top + SS(22), _T("\u4fc4\u7f57\u65af\u65b9\u5757"), lstrlen(_T("\u4fc4\u7f57\u65af\u65b9\u5757")));
TextOut(hdc, leftPanelRect.left + SS(24), leftPanelRect.top + SS(22), _T("\u5bf9\u5c40\u4fe1\u606f"), lstrlen(_T("\u5bf9\u5c40\u4fe1\u606f")));
HPEN accentPen = CreatePen(PS_SOLID, SS(3), accentColor);
oldPen = (HPEN)SelectObject(hdc, accentPen);
MoveToEx(hdc, panelRect.left + SS(24), panelRect.top + SS(68), nullptr);
LineTo(hdc, panelRect.left + SS(160), panelRect.top + SS(68));
MoveToEx(hdc, leftPanelRect.left + SS(24), leftPanelRect.top + SS(68), nullptr);
LineTo(hdc, leftPanelRect.left + SS(160), leftPanelRect.top + SS(68));
MoveToEx(hdc, rightPanelRect.left + SS(24), rightPanelRect.top + SS(68), nullptr);
LineTo(hdc, rightPanelRect.left + SS(188), rightPanelRect.top + SS(68));
SelectObject(hdc, oldPen);
DeleteObject(accentPen);
@@ -588,10 +599,10 @@ void TDrawScreen(HDC hdc, HWND hWnd)
RECT overviewRect =
{
panelRect.left + SS(20),
panelRect.top + SS(92),
panelRect.right - SS(20),
panelRect.top + SS(208)
leftPanelRect.left + SS(20),
leftPanelRect.top + SS(92),
leftPanelRect.right - SS(20),
leftPanelRect.top + SS(208)
};
DrawPanelCard(overviewRect, RGB(255, 247, 250), RGB(233, 191, 208), 24);
@@ -612,10 +623,10 @@ void TDrawScreen(HDC hdc, HWND hWnd)
{
RECT progressRect =
{
panelRect.left + SS(20),
panelRect.top + SS(224),
panelRect.right - SS(20),
panelRect.top + SS(364)
leftPanelRect.left + SS(20),
leftPanelRect.top + SS(224),
leftPanelRect.right - SS(20),
leftPanelRect.top + SS(356)
};
DrawPanelCard(progressRect, RGB(255, 248, 251), RGB(233, 191, 208), 24);
@@ -672,10 +683,10 @@ void TDrawScreen(HDC hdc, HWND hWnd)
RECT combatRect =
{
panelRect.left + SS(20),
panelRect.top + SS(382),
panelRect.right - SS(20),
panelRect.top + SS(492)
leftPanelRect.left + SS(20),
leftPanelRect.top + SS(374),
leftPanelRect.right - SS(20),
leftPanelRect.top + SS(516)
};
DrawPanelCard(combatRect, RGB(255, 247, 250), RGB(233, 191, 208), 24);
@@ -697,219 +708,74 @@ void TDrawScreen(HDC hdc, HWND hWnd)
upgradeUiState.totalChosenCount);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(82), summaryText, lstrlen(summaryText));
SelectObject(hdc, smallFont);
SetTextColor(hdc, RGB(122, 95, 110));
RECT combatBodyRect =
{
combatRect.left + SS(18),
combatRect.top + SS(112),
combatRect.right - SS(18),
combatRect.bottom - SS(16)
};
TCHAR combatSummary[512];
combatSummary[0] = _T('\0');
_stprintf_s(
combatSummary + lstrlen(combatSummary),
512 - lstrlen(combatSummary),
_T("\u5f97\u5206 %d%% EXP %d%% \u901f\u5ea6 %dms\r\n"),
rogueStats.scoreMultiplierPercent,
rogueStats.expMultiplierPercent,
currentFallInterval);
if (rogueStats.sweeperLevel > 0)
{
TCHAR sweeperText[96];
int sweeperThreshold = 8 - (rogueStats.sweeperLevel - 1) * 2;
if (sweeperThreshold < 3)
{
sweeperThreshold = 3;
}
_stprintf_s(sweeperText, _T("\u6e05\u626b\u8005 %d / %d"), rogueStats.sweeperCharge, sweeperThreshold);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(114), sweeperText, lstrlen(sweeperText));
_stprintf_s(combatSummary + lstrlen(combatSummary), 512 - lstrlen(combatSummary), _T("\u6e05\u626b\u8005 %d/%d\r\n"), rogueStats.sweeperCharge, sweeperThreshold);
}
if (rogueStats.explosiveLevel > 0)
{
TCHAR explosiveText[96];
_stprintf_s(
explosiveText,
_T("\u7206\u7834\u8ba1\u6570 %d / 10 %s"),
rogueStats.explosivePieceCounter,
currentPieceIsExplosive ? _T("\u672c\u5757\u5df2\u7206\u7834") : _T("\u672c\u5757\u666e\u901a"));
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(146), explosiveText, lstrlen(explosiveText));
}
if (rogueStats.crossPieceLevel > 0)
{
TCHAR crossText[96];
int crossChance = 8 + (rogueStats.crossPieceLevel - 1) * 6;
if (crossChance > 28)
{
crossChance = 28;
}
_stprintf_s(crossText, _T("\u5341\u5b57\u6982\u7387 %d%% %s"), crossChance, currentPieceIsCross ? _T("\u672c\u5757\u5df2\u5341\u5b57") : _T("\u672c\u5757\u666e\u901a"));
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(178), crossText, lstrlen(crossText));
}
if (rogueStats.rainbowPieceLevel > 0)
{
TCHAR rainbowText[128];
_stprintf_s(
rainbowText,
_T("\u5f69\u8679\u6982\u7387 12%% %s"),
currentPieceIsRainbow ? _T("\u672c\u5757\u5df2\u5f69\u8679") :
(rogueStats.pendingRainbowPieceCount > 0 ? _T("\u4e0b\u4e00\u5757\u5f69\u8679") : _T("\u672c\u5757\u666e\u901a")));
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(210), rainbowText, lstrlen(rainbowText));
}
if (rogueStats.laserLevel > 0)
{
TCHAR laserText[96];
int laserChance = 10 + (rogueStats.laserLevel - 1) * 8;
if (laserChance > 35)
{
laserChance = 35;
}
_stprintf_s(laserText, _T("\u6fc0\u5149\u6982\u7387 %d%% %s"), laserChance, currentPieceIsLaser ? _T("\u672c\u5757\u5df2\u6fc0\u5149") : _T("\u672c\u5757\u666e\u901a"));
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(338), laserText, lstrlen(laserText));
}
if (rogueStats.thunderTetrisLevel > 0)
{
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(370), _T("\u96f7\u9706\u56db\u6d88 \u56db\u6d88\u52a0\u6e05 2 \u884c"), lstrlen(_T("\u96f7\u9706\u56db\u6d88 \u56db\u6d88\u52a0\u6e05 2 \u884c")));
}
if (rogueStats.thunderLaserLevel > 0)
{
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(402), _T("\u96f7\u9706\u6fc0\u5149 \u56db\u6d88\u52a0\u6fc0\u5149 2 \u5217"), lstrlen(_T("\u96f7\u9706\u6fc0\u5149 \u56db\u6d88\u52a0\u6fc0\u5149 2 \u5217")));
}
if (rogueStats.feverLevel > 0)
{
TCHAR feverText[128];
_stprintf_s(feverText, _T("\u72c2\u70ed\u5145\u80fd %d / 20 \u5269\u4f59 %d \u79d2 \u7279\u5757\u51fa\u73b0\u7387\u63d0\u9ad8"), rogueStats.feverLineCharge, rogueStats.feverTicks);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(434), feverText, lstrlen(feverText));
_stprintf_s(combatSummary + lstrlen(combatSummary), 512 - lstrlen(combatSummary), _T("\u72c2\u70ed\u5145\u80fd %d/20 \u5269\u4f59 %d \u79d2\r\n"), rogueStats.feverLineCharge, rogueStats.feverTicks);
}
if (rogueStats.rageStackLevel > 0)
if (rogueStats.explosiveLevel > 0)
{
TCHAR rageText[96];
_stprintf_s(rageText, _T("\u66b4\u8d70\u5806\u53e0 \u8fde\u51fb %d"), rogueStats.comboChain);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(466), rageText, lstrlen(rageText));
_stprintf_s(combatSummary + lstrlen(combatSummary), 512 - lstrlen(combatSummary), _T("\u7206\u7834\u8ba1\u6570 %d/10 %s\r\n"), rogueStats.explosivePieceCounter, currentPieceIsExplosive ? _T("\u672c\u5757\u5df2\u7206\u7834") : _T("\u5f85\u89e6\u53d1"));
}
if (rogueStats.infiniteFeverLevel > 0)
if (rogueStats.laserLevel > 0 || rogueStats.crossPieceLevel > 0 || rogueStats.rainbowPieceLevel > 0)
{
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(498), _T("\u65e0\u9650\u72c2\u70ed \u6d88\u884c\u53ef\u5ef6\u957f\u65f6\u95f4"), lstrlen(_T("\u65e0\u9650\u72c2\u70ed \u6d88\u884c\u53ef\u5ef6\u957f\u65f6\u95f4")));
_stprintf_s(
combatSummary + lstrlen(combatSummary),
512 - lstrlen(combatSummary),
_T("\u7279\u5757\uff1a%s%s%s\r\n"),
rogueStats.laserLevel > 0 ? _T("\u6fc0\u5149 ") : _T(""),
rogueStats.crossPieceLevel > 0 ? _T("\u5341\u5b57 ") : _T(""),
rogueStats.rainbowPieceLevel > 0 ? _T("\u5f69\u8679") : _T(""));
}
if (rogueStats.screenBombLevel > 0)
if (rogueStats.screenBombLevel > 0 || rogueStats.blackHoleLevel > 0 || rogueStats.reshapeLevel > 0)
{
TCHAR bombText[96];
_stprintf_s(bombText, _T("\u6e05\u5c4f\u70b8\u5f39 %d / 30 \u5e93\u5b58 %d X \u4e3b\u52a8\u91ca\u653e"), rogueStats.screenBombCharge, rogueStats.screenBombCount);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(530), bombText, lstrlen(bombText));
_stprintf_s(
combatSummary + lstrlen(combatSummary),
512 - lstrlen(combatSummary),
_T("\u4e3b\u52a8\uff1aX %d Z %d V %d\r\n"),
rogueStats.screenBombCount,
rogueStats.blackHoleCharges,
rogueStats.reshapeCharges);
}
if (rogueStats.blackHoleLevel > 0)
if (rogueStats.highPressureLevel > 0 || rogueStats.tetrisGambleLevel > 0 || rogueStats.extremePlayerLevel > 0)
{
TCHAR blackHoleText[96];
_stprintf_s(blackHoleText, _T("\u9ed1\u6d1e \u5e93\u5b58 %d Z \u4e3b\u52a8\u91ca\u653e"), rogueStats.blackHoleCharges);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(818), blackHoleText, lstrlen(blackHoleText));
}
if (rogueStats.reshapeLevel > 0)
{
TCHAR reshapeText[96];
_stprintf_s(reshapeText, _T("\u7a7a\u4e2d\u6362\u5f62 \u5e93\u5b58 %d V \u53d8\u4e3a I \u5757"), rogueStats.reshapeCharges);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(850), reshapeText, lstrlen(reshapeText));
}
if (rogueStats.voidCoreLevel > 0)
{
TCHAR voidText[128];
_stprintf_s(voidText, _T("\u865a\u7a7a\u6838\u5fc3 \u9ed1\u6d1e\u540e\u989d\u5916\u751f\u6210\u5f69\u8679\uff0c\u5f69\u8679\u6d88\u884c\u89e6\u53d1\u5c0f\u578b\u9ed1\u6d1e"));
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(882), voidText, lstrlen(voidText));
}
if (rogueStats.terminalClearLevel > 0)
{
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(562), _T("\u7ec8\u672b\u6e05\u573a \u6fc0\u6d3b\u6700\u540e\u4e00\u640f\u65f6\u81ea\u52a8\u89e6\u53d1"), lstrlen(_T("\u7ec8\u672b\u6e05\u573a \u6fc0\u6d3b\u6700\u540e\u4e00\u640f\u65f6\u81ea\u52a8\u89e6\u53d1")));
}
if (rogueStats.perfectRotateLevel > 0)
{
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(594), _T("\u5b8c\u7f8e\u65cb\u8f6c \u65cb\u8f6c\u5931\u8d25\u65f6\u81ea\u52a8\u4fee\u6b63"), lstrlen(_T("\u5b8c\u7f8e\u65cb\u8f6c \u65cb\u8f6c\u5931\u8d25\u65f6\u81ea\u52a8\u4fee\u6b63")));
}
if (rogueStats.timeDilationLevel > 0)
{
TCHAR dilationText[128];
_stprintf_s(dilationText, _T("\u65f6\u95f4\u7f13\u6d41 \u5269\u4f59 %d \u79d2 \u9ad8\u5ea6>15\u65f6\u89e6\u53d1 8 \u79d2 30%%\u51cf\u901f"), rogueStats.timeDilationTicks);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(626), dilationText, lstrlen(dilationText));
}
if (rogueStats.highPressureLevel > 0)
{
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(658), _T("\u9ad8\u538b\u5956\u52b1 \u901f\u5ea6\u66f4\u5feb\uff0c\u5f97\u5206 / EXP x1.5"), lstrlen(_T("\u9ad8\u538b\u5956\u52b1 \u901f\u5ea6\u66f4\u5feb\uff0c\u5f97\u5206 / EXP x1.5")));
}
if (rogueStats.tetrisGambleLevel > 0)
{
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(690), _T("\u8d4c\u547d\u56db\u6d88 1~3\u6d88\u5f97\u5206 x0.5 4\u6d88\u5f97\u5206 x4"), lstrlen(_T("\u8d4c\u547d\u56db\u6d88 1~3\u6d88\u5f97\u5206 x0.5 4\u6d88\u5f97\u5206 x4")));
}
if (rogueStats.extremePlayerLevel > 0)
{
TCHAR extremeText[128];
_stprintf_s(extremeText, _T("\u6781\u9650\u73a9\u5bb6 \u7f13\u901f %d \u5371\u9669 %d \u8ddd\u4e0b\u6b21\u589e\u538b %d \u79d2"), rogueStats.extremeSlowTicks, rogueStats.extremeDangerLevel, rogueStats.extremeDangerTicks);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(722), extremeText, lstrlen(extremeText));
}
if (rogueStats.controlMasterLevel > 0)
{
TCHAR controlText[96];
_stprintf_s(controlText, _T("\u64cd\u63a7\u5927\u5e08 Hold \u7f13\u901f\u5269\u4f59 %d"), rogueStats.holdSlowTicks);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(754), controlText, lstrlen(controlText));
}
if (rogueStats.blockStormLevel > 0)
{
TCHAR stormText[96];
_stprintf_s(stormText, _T("\u65b9\u5757\u98ce\u66b4 \u5269\u4f59 I \u5757 %d"), rogueStats.blockStormPiecesRemaining + 3);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(786), stormText, lstrlen(stormText));
}
if (rogueStats.chainBlastLevel > 0)
{
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(274), _T("\u8fde\u9501\u7206\u7834 \u5df2\u89e3\u9501"), lstrlen(_T("\u8fde\u9501\u7206\u7834 \u5df2\u89e3\u9501")));
}
if (rogueStats.chainBombLevel > 0)
{
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(306), _T("\u8fde\u73af\u70b8\u5f39 5x5 + \u4e8c\u6b21\u7206\u70b8"), lstrlen(_T("\u8fde\u73af\u70b8\u5f39 5x5 + \u4e8c\u6b21\u7206\u70b8")));
}
if (rogueStats.doubleGrowthLevel > 0)
{
TCHAR growthText[96];
_stprintf_s(growthText, _T("\u6210\u957f\u6838\u5fc3 +15%% Score / +15%% EXP"));
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(178), growthText, lstrlen(growthText));
}
int tunedPieces = 0;
for (int pieceType = 0; pieceType < 7; pieceType++)
{
if (rogueStats.pieceTuningLevels[pieceType] > 0)
{
tunedPieces++;
}
}
if (tunedPieces > 0)
{
TCHAR luckyText[96];
_stprintf_s(luckyText, _T("\u65b9\u5757\u6539\u9020 %d \u79cd\u5df2\u8c03\u6574"), tunedPieces);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(210), luckyText, lstrlen(luckyText));
}
if (rogueStats.gamblerLevel > 0)
{
TCHAR gamblerText[96];
int variance = 20 + (rogueStats.gamblerLevel - 1) * 10;
if (variance > 40)
{
variance = 40;
}
_stprintf_s(gamblerText, _T("\u8d4c\u5f92\u6982\u7387 \u53cc\u500d/%u\u6548 %d%%"), variance, variance);
TextOut(hdc, combatRect.left + SS(18), combatRect.top + SS(242), gamblerText, lstrlen(gamblerText));
_stprintf_s(combatSummary + lstrlen(combatSummary), 512 - lstrlen(combatSummary), _T("\u98ce\u9669\u7ebf\u5df2\u542f\u7528\r\n"));
}
DrawText(hdc, combatSummary, -1, &combatBodyRect, DT_LEFT | DT_TOP | DT_WORDBREAK);
RECT upgradeListRect =
{
panelRect.left + SS(20),
panelRect.top + SS(510),
panelRect.right - SS(20),
panelRect.top + SS(676)
leftPanelRect.left + SS(20),
leftPanelRect.top + SS(534),
leftPanelRect.right - SS(20),
leftPanelRect.bottom - SS(20)
};
DrawPanelCard(upgradeListRect, RGB(255, 248, 251), RGB(233, 191, 208), 24);
@@ -1112,33 +978,63 @@ void TDrawScreen(HDC hdc, HWND hWnd)
}
else
{
RECT classicInfoRect =
{
leftPanelRect.left + SS(20),
leftPanelRect.top + SS(224),
leftPanelRect.right - SS(20),
leftPanelRect.top + SS(360)
};
DrawPanelCard(classicInfoRect, RGB(255, 248, 251), RGB(233, 191, 208), 24);
SelectObject(hdc, smallFont);
SetTextColor(hdc, RGB(128, 104, 118));
TextOut(hdc, panelRect.left + SS(24), panelRect.top + SS(232), _T("\u7ecf\u5178\u6a21\u5f0f\u4fdd\u6301\u539f\u7248\u7b80\u5355\u8ba1\u5206"), lstrlen(_T("\u7ecf\u5178\u6a21\u5f0f\u4fdd\u6301\u539f\u7248\u7b80\u5355\u8ba1\u5206")));
TextOut(hdc, panelRect.left + SS(24), panelRect.top + SS(260), _T("\u6682\u4e0d\u63a5\u5165\u7b49\u7ea7\u548c\u5f3a\u5316\u7cfb\u7edf"), lstrlen(_T("\u6682\u4e0d\u63a5\u5165\u7b49\u7ea7\u548c\u5f3a\u5316\u7cfb\u7edf")));
SelectObject(hdc, sectionFont);
SetTextColor(hdc, textColor);
RECT classicBodyRect =
{
classicInfoRect.left + SS(18),
classicInfoRect.top + SS(18),
classicInfoRect.right - SS(18),
classicInfoRect.bottom - SS(18)
};
DrawText(hdc, _T("\u7ecf\u5178\u6a21\u5f0f\u4fdd\u6301\u539f\u7248\u7b80\u5355\u8ba1\u5206\u3002\r\n\r\n\u6682\u4e0d\u63a5\u5165\u7b49\u7ea7\u3001EXP \u548c\u5f3a\u5316\u7cfb\u7edf\uff0c\u4e13\u6ce8\u4e8e\u57fa\u7840\u4fc4\u7f57\u65af\u65b9\u5757\u5bf9\u5c40\u3002"), -1, &classicBodyRect, DT_LEFT | DT_TOP | DT_WORDBREAK);
}
SelectObject(hdc, titleFont);
SetTextColor(hdc, titleColor);
TextOut(hdc, rightPanelRect.left + SS(24), rightPanelRect.top + SS(22), _T("\u64cd\u4f5c\u4e0e\u9884\u89c8"), lstrlen(_T("\u64cd\u4f5c\u4e0e\u9884\u89c8")));
int holdTitleTop = (currentMode == MODE_ROGUE) ? panelRect.top + SS(690) : panelRect.top + SS(430);
int holdCardTop = (currentMode == MODE_ROGUE) ? panelRect.top + SS(724) : panelRect.top + SS(472);
int previewTitleTop = holdTitleTop;
int nextCardTop = holdCardTop;
int hintTop = (currentMode == MODE_ROGUE) ? panelRect.top + SS(818) : panelRect.top + SS(656);
RECT holdNextRect =
{
rightPanelRect.left + SS(20),
rightPanelRect.top + SS(92),
rightPanelRect.right - SS(20),
rightPanelRect.top + SS(360)
};
DrawPanelCard(holdNextRect, RGB(255, 247, 250), RGB(233, 191, 208), 24);
RECT holdCard =
{
holdNextRect.left + SS(18),
holdNextRect.top + SS(54),
holdNextRect.left + SS(18) + grid * 2 + SS(40),
holdNextRect.top + SS(54) + grid * 2 + SS(40)
};
RECT nextSectionRect =
{
holdCard.right + SS(18),
holdNextRect.top + SS(54),
holdNextRect.right - SS(18),
holdNextRect.bottom - SS(18)
};
SelectObject(hdc, sectionFont);
SetTextColor(hdc, textColor);
TextOut(hdc, holdNextRect.left + SS(18), holdNextRect.top + SS(16), _T("Hold"), lstrlen(_T("Hold")));
TextOut(hdc, nextSectionRect.left, holdNextRect.top + SS(16), _T("\u4e0b\u4e00\u4e2a"), lstrlen(_T("\u4e0b\u4e00\u4e2a")));
DrawPanelCard(holdCard, RGB(255, 238, 244), RGB(233, 191, 208), 22);
if (currentMode == MODE_ROGUE)
{
TextOut(hdc, panelRect.left + SS(24), holdTitleTop, _T("Hold \u69fd"), lstrlen(_T("Hold \u69fd")));
RECT holdCard =
{
panelRect.left + SS(24),
holdCardTop,
panelRect.left + SS(24) + grid * 2 + SS(40),
holdCardTop + grid * 2 + SS(40)
};
DrawPanelCard(holdCard, RGB(255, 238, 244), RGB(233, 191, 208), 22);
if (rogueStats.holdUnlocked == 0)
{
SelectObject(hdc, smallFont);
@@ -1150,7 +1046,7 @@ void TDrawScreen(HDC hdc, HWND hWnd)
holdCard.right - SS(10),
holdCard.bottom - SS(10)
};
DrawText(hdc, _T("\u672a\u89e3\u9501\r\n\u83b7\u53d6 Hold \u5f3a\u5316\u540e\u53ef\u7528"), -1, &holdLockedRect, DT_CENTER | DT_VCENTER | DT_WORDBREAK);
DrawText(hdc, _T("\u672a\u89e3\u9501\r\n\u9700 Hold \u5f3a\u5316"), -1, &holdLockedRect, DT_CENTER | DT_VCENTER | DT_WORDBREAK);
}
else if (holdType >= 0)
{
@@ -1192,15 +1088,22 @@ void TDrawScreen(HDC hdc, HWND hWnd)
holdCard.right - SS(10),
holdCard.bottom - SS(10)
};
DrawText(hdc, _T("\u6682\u65e0\u6682\u5b58\r\nC / Shift \u53ef\u5b58\u5165\u5f53\u524d\u65b9\u5757"), -1, &emptyHoldRect, DT_CENTER | DT_VCENTER | DT_WORDBREAK);
DrawText(hdc, _T("\u6682\u65e0\u6682\u5b58"), -1, &emptyHoldRect, DT_CENTER | DT_VCENTER | DT_WORDBREAK);
}
previewTitleTop = holdTitleTop;
nextCardTop = holdCardTop;
}
int previewLabelLeft = panelRect.left + SS((currentMode == MODE_ROGUE) ? 132 : 24);
TextOut(hdc, previewLabelLeft, previewTitleTop, _T("\u4e0b\u4e00\u4e2a\u65b9\u5757"), lstrlen(_T("\u4e0b\u4e00\u4e2a\u65b9\u5757")));
else
{
SelectObject(hdc, smallFont);
SetTextColor(hdc, RGB(128, 104, 118));
RECT classicHoldRect =
{
holdCard.left + SS(10),
holdCard.top + SS(18),
holdCard.right - SS(10),
holdCard.bottom - SS(10)
};
DrawText(hdc, _T("\u7ecf\u5178\u6a21\u5f0f\r\n\u4e0d\u542f\u7528 Hold"), -1, &classicHoldRect, DT_CENTER | DT_VCENTER | DT_WORDBREAK);
}
int previewCount = 1;
if (currentMode == MODE_ROGUE)
@@ -1220,10 +1123,10 @@ void TDrawScreen(HDC hdc, HWND hWnd)
{
RECT nextCard =
{
previewLabelLeft + previewIndex * SS(94),
nextCardTop,
previewLabelLeft + previewIndex * SS(94) + grid * 2 + SS(40),
nextCardTop + grid * 2 + SS(40)
nextSectionRect.left + (previewIndex % 2) * SS(94),
nextSectionRect.top + (previewIndex / 2) * SS(94),
nextSectionRect.left + (previewIndex % 2) * SS(94) + grid * 2 + SS(40),
nextSectionRect.top + (previewIndex / 2) * SS(94) + grid * 2 + SS(40)
};
HBRUSH nextCardBrush = CreateSolidBrush(RGB(255, 238, 244));
@@ -1266,10 +1169,54 @@ void TDrawScreen(HDC hdc, HWND hWnd)
}
}
RECT controlRect =
{
rightPanelRect.left + SS(20),
rightPanelRect.top + SS(378),
rightPanelRect.right - SS(20),
rightPanelRect.bottom - SS(20)
};
DrawPanelCard(controlRect, RGB(255, 248, 251), RGB(233, 191, 208), 24);
SelectObject(hdc, sectionFont);
SetTextColor(hdc, textColor);
TextOut(hdc, controlRect.left + SS(18), controlRect.top + SS(16), _T("\u5feb\u6377\u64cd\u4f5c"), lstrlen(_T("\u5feb\u6377\u64cd\u4f5c")));
SelectObject(hdc, smallFont);
SetTextColor(hdc, RGB(128, 104, 118));
TextOut(hdc, panelRect.left + SS(24), hintTop, _T("M \uff1a\u8fd4\u56de\u83dc\u5355"), lstrlen(_T("M \uff1a\u8fd4\u56de\u83dc\u5355")));
TextOut(hdc, panelRect.left + SS(24), hintTop + SS(32), _T("Z \u9ed1\u6d1e X \u6e05\u5c4f\u70b8\u5f39 V \u7a7a\u4e2d\u6362\u5f62"), lstrlen(_T("Z \u9ed1\u6d1e X \u6e05\u5c4f\u70b8\u5f39 V \u7a7a\u4e2d\u6362\u5f62")));
RECT controlBodyRect =
{
controlRect.left + SS(18),
controlRect.top + SS(52),
controlRect.right - SS(18),
controlRect.bottom - SS(18)
};
if (currentMode == MODE_ROGUE)
{
DrawText(
hdc,
_T("\u2190/\u2192 \u6216 A/D\uff1a\u5de6\u53f3\u79fb\u52a8\r\n")
_T("\u2191 \u6216 W\uff1a\u65cb\u8f6c \u2193 \u6216 S\uff1a\u8f6f\u964d\r\n")
_T("Space\uff1a\u786c\u964d P\uff1a\u6682\u505c R\uff1a\u91cd\u5f00\r\n")
_T("C/Shift\uff1aHold M\uff1a\u8fd4\u56de\u83dc\u5355\r\n")
_T("Z\uff1a\u9ed1\u6d1e X\uff1a\u6e05\u5c4f\u70b8\u5f39 V\uff1a\u7a7a\u4e2d\u6362\u5f62\r\n\r\n")
_T("\u5f53\u524d\u8bf4\u660e\uff1a\u4e3b\u754c\u9762\u53ea\u4fdd\u7559\u5bf9\u5c40\u5173\u952e\u4fe1\u606f\uff0c\u8be6\u7ec6\u5f3a\u5316\u6548\u679c\u4ee5\u540e\u518d\u505a\u5c55\u5f00\u5c42\u3002"),
-1,
&controlBodyRect,
DT_LEFT | DT_TOP | DT_WORDBREAK);
}
else
{
DrawText(
hdc,
_T("\u2190/\u2192 \u6216 A/D\uff1a\u5de6\u53f3\u79fb\u52a8\r\n")
_T("\u2191 \u6216 W\uff1a\u65cb\u8f6c \u2193 \u6216 S\uff1a\u8f6f\u964d\r\n")
_T("Space\uff1a\u786c\u964d P\uff1a\u6682\u505c R\uff1a\u91cd\u5f00\r\n")
_T("M\uff1a\u8fd4\u56de\u83dc\u5355"),
-1,
&controlBodyRect,
DT_LEFT | DT_TOP | DT_WORDBREAK);
}
if (feedbackState.visibleTicks > 0)
{