Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge branch 'master' of github.com:supertuxkart/stk-code

  • Loading branch information...
commit 364c7434f67a4951116c4b41706285e9fa72a9b2 2 parents d36ff8b + e3a2246
@hiker hiker authored
View
5 src/config/player_profile.hpp
@@ -215,7 +215,10 @@ class PlayerProfile : public NoCopy
// ------------------------------------------------------------------------
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
View
3  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,6 +160,7 @@ void AbstractStateManager::replaceTopMostScreen(Screen* screen)
getCurrentScreen()->tearDown();
m_menu_stack[m_menu_stack.size()-1] = name;
+ setGameState(gameState);
switchToScreen(name.c_str());
// Send init event to new menu
View
2  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
View
199 src/guiengine/event_handler.cpp
@@ -305,12 +305,12 @@ void EventHandler::processGUIAction(const PlayerAction action,
case PA_ACCEL:
case PA_MENU_UP:
- navigateUp(playerID, type, pressedDown);
+ navigate(playerID, type, pressedDown, true);
break;
case PA_BRAKE:
case PA_MENU_DOWN:
- navigateDown(playerID, type, pressedDown);
+ navigate(playerID, type, pressedDown, false);
break;
case PA_RESCUE:
@@ -364,10 +364,14 @@ const bool NAVIGATION_DEBUG = false;
#pragma mark Private methods
#endif
-void EventHandler::navigateUp(const int playerID, Input::InputType type, const bool pressedDown)
+/**
+ * Focus the next widget either downwards or upwards.
+ *
+ * \param reverse True means navigating up, false means down.
+ */
+void EventHandler::navigate(const int playerID, Input::InputType type, const bool pressedDown, const bool reverse)
{
- //std::cout << "Naviagte up!\n";
- IGUIElement *el = NULL/*, *first=NULL*/, *closest=NULL;
+ IGUIElement *el = NULL, *closest = NULL;
if (type == Input::IT_STICKBUTTON && !pressedDown)
return;
@@ -378,19 +382,22 @@ void EventHandler::navigateUp(const int playerID, Input::InputType type, const b
el = w->getIrrlichtElement();
}
-
// list widgets are a bit special, because up/down keys are also used
// to navigate between various list items, not only to navigate between
// components
if (w != NULL && w->m_type == WTYPE_LIST)
{
- ListWidget* list = (ListWidget*)w;
+ ListWidget* list = (ListWidget*) w;
- const bool stay_within_list = list->getSelectionID() > 0;
+ const bool stay_within_list = reverse ? list->getSelectionID() > 0 :
+ list->getSelectionID() < list->getItemCount() - 1;
if (stay_within_list)
{
- list->setSelectionID(list->getSelectionID()-1);
+ if (reverse)
+ list->setSelectionID(list->getSelectionID() - 1);
+ else
+ list->setSelectionID(list->getSelectionID() + 1);
return;
}
else
@@ -399,16 +406,15 @@ void EventHandler::navigateUp(const int playerID, Input::InputType type, const b
}
}
- if (w != NULL && w->m_tab_up_root != -1)
+ if (w != NULL && ((reverse && w->m_tab_up_root != -1) || (!reverse && w->m_tab_down_root != -1)))
{
- Widget* up = GUIEngine::getWidget( w->m_tab_up_root );
- assert( up != NULL );
-
- el = up->getIrrlichtElement();
+ Widget* next = GUIEngine::getWidget(reverse ? w->m_tab_up_root : w->m_tab_down_root);
+ assert(next != NULL);
+ el = next->getIrrlichtElement();
if (el == NULL)
{
- std::cerr << "WARNING : m_tab_down_root is set to an ID for which I can't find the widget\n";
+ std::cerr << "WARNING : m_tab_down/up_root is set to an ID for which I can't find the widget\n";
return;
}
}
@@ -424,164 +430,42 @@ void EventHandler::navigateUp(const int playerID, Input::InputType type, const b
// find closest widget
if (el != NULL && el->getTabGroup() != NULL)
{
- // if the current widget is e.g. 15, search for widget 14, 13, 12, ... (up to 10 IDs may be missing)
- for (int n=1; n<10 && !found; n++)
+ // Up: if the current widget is e.g. 15, search for widget 14, 13, 12, ... (up to 10 IDs may be missing)
+ // Down: if the current widget is e.g. 5, search for widget 6, 7, 8, 9, ..., 15 (up to 10 IDs may be missing)
+ for (int n = 1; n < 10 && !found; n++)
{
- closest = GUIEngine::getGUIEnv()->getRootGUIElement()->getElementFromId(el->getTabOrder() - n, true);
+ closest = GUIEngine::getGUIEnv()->getRootGUIElement()->getElementFromId(el->getTabOrder() + (reverse ? -n : n), true);
if (closest != NULL && Widget::isFocusableId(closest->getID()))
{
- if (NAVIGATION_DEBUG) std::cout << "Navigating up to " << closest->getID() << std::endl;
Widget* closestWidget = GUIEngine::getWidget( closest->getID() );
if (playerID != PLAYER_ID_GAME_MASTER && !closestWidget->m_supports_multiplayer) return;
// if a dialog is shown, restrict to items in the dialog
if (ModalDialog::isADialogActive() && !ModalDialog::getCurrent()->isMyChild(closestWidget))
- {
continue;
- }
-
- // when focusing a list by going up, select the last item of the list
- assert (closestWidget != NULL);
- closestWidget->setFocusForPlayer(playerID);
-
- if (closestWidget->m_type == WTYPE_LIST)
+ if (NAVIGATION_DEBUG)
{
- IGUIListBox* list = (IGUIListBox*)(closestWidget->m_element);
- assert(list != NULL);
-
- list->setSelected( list->getItemCount()-1 );
- return;
+ std::cout << "Navigating " << (reverse ? "up" : "down") << " to " << closest->getID() << std::endl;
}
- found = true;
-
- }
- } // end for
-
- }
-
- if (!found)
- {
- if (NAVIGATION_DEBUG)
- {
- std::cout << "EventHandler::navigateUp : wrap around, selecting the last widget\n";
- }
-
- // select the last widget
- Widget* lastWidget = NULL;
-
- if (ModalDialog::isADialogActive())
- {
- lastWidget = ModalDialog::getCurrent()->getLastWidget();
- }
- else
- {
- Screen* screen = GUIEngine::getCurrentScreen();
- if (screen == NULL) return;
- lastWidget = screen->getLastWidget();
- }
-
- if (lastWidget != NULL) lastWidget->setFocusForPlayer(playerID);
- }
-}
-
-// -----------------------------------------------------------------------------
-
-void EventHandler::navigateDown(const int playerID, Input::InputType type, const bool pressedDown)
-{
- //std::cout << "Naviagte down!\n";
-
- IGUIElement *el = NULL, *closest = NULL;
-
- if (type == Input::IT_STICKBUTTON && !pressedDown)
- return;
-
- Widget* w = GUIEngine::getFocusForPlayer(playerID);
- if (w != NULL)
- {
- el = w->getIrrlichtElement();
- }
- //std::cout << "!!! Player " << playerID << " navigating down of " << w->m_element->getID() << std::endl;
-
- // list widgets are a bit special, because up/down keys are also used
- // to navigate between various list items, not only to navigate between
- // components
- if (w != NULL && w->m_type == WTYPE_LIST)
- {
- ListWidget* list = (ListWidget*)w;
-
- const bool stay_within_list = list->getSelectionID() < list->getItemCount()-1;
-
- if (stay_within_list)
- {
- list->setSelectionID(list->getSelectionID()+1);
- return;
- }
- else
- {
- list->setSelectionID(-1);
- }
- }
-
- if (w != NULL && w->m_tab_down_root != -1)
- {
- Widget* down = GUIEngine::getWidget( w->m_tab_down_root );
- assert(down != NULL);
- el = down->getIrrlichtElement();
-
- if (el == NULL)
- {
- std::cerr << "WARNING : m_tab_down_root is set to an ID for which I can't find the widget\n";
- return;
- }
- }
-
- // don't allow navigating to any widget when a dialog is shown; only navigate to widgets in the dialog
- if (ModalDialog::isADialogActive() && !ModalDialog::getCurrent()->isMyIrrChild(el))
- {
- el = NULL;
- }
-
- bool found = false;
-
- if (el != NULL && el->getTabGroup() != NULL)
- {
- // if the current widget is e.g. 5, search for widget 6, 7, 8, 9, ..., 15 (up to 10 IDs may be missing)
- for (int n=1; n<10 && !found; n++)
- {
- closest = GUIEngine::getGUIEnv()->getRootGUIElement()->getElementFromId(el->getTabOrder() + n, true);
- if (closest != NULL && Widget::isFocusableId(closest->getID()))
- {
-
- Widget* closestWidget = GUIEngine::getWidget( closest->getID() );
- if (playerID != PLAYER_ID_GAME_MASTER && !closestWidget->m_supports_multiplayer) return;
+ assert(closestWidget != NULL);
- // if a dialog is shown, restrict to items in the dialog
- if (ModalDialog::isADialogActive() && !ModalDialog::getCurrent()->isMyChild(closestWidget))
- {
+ if (!closestWidget->isVisible() || !closestWidget->isActivated())
continue;
- }
- if (NAVIGATION_DEBUG)
- {
- std::cout << "Navigating down to " << closestWidget->getID() << "\n";
- }
-
- assert( closestWidget != NULL );
closestWidget->setFocusForPlayer(playerID);
- // another list exception : when entering a list, select the first item
+ // another list exception : when entering a list by going down, select the first item
+ // when focusing a list by going up, select the last item of the list
if (closestWidget->m_type == WTYPE_LIST)
{
- IGUIListBox* list = (IGUIListBox*)(closestWidget->m_element);
+ ListWidget* list = (ListWidget*) closestWidget;
assert(list != NULL);
-
- list->setSelected(0);
+ list->setSelectionID(reverse ? list->getItemCount() - 1 : 0);
}
-
found = true;
}
} // end for
@@ -589,25 +473,26 @@ void EventHandler::navigateDown(const int playerID, Input::InputType type, const
if (!found)
{
+ if (NAVIGATION_DEBUG)
+ std::cout << "EventHandler::navigat : wrap around\n";
- if (NAVIGATION_DEBUG) std::cout << "Navigating down : wrap around\n";
-
- // select the first widget
- Widget* firstWidget = NULL;
+ // select the last/first widget
+ Widget* wrapWidget = NULL;
if (ModalDialog::isADialogActive())
{
- //std::cout << "w = ModalDialog::getCurrent()->getFirstWidget();\n";
- firstWidget = ModalDialog::getCurrent()->getFirstWidget();
+ wrapWidget = reverse ? ModalDialog::getCurrent()->getLastWidget() :
+ ModalDialog::getCurrent()->getFirstWidget();
}
else
{
Screen* screen = GUIEngine::getCurrentScreen();
if (screen == NULL) return;
- firstWidget = screen->getFirstWidget();
+ wrapWidget = reverse ? screen->getLastWidget() :
+ screen->getFirstWidget();
}
- if (firstWidget != NULL) firstWidget->setFocusForPlayer(playerID);
+ if (wrapWidget != NULL) wrapWidget->setFocusForPlayer(playerID);
}
}
View
3  src/guiengine/event_handler.hpp
@@ -62,8 +62,7 @@ namespace GUIEngine
EventPropagation onGUIEvent(const irr::SEvent& event);
EventPropagation onWidgetActivated(Widget* w, const int playerID);
- void navigateUp(const int playerID, Input::InputType type, const bool pressedDown);
- void navigateDown(const int playerID, Input::InputType type, const bool pressedDown);
+ void navigate(const int playerID, Input::InputType type, const bool pressedDown, const bool reverse);
/** \brief send an event to the GUI module user's event callback
* \param widget the widget that triggerred this event
View
62 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<const ChallengeData*> unlocked =
+ PlayerManager::getCurrentPlayer()->getRecentlyCompletedChallenges();
+ if (unlocked.size() > 0)
{
- std::vector<const ChallengeData*> 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<const ChallengeData*> 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<std::string> 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" ||
View
2  src/states_screens/feature_unlocked.cpp
@@ -346,6 +346,8 @@ void FeatureUnlockedCutScene::init()
std::cerr << "Malformed unlocked goody!!!\n";
}
}
+
+ PlayerManager::getCurrentPlayer()->clearUnlocked();
} // init
// ----------------------------------------------------------------------------
View
42 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<const ChallengeData*> 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<std::string> 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();
- }
- }
}
// -------------------------------------------------------------------------------------
Please sign in to comment.
Something went wrong with that request. Please try again.