From e3a2246e25d33b21ccd327960073b248167b8630 Mon Sep 17 00:00:00 2001 From: Marianne Gagnon Date: Thu, 12 Jun 2014 18:43:20 -0400 Subject: [PATCH] More work on cutscene screens --- src/config/player_profile.hpp | 5 +- src/guiengine/abstract_state_manager.cpp | 4 +- src/guiengine/abstract_state_manager.hpp | 2 +- src/modes/cutscene_world.cpp | 62 ++++++++++++++++++++---- src/states_screens/feature_unlocked.cpp | 2 + src/states_screens/grand_prix_lose.cpp | 42 ---------------- 6 files changed, 62 insertions(+), 55 deletions(-) diff --git a/src/config/player_profile.hpp b/src/config/player_profile.hpp index a294d0a70..6625e211f 100644 --- a/src/config/player_profile.hpp +++ b/src/config/player_profile.hpp @@ -215,7 +215,10 @@ public: // ------------------------------------------------------------------------ bool isFirstTime() const { return m_story_mode_status->isFirstTime(); } // ------------------------------------------------------------------------ - void clearUnlocked() { m_story_mode_status->clearUnlocked(); } + void clearUnlocked() + { + m_story_mode_status->clearUnlocked(); + } // ------------------------------------------------------------------------ /** Returns the current challenge for this player. */ const ChallengeStatus* getCurrentChallengeStatus() const diff --git a/src/guiengine/abstract_state_manager.cpp b/src/guiengine/abstract_state_manager.cpp index 90ca4068f..3b7989370 100644 --- a/src/guiengine/abstract_state_manager.cpp +++ b/src/guiengine/abstract_state_manager.cpp @@ -138,7 +138,7 @@ void AbstractStateManager::pushScreen(Screen* screen) // ---------------------------------------------------------------------------- -void AbstractStateManager::replaceTopMostScreen(Screen* screen) +void AbstractStateManager::replaceTopMostScreen(Screen* screen, GUIEngine::GameState gameState) { //assert(m_game_mode != GAME); // you need to close any dialog before calling this @@ -160,7 +160,7 @@ void AbstractStateManager::replaceTopMostScreen(Screen* screen) getCurrentScreen()->tearDown(); m_menu_stack[m_menu_stack.size()-1] = name; - setGameState(MENU); + setGameState(gameState); switchToScreen(name.c_str()); // Send init event to new menu diff --git a/src/guiengine/abstract_state_manager.hpp b/src/guiengine/abstract_state_manager.hpp index e280103ac..b8ace0901 100644 --- a/src/guiengine/abstract_state_manager.hpp +++ b/src/guiengine/abstract_state_manager.hpp @@ -82,7 +82,7 @@ namespace GUIEngine * without displaying the second-topmost menu of the stack * in-between) */ - void replaceTopMostScreen(Screen* screen); + void replaceTopMostScreen(Screen* screen, GUIEngine::GameState gameState = GUIEngine::MENU); /** * \brief removes the menu at the top of the screens stack diff --git a/src/modes/cutscene_world.cpp b/src/modes/cutscene_world.cpp index ce878bf10..a998896e8 100644 --- a/src/modes/cutscene_world.cpp +++ b/src/modes/cutscene_world.cpp @@ -419,12 +419,11 @@ void CutsceneWorld::enterRaceOverState() // un-set the GP mode so that after unlocking, it doesn't try to continue the GP race_manager->setMajorMode(RaceManager::MAJOR_MODE_SINGLE); - if (PlayerManager::getCurrentPlayer() - ->getRecentlyCompletedChallenges().size() > 0) + std::vector unlocked = + PlayerManager::getCurrentPlayer()->getRecentlyCompletedChallenges(); + if (unlocked.size() > 0) { - std::vector unlocked = - PlayerManager::getCurrentPlayer()->getRecentlyCompletedChallenges(); - PlayerManager::getCurrentPlayer()->clearUnlocked(); + //PlayerManager::getCurrentPlayer()->clearUnlocked(); StateManager::get()->enterGameState(); race_manager->setMinorMode(RaceManager::MINOR_MODE_CUTSCENE); @@ -443,12 +442,13 @@ void CutsceneWorld::enterRaceOverState() scene->addTrophy(race_manager->getDifficulty()); scene->findWhatWasUnlocked(race_manager->getDifficulty()); - StateManager::get()->replaceTopMostScreen(scene); + StateManager::get()->replaceTopMostScreen(scene, GUIEngine::INGAME_MENU); } else { if (race_manager->raceWasStartedFromOverworld()) { + //StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); OverWorld::enterOverWorld(); } else @@ -462,10 +462,54 @@ void CutsceneWorld::enterRaceOverState() // TODO: remove hardcoded knowledge of cutscenes, replace with scripting probably else if (m_parts.size() == 1 && m_parts[0] == "gplose") { + //race_manager->exitRace(); + //StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); + //if (race_manager->raceWasStartedFromOverworld()) + // OverWorld::enterOverWorld(); + race_manager->exitRace(); - StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); - if (race_manager->raceWasStartedFromOverworld()) - OverWorld::enterOverWorld(); + + // un-set the GP mode so that after unlocking, it doesn't try to continue the GP + race_manager->setMajorMode(RaceManager::MAJOR_MODE_SINGLE); + + std::vector unlocked = + PlayerManager::getCurrentPlayer()->getRecentlyCompletedChallenges(); + if (unlocked.size() > 0) + { + //PlayerManager::getCurrentPlayer()->clearUnlocked(); + + StateManager::get()->enterGameState(); + race_manager->setMinorMode(RaceManager::MINOR_MODE_CUTSCENE); + race_manager->setNumKarts(0); + race_manager->setNumPlayers(0); + race_manager->setNumLocalPlayers(0); + race_manager->startSingleRace("featunlocked", 999, false); + + FeatureUnlockedCutScene* scene = + FeatureUnlockedCutScene::getInstance(); + std::vector parts; + parts.push_back("featunlocked"); + ((CutsceneWorld*)World::getWorld())->setParts(parts); + + scene->addTrophy(race_manager->getDifficulty()); + scene->findWhatWasUnlocked(race_manager->getDifficulty()); + + StateManager::get()->replaceTopMostScreen(scene, GUIEngine::INGAME_MENU); + } + else + { + if (race_manager->raceWasStartedFromOverworld()) + { + //StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); + OverWorld::enterOverWorld(); + } + else + { + StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); + // we assume the main menu was pushed before showing this menu + //StateManager::get()->popMenu(); + } + } } // TODO: remove hardcoded knowledge of cutscenes, replace with scripting probably else if (race_manager->getTrackName() == "introcutscene" || diff --git a/src/states_screens/feature_unlocked.cpp b/src/states_screens/feature_unlocked.cpp index 624e99e0c..ab7c2df9f 100644 --- a/src/states_screens/feature_unlocked.cpp +++ b/src/states_screens/feature_unlocked.cpp @@ -346,6 +346,8 @@ void FeatureUnlockedCutScene::init() std::cerr << "Malformed unlocked goody!!!\n"; } } + + PlayerManager::getCurrentPlayer()->clearUnlocked(); } // init // ---------------------------------------------------------------------------- diff --git a/src/states_screens/grand_prix_lose.cpp b/src/states_screens/grand_prix_lose.cpp index 80ba7bfe9..f9bc459fd 100644 --- a/src/states_screens/grand_prix_lose.cpp +++ b/src/states_screens/grand_prix_lose.cpp @@ -109,48 +109,6 @@ void GrandPrixLose::onCutsceneEnd() m_kart_node[1] = NULL; m_kart_node[2] = NULL; m_kart_node[3] = NULL; - - // un-set the GP mode so that after unlocking, it doesn't try to continue the GP - race_manager->setMajorMode(RaceManager::MAJOR_MODE_SINGLE); - - std::vector unlocked = - PlayerManager::getCurrentPlayer()->getRecentlyCompletedChallenges(); - if (unlocked.size() > 0) - { - race_manager->exitRace(); - - StateManager::get()->enterGameState(); - race_manager->setMinorMode(RaceManager::MINOR_MODE_CUTSCENE); - race_manager->setNumKarts(0); - race_manager->setNumPlayers(0); - race_manager->setNumLocalPlayers(0); - race_manager->startSingleRace("featunlocked", 999, false); - - FeatureUnlockedCutScene* scene = - FeatureUnlockedCutScene::getInstance(); - std::vector parts; - parts.push_back("featunlocked"); - ((CutsceneWorld*)World::getWorld())->setParts(parts); - - scene->addTrophy(race_manager->getDifficulty()); - scene->findWhatWasUnlocked(race_manager->getDifficulty()); - - StateManager::get()->replaceTopMostScreen(scene); - PlayerManager::getCurrentPlayer()->clearUnlocked(); - } - else - { - if (race_manager->raceWasStartedFromOverworld()) - { - StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); - OverWorld::enterOverWorld(); - } - else - { - // we assume the main menu was pushed before showing this menu - StateManager::get()->popMenu(); - } - } } // -------------------------------------------------------------------------------------