diff --git a/src/network/protocols/client_lobby_room_protocol.cpp b/src/network/protocols/client_lobby_room_protocol.cpp index adaf0790c..1e3c07c45 100644 --- a/src/network/protocols/client_lobby_room_protocol.cpp +++ b/src/network/protocols/client_lobby_room_protocol.cpp @@ -68,12 +68,12 @@ void ClientLobbyRoomProtocol::requestKartSelection(const std::string &kart_name) //----------------------------------------------------------------------------- -void ClientLobbyRoomProtocol::voteMajor(uint8_t major) +void ClientLobbyRoomProtocol::voteMajor(uint32_t major) { NetworkString request(8); // size_token (4), token, size major(1),major request.ai8(LE_VOTE_MAJOR).ai8(4) - .ai32(m_server->getClientServerToken()).ai8(1).ai8(major); + .ai32(m_server->getClientServerToken()).ai8(4).addUInt32(major); sendMessage(request, true); } // voteMajor @@ -90,12 +90,12 @@ void ClientLobbyRoomProtocol::voteRaceCount(uint8_t count) //----------------------------------------------------------------------------- -void ClientLobbyRoomProtocol::voteMinor(uint8_t minor) +void ClientLobbyRoomProtocol::voteMinor(uint32_t minor) { NetworkString request(8); // size_token (4), token, size minor(1),minor request.ai8(LE_VOTE_MINOR).ai8(4).ai32(m_server->getClientServerToken()) - .ai8(1).ai8(minor); + .ai8(4).addUInt32(minor); sendMessage(request, true); } // voteMinor @@ -723,7 +723,7 @@ void ClientLobbyRoomProtocol::playerMajorVote(Event* event) return; if (!isByteCorrect(event, 5, 1)) return; - if (!isByteCorrect(event, 7, 1)) + if (!isByteCorrect(event, 7, 4)) return; m_setup->getRaceConfig()->setPlayerMajorVote(data[6], data[8]); } // playerMajorVote @@ -758,8 +758,8 @@ void ClientLobbyRoomProtocol::playerRaceCountVote(Event* event) * Format of the data : * Byte 0 1 5 6 7 8 9 * -------------------------------------------------------- - * Size | 1 | 4 | 1 | 1 | 1 | 1 | - * Data | 4 | priv token | 1 | player id | 1 | minor mode vote | + * Size | 1 | 4 | 1 | 1 | 1 | 4 | + * Data | 4 | priv token | 1 | player id | 4 | minor mode vote | * -------------------------------------------------------- */ void ClientLobbyRoomProtocol::playerMinorVote(Event* event) @@ -769,7 +769,7 @@ void ClientLobbyRoomProtocol::playerMinorVote(Event* event) return; if (!isByteCorrect(event, 5, 1)) return; - if (!isByteCorrect(event, 7, 1)) + if (!isByteCorrect(event, 7, 4)) return; m_setup->getRaceConfig()->setPlayerMinorVote(data[6], data[8]); } // playerMinorVote diff --git a/src/network/protocols/client_lobby_room_protocol.hpp b/src/network/protocols/client_lobby_room_protocol.hpp index 616f0c7d7..882a2c0b8 100644 --- a/src/network/protocols/client_lobby_room_protocol.hpp +++ b/src/network/protocols/client_lobby_room_protocol.hpp @@ -13,9 +13,9 @@ class ClientLobbyRoomProtocol : public LobbyRoomProtocol virtual ~ClientLobbyRoomProtocol(); void requestKartSelection(const std::string &kart_name); - void voteMajor(uint8_t major); + void voteMajor(uint32_t major); void voteRaceCount(uint8_t count); - void voteMinor(uint8_t minor); + void voteMinor(uint32_t minor); void voteTrack(const std::string &track, uint8_t track_nb = 0); void voteReversed(bool reversed, uint8_t track_nb = 0); void voteLaps(uint8_t laps, uint8_t track_nb = 0); diff --git a/src/network/protocols/server_lobby_room_protocol.cpp b/src/network/protocols/server_lobby_room_protocol.cpp index 4fa2ff709..7faa990ef 100644 --- a/src/network/protocols/server_lobby_room_protocol.cpp +++ b/src/network/protocols/server_lobby_room_protocol.cpp @@ -566,10 +566,10 @@ void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event) * \param event : Event providing the information. * * Format of the data : - * Byte 0 1 5 6 7 + * Byte 0 1 5 6 10 * ---------------------------------------- - * Size | 1 | 4 | 1 | 1 | - * Data | 4 | priv token | 1 | major mode vote | + * Size | 1 | 4 | 1 | 4 | + * Data | 4 | priv token | 4 | major mode vote | * ---------------------------------------- */ void ServerLobbyRoomProtocol::playerMajorVote(Event* event) @@ -578,13 +578,14 @@ void ServerLobbyRoomProtocol::playerMajorVote(Event* event) STKPeer* peer = event->getPeer(); if (!checkDataSizeAndToken(event, 7)) return; - if (!isByteCorrect(event, 5, 1)) + if (!isByteCorrect(event, 5, 4)) return; uint8_t player_id = peer->getPlayerProfile()->getPlayerID(); - m_setup->getRaceConfig()->setPlayerMajorVote(player_id, data[6]); + uint32_t major = data.getUInt32(6); + m_setup->getRaceConfig()->setPlayerMajorVote(player_id, major); // Send the vote to everybody (including the sender) data.removeFront(5); // remove the token - NetworkString other(2+data.size()); + NetworkString other(5+data.size()); other.ai8(1).ai8(player_id); // add the player id other += data; // add the data NetworkString prefix(1); @@ -630,10 +631,10 @@ void ServerLobbyRoomProtocol::playerRaceCountVote(Event* event) * \param event : Event providing the information. * * Format of the data : - * Byte 0 1 5 6 7 + * Byte 0 1 5 6 10 * ---------------------------------------- - * Size | 1 | 4 | 1 | 1 | - * Data | 4 | priv token | 1 | minor mode vote | + * Size | 1 | 4 | 1 | 4 | + * Data | 4 | priv token | 4 | minor mode vote | * ---------------------------------------- */ void ServerLobbyRoomProtocol::playerMinorVote(Event* event) @@ -642,10 +643,11 @@ void ServerLobbyRoomProtocol::playerMinorVote(Event* event) STKPeer* peer = event->getPeer(); if (!checkDataSizeAndToken(event, 7)) return; - if (!isByteCorrect(event, 5, 1)) + if (!isByteCorrect(event, 5, 4)) return; uint8_t player_id = peer->getPlayerProfile()->getPlayerID(); - m_setup->getRaceConfig()->setPlayerMinorVote(player_id, data[6]); + uint32_t minor = data.getUInt32(6); + m_setup->getRaceConfig()->setPlayerMinorVote(player_id, minor); // Send the vote to everybody (including the sender) data.removeFront(5); // remove the token NetworkString other(2+data.size()); diff --git a/src/network/race_config.cpp b/src/network/race_config.cpp index 8f43f8529..46bfae6d3 100644 --- a/src/network/race_config.cpp +++ b/src/network/race_config.cpp @@ -108,7 +108,7 @@ RaceVote::RaceVote() //----------------------------------------------------------------------------- /** Sets the selected major race vote. */ -void RaceVote::voteMajor(uint8_t major) +void RaceVote::voteMajor(uint32_t major) { m_has_voted_major = true; m_major_mode = major; @@ -126,7 +126,7 @@ void RaceVote::voteRaceCount(uint8_t count) //----------------------------------------------------------------------------- /** Sets vote for minor race mode. */ -void RaceVote::voteMinor(uint8_t minor) +void RaceVote::voteMinor(uint32_t minor) { m_has_voted_minor = true; m_minor_mode = minor; @@ -247,7 +247,7 @@ void RaceConfig::setMaxPlayerCount(uint8_t count) } // setMaxPlayerCount //----------------------------------------------------------------------------- -void RaceConfig::setPlayerMajorVote(uint8_t player_id, uint8_t major) +void RaceConfig::setPlayerMajorVote(uint8_t player_id, uint32_t major) { Log::info("RaceConfig", "Player %d voted for major %d", player_id, major); m_votes[player_id].voteMajor(major); @@ -262,7 +262,7 @@ void RaceConfig::setPlayerRaceCountVote(uint8_t player_id, uint8_t count) } // setPlayerRaceCountVote //----------------------------------------------------------------------------- -void RaceConfig::setPlayerMinorVote(uint8_t player_id, uint8_t minor) +void RaceConfig::setPlayerMinorVote(uint8_t player_id, uint32_t minor) { Log::info("RaceConfig", "Player %d voted for minor %d", player_id, minor); m_votes[player_id].voteMinor(minor); diff --git a/src/network/race_config.hpp b/src/network/race_config.hpp index 533ffacd3..3e264025c 100644 --- a/src/network/race_config.hpp +++ b/src/network/race_config.hpp @@ -59,9 +59,9 @@ class RaceVote public: RaceVote(); - void voteMajor(uint8_t major); + void voteMajor(uint32_t major); void voteRaceCount(uint8_t count); - void voteMinor(uint8_t minor); + void voteMinor(uint32_t minor); void voteTrack(const std::string &track, uint8_t track_number = 0); void voteReversed(bool reversed, uint8_t track_number = 0); void voteLaps(uint8_t laps, uint8_t track_number = 0); @@ -81,8 +81,8 @@ class RaceVote uint8_t getLapsVote(uint8_t track_number = 0) const; private: - uint8_t m_major_mode; - uint8_t m_minor_mode; + uint32_t m_major_mode; + uint32_t m_minor_mode; uint8_t m_races_count; //!< Stores the number of races that will be in a GP bool m_has_voted_major; bool m_has_voted_minor; @@ -97,9 +97,9 @@ class RaceConfig RaceConfig(); void setMaxPlayerCount(uint8_t count); - void setPlayerMajorVote(uint8_t player_id, uint8_t major); + void setPlayerMajorVote(uint8_t player_id, uint32_t major); void setPlayerRaceCountVote(uint8_t player_id, uint8_t count); - void setPlayerMinorVote(uint8_t player_id, uint8_t minor); + void setPlayerMinorVote(uint8_t player_id, uint32_t minor); void setPlayerTrackVote(uint8_t player_id, const std::string &track, uint8_t track_nb = 0); void setPlayerReversedVote(uint8_t player_id, bool reversed, diff --git a/src/race/race_manager.cpp b/src/race/race_manager.cpp index 60b5c7378..b969f8901 100644 --- a/src/race/race_manager.cpp +++ b/src/race/race_manager.cpp @@ -222,6 +222,26 @@ void RaceManager::setNumPlayers(int num) m_player_karts.resize(num); } // setNumPlayers +// ---------------------------------------------------------------------------- +/** Converst the difficulty given as a string into a Difficult enum. Defaults + * to HARD. + * \param difficulty The difficulty as string. + */ +RaceManager::Difficulty + RaceManager::convertDifficulty(const std::string &difficulty) +{ + if (difficulty == "novice") + return DIFFICULTY_EASY; + else if (difficulty == "intermediate") + return DIFFICULTY_MEDIUM; + else if (difficulty == "expert") + return DIFFICULTY_HARD; + else if (difficulty == "best") + return DIFFICULTY_BEST; + else + return DIFFICULTY_HARD; +} // convertDifficulty + //----------------------------------------------------------------------------- /** Sets the difficulty to use. * \param diff The difficulty to use. diff --git a/src/race/race_manager.hpp b/src/race/race_manager.hpp index 760acb28d..19491fc34 100644 --- a/src/race/race_manager.hpp +++ b/src/race/race_manager.hpp @@ -414,6 +414,7 @@ public: * \param diff Difficulty. */ void setDifficulty(Difficulty diff); + static Difficulty convertDifficulty(const std::string &difficulty); // ------------------------------------------------------------------------ void setCoinTarget(int num) { m_coin_target = num; } diff --git a/src/states_screens/create_server_screen.cpp b/src/states_screens/create_server_screen.cpp index c845e51d1..297f3e9a8 100644 --- a/src/states_screens/create_server_screen.cpp +++ b/src/states_screens/create_server_screen.cpp @@ -192,6 +192,14 @@ void CreateServerScreen::createServer() // request is finished. NetworkConfig::get()->setMaxPlayers(max_players); NetworkConfig::get()->setServerName(name); + + // FIXME: Add the following fields to the create server screen + // FIXME: Long term we might add a 'vote' option (e.g. GP vs single race, + // and normal vs FTL vs time trial could be voted about). + race_manager->setDifficulty(RaceManager::convertDifficulty("hard")); + race_manager->setMajorMode(RaceManager::MAJOR_MODE_SINGLE); + race_manager->setMinorMode(RaceManager::MINOR_MODE_NORMAL_RACE); + race_manager->setReverseTrack(false); STKHost::create(); } // createServer diff --git a/src/states_screens/network_kart_selection.cpp b/src/states_screens/network_kart_selection.cpp index c8f63fb74..d7343d79a 100644 --- a/src/states_screens/network_kart_selection.cpp +++ b/src/states_screens/network_kart_selection.cpp @@ -32,6 +32,7 @@ #include "network/stk_host.hpp" #include "states_screens/server_selection.hpp" #include "states_screens/state_manager.hpp" +#include "states_screens/tracks_screen.hpp" static const char ID_LOCKED[] = "locked/"; @@ -162,15 +163,15 @@ void NetworkKartSelectionScreen::playerConfirm(const int playerID) } // playerConfirm // ---------------------------------------------------------------------------- -void NetworkKartSelectionScreen::playerSelected(uint8_t race_id, +void NetworkKartSelectionScreen::playerSelected(uint8_t player_id, const std::string &kart_name) { uint8_t widget_id = -1; for (unsigned int i = 0; i < m_id_mapping.size(); i++) { Log::info("NKSS", "Checking race id %d : mapped of %d is %d", - race_id, i, m_id_mapping[i]); - if (m_id_mapping[i] == race_id) + player_id, i, m_id_mapping[i]); + if (m_id_mapping[i] == player_id) widget_id = i; } @@ -181,6 +182,25 @@ void NetworkKartSelectionScreen::playerSelected(uint8_t race_id, KartSelectionScreen::updateKartStats(widget_id, kart_name); m_kart_widgets[widget_id].setKartInternalName(kart_name); m_kart_widgets[widget_id].markAsReady(); // mark player ready + + // If this is the authorised client, send the currently set race config + // to the server. + if(STKHost::get()->isAuthorisedToControl()) + { + // FIXME: for now we submit a vote from the authorised user + // for the various modes based on the settings in the race manager. + // This needs more/better gui elements (and some should be set when + // defining the server). + Protocol* protocol = ProtocolManager::getInstance() + ->getProtocol(PROTOCOL_LOBBY_ROOM); + ClientLobbyRoomProtocol* clrp = + static_cast(protocol); + clrp->voteMajor(race_manager->getMajorMode()); + clrp->voteMinor(race_manager->getMinorMode()); + clrp->voteReversed(race_manager->getReverseTrack()); + clrp->voteRaceCount(1); + } + TracksScreen::getInstance()->push(); } // playerSelected // ---------------------------------------------------------------------------- diff --git a/src/states_screens/race_setup_screen.cpp b/src/states_screens/race_setup_screen.cpp index b0b232ae2..35970e7c9 100644 --- a/src/states_screens/race_setup_screen.cpp +++ b/src/states_screens/race_setup_screen.cpp @@ -59,7 +59,136 @@ void RaceSetupScreen::loadedFromFile() // ----------------------------------------------------------------------------- -void RaceSetupScreen::eventCallback(Widget* widget, const std::string& name, const int playerID) +void RaceSetupScreen::init() +{ + Screen::init(); + input_manager->setMasterPlayerOnly(true); + RibbonWidget* w = getWidget("difficulty"); + assert( w != NULL ); + + if (UserConfigParams::m_difficulty == RaceManager::DIFFICULTY_BEST && + PlayerManager::getCurrentPlayer()->isLocked("difficulty_best")) + { + w->setSelection(RaceManager::DIFFICULTY_HARD, PLAYER_ID_GAME_MASTER); + } + else + { + w->setSelection( UserConfigParams::m_difficulty, PLAYER_ID_GAME_MASTER ); + } + + DynamicRibbonWidget* w2 = getWidget("gamemode"); + assert( w2 != NULL ); + w2->clearItems(); + + // ---- Add game modes + irr::core::stringw name1 = irr::core::stringw( + RaceManager::getNameOf(RaceManager::MINOR_MODE_NORMAL_RACE)) + L"\n"; + //FIXME: avoid duplicating descriptions from the help menu! + name1 += _("All blows allowed, so catch weapons and make clever use of them!"); + + w2->addItem( name1, IDENT_STD, RaceManager::getIconOf(RaceManager::MINOR_MODE_NORMAL_RACE)); + + irr::core::stringw name2 = irr::core::stringw( + RaceManager::getNameOf(RaceManager::MINOR_MODE_TIME_TRIAL)) + L"\n"; + //FIXME: avoid duplicating descriptions from the help menu! + name2 += _("Contains no powerups, so only your driving skills matter!"); + w2->addItem( name2, IDENT_TTRIAL, RaceManager::getIconOf(RaceManager::MINOR_MODE_TIME_TRIAL)); + + if (PlayerManager::getCurrentPlayer()->isLocked(IDENT_FTL)) + { + w2->addItem( _("Locked : solve active challenges to gain access to more!"), + "locked", RaceManager::getIconOf(RaceManager::MINOR_MODE_FOLLOW_LEADER), true); + } + else + { + irr::core::stringw name3 = irr::core::stringw( + RaceManager::getNameOf(RaceManager::MINOR_MODE_FOLLOW_LEADER)) + L"\n"; + //I18N: short definition for follow-the-leader game mode + name3 += _("Keep up with the leader kart but don't overtake it!"); + w2->addItem(name3, IDENT_FTL, RaceManager::getIconOf(RaceManager::MINOR_MODE_FOLLOW_LEADER), false); + } + + if (race_manager->getNumLocalPlayers() > 1 || UserConfigParams::m_artist_debug_mode) + { + irr::core::stringw name4 = irr::core::stringw( + RaceManager::getNameOf(RaceManager::MINOR_MODE_3_STRIKES)) + L"\n"; + //FIXME: avoid duplicating descriptions from the help menu! + name4 += _("Hit others with weapons until they lose all their lives (only in multiplayer games)."); + w2->addItem( name4, IDENT_STRIKES, RaceManager::getIconOf(RaceManager::MINOR_MODE_3_STRIKES)); + } + +#ifdef ENABLE_SOCCER_MODE + if (race_manager->getNumLocalPlayers() > 1 || UserConfigParams::m_artist_debug_mode) + { + irr::core::stringw name5 = irr::core::stringw( + RaceManager::getNameOf(RaceManager::MINOR_MODE_SOCCER)) + L"\n"; + name5 += _("Push the ball to the opposite cage to score goals (only in multiplayer games)."); + w2->addItem( name5, IDENT_SOCCER, RaceManager::getIconOf(RaceManager::MINOR_MODE_SOCCER)); + } +#endif + +#define ENABLE_EASTER_EGG_MODE +#ifdef ENABLE_EASTER_EGG_MODE + if(race_manager->getNumLocalPlayers() == 1) + { + irr::core::stringw name1 = irr::core::stringw( + RaceManager::getNameOf(RaceManager::MINOR_MODE_EASTER_EGG)) + L"\n"; + //FIXME: avoid duplicating descriptions from the help menu! + name1 += _("Explore tracks to find all hidden eggs"); + + w2->addItem( name1, IDENT_EASTER, + RaceManager::getIconOf(RaceManager::MINOR_MODE_EASTER_EGG)); + } +#endif + + w2->updateItemDisplay(); + + // restore saved game mode + switch (UserConfigParams::m_game_mode) + { + case CONFIG_CODE_NORMAL : + w2->setSelection(IDENT_STD, PLAYER_ID_GAME_MASTER, true); + break; + case CONFIG_CODE_TIMETRIAL : + w2->setSelection(IDENT_TTRIAL, PLAYER_ID_GAME_MASTER, true); + break; + case CONFIG_CODE_FTL : + w2->setSelection(IDENT_FTL, PLAYER_ID_GAME_MASTER, true); + break; + case CONFIG_CODE_3STRIKES : + w2->setSelection(IDENT_STRIKES, PLAYER_ID_GAME_MASTER, true); + break; + case CONFIG_CODE_EASTER : + w2->setSelection(IDENT_EASTER, PLAYER_ID_GAME_MASTER, true); + break; + case CONFIG_CODE_SOCCER : + w2->setSelection(IDENT_SOCCER, PLAYER_ID_GAME_MASTER, true); + break; + } + + { + RibbonWidget* w = getWidget("difficulty"); + assert(w != NULL); + + int index = w->findItemNamed("best"); + Widget* hardestWidget = &w->getChildren()[index]; + + if (PlayerManager::getCurrentPlayer()->isLocked("difficulty_best")) + { + hardestWidget->setBadge(LOCKED_BADGE); + hardestWidget->setActive(false); + } + else + { + hardestWidget->unsetBadge(LOCKED_BADGE); + hardestWidget->setActive(true); + } + } +} // init + +// ----------------------------------------------------------------------------- +void RaceSetupScreen::eventCallback(Widget* widget, const std::string& name, + const int playerID) { if (name == "difficulty") { @@ -132,173 +261,19 @@ void RaceSetupScreen::eventCallback(Widget* widget, const std::string& name, con } // eventCallback // ----------------------------------------------------------------------------- - +/** Converts the difficulty string into a RaceManager::Difficulty value + * and sets this difficulty in the user config and in the race manager. + */ void RaceSetupScreen::assignDifficulty() { - RibbonWidget* difficulty = getWidget("difficulty"); - assert(difficulty != NULL); - const std::string& difficultySelection = difficulty->getSelectionIDString(PLAYER_ID_GAME_MASTER); + RibbonWidget* difficulty_widget = getWidget("difficulty"); + assert(difficulty_widget != NULL); + const std::string& difficulty = + difficulty_widget->getSelectionIDString(PLAYER_ID_GAME_MASTER); - if (difficultySelection == "novice") - { - UserConfigParams::m_difficulty = RaceManager::DIFFICULTY_EASY; - race_manager->setDifficulty(RaceManager::DIFFICULTY_EASY); - } - else if (difficultySelection == "intermediate") - { - UserConfigParams::m_difficulty = RaceManager::DIFFICULTY_MEDIUM; - race_manager->setDifficulty(RaceManager::DIFFICULTY_MEDIUM); - } - else if (difficultySelection == "expert") - { - UserConfigParams::m_difficulty = RaceManager::DIFFICULTY_HARD; - race_manager->setDifficulty(RaceManager::DIFFICULTY_HARD); - } - else if (difficultySelection == "best") - { - if (PlayerManager::getCurrentPlayer()->isLocked("difficulty_best")) - { - unlock_manager->playLockSound(); - UserConfigParams::m_difficulty = RaceManager::DIFFICULTY_HARD; - race_manager->setDifficulty(RaceManager::DIFFICULTY_HARD); - difficulty->setSelection(2, PLAYER_ID_GAME_MASTER); - difficulty->setFocusForPlayer(PLAYER_ID_GAME_MASTER); - } - else - { - UserConfigParams::m_difficulty = RaceManager::DIFFICULTY_BEST; - race_manager->setDifficulty(RaceManager::DIFFICULTY_BEST); - } - } -} - -// ----------------------------------------------------------------------------- - -void RaceSetupScreen::init() -{ - Screen::init(); - input_manager->setMasterPlayerOnly(true); - RibbonWidget* w = getWidget("difficulty"); - assert( w != NULL ); - - if (UserConfigParams::m_difficulty == RaceManager::DIFFICULTY_BEST && - PlayerManager::getCurrentPlayer()->isLocked("difficulty_best")) - { - w->setSelection(RaceManager::DIFFICULTY_HARD, PLAYER_ID_GAME_MASTER); - } - else - { - w->setSelection( UserConfigParams::m_difficulty, PLAYER_ID_GAME_MASTER ); - } - - DynamicRibbonWidget* w2 = getWidget("gamemode"); - assert( w2 != NULL ); - w2->clearItems(); - - // ---- Add game modes - irr::core::stringw name1 = irr::core::stringw( - RaceManager::getNameOf(RaceManager::MINOR_MODE_NORMAL_RACE)) + L"\n"; - //FIXME: avoid duplicating descriptions from the help menu! - name1 += _("All blows allowed, so catch weapons and make clever use of them!"); - - w2->addItem( name1, IDENT_STD, RaceManager::getIconOf(RaceManager::MINOR_MODE_NORMAL_RACE)); - - irr::core::stringw name2 = irr::core::stringw( - RaceManager::getNameOf(RaceManager::MINOR_MODE_TIME_TRIAL)) + L"\n"; - //FIXME: avoid duplicating descriptions from the help menu! - name2 += _("Contains no powerups, so only your driving skills matter!"); - w2->addItem( name2, IDENT_TTRIAL, RaceManager::getIconOf(RaceManager::MINOR_MODE_TIME_TRIAL)); - - if (PlayerManager::getCurrentPlayer()->isLocked(IDENT_FTL)) - { - w2->addItem( _("Locked : solve active challenges to gain access to more!"), - "locked", RaceManager::getIconOf(RaceManager::MINOR_MODE_FOLLOW_LEADER), true); - } - else - { - irr::core::stringw name3 = irr::core::stringw( - RaceManager::getNameOf(RaceManager::MINOR_MODE_FOLLOW_LEADER)) + L"\n"; - //I18N: short definition for follow-the-leader game mode - name3 += _("Keep up with the leader kart but don't overtake it!"); - w2->addItem(name3, IDENT_FTL, RaceManager::getIconOf(RaceManager::MINOR_MODE_FOLLOW_LEADER), false); - } - - if (race_manager->getNumLocalPlayers() > 1 || UserConfigParams::m_artist_debug_mode) - { - irr::core::stringw name4 = irr::core::stringw( - RaceManager::getNameOf(RaceManager::MINOR_MODE_3_STRIKES)) + L"\n"; - //FIXME: avoid duplicating descriptions from the help menu! - name4 += _("Hit others with weapons until they lose all their lives (only in multiplayer games)."); - w2->addItem( name4, IDENT_STRIKES, RaceManager::getIconOf(RaceManager::MINOR_MODE_3_STRIKES)); - } - -#ifdef ENABLE_SOCCER_MODE - if (race_manager->getNumLocalPlayers() > 1 || UserConfigParams::m_artist_debug_mode) - { - irr::core::stringw name5 = irr::core::stringw( - RaceManager::getNameOf(RaceManager::MINOR_MODE_SOCCER)) + L"\n"; - name5 += _("Push the ball to the opposite cage to score goals (only in multiplayer games)."); - w2->addItem( name5, IDENT_SOCCER, RaceManager::getIconOf(RaceManager::MINOR_MODE_SOCCER)); - } -#endif - -#define ENABLE_EASTER_EGG_MODE -#ifdef ENABLE_EASTER_EGG_MODE - if(race_manager->getNumLocalPlayers() == 1) - { - irr::core::stringw name1 = irr::core::stringw( - RaceManager::getNameOf(RaceManager::MINOR_MODE_EASTER_EGG)) + L"\n"; - //FIXME: avoid duplicating descriptions from the help menu! - name1 += _("Explore tracks to find all hidden eggs"); - - w2->addItem( name1, IDENT_EASTER, - RaceManager::getIconOf(RaceManager::MINOR_MODE_EASTER_EGG)); - } -#endif - - w2->updateItemDisplay(); - - // restore saved game mode - switch (UserConfigParams::m_game_mode) - { - case CONFIG_CODE_NORMAL : - w2->setSelection(IDENT_STD, PLAYER_ID_GAME_MASTER, true); - break; - case CONFIG_CODE_TIMETRIAL : - w2->setSelection(IDENT_TTRIAL, PLAYER_ID_GAME_MASTER, true); - break; - case CONFIG_CODE_FTL : - w2->setSelection(IDENT_FTL, PLAYER_ID_GAME_MASTER, true); - break; - case CONFIG_CODE_3STRIKES : - w2->setSelection(IDENT_STRIKES, PLAYER_ID_GAME_MASTER, true); - break; - case CONFIG_CODE_EASTER : - w2->setSelection(IDENT_EASTER, PLAYER_ID_GAME_MASTER, true); - break; - case CONFIG_CODE_SOCCER : - w2->setSelection(IDENT_SOCCER, PLAYER_ID_GAME_MASTER, true); - break; - } - - { - RibbonWidget* w = getWidget("difficulty"); - assert(w != NULL); - - int index = w->findItemNamed("best"); - Widget* hardestWidget = &w->getChildren()[index]; - - if (PlayerManager::getCurrentPlayer()->isLocked("difficulty_best")) - { - hardestWidget->setBadge(LOCKED_BADGE); - hardestWidget->setActive(false); - } - else - { - hardestWidget->unsetBadge(LOCKED_BADGE); - hardestWidget->setActive(true); - } - } -} // init + RaceManager::Difficulty diff = RaceManager::convertDifficulty(difficulty); + UserConfigParams::m_difficulty = diff; + race_manager->setDifficulty(diff); +} // assignDifficulty // -----------------------------------------------------------------------------