diff --git a/data/gui/screens/race_result.stkgui b/data/gui/screens/race_result.stkgui index 7dbc80659..5cbbf3dd6 100644 --- a/data/gui/screens/race_result.stkgui +++ b/data/gui/screens/race_result.stkgui @@ -1,25 +1,27 @@ -
- -
- +
+ +
+
+ +
+ + + + + + +
- - -
diff --git a/src/states_screens/race_result_gui.cpp b/src/states_screens/race_result_gui.cpp index 55a614e85..0c1fddfaa 100644 --- a/src/states_screens/race_result_gui.cpp +++ b/src/states_screens/race_result_gui.cpp @@ -34,6 +34,7 @@ #include "guiengine/widget.hpp" #include "guiengine/widgets/icon_button_widget.hpp" #include "guiengine/widgets/label_widget.hpp" +#include "guiengine/widgets/ribbon_widget.hpp" #include "io/file_manager.hpp" #include "karts/abstract_kart.hpp" #include "karts/controller/controller.hpp" @@ -83,9 +84,9 @@ void RaceResultGUI::init() m_timer = 0; - getWidget("top")->setVisible(false); + getWidget("left")->setVisible(false); getWidget("middle")->setVisible(false); - getWidget("bottom")->setVisible(false); + getWidget("right")->setVisible(false); music_manager->stopMusic(); @@ -159,9 +160,9 @@ void RaceResultGUI::tearDown() */ void RaceResultGUI::enableAllButtons() { - GUIEngine::Widget *top = getWidget("top"); - GUIEngine::Widget *middle = getWidget("middle"); - GUIEngine::Widget *bottom = getWidget("bottom"); + GUIEngine::IconButtonWidget *left = getWidget("left"); + GUIEngine::IconButtonWidget *middle = getWidget("middle"); + GUIEngine::IconButtonWidget *right = getWidget("right"); if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) { @@ -171,12 +172,14 @@ void RaceResultGUI::enableAllButtons() // If we're in a network world, change the buttons text if (World::getWorld()->isNetworkWorld()) { - top->setVisible(false); - middle->setText(_("Continue")); - middle->setVisible(true); - middle->setFocusForPlayer(PLAYER_ID_GAME_MASTER); - bottom->setText(_("Quit the server")); - bottom->setVisible(true); + left->setLabel(_("Continue")); + left->setImage("gui/icons/green_check.png"); + left->setVisible(true); + left->setFocusForPlayer(PLAYER_ID_GAME_MASTER); + middle->setVisible(false); + right->setLabel(_("Quit the server")); + right->setImage("gui/icons/main_quit.png"); + right->setVisible(true); return; } @@ -187,30 +190,40 @@ void RaceResultGUI::enableAllButtons() (race_manager->getMajorMode() != RaceManager::MAJOR_MODE_GRAND_PRIX || race_manager->getTrackNumber() + 1 == race_manager->getNumOfTracks() ) ) { - top->setText(n == 1 ? _("You completed a challenge!") + middle->setLabel(n == 1 ? _("You completed a challenge!") : _("You completed challenges!")); - top->setVisible(true); - top->setFocusForPlayer(PLAYER_ID_GAME_MASTER); + middle->setImage("gui/icons/cup_gold.png"); + middle->setVisible(true); + middle->setFocusForPlayer(PLAYER_ID_GAME_MASTER); } else if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) { // In case of a GP: // ---------------- - top->setVisible(false); - top->setFocusable(false); + middle->setLabel(_("Continue")); + middle->setImage("gui/icons/green_check.png"); + middle->setVisible(false); + middle->setFocusable(false); + right->setVisible(false); + right->setFocusable(false); - middle->setText(_("Continue")); - middle->setVisible(true); + // Two continue buttons to make sure the buttons in the bar is balanced + left->setLabel(_("Continue")); + left->setImage("gui/icons/green_check.png"); + left->setVisible(true); if (race_manager->getTrackNumber() + 1 < race_manager->getNumOfTracks()) { - bottom->setText(_("Abort Grand Prix")); - bottom->setVisible(true); - bottom->setFocusable(true); + right->setLabel(_("Abort Grand Prix")); + right->setImage("gui/icons/race_giveup.png"); + right->setVisible(true); + right->setFocusable(true); } else { - bottom->setFocusable(false); + left->setVisible(false); + left->setFocusable(false); + middle->setVisible(true); } middle->setFocusForPlayer(PLAYER_ID_GAME_MASTER); @@ -220,24 +233,28 @@ void RaceResultGUI::enableAllButtons() // Normal race // ----------- - middle->setText(_("Restart")); - middle->setVisible(true); - middle->setFocusForPlayer(PLAYER_ID_GAME_MASTER); + left->setLabel(_("Restart")); + left->setImage("gui/icons/restart.png"); + left->setVisible(true); + left->setFocusForPlayer(PLAYER_ID_GAME_MASTER); if (race_manager->raceWasStartedFromOverworld()) { - top->setVisible(false); - bottom->setText(_("Back to challenge selection")); + middle->setVisible(false); + right->setLabel(_("Back to challenge selection")); + right->setImage("gui/icons/back.png"); } else { + middle->setImage("gui/icons/main_race.png"); if (race_manager->isRecordingRace()) - top->setText(_("Race against the new ghost replay")); + middle->setLabel(_("Race against the new ghost replay")); else - top->setText(_("Setup New Race")); - top->setVisible(true); - bottom->setText(_("Back to the menu")); + middle->setLabel(_("Setup New Race")); + middle->setVisible(true); + right->setLabel(_("Back to the menu")); + right->setImage("gui/icons/back.png"); } - bottom->setVisible(true); + right->setVisible(true); } } // enableAllButtons @@ -259,198 +276,203 @@ void RaceResultGUI::eventCallback(GUIEngine::Widget* widget, m_end_track++; displayScreenShots(); } - - // If we're playing online : - if (World::getWorld()->isNetworkWorld()) + + if(name == "operations") { - if (name == "middle") // Continue button (return to server lobby) + const std::string& action = + getWidget("operations")->getSelectionIDString(PLAYER_ID_GAME_MASTER); + // If we're playing online : + if (World::getWorld()->isNetworkWorld()) { - // Signal to the server that this client is back in the lobby now. - auto cl = LobbyProtocol::get(); - if (cl) - cl->doneWithResults(); - getWidget("middle")->setText(_("Waiting for others")); - } - if (name == "bottom") // Quit server (return to online lan / wan menu) - { - race_manager->clearNetworkGrandPrixResult(); - if (STKHost::existHost()) + if (action == "left") // Continue button (return to server lobby) { - STKHost::get()->shutdown(); + // Signal to the server that this client is back in the lobby now. + auto cl = LobbyProtocol::get(); + if (cl) + cl->doneWithResults(); + getWidget("left")->setLabel(_("Waiting for others")); } - race_manager->exitRace(); - race_manager->setAIKartOverride(""); - StateManager::get()->resetAndSetStack( - NetworkConfig::get()->getResetScreens().data()); - NetworkConfig::get()->unsetNetworking(); + if (action == "right") // Quit server (return to online lan / wan menu) + { + race_manager->clearNetworkGrandPrixResult(); + if (STKHost::existHost()) + { + STKHost::get()->shutdown(); + } + race_manager->exitRace(); + race_manager->setAIKartOverride(""); + StateManager::get()->resetAndSetStack( + NetworkConfig::get()->getResetScreens().data()); + NetworkConfig::get()->unsetNetworking(); + } + return; } - return; - } - // If something was unlocked, the 'continue' button was - // actually used to display "Show unlocked feature(s)" text. - // --------------------------------------------------------- - int n = (int)PlayerManager::getCurrentPlayer() - ->getRecentlyCompletedChallenges().size(); - if (n > 0 && - (race_manager->getMajorMode() != RaceManager::MAJOR_MODE_GRAND_PRIX || - race_manager->getTrackNumber() + 1 == race_manager->getNumOfTracks() ) ) + // If something was unlocked, the 'continue' button was + // actually used to display "Show unlocked feature(s)" text. + // --------------------------------------------------------- + int n = (int)PlayerManager::getCurrentPlayer() + ->getRecentlyCompletedChallenges().size(); + if (n > 0 && + (race_manager->getMajorMode() != RaceManager::MAJOR_MODE_GRAND_PRIX || + race_manager->getTrackNumber() + 1 == race_manager->getNumOfTracks() ) ) - { - if (name == "top") { - if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) + if (action == "middle") + { + if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) + { + cleanupGPProgress(); + } + + std::vector unlocked = + PlayerManager::getCurrentPlayer()->getRecentlyCompletedChallenges(); + + bool gameCompleted = false; + for (unsigned int n = 0; n < unlocked.size(); n++) + { + if (unlocked[n]->getChallengeId() == "fortmagma") + { + gameCompleted = true; + break; + } + } + + if (gameCompleted) + { + // clear the race + + // kart will no longer be available during cutscene, drop reference + StateManager::get()->getActivePlayer(playerID)->setKart(NULL); + PropertyAnimator::get()->clear(); + World::deleteWorld(); + + CutsceneWorld::setUseDuration(true); + StateManager::get()->enterGameState(); + race_manager->setMinorMode(RaceManager::MINOR_MODE_CUTSCENE); + race_manager->setNumKarts(0); + race_manager->setNumPlayers(0); + race_manager->startSingleRace("endcutscene", 999, false); + + std::vector parts; + parts.push_back("endcutscene"); + ((CutsceneWorld*)World::getWorld())->setParts(parts); + } + else + { + StateManager::get()->popMenu(); + PropertyAnimator::get()->clear(); + World::deleteWorld(); + + CutsceneWorld::setUseDuration(false); + StateManager::get()->enterGameState(); + race_manager->setMinorMode(RaceManager::MINOR_MODE_CUTSCENE); + race_manager->setNumKarts(0); + race_manager->setNumPlayers(0); + race_manager->startSingleRace("featunlocked", 999, race_manager->raceWasStartedFromOverworld()); + + FeatureUnlockedCutScene* scene = + FeatureUnlockedCutScene::getInstance(); + + scene->addTrophy(race_manager->getDifficulty(),false); + scene->findWhatWasUnlocked(race_manager->getDifficulty(),unlocked); + scene->push(); + race_manager->setAIKartOverride(""); + + std::vector parts; + parts.push_back("featunlocked"); + ((CutsceneWorld*)World::getWorld())->setParts(parts); + } + + PlayerManager::getCurrentPlayer()->clearUnlocked(); + + return; + } + Log::warn("RaceResultGUI", "Incorrect event '%s' when things are unlocked.", + action.c_str()); + } + + // Next check for GP + // ----------------- + if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) + { + if (action == "left" || action == "middle") // Next GP { cleanupGPProgress(); + StateManager::get()->popMenu(); + race_manager->next(); } - - std::vector unlocked = - PlayerManager::getCurrentPlayer()->getRecentlyCompletedChallenges(); - - bool gameCompleted = false; - for (unsigned int n = 0; n < unlocked.size(); n++) + else if (action == "right") // Abort { - if (unlocked[n]->getChallengeId() == "fortmagma") - { - gameCompleted = true; - break; - } + new MessageDialog(_("Do you really want to abort the Grand Prix?"), + MessageDialog::MESSAGE_DIALOG_CONFIRM, this, false); } - - if (gameCompleted) + else if (!getWidget(action.c_str())->isVisible()) { - // clear the race + Log::warn("RaceResultGUI", "Incorrect event '%s' when things are unlocked.", + action.c_str()); + } + return; + } - // kart will no longer be available during cutscene, drop reference - StateManager::get()->getActivePlayer(playerID)->setKart(NULL); - PropertyAnimator::get()->clear(); - World::deleteWorld(); + StateManager::get()->popMenu(); + if (action == "left") // Restart + { + race_manager->rerunRace(); + } + else if (action == "middle") // Setup new race + { + // Save current race data for race against new ghost + std::string track_name = race_manager->getTrackName(); + int laps = race_manager->getNumLaps(); + bool reverse = race_manager->getReverseTrack(); + bool new_ghost_race = race_manager->isRecordingRace(); - CutsceneWorld::setUseDuration(true); - StateManager::get()->enterGameState(); - race_manager->setMinorMode(RaceManager::MINOR_MODE_CUTSCENE); - race_manager->setNumKarts(0); - race_manager->setNumPlayers(0); - race_manager->startSingleRace("endcutscene", 999, false); + race_manager->exitRace(); + race_manager->setAIKartOverride(""); - std::vector parts; - parts.push_back("endcutscene"); - ((CutsceneWorld*)World::getWorld())->setParts(parts); + //If pressing continue quickly in a losing challenge + if (race_manager->raceWasStartedFromOverworld()) + { + StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); + OverWorld::enterOverWorld(); + } + // Special case : race against a newly saved ghost + else if (new_ghost_race) + { + ReplayPlay::get()->loadAllReplayFile(); + unsigned long long int last_uid = ReplayRecorder::get()->getLastUID(); + ReplayPlay::get()->setReplayFileByUID(last_uid); + + race_manager->setRecordRace(true); + race_manager->setRaceGhostKarts(true); + + race_manager->setNumKarts(race_manager->getNumLocalPlayers()); + + // Disable accidentally unlocking of a challenge + PlayerManager::getCurrentPlayer()->setCurrentChallenge(""); + + race_manager->setReverseTrack(reverse); + race_manager->startSingleRace(track_name, laps, false); } else { - StateManager::get()->popMenu(); - PropertyAnimator::get()->clear(); - World::deleteWorld(); - - CutsceneWorld::setUseDuration(false); - StateManager::get()->enterGameState(); - race_manager->setMinorMode(RaceManager::MINOR_MODE_CUTSCENE); - race_manager->setNumKarts(0); - race_manager->setNumPlayers(0); - race_manager->startSingleRace("featunlocked", 999, race_manager->raceWasStartedFromOverworld()); - - FeatureUnlockedCutScene* scene = - FeatureUnlockedCutScene::getInstance(); - - scene->addTrophy(race_manager->getDifficulty(),false); - scene->findWhatWasUnlocked(race_manager->getDifficulty(),unlocked); - scene->push(); - race_manager->setAIKartOverride(""); - - std::vector parts; - parts.push_back("featunlocked"); - ((CutsceneWorld*)World::getWorld())->setParts(parts); + Screen* newStack[] = { MainMenuScreen::getInstance(), + RaceSetupScreen::getInstance(), + NULL }; + StateManager::get()->resetAndSetStack(newStack); } - - PlayerManager::getCurrentPlayer()->clearUnlocked(); - - return; } - Log::warn("RaceResultGUI", "Incorrect event '%s' when things are unlocked.", - name.c_str()); - } - - // 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()) - { - Log::warn("RaceResultGUI", "Incorrect event '%s' when things are unlocked.", - name.c_str()); - } - return; - } - - StateManager::get()->popMenu(); - if (name == "top") // Setup new race - { - // Save current race data for race against new ghost - std::string track_name = race_manager->getTrackName(); - int laps = race_manager->getNumLaps(); - bool reverse = race_manager->getReverseTrack(); - bool new_ghost_race = race_manager->isRecordingRace(); - - race_manager->exitRace(); - race_manager->setAIKartOverride(""); - - //If pressing continue quickly in a losing challenge - if (race_manager->raceWasStartedFromOverworld()) + else if (action == "right") // Back to main { + race_manager->exitRace(); + race_manager->setAIKartOverride(""); StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); - OverWorld::enterOverWorld(); - } - // Special case : race against a newly saved ghost - else if (new_ghost_race) - { - ReplayPlay::get()->loadAllReplayFile(); - unsigned long long int last_uid = ReplayRecorder::get()->getLastUID(); - ReplayPlay::get()->setReplayFileByUID(last_uid); - race_manager->setRecordRace(true); - race_manager->setRaceGhostKarts(true); - - race_manager->setNumKarts(race_manager->getNumLocalPlayers()); - - // Disable accidentally unlocking of a challenge - PlayerManager::getCurrentPlayer()->setCurrentChallenge(""); - - race_manager->setReverseTrack(reverse); - race_manager->startSingleRace(track_name, laps, false); - } - else - { - 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(""); - StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); - - if (race_manager->raceWasStartedFromOverworld()) - { - OverWorld::enterOverWorld(); + if (race_manager->raceWasStartedFromOverworld()) + { + OverWorld::enterOverWorld(); + } } } else