diff --git a/source/director.cpp b/source/director.cpp index b36d086..f438ef9 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -578,9 +578,9 @@ void Director::runTitle() void Director::runGame() { if (mSection.subsection == GAME_SECTION_PLAY_1P) - mGame = new Game(1, mRenderer, mFileList, mLang, mInput1, mInput2, false); + mGame = new Game(1, mRenderer, mFileList, mLang, mInput1, mInput2, false, mOptions->difficulty); if (mSection.subsection == GAME_SECTION_PLAY_2P) - mGame = new Game(2, mRenderer, mFileList, mLang, mInput1, mInput2, false); + mGame = new Game(2, mRenderer, mFileList, mLang, mInput1, mInput2, false, mOptions->difficulty); setSection(mGame->run()); delete mGame; } diff --git a/source/game.cpp b/source/game.cpp index 16ee0a2..d04f9ad 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -5,7 +5,7 @@ #endif // Constructor -Game::Game(int numPlayers, SDL_Renderer *renderer, std::string *filelist, Lang *lang, Input *input1, Input *input2, bool demo) +Game::Game(int numPlayers, SDL_Renderer *renderer, std::string *filelist, Lang *lang, Input *input1, Input *input2, bool demo, int difficulty) { // Copia los punteros mRenderer = renderer; @@ -13,8 +13,11 @@ Game::Game(int numPlayers, SDL_Renderer *renderer, std::string *filelist, Lang * mLang = lang; mInput[0] = input1; mInput[1] = input2; + + // Pasa variables mDemo.enabled = demo; mNumPlayers = numPlayers; + mDifficulty = difficulty; // Crea los objetos for (int i = 0; i < mNumPlayers; i++) @@ -284,6 +287,26 @@ void Game::init() mTicksSpeed = 15; // Inicializa las variables + switch (mDifficulty) + { + case DIFFICULTY_EASY: + mDefaultEnemySpeed = BALLOON_SPEED_1; + mDifficultyScoreMultiplier = 0.5f; + break; + + case DIFFICULTY_NORMAL: + mDefaultEnemySpeed = BALLOON_SPEED_1; + mDifficultyScoreMultiplier = 1.0f; + break; + + case DIFFICULTY_HARD: + mDefaultEnemySpeed = BALLOON_SPEED_5; + mDifficultyScoreMultiplier = 1.5f; + break; + + default: + break; + } mGameCompleted = false; mGameCompletedCounter = 0; mSection.name = PROG_SECTION_GAME; @@ -303,7 +326,7 @@ void Game::init() mBalloonsPopped = 0; mLastEnemyDeploy = 0; mEnemyDeployCounter = 0; - mEnemySpeed = BALLOON_SPEED_1; + mEnemySpeed = mDefaultEnemySpeed; mEffect.flash = false; mEffect.shake = false; mEffect.shakeCounter = SHAKE_COUNTER; @@ -1677,7 +1700,7 @@ void Game::updateStage() } JA_PlaySound(mSoundStageChange); mStageBitmapCounter = 0; - mEnemySpeed = BALLOON_SPEED_1; + mEnemySpeed = mDefaultEnemySpeed; setBalloonSpeed(mEnemySpeed); mEffect.flash = true; mEffect.shake = true; @@ -1867,31 +1890,39 @@ void Game::setBalloonSpeed(float speed) // Incrementa la velocidad de los globos void Game::incBalloonSpeed() { - if (mEnemySpeed == BALLOON_SPEED_1) - mEnemySpeed = BALLOON_SPEED_2; - else if (mEnemySpeed == BALLOON_SPEED_2) - mEnemySpeed = BALLOON_SPEED_3; - else if (mEnemySpeed == BALLOON_SPEED_3) - mEnemySpeed = BALLOON_SPEED_4; - else if (mEnemySpeed == BALLOON_SPEED_4) - mEnemySpeed = BALLOON_SPEED_5; + // La velocidad solo se incrementa en el modo normal + if (mDifficulty == DIFFICULTY_NORMAL) + { + if (mEnemySpeed == BALLOON_SPEED_1) + mEnemySpeed = BALLOON_SPEED_2; + else if (mEnemySpeed == BALLOON_SPEED_2) + mEnemySpeed = BALLOON_SPEED_3; + else if (mEnemySpeed == BALLOON_SPEED_3) + mEnemySpeed = BALLOON_SPEED_4; + else if (mEnemySpeed == BALLOON_SPEED_4) + mEnemySpeed = BALLOON_SPEED_5; - setBalloonSpeed(mEnemySpeed); + setBalloonSpeed(mEnemySpeed); + } } // Decrementa la velocidad de los globos void Game::decBalloonSpeed() { - if (mEnemySpeed == BALLOON_SPEED_5) - mEnemySpeed = BALLOON_SPEED_4; - else if (mEnemySpeed == BALLOON_SPEED_4) - mEnemySpeed = BALLOON_SPEED_3; - else if (mEnemySpeed == BALLOON_SPEED_3) - mEnemySpeed = BALLOON_SPEED_2; - else if (mEnemySpeed == BALLOON_SPEED_2) - mEnemySpeed = BALLOON_SPEED_1; + // La velocidad solo se decrementa en el modo normal + if (mDifficulty == DIFFICULTY_NORMAL) + { + if (mEnemySpeed == BALLOON_SPEED_5) + mEnemySpeed = BALLOON_SPEED_4; + else if (mEnemySpeed == BALLOON_SPEED_4) + mEnemySpeed = BALLOON_SPEED_3; + else if (mEnemySpeed == BALLOON_SPEED_3) + mEnemySpeed = BALLOON_SPEED_2; + else if (mEnemySpeed == BALLOON_SPEED_2) + mEnemySpeed = BALLOON_SPEED_1; - setBalloonSpeed(mEnemySpeed); + setBalloonSpeed(mEnemySpeed); + } } // Actualiza la velocidad de los globos en funcion del poder acumulado de la fase @@ -2010,7 +2041,7 @@ void Game::destroyBalloon(Uint8 index) } // Otorga los puntos correspondientes al globo - mPlayer[0]->addScore(Uint32(score * mPlayer[0]->getScoreMultiplier())); + mPlayer[0]->addScore(Uint32(score * mPlayer[0]->getScoreMultiplier()*mDifficultyScoreMultiplier)); //setScore(mPlayer[0]->getScore()); updateHiScore(); @@ -2165,7 +2196,7 @@ void Game::checkBulletBalloonCollision() // Otorga los puntos correspondientes al globo al jugador que disparó la bala int index = mBullet[j]->getOwner(); mPlayer[index]->incScoreMultiplier(); - mPlayer[index]->addScore(Uint32(mBalloon[i]->getScore() * mPlayer[index]->getScoreMultiplier())); + mPlayer[index]->addScore(Uint32(mBalloon[i]->getScore() * mPlayer[index]->getScoreMultiplier() * mDifficultyScoreMultiplier)); //setScore(mPlayer[index]->getScore()); updateHiScore(); diff --git a/source/game.h b/source/game.h index beb5272..988351f 100644 --- a/source/game.h +++ b/source/game.h @@ -179,6 +179,7 @@ private: Uint8 mLastEnemyDeploy; // Guarda cual ha sido la última formación desplegada para no repetir; Uint8 mEnemyDeployCounter; // Cuando se lanza una formación, se le da un valor y no sale otra hasta que llegue a cero float mEnemySpeed; // Velocidad a la que se mueven los enemigos + float mDefaultEnemySpeed; // Velocidad base de los enemigos, sin incrementar effect_t mEffect; // Variable para gestionar los efectos visuales helper_t mHelper; // Variable para gestionar las ayudas bool mPowerBallEnabled; // Indica si hay una powerball ya activa @@ -188,6 +189,8 @@ private: float mSin[360]; // Vector con los valores del seno para 360 grados bool mGameCompleted; // Indica si se ha completado la partida, llegando al final de la ultima pantalla int mGameCompletedCounter; // Contador para el tramo final, cuando se ha completado la partida y ya no aparecen más enemigos + int mDifficulty; // Dificultad del juego + float mDifficultyScoreMultiplier; // Multiplicador de puntos en función de la dificultad struct demo_t { @@ -210,7 +213,7 @@ private: public: // Constructor - Game(int numPlayers, SDL_Renderer *renderer, std::string *filelist, Lang *lang, Input *input1, Input *input2, bool demo); + Game(int numPlayers, SDL_Renderer *renderer, std::string *filelist, Lang *lang, Input *input1, Input *input2, bool demo, int difficulty); // Destructor ~Game();