diff --git a/src/states_screens/dialogs/race_over_dialog.cpp b/src/states_screens/dialogs/race_over_dialog.cpp index 5349ac71f..bca479664 100644 --- a/src/states_screens/dialogs/race_over_dialog.cpp +++ b/src/states_screens/dialogs/race_over_dialog.cpp @@ -31,8 +31,8 @@ #include "states_screens/main_menu_screen.hpp" #include "states_screens/race_setup_screen.hpp" #include "states_screens/state_manager.hpp" -#include "tracks/track_manager.hpp" -#include "tracks/track.hpp" +//#include "tracks/track_manager.hpp" +//#include "tracks/track.hpp" #include "utils/string_utils.hpp" #include "utils/translation.hpp" @@ -411,62 +411,7 @@ GUIEngine::EventPropagation RaceOverDialog::processEvent(const std::string& even */ assert(unlocked.size() > 0); - for (unsigned int n=0; n<unlocked.size(); n++) - { - const std::vector<UnlockableFeature>& unlockedFeatures = unlocked[n]->getFeatures(); - assert(unlockedFeatures.size() > 0); - - for (unsigned int i=0; i<unlockedFeatures.size(); i++) - { - - switch (unlockedFeatures[i].type) - { - case UNLOCK_TRACK: - { - Track* track = track_manager->getTrack(unlockedFeatures[i].name); - assert(track != NULL); - const std::string sshot = track->getScreenshotFile(); - scene->addUnlockedPicture( irr_driver->getTexture(sshot.c_str()), 1.0f, 0.75f, - unlockedFeatures[i].getUnlockedMessage() ); - break; - } - case UNLOCK_GP: - { - //TODO - break; - } - case UNLOCK_MODE: - { - const RaceManager::MinorRaceModeType mode = - RaceManager::getModeIDFromInternalName(unlockedFeatures[i].name.c_str()); - const std::string icon = file_manager->getDataDir() + "/" + RaceManager::getIconOf(mode); - scene->addUnlockedPicture( irr_driver->getTexture(icon.c_str()), 0.8f, 0.8f, - unlockedFeatures[i].getUnlockedMessage() ); - break; - } - case UNLOCK_KART: - { - const KartProperties* kart = kart_properties_manager->getKart(unlockedFeatures[i].name); - assert(kart != NULL); - - // the passed kart will not be modified, that's why I allow myself to use const_cast - scene->addUnlockedKart( const_cast<KartProperties*>(kart), - unlockedFeatures[i].getUnlockedMessage() ); - break; - } - case UNLOCK_DIFFICULTY: - { - //TODO - break; - } - default: - { - assert(false); - } - } - - } // next feature - } // next challenge + scene->addUnlockedThings(unlocked); ModalDialog::dismiss(); diff --git a/src/states_screens/feature_unlocked.cpp b/src/states_screens/feature_unlocked.cpp index aad4fee23..c93fa567c 100644 --- a/src/states_screens/feature_unlocked.cpp +++ b/src/states_screens/feature_unlocked.cpp @@ -1,13 +1,17 @@ #include "states_screens/feature_unlocked.hpp" - +#include "challenges/challenge.hpp" #include "guiengine/engine.hpp" #include "io/file_manager.hpp" #include "items/item_manager.hpp" +#include "karts/kart.hpp" +#include "karts/kart_properties_manager.hpp" #include "modes/world.hpp" #include "states_screens/main_menu_screen.hpp" #include "states_screens/state_manager.hpp" +#include "tracks/track.hpp" +#include "tracks/track_manager.hpp" #include "utils/translation.hpp" #include <SColor.h> @@ -292,6 +296,78 @@ void FeatureUnlockedCutScene::onUpdate(float dt, irr::video::IVideoDriver* drive // ------------------------------------------------------------------------------------- +void FeatureUnlockedCutScene::addUnlockedThings(const std::vector<const Challenge*> unlocked) +{ + for (unsigned int n=0; n<unlocked.size(); n++) + { + const std::vector<UnlockableFeature>& unlockedFeatures = unlocked[n]->getFeatures(); + assert(unlockedFeatures.size() > 0); + + for (unsigned int i=0; i<unlockedFeatures.size(); i++) + { + + switch (unlockedFeatures[i].type) + { + case UNLOCK_TRACK: + { + Track* track = track_manager->getTrack(unlockedFeatures[i].name); + assert(track != NULL); + const std::string sshot = track->getScreenshotFile(); + addUnlockedPicture( irr_driver->getTexture(sshot.c_str()), 1.0f, 0.75f, + unlockedFeatures[i].getUnlockedMessage() ); + break; + } + case UNLOCK_GP: + { + //TODO: implement + std::cerr << "OK, I see you unlocked a GP, but this is not supported yet\n"; + + video::ITexture* tex = irr_driver->getTexture( file_manager->getGUIDir() + "/main_help.png"); + addUnlockedPicture( tex, 1.0f, 0.75f, + unlockedFeatures[i].getUnlockedMessage() ); + break; + } + case UNLOCK_MODE: + { + const RaceManager::MinorRaceModeType mode = + RaceManager::getModeIDFromInternalName(unlockedFeatures[i].name.c_str()); + const std::string icon = file_manager->getDataDir() + "/" + RaceManager::getIconOf(mode); + addUnlockedPicture( irr_driver->getTexture(icon.c_str()), 0.8f, 0.8f, + unlockedFeatures[i].getUnlockedMessage() ); + break; + } + case UNLOCK_KART: + { + const KartProperties* kart = kart_properties_manager->getKart(unlockedFeatures[i].name); + assert(kart != NULL); + + // the passed kart will not be modified, that's why I allow myself to use const_cast + addUnlockedKart( const_cast<KartProperties*>(kart), + unlockedFeatures[i].getUnlockedMessage() ); + break; + } + case UNLOCK_DIFFICULTY: + { + //TODO : implement + std::cerr << "OK, I see you unlocked a difficulty, but this is not supported yet\n"; + + video::ITexture* tex = irr_driver->getTexture( file_manager->getGUIDir() + "/main_help.png"); + addUnlockedPicture( tex, 1.0f, 0.75f, + unlockedFeatures[i].getUnlockedMessage() ); + break; + } + default: + { + assert(false); + } + } + + } // next feature + } // next challenge +} + +// ------------------------------------------------------------------------------------- + bool FeatureUnlockedCutScene::onEscapePressed() { continueButtonPressed(); diff --git a/src/states_screens/feature_unlocked.hpp b/src/states_screens/feature_unlocked.hpp index db923789b..ca619d122 100644 --- a/src/states_screens/feature_unlocked.hpp +++ b/src/states_screens/feature_unlocked.hpp @@ -6,7 +6,7 @@ namespace irr { namespace scene { class ISceneNode; class ICameraSceneNode; class ILightSceneNode; } } class KartProperties; - +class Challenge; class FeatureUnlockedCutScene : public GUIEngine::Screen, public GUIEngine::ScreenSingleton<FeatureUnlockedCutScene> { @@ -89,6 +89,10 @@ public: /** Call before showing up the screen to make a picture come out of the chest */ void addUnlockedPicture(irr::video::ITexture* picture, float w, float h, irr::core::stringw msg); + /** Call before showing up the screen to make whatever the passed challenges unlocked + * come out of the chest */ + void addUnlockedThings(const std::vector<const Challenge*> unlocked); + /** override from base class to handle escape press */ virtual bool onEscapePressed(); }; diff --git a/src/states_screens/grand_prix_over.cpp b/src/states_screens/grand_prix_over.cpp index 1c8448c9f..a227cdcda 100644 --- a/src/states_screens/grand_prix_over.cpp +++ b/src/states_screens/grand_prix_over.cpp @@ -10,6 +10,7 @@ #include "io/file_manager.hpp" #include "items/item_manager.hpp" #include "karts/kart_properties_manager.hpp" +#include "states_screens/feature_unlocked.hpp" #include "states_screens/state_manager.hpp" #include "utils/translation.hpp" @@ -338,8 +339,26 @@ void GrandPrixOver::eventCallback(GUIEngine::Widget* widget, { if (name == "continue") { - // we assume the main menu was pushed before showing this menu - StateManager::get()->popMenu(); + // 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->getRecentlyUnlockedFeatures().size() > 0) + { + std::vector<const Challenge*> unlocked = unlock_manager->getRecentlyUnlockedFeatures(); + unlock_manager->clearUnlocked(); + + FeatureUnlockedCutScene* scene = FeatureUnlockedCutScene::getInstance(); + + assert(unlocked.size() > 0); + scene->addUnlockedThings(unlocked); + + StateManager::get()->replaceTopMostScreen(scene); + } + else + { + // we assume the main menu was pushed before showing this menu + StateManager::get()->popMenu(); + } } }