📄 game.cpp
字号:
m_iCurGirl = 2; UTIL_Delay(800); break; } else if (key == SDLK_d && !(m_iLevelClearFlag & (1 << 3))) { gpGeneral->PlaySound(SND_DING); gpGeneral->DrawGirl(340, 260, 280, 200, 3, 0); gpGeneral->DrawText("D", 360, 270, 1, 250, 250, 0); gpGeneral->UpdateScreen(340, 260, 280, 200); m_iCurGirl = 3; UTIL_Delay(800); break; } } GameInit(); gpGeneral->ScreenFade(200);}void CGame::GameInit(){ int scores[4] = {16000, 24000, 48000, 100000}, i, cleared = 0; for (i = 0; i < 4; i++) { if (m_iLevelClearFlag & (1 << i)) { cleared++; } } m_pPlayer->m_iScore = 1000; m_pBot->m_iScore = scores[cleared]; m_iRound = TURN_EAST; m_iNumDeal = 0; m_iPendingPoint = 0; if (RandomLong(1, 100) > 50) { m_pPlayer->m_iTurn = TURN_EAST; m_pBot->m_iTurn = TURN_SOUTH; } else { m_pBot->m_iTurn = TURN_EAST; m_pPlayer->m_iTurn = TURN_SOUTH; } m_fTurned = false;}void CGame::PlayRound(){ CBasePlayer *pWinner = NULL, *pCurrent; if (RandomLong(1, 100) < m_iFirstChancePercent && !m_fSanGenRush && !m_fBonusGame) { m_pPlayer->FirstChance(); } // This should be backward if (m_pPlayer->m_iTurn == TURN_EAST) { pCurrent = m_pBot; } else { pCurrent = m_pPlayer; } while (pWinner == NULL) { pCurrent = pCurrent->m_pOpponent; playeraction act; pCurrent->DrawHand(); if (pCurrent->m_iNumDiscarded >= 20 || !CanDeclareKong()) { if (pCurrent->Action(AS_DRAW) == PA_MAHJONG) { pWinner = pCurrent; break; } gpGeneral->PlayEndRoundMusic(); break; } while (1) { act = pCurrent->Action(AS_DRAW); if (act == PA_DRAW) { gpGeneral->PlaySound(SND_DISCARD1); break; } else if (act == PA_KONG || act == PA_PUNG || act == PA_CHOW) { gpGeneral->PlaySound(SND_SOUND3); pCurrent->m_pOpponent->DrawDiscarded(); if (act == PA_KONG) { KongDeclared(); continue; } break; } else if (act == PA_MAHJONG) { pWinner = pCurrent; break; } } if (pWinner != NULL) { break; // someone won; don't continue the game } pCurrent->DrawHand(); while (1) { act = pCurrent->Action(AS_DISCARD); if (act == PA_DISCARD || act == PA_REACH) { gpGeneral->PlaySound(SND_DISCARD2); if (act == PA_REACH) { if (pCurrent->IsBot()) { gpGeneral->PlayBGMusic(2); } else { pCurrent->DrawHand(); pCurrent->DrawDiscarded(); gpGeneral->PlayBGMusic(-1); gpGeneral->Fire(); gpGeneral->PlayBGMusic(3); } m_iPendingPoint += 1000; pCurrent->m_iScore -= 1000; DrawScore(); pCurrent->m_pOpponent->DrawHand(); } break; } else if (act == PA_KONG) { KongDeclared(); gpGeneral->PlaySound(SND_SOUND3); pCurrent->Action(AS_DRAW); gpGeneral->PlaySound(SND_DISCARD1); pCurrent->DrawHand(); } else if (act == PA_MAHJONG) { pWinner = pCurrent; break; } } pCurrent->DrawHand(); pCurrent->DrawDiscarded(); } if (pWinner == NULL && RandomLong(1, 100) < m_iLastChancePercent) { if (m_pPlayer->LastChance()) { pWinner = m_pPlayer; } } if (pWinner == NULL) { // This round is a draw bool ready[2] = {false, false}; UTIL_Delay(1000); m_pPlayer->DrawHand(true); m_pBot->DrawHand(true); gpGeneral->PlaySound(SND_DISCARD2); ready[0] = m_pPlayer->m_Hand.IsReady(); ready[1] = m_pBot->m_Hand.IsReady(); gpGeneral->DrawUTF8Text(msg("round_draw"), 220, 190, 2, 255, 100, 255); gpGeneral->UpdateScreen(220, 190, 420, 75); UTIL_Delay(1000); if (ready[1]) { gpGeneral->DrawUTF8Text(msg("ready_hand"), 200, 105, 2, 255, 255, 0); } else { gpGeneral->DrawUTF8Text(msg("unready_hand"), 200, 105, 2, 0, 255, 255); } gpGeneral->UpdateScreen(200, 105, 440, 100); if (ready[0]) { gpGeneral->DrawUTF8Text(msg("ready_hand"), 200, 275, 2, 255, 255, 0); } else { gpGeneral->DrawUTF8Text(msg("unready_hand"), 200, 275, 2, 0, 255, 255); } gpGeneral->UpdateScreen(200, 275, 440, 100); if (ready[0] != ready[1] && CanDeclareKong()) { if (ready[0]) { m_pPlayer->m_iScore += 1000; m_pBot->m_iScore -= 1000; } else { m_pPlayer->m_iScore -= 1000; m_pBot->m_iScore += 1000; } UTIL_Delay(1000); gpGeneral->PlaySound(SND_SOUND3); DrawScore(); } if (m_pPlayer->m_iTurn == TURN_EAST && !ready[0]) { m_pPlayer->m_iTurn = TURN_SOUTH; m_pBot->m_iTurn = TURN_EAST; if (m_fTurned) { m_iRound ^= 1; m_fTurned = false; } else { m_fTurned = true; } } else if (m_pBot->m_iTurn == TURN_EAST && !ready[1]) { m_pPlayer->m_iTurn = TURN_EAST; m_pBot->m_iTurn = TURN_SOUTH; if (m_fTurned) { m_iRound ^= 1; m_fTurned = false; } else { m_fTurned = true; } } m_iNumDeal++; UTIL_Delay(3000); } else { // someone won the round if (!pWinner->IsBot()) { // Play the "win" music if player won int i; bool selfdrawn = pWinner->m_Result.selfdrawn; CTile t = pWinner->m_Hand.m_Tiles[pWinner->m_Hand.m_iNumTiles - 1].tile; if (selfdrawn) { pWinner->m_Hand.m_iNumTiles--; pWinner->DrawHand(); gpGeneral->AnimSelfDrawn(t); pWinner->m_Hand.m_iNumTiles++; } else { gpGeneral->AnimOut(t); } gpGeneral->PlayBGMusic(-1); UTIL_Delay(500); gpGeneral->PlayWinMusic(); UTIL_Delay(300); } gpGeneral->PlaySound(SND_DISCARD2); pWinner->DrawHand(true); if (pWinner->m_fReach) { gpGeneral->DrawTile(m_Dora[5], (int)(415 + TILE_WIDTH * 0.7 * 2), 235, WALL_SHOWN, 0); gpGeneral->UpdateScreen((int)(415 + TILE_WIDTH * 0.7 * 2), 235, (int)(TILE_WIDTH * 0.7), (int)(TILE_HEIGHT_SHOWN * 0.7)); } UTIL_Delay(3500); gpGeneral->DrawBG(m_iCurGirl, 1); pWinner->DrawHand(true); gpGeneral->UpdateScreen(); UTIL_Delay(500); gpGeneral->PlaySound(SND_SOUND3); pWinner->DrawResult(); UTIL_Delay(500); DrawScore(435, 300); UTIL_Delay(1500); pWinner->m_iScore += pWinner->m_Result.score; pWinner->m_pOpponent->m_iScore -= pWinner->m_Result.score; gpGeneral->PlaySound(SND_SOUND1); DrawScore(435, 300); UTIL_Delay(1500); if (m_iPendingPoint > 0) { pWinner->m_iScore += m_iPendingPoint; gpGeneral->PlaySound(SND_SOUND4); DrawScore(435, 300); m_iPendingPoint = 0; } UTIL_Delay(4000); if (pWinner->m_iTurn != TURN_EAST) { pWinner->m_iTurn = TURN_EAST; pWinner->m_pOpponent->m_iTurn = TURN_SOUTH; m_iNumDeal = 0; if (m_fTurned) { m_fTurned = false; m_iRound ^= 1; } else { m_fTurned = true; } } else { m_iNumDeal++; } } gpGeneral->ScreenFade();}void CGame::StageClear(){ m_iLevelClearFlag |= (1 << m_iCurGirl); HighScore(); m_iCurGirl = -1;}void CGame::HighScore(){ gpGeneral->DrawBGFade(m_iCurGirl, 2); gpGeneral->PlayBGMusic(5); gpGeneral->WaitForAnyKey(); // TODO: high score gpGeneral->ScreenFade();}void CGame::KongDeclared(){ m_iKongs++; if (m_iKongs > 4) m_iKongs = 4; gpGeneral->DrawTiles(m_Dora, m_iKongs + 1, (int)(415 + TILE_WIDTH * 0.7 * 2), 200, WALL_SHOWN, 0); int n = (m_iKongs - 1)/ 2 + 1; gpGeneral->EraseArea(415, 200, (int)(TILE_WIDTH * 0.7 * n), 60); if (m_iKongs % 2) { gpGeneral->DrawTile(CTile(0), (int)(415 + (n - 1) * TILE_WIDTH * 0.7), 215, WALL_CONCEALED, 0); } gpGeneral->UpdateScreen(415, 200, 225, 60);}void CGame::DrawScore(int x, int y){ gpGeneral->EraseArea(x, y, 155, 50); gpGeneral->DrawUTF8Text(msg("computer"), x, y, 0, 255, 255, 0); gpGeneral->DrawUTF8Text(va("%10d", m_pBot->m_iScore), x + 20, y); y += 24; gpGeneral->DrawUTF8Text(msg("player"), x, y, 0, 255, 255, 0); gpGeneral->DrawUTF8Text(va("%10d", m_pPlayer->m_iScore), x + 20, y); gpGeneral->UpdateScreen(x, y - 24, 155, 50);}void CGame::DrawDonDen(){ gpGeneral->EraseArea(450, 300, 160, 50); if (m_iTotalDonDen - m_iDonDen <= 0) { gpGeneral->UpdateScreen(470, 270, 160, 50); return; } gpGeneral->DrawText("DON", 470, 270, 0, 255, 255, 0); gpGeneral->DrawText("DEN", 480, 290, 0, 255, 255, 0); gpGeneral->DrawText(va("%d", m_iTotalDonDen - m_iDonDen), 537, 275, 1, 255, 255, 255); gpGeneral->DrawUTF8Text("TIMES", 560, 290, 0, 255, 255, 0); gpGeneral->UpdateScreen(470, 270, 160, 50);}int CGame::IsDora(const CTile &t, bool reach){ int i, d = 0; for (i = 0; i < m_iKongs + 1; i++) { if (m_Dora[i].Dora() == t) { d++; } } if (reach && t == m_Dora[5].Dora()) { d++; } return d;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -