diff --git a/src/states/GameOverState.cpp b/src/states/GameOverState.cpp index 9cda10f..8ca8a05 100644 --- a/src/states/GameOverState.cpp +++ b/src/states/GameOverState.cpp @@ -24,6 +24,9 @@ void GameOverState::handleEvents(std::vector events) { for(Event event: events) { if (event == Event::CONFIRM) { this->done = true; + } else if (event == Event::QUIT) { + this->next_state = State::EXIT; + this->done = true; } } } @@ -34,5 +37,5 @@ void GameOverState::draw(SDL_Renderer *renderer) { } State GameOverState::getNextState() { - return State::MENU; + return this->next_state; } diff --git a/src/states/GameOverState.hpp b/src/states/GameOverState.hpp index cb00a83..5a5d1eb 100644 --- a/src/states/GameOverState.hpp +++ b/src/states/GameOverState.hpp @@ -30,6 +30,8 @@ class GameOverState : public BaseState { PauseScreen screen_text; bool sound_played = false; + + State next_state = State::MENU; public: GameOverState(SDL_Renderer *renderer, FontManager * fonts, SoundManager * sounds, OptionManager * options); ~GameOverState(); diff --git a/src/states/GameState.cpp b/src/states/GameState.cpp index 62e5968..d4cf8fa 100644 --- a/src/states/GameState.cpp +++ b/src/states/GameState.cpp @@ -57,13 +57,23 @@ void GameState::handleEvents(std::vector events) { } for(Event event: events) { + if (event == Event::QUIT) { + if (this->completed) { + this->options->setStandardModeLevel(this->level+1); + } else { + this->options->setStandardModeLevel(this->level); + } + this->next_state = State::EXIT; + this->done = true; + return; + } if (this->completed) { if (event == Event::CONFIRM) { this->completed = false; int next_level = this->level+1; if (next_level > this->total_levels ) { this->options->resetStandardMode(); - this->finished = true; + this->next_state = State::WON; this->done = true; } else { this->loadLevel(next_level); @@ -77,12 +87,12 @@ void GameState::handleEvents(std::vector events) { this->failed = false; } } else if (this->paused) { - if (event == Event::CONFIRM || event == Event::QUIT) { + if (event == Event::CONFIRM) { this->done = true; } else if (event == Event::CANCEL || event == Event::MENU) { this->paused = false; } - } else if (event == Event::MENU || event == Event::QUIT) { + } else if (event == Event::MENU) { this->paused = true; return; } else if(event == Event::NEXT) { @@ -243,9 +253,5 @@ SDL_Point GameState::calculatePosition(int width, int height) { } State GameState::getNextState() { - if(this->finished) { - return State::WON; - } else { - return State::MENU; - } + return this->next_state; } diff --git a/src/states/GameState.hpp b/src/states/GameState.hpp index 9563fed..d3584b0 100644 --- a/src/states/GameState.hpp +++ b/src/states/GameState.hpp @@ -51,6 +51,8 @@ class GameState : public BaseState { std::vector> shells; SDL_Point position; + State next_state = State::MENU; + SDL_Point calculatePosition(int width, int height); int getTotalLevels(); void loadLevel(int level); diff --git a/src/states/GameStateChallenge.cpp b/src/states/GameStateChallenge.cpp index a5ea696..7afb659 100644 --- a/src/states/GameStateChallenge.cpp +++ b/src/states/GameStateChallenge.cpp @@ -32,7 +32,7 @@ void GameStateChallenge::update() { this->options->setChallengeModeHighscore(this->level); } this->options->resetChallengeMode(); - this->game_over = true; + this->next_state = State::GAMEOVER; this->done = true; } else if (this->board->isCompleted() && !this->completed) { this->theme.pause(); @@ -58,6 +58,13 @@ void GameStateChallenge::handleEvents(std::vector events) { } for(Event event: events) { + if (event == Event::QUIT) { + this->options->setChallengeModeLevel(this->level); + this->options->setChallengeModeLives(this->attempts); + this->next_state = State::EXIT; + this->done = true; + return; + } if (this->completed) { if (event == Event::CONFIRM) { this->completed = false; @@ -71,14 +78,14 @@ void GameStateChallenge::handleEvents(std::vector events) { this->theme.unpause(); } } else if (this->paused) { - if (event == Event::CONFIRM || event == Event::QUIT) { + if (event == Event::CONFIRM) { this->options->setChallengeModeLevel(this->level); this->options->setChallengeModeLives(this->attempts); this->done = true; } else if (event == Event::CANCEL || event == Event::MENU) { this->paused = false; } - } else if (event == Event::MENU || event == Event::QUIT) { + } else if (event == Event::MENU) { this->paused = true; return; } @@ -165,9 +172,5 @@ SDL_Point GameStateChallenge::calculatePosition(int width, int height) { } State GameStateChallenge::getNextState() { - if (this->game_over) { - return State::GAMEOVER; - } else { - return State::MENU; - } + return this->next_state; } diff --git a/src/states/GameStateChallenge.hpp b/src/states/GameStateChallenge.hpp index 1046b32..10e9ac0 100644 --- a/src/states/GameStateChallenge.hpp +++ b/src/states/GameStateChallenge.hpp @@ -32,7 +32,6 @@ class GameStateChallenge : public BaseState { bool paused = false; bool completed = false; bool failed = false; - bool game_over = false; int level; int seed; @@ -45,6 +44,8 @@ class GameStateChallenge : public BaseState { int attempts; bool attempts_changed; + State next_state = State::MENU; + SDL_Point calculatePosition(int width, int height); void loadLevel(); diff --git a/src/states/GameStateRelaxed.cpp b/src/states/GameStateRelaxed.cpp index 60fc59c..33d7fb0 100644 --- a/src/states/GameStateRelaxed.cpp +++ b/src/states/GameStateRelaxed.cpp @@ -37,8 +37,11 @@ void GameStateRelaxed::handleEvents(std::vector events) { this->paused = !(this->paused); return; } else if (event == Event::QUIT) { - this->paused = true; - return; + this->options->setRelaxedModeScore(this->board->getMatches()); + this->options->setRelaxedModeShells(this->board->getCurrentShells()); + this->options->setRelaxedModeSeed(this->board->getCurrentSeed()); + this->next_state = State::EXIT; + this->done = true; } if (this->paused) { @@ -113,5 +116,5 @@ SDL_Point GameStateRelaxed::calculatePosition(int width, int height) { } State GameStateRelaxed::getNextState() { - return State::MENU; + return this->next_state; } diff --git a/src/states/GameStateRelaxed.hpp b/src/states/GameStateRelaxed.hpp index a49e095..3740610 100644 --- a/src/states/GameStateRelaxed.hpp +++ b/src/states/GameStateRelaxed.hpp @@ -30,6 +30,8 @@ class GameStateRelaxed : public BaseState { int height; SDL_Point position; + State next_state = State::MENU; + SDL_Point calculatePosition(int width, int height); void loadLevel(); public: diff --git a/src/states/HighscoreState.cpp b/src/states/HighscoreState.cpp index 67ca070..7fa81ae 100644 --- a/src/states/HighscoreState.cpp +++ b/src/states/HighscoreState.cpp @@ -32,6 +32,9 @@ void HighscoreState::handleEvents(std::vector events) { for(Event event :events) { switch (event) { case Event::QUIT: + this->next_state = State::EXIT; + this->done = true; + break; case Event::MENU: case Event::CANCEL: case Event::CONFIRM: @@ -79,5 +82,5 @@ int HighscoreState::getTextY(int number) { } State HighscoreState::getNextState() { - return State::MENU; + return this->next_state; } \ No newline at end of file diff --git a/src/states/HighscoreState.hpp b/src/states/HighscoreState.hpp index 0d85969..7d3cd4a 100644 --- a/src/states/HighscoreState.hpp +++ b/src/states/HighscoreState.hpp @@ -27,6 +27,8 @@ class HighscoreState : public BaseState { int text_offset = 2; int text_start_y; + State next_state = State::MENU; + int getTextY(int number); public: HighscoreState(SDL_Renderer * renderer, FontManager * fonts, SoundManager * sounds, OptionManager * options); diff --git a/src/states/NotImplementedState.cpp b/src/states/NotImplementedState.cpp index b4860d2..1ef35d1 100644 --- a/src/states/NotImplementedState.cpp +++ b/src/states/NotImplementedState.cpp @@ -19,7 +19,10 @@ void NotImplementedState::update() { void NotImplementedState::handleEvents(std::vector events) { for(Event event: events) { - if (event == Event::CONFIRM || event == Event::CANCEL || event == Event::MENU) { + if (event == Event::QUIT) { + this->next_state = State::EXIT; + this->done = true; + } else if (event == Event::CONFIRM || event == Event::CANCEL || event == Event::MENU) { this->done = true; } } @@ -31,5 +34,5 @@ void NotImplementedState::draw(SDL_Renderer *renderer) { } State NotImplementedState::getNextState() { - return State::MENU; + return this->next_state; } diff --git a/src/states/NotImplementedState.hpp b/src/states/NotImplementedState.hpp index 7d4aa32..4482137 100644 --- a/src/states/NotImplementedState.hpp +++ b/src/states/NotImplementedState.hpp @@ -23,6 +23,8 @@ class NotImplementedState : public BaseState { ThemeManager theme; PauseScreen screen_text; + + State next_state = State::MENU; public: NotImplementedState(SDL_Renderer *renderer, FontManager * fonts, SoundManager * sounds, OptionManager * options); ~NotImplementedState(); diff --git a/src/states/OptionsState.cpp b/src/states/OptionsState.cpp index 203ac67..1c3c179 100644 --- a/src/states/OptionsState.cpp +++ b/src/states/OptionsState.cpp @@ -86,6 +86,9 @@ void OptionsState::handleEvents(std::vector events) { } break; case Event::QUIT: + this->next_state = State::EXIT; + this->done = true; + break; case Event::MENU: case Event::CANCEL: this->done = true; @@ -309,5 +312,5 @@ int OptionsState::getTextY(int number) { } State OptionsState::getNextState() { - return State::MENU; + return this->next_state; } \ No newline at end of file diff --git a/src/states/OptionsState.hpp b/src/states/OptionsState.hpp index e54bb92..112a454 100644 --- a/src/states/OptionsState.hpp +++ b/src/states/OptionsState.hpp @@ -33,6 +33,8 @@ class OptionsState : public BaseState { SDL_Texture * text_title; std::vector texts; + State next_state = State::MENU; + int text_offset = 2; int text_start_y; diff --git a/src/states/WonState.cpp b/src/states/WonState.cpp index 0e3bde4..22ed5d7 100644 --- a/src/states/WonState.cpp +++ b/src/states/WonState.cpp @@ -24,6 +24,9 @@ void WonState::handleEvents(std::vector events) { for(Event event: events) { if (event == Event::CONFIRM) { this->done = true; + } else if (event == Event::QUIT) { + this->next_state = State::EXIT; + this->done = true; } } } @@ -34,5 +37,5 @@ void WonState::draw(SDL_Renderer *renderer) { } State WonState::getNextState() { - return State::MENU; + return this->next_state; } diff --git a/src/states/WonState.hpp b/src/states/WonState.hpp index 9d5999c..daf9a6c 100644 --- a/src/states/WonState.hpp +++ b/src/states/WonState.hpp @@ -25,6 +25,8 @@ class WonState : public BaseState { PauseScreen screen_text; bool sound_played = false; + + State next_state = State::EXIT; public: WonState(SDL_Renderer *renderer, FontManager * fonts, SoundManager * sounds, OptionManager * options); ~WonState();