Exemplo n.º 1
0
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
Exemplo n.º 2
0
//-----------------------------------------------------------------------------
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