/* =========================================================================== Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Doom 3 BFG Edition Source Code. If not, see . In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #include "../idlib/precompiled.h" #pragma hdrstop #include "Common_local.h" /* ============== idCommonLocal::InitializeMPMapsModes ============== */ void idCommonLocal::InitializeMPMapsModes() { const char ** gameModes = NULL; const char ** gameModesDisplay = NULL; int numModes = game->GetMPGameModes( &gameModes, &gameModesDisplay ); mpGameModes.SetNum( numModes ); for ( int i = 0; i < numModes; i++ ) { mpGameModes[i] = gameModes[i]; } mpDisplayGameModes.SetNum( numModes ); for ( int i = 0; i < numModes; i++ ) { mpDisplayGameModes[i] = gameModesDisplay[i]; } int numMaps = declManager->GetNumDecls( DECL_MAPDEF ); mpGameMaps.Clear(); for ( int i = 0; i < numMaps; i++ ) { const idDeclEntityDef * mapDef = static_cast( declManager->DeclByIndex( DECL_MAPDEF, i ) ); uint32 supportedModes = 0; for ( int j = 0; j < numModes; j++ ) { if ( mapDef->dict.GetBool( gameModes[j], false ) ) { supportedModes |= BIT(j); } } if ( supportedModes != 0 ) { mpMap_t & mpMap = mpGameMaps.Alloc(); mpMap.mapFile = mapDef->GetName(); mpMap.mapName = mapDef->dict.GetString( "name", mpMap.mapFile ); mpMap.supportedModes = supportedModes; } } } /* ============== idCommonLocal::OnStartHosting ============== */ void idCommonLocal::OnStartHosting( idMatchParameters & parms ) { if ( ( parms.matchFlags & MATCH_REQUIRE_PARTY_LOBBY ) == 0 ) { return; // This is the party lobby or a SP match } // If we were searching for a random match but didn't find one, we'll need to select parameters now if ( parms.gameMap < 0 ) { if ( parms.gameMode < 0 ) { // Random mode means any map will do parms.gameMap = idLib::frameNumber % mpGameMaps.Num(); } else { // Select a map which supports the chosen mode idList supportedMaps; uint32 supportedMode = BIT( parms.gameMode ); for ( int i = 0; i < mpGameMaps.Num(); i++ ) { if ( mpGameMaps[i].supportedModes & supportedMode ) { supportedMaps.Append( i ); } } if ( supportedMaps.Num() == 0 ) { // We don't have any maps which support the chosen mode... parms.gameMap = idLib::frameNumber % mpGameMaps.Num(); parms.gameMode = -1; } else { parms.gameMap = supportedMaps[ idLib::frameNumber % supportedMaps.Num() ]; } } } if ( parms.gameMode < 0 ) { uint32 supportedModes = mpGameMaps[parms.gameMap].supportedModes; int8 supportedModeList[32] = {}; int numSupportedModes = 0; for ( int i = 0; i < 32; i++ ) { if ( supportedModes & BIT(i) ) { supportedModeList[numSupportedModes] = i; numSupportedModes++; } } parms.gameMode = supportedModeList[ ( idLib::frameNumber / mpGameMaps.Num() ) % numSupportedModes ]; } parms.mapName = mpGameMaps[parms.gameMap].mapFile; parms.numSlots = session->GetTitleStorageInt("MAX_PLAYERS_ALLOWED", 4 ); } /* ============== idCommonLocal::StartMainMenu ============== */ void idCommonLocal::StartMenu( bool playIntro ) { if ( game && game->Shell_IsActive() ) { return; } if ( readDemo ) { // if we're playing a demo, esc kills it UnloadMap(); } if ( game ) { game->Shell_Show( true ); game->Shell_SyncWithSession(); } console->Close(); } /* =============== idCommonLocal::ExitMenu =============== */ void idCommonLocal::ExitMenu() { if ( game ) { game->Shell_Show( false ); } } /* ============== idCommonLocal::MenuEvent Executes any commands returned by the gui ============== */ bool idCommonLocal::MenuEvent( const sysEvent_t * event ) { if ( session->GetSignInManager().ProcessInputEvent( event ) ) { return true; } if ( game && game->Shell_IsActive() ) { return game->Shell_HandleGuiEvent( event ); } if ( game ) { return game->HandlePlayerGuiEvent( event ); } return false; } /* ================= idCommonLocal::GuiFrameEvents ================= */ void idCommonLocal::GuiFrameEvents() { if ( game ) { game->Shell_SyncWithSession(); } }