diff --git a/src/include/Tetris.h b/src/include/Tetris.h index 2df1cf2..8e10958 100644 --- a/src/include/Tetris.h +++ b/src/include/Tetris.h @@ -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; diff --git a/src/source/TetrisRender.cpp b/src/source/TetrisRender.cpp index ab63031..9ed694e 100644 --- a/src/source/TetrisRender.cpp +++ b/src/source/TetrisRender.cpp @@ -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) {