void GrandPrixWin::eventCallback(GUIEngine::Widget* widget, const std::string& name, const int playerID) { if (name == "continue") { // 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 (unlock_manager->getCurrentSlot()->getRecentlyCompletedChallenges().size() > 0) { std::vector<const ChallengeData*> unlocked = unlock_manager->getCurrentSlot()->getRecentlyCompletedChallenges(); unlock_manager->getCurrentSlot()->clearUnlocked(); FeatureUnlockedCutScene* scene = FeatureUnlockedCutScene::getInstance(); assert(unlocked.size() > 0); scene->addTrophy(race_manager->getDifficulty()); scene->findWhatWasUnlocked(race_manager->getDifficulty()); StateManager::get()->replaceTopMostScreen(scene); } else { // we assume the main menu was pushed before showing this menu StateManager::get()->popMenu(); } } } // eventCallback
//----------------------------------------------------------------------------- void RaceResultGUI::eventCallback(GUIEngine::Widget* widget, const std::string& name, const int playerID) { // If something was unlocked, the 'continue' button was // actually used to display "Show unlocked feature(s)" text. // --------------------------------------------------------- int n = unlock_manager->getCurrentSlot()->getRecentlyCompletedChallenges().size(); if(n>0) { if(name=="top") { if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) { cleanupGPProgress(); } std::vector<const ChallengeData*> unlocked = unlock_manager->getCurrentSlot()->getRecentlyCompletedChallenges(); bool gameCompleted = false; for (unsigned int n = 0; n < unlocked.size(); n++) { if (unlocked[n]->getId() == "fortmagma") { gameCompleted = true; break; } } unlock_manager->getCurrentSlot()->clearUnlocked(); if (gameCompleted) { // clear the race // kart will no longer be available during cutscene, drop reference StateManager::get()->getActivePlayer(playerID)->setKart(NULL); World::deleteWorld(); 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("endcutscene", 999, false); std::vector<std::string> parts; parts.push_back("endcutscene"); ((CutsceneWorld*)World::getWorld())->setParts(parts); } else { FeatureUnlockedCutScene* scene = FeatureUnlockedCutScene::getInstance(); scene->addTrophy(race_manager->getDifficulty()); scene->findWhatWasUnlocked(race_manager->getDifficulty()); StateManager::get()->popMenu(); World::deleteWorld(); StateManager::get()->pushScreen(scene); race_manager->setAIKartOverride(""); } return; } fprintf(stderr, "Incorrect event '%s' when things are unlocked.\n", name.c_str()); assert(false); } // If we're playing online : if (World::getWorld()->isNetworkWorld()) { StateManager::get()->popMenu(); if (name == "middle") // Continue button (return to server lobby) { race_manager->exitRace(); race_manager->setAIKartOverride(""); Screen* newStack[] = {MainMenuScreen::getInstance(), OnlineScreen::getInstance(), ServerSelection::getInstance(), NetworkingLobby::getInstance(), NULL}; StateManager::get()->resetAndSetStack( newStack ); } if (name == "bottom") // Quit server (return to main menu) { race_manager->exitRace(); race_manager->setAIKartOverride(""); StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); } return; } // Next check for GP // ----------------- if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) { if (name == "middle") // Next GP { cleanupGPProgress(); StateManager::get()->popMenu(); race_manager->next(); } else if (name == "bottom") // Abort { new MessageDialog(_("Do you really want to abort the Grand Prix?"), MessageDialog::MESSAGE_DIALOG_CONFIRM, this, false); } else if (!getWidget(name.c_str())->isVisible()) { fprintf(stderr, "Incorrect event '%s' when things are unlocked.\n", name.c_str()); assert(false); } return; } // This is a normal race, nothing was unlocked // ------------------------------------------- StateManager::get()->popMenu(); if(name=="top") // Setup new race { race_manager->exitRace(); race_manager->setAIKartOverride(""); NetworkKartSelectionScreen::getInstance()->tearDown(); // be sure to delete the kart selection screen Screen* newStack[] = {MainMenuScreen::getInstance(), RaceSetupScreen::getInstance(), NULL}; StateManager::get()->resetAndSetStack( newStack ); } else if (name=="middle") // Restart { race_manager->rerunRace(); } else if (name=="bottom") // Back to main { race_manager->exitRace(); race_manager->setAIKartOverride(""); NetworkKartSelectionScreen::getInstance()->tearDown(); // be sure to delete the kart selection screen StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); if (race_manager->raceWasStartedFromOverworld()) { OverWorld::enterOverWorld(); } } else { fprintf(stderr, "Incorrect event '%s' for normal race.\n", name.c_str()); } return; } // eventCallback