/** Small utility function that returns whether the two given players chose * the same kart. The advantage of this function is that it can handle * "random kart" selection. */ bool sameKart(const PlayerKartWidget& player1, const PlayerKartWidget& player2) { return player1.getKartInternalName() == player2.getKartInternalName() && player1.getKartInternalName() != RANDOM_KART_ID; }
// ---------------------------------------------------------------------------- // Return true if event was handled successfully bool KartSelectionScreen::joinPlayer(InputDevice* device) { bool first_player = m_kart_widgets.size() == 0; if (UserConfigParams::logGUI()) Log::info("KartSelectionScreen", "joinPlayer() invoked"); if (!m_multiplayer && !first_player) return false; assert (m_dispatcher != NULL); DynamicRibbonWidget* w = getWidget<DynamicRibbonWidget>("karts"); if (w == NULL) { Log::error("KartSelectionScreen", "joinPlayer(): Called outside of " "kart selection screen."); return false; } else if (device == NULL) { Log::error("KartSelectionScreen", "joinPlayer(): Received null " "device pointer"); return false; } if (StateManager::get()->activePlayerCount() >= MAX_PLAYER_COUNT) { Log::error("KartSelectionScreen", "Maximum number of players " "reached"); SFXManager::get()->quickSound( "anvil" ); return false; } // ---- Create new active player PlayerProfile* profile_to_use = PlayerManager::getCurrentPlayer(); // Make sure enough guest character exists. At this stage this player has // not been added, so the number of guests requested for the first player // is 0 --> forcing at least one real player. PlayerManager::get()->createGuestPlayers( StateManager::get()->activePlayerCount()); if (!first_player) { // Give each player a different start profile const int num_active_players = StateManager::get()->activePlayerCount(); profile_to_use = PlayerManager::get()->getPlayer(num_active_players); removeMultiplayerMessage(); } const int new_player_id = StateManager::get()->createActivePlayer(profile_to_use, device); StateManager::ActivePlayer* aplayer = StateManager::get()->getActivePlayer(new_player_id); RibbonWidget* tabs = getWidget<RibbonWidget>("kartgroups"); assert(tabs != NULL); std::string selected_kart_group = tabs->getSelectionIDString(PLAYER_ID_GAME_MASTER); // ---- Get available area for karts // make a copy of the area, ands move it to be outside the screen Widget* kartsAreaWidget = getWidget("playerskarts"); // start at the rightmost of the screen const int shift = irr_driver->getFrameSize().Width; core::recti kartsArea(kartsAreaWidget->m_x + shift, kartsAreaWidget->m_y, kartsAreaWidget->m_x + shift + kartsAreaWidget->m_w, kartsAreaWidget->m_y + kartsAreaWidget->m_h); // ---- Create player/kart widget PlayerKartWidget* newPlayerWidget = new PlayerKartWidget(this, aplayer, NULL, kartsArea, m_kart_widgets.size(), selected_kart_group); manualAddWidget(newPlayerWidget); m_kart_widgets.push_back(newPlayerWidget); newPlayerWidget->add(); // ---- Divide screen space among all karts const int amount = m_kart_widgets.size(); Widget* fullarea = getWidget("playerskarts"); // in this special case, leave room for a message on the right if (m_multiplayer && first_player) { addMultiplayerMessage(); const int splitWidth = fullarea->m_w / 2; m_kart_widgets[0].move( fullarea->m_x, fullarea->m_y, splitWidth, fullarea->m_h ); } else { const int splitWidth = fullarea->m_w / amount; for (int n=0; n<amount; n++) { m_kart_widgets[n].move( fullarea->m_x + splitWidth * n, fullarea->m_y, splitWidth, fullarea->m_h); } } // select something (anything) in the ribbon; by default, only the // game master has something selected. Thus, when a new player joins, // we need to select something for them w->setSelection(new_player_id, new_player_id, true); newPlayerWidget->m_player_ident_spinner ->setFocusForPlayer(new_player_id); if (!m_multiplayer) { input_manager->getDeviceManager()->setSinglePlayer(StateManager::get() ->getActivePlayer(0)); } return true; } // joinPlayer
void NetworkKartSelectionScreen::init() { m_multiplayer = false; KartSelectionScreen::init(); RibbonWidget* tabs = getWidget<RibbonWidget>("kartgroups"); assert( tabs != NULL ); tabs->select( "standard", PLAYER_ID_GAME_MASTER); // select standard kart group tabs->setDeactivated(); tabs->setVisible(false); // change the back button image (because it makes the game quit) IconButtonWidget* back_button = getWidget<IconButtonWidget>("back"); back_button->setImage("gui/main_quit.png"); m_multiplayer = false; // add a widget for each player except self (already exists): GameSetup* setup = NetworkManager::getInstance()->getGameSetup(); if (!setup) { Log::error("NetworkKartSelectionScreen", "No network game setup registered."); return; } std::vector<NetworkPlayerProfile*> players = setup->getPlayers(); Log::info("NKSS", "There are %d players", players.size()); // ---- Get available area for karts // make a copy of the area, ands move it to be outside the screen Widget* kartsAreaWidget = getWidget("playerskarts"); // start at the rightmost of the screen const int shift = irr_driver->getFrameSize().Width; core::recti kartsArea(kartsAreaWidget->m_x + shift, kartsAreaWidget->m_y, kartsAreaWidget->m_x + shift + kartsAreaWidget->m_w, kartsAreaWidget->m_y + kartsAreaWidget->m_h); for (unsigned int i = 0; i < players.size(); i++) { if (players[i]->user_profile == PlayerManager::getCurrentOnlineProfile()) { m_id_mapping.insert(m_id_mapping.begin(),players[i]->race_id); //!< first kart widget always me Log::info("NKSS", "Insert %d at pos 0", players[i]->race_id); continue; // it is me, don't add again } Log::info("NKSS", "Adding %d at pos %d", players[i]->race_id, i); m_id_mapping.push_back(players[i]->race_id); StateManager::ActivePlayer* aplayer = NULL; // player is remote std::string selected_kart_group = "standard"; // standard group PlayerKartWidget* newPlayerWidget = new PlayerKartWidget(this, aplayer, players[i]->user_profile, kartsArea, m_kart_widgets.size(), selected_kart_group); manualAddWidget(newPlayerWidget); m_kart_widgets.push_back(newPlayerWidget); newPlayerWidget->add(); } const int amount = m_kart_widgets.size(); Widget* fullarea = getWidget("playerskarts"); const int splitWidth = fullarea->m_w / amount; for (int n=0; n<amount; n++) { m_kart_widgets[n].move( fullarea->m_x + splitWidth*n, fullarea->m_y, splitWidth, fullarea->m_h); } }