添加模式选择与Rogue升级界面
This commit is contained in:
+148
-3
@@ -12,6 +12,9 @@ int workRegion[20][10] = { 0 };
|
||||
Point point = { 0, 0 };
|
||||
Point target = { 0, 0 };
|
||||
MenuState menuState = { 0, 2 };
|
||||
PlayerStats classicStats = { 0, 1, 0, 0, 0 };
|
||||
PlayerStats rogueStats = { 0, 1, 0, 100, 0 };
|
||||
UpgradeUiState upgradeUiState = { 0, 0, 0, 0, {} };
|
||||
int currentScreen = SCREEN_MENU;
|
||||
int currentMode = MODE_CLASSIC;
|
||||
|
||||
@@ -143,6 +146,99 @@ static Point GetSpawnPoint(int brickType)
|
||||
return spawnPoint;
|
||||
}
|
||||
|
||||
static void ResetPlayerStats(PlayerStats& stats, bool useRogueRules)
|
||||
{
|
||||
stats.score = 0;
|
||||
stats.level = 1;
|
||||
stats.exp = 0;
|
||||
stats.requiredExp = useRogueRules ? 100 : 0;
|
||||
stats.totalLinesCleared = 0;
|
||||
}
|
||||
|
||||
static int GetRogueScoreByLines(int linesCleared)
|
||||
{
|
||||
switch (linesCleared)
|
||||
{
|
||||
case 1: return 100;
|
||||
case 2: return 300;
|
||||
case 3: return 500;
|
||||
case 4: return 800;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int GetRogueExpByLines(int linesCleared)
|
||||
{
|
||||
switch (linesCleared)
|
||||
{
|
||||
case 1: return 10;
|
||||
case 2: return 25;
|
||||
case 3: return 45;
|
||||
case 4: return 80;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int ApplyLevelProgress(PlayerStats& stats)
|
||||
{
|
||||
int levelUps = 0;
|
||||
|
||||
while (stats.requiredExp > 0 && stats.exp >= stats.requiredExp)
|
||||
{
|
||||
stats.exp -= stats.requiredExp;
|
||||
stats.level++;
|
||||
stats.requiredExp = 100 + stats.level * 50;
|
||||
levelUps++;
|
||||
}
|
||||
|
||||
return levelUps;
|
||||
}
|
||||
|
||||
static void FillUpgradeOptions()
|
||||
{
|
||||
upgradeUiState.optionCount = 3;
|
||||
upgradeUiState.selectedIndex = 0;
|
||||
|
||||
upgradeUiState.options[0].name = _T("\u5206\u6570\u500d\u7387");
|
||||
upgradeUiState.options[0].category = _T("\u5f97\u5206");
|
||||
upgradeUiState.options[0].description = _T("\u6240\u6709\u5f97\u5206\u5c0f\u5e45\u63d0\u5347\u3002");
|
||||
|
||||
upgradeUiState.options[1].name = _T("\u7ecf\u9a8c\u5f3a\u5316");
|
||||
upgradeUiState.options[1].category = _T("\u6210\u957f");
|
||||
upgradeUiState.options[1].description = _T("\u540e\u7eed\u6d88\u884c\u53ef\u4ee5\u83b7\u5f97\u66f4\u591a EXP\u3002");
|
||||
|
||||
upgradeUiState.options[2].name = _T("\u6162\u901f\u4e0b\u843d");
|
||||
upgradeUiState.options[2].category = _T("\u64cd\u4f5c");
|
||||
upgradeUiState.options[2].description = _T("\u964d\u4f4e\u81ea\u7136\u4e0b\u843d\u901f\u5ea6\uff0c\u63d0\u9ad8\u5bb9\u9519\u3002");
|
||||
}
|
||||
|
||||
static void ApplyLineClearResult(int linesCleared)
|
||||
{
|
||||
if (linesCleared <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (currentMode == MODE_CLASSIC)
|
||||
{
|
||||
classicStats.totalLinesCleared += linesCleared;
|
||||
classicStats.score += linesCleared * 100;
|
||||
tScore = classicStats.score;
|
||||
return;
|
||||
}
|
||||
|
||||
rogueStats.totalLinesCleared += linesCleared;
|
||||
rogueStats.score += GetRogueScoreByLines(linesCleared);
|
||||
rogueStats.exp += GetRogueExpByLines(linesCleared);
|
||||
upgradeUiState.pendingCount += ApplyLevelProgress(rogueStats);
|
||||
tScore = rogueStats.score;
|
||||
|
||||
if (upgradeUiState.pendingCount > 0)
|
||||
{
|
||||
OpenUpgradeMenu();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 判断当前方块是否可以继续向下移动。
|
||||
*
|
||||
@@ -439,8 +535,10 @@ void DeleteOneLine(int number)
|
||||
* 并将该行上方的内容整体下移。为了避免连续满行被漏检,
|
||||
* 删除后会继续检查当前行号。每成功消除 1 行,当前得分增加 100 分。
|
||||
*/
|
||||
void DeleteLines()
|
||||
int DeleteLines()
|
||||
{
|
||||
int clearedLines = 0;
|
||||
|
||||
for (int i = nGameHeight - 1; i >= 0; i--)
|
||||
{
|
||||
bool fullLine = true;
|
||||
@@ -457,10 +555,13 @@ void DeleteLines()
|
||||
if (fullLine)
|
||||
{
|
||||
DeleteOneLine(i);
|
||||
tScore += 100;
|
||||
clearedLines++;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
ApplyLineClearResult(clearedLines);
|
||||
return clearedLines;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -506,11 +607,18 @@ void Restart()
|
||||
}
|
||||
}
|
||||
|
||||
tScore = 0;
|
||||
gameOverFlag = false;
|
||||
suspendFlag = false;
|
||||
targetFlag = true;
|
||||
|
||||
ResetPlayerStats(classicStats, false);
|
||||
ResetPlayerStats(rogueStats, true);
|
||||
upgradeUiState.selectedIndex = 0;
|
||||
upgradeUiState.optionCount = 0;
|
||||
upgradeUiState.pendingCount = 0;
|
||||
upgradeUiState.totalChosenCount = 0;
|
||||
tScore = 0;
|
||||
|
||||
type = rand() % 7;
|
||||
nType = rand() % 7;
|
||||
state = 0;
|
||||
@@ -525,6 +633,7 @@ void StartGameWithMode(int mode)
|
||||
currentMode = mode;
|
||||
currentScreen = SCREEN_PLAYING;
|
||||
Restart();
|
||||
tScore = (currentMode == MODE_CLASSIC) ? classicStats.score : rogueStats.score;
|
||||
}
|
||||
|
||||
void ReturnToMainMenu()
|
||||
@@ -533,9 +642,45 @@ void ReturnToMainMenu()
|
||||
suspendFlag = false;
|
||||
gameOverFlag = false;
|
||||
menuState.optionCount = 2;
|
||||
upgradeUiState.pendingCount = 0;
|
||||
|
||||
if (menuState.selectedIndex < 0 || menuState.selectedIndex >= menuState.optionCount)
|
||||
{
|
||||
menuState.selectedIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void OpenUpgradeMenu()
|
||||
{
|
||||
if (currentMode != MODE_ROGUE || upgradeUiState.pendingCount <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
FillUpgradeOptions();
|
||||
currentScreen = SCREEN_UPGRADE;
|
||||
}
|
||||
|
||||
void ConfirmUpgradeSelection()
|
||||
{
|
||||
if (currentScreen != SCREEN_UPGRADE || upgradeUiState.optionCount <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
upgradeUiState.totalChosenCount++;
|
||||
|
||||
if (upgradeUiState.pendingCount > 0)
|
||||
{
|
||||
upgradeUiState.pendingCount--;
|
||||
}
|
||||
|
||||
if (upgradeUiState.pendingCount > 0)
|
||||
{
|
||||
FillUpgradeOptions();
|
||||
currentScreen = SCREEN_UPGRADE;
|
||||
return;
|
||||
}
|
||||
|
||||
currentScreen = SCREEN_PLAYING;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user