ef2gamesource/dlls/game/mp_modeDm.cpp
2012-12-31 16:19:55 +01:00

256 lines
5.9 KiB
C++

//-----------------------------------------------------------------------------
//
// $Logfile:: /Code/DLLs/game/mp_modeDm.cpp $
// $Revision:: 19 $
// $Author:: Steven $
// $Date:: 8/08/03 1:26p $
//
// Copyright (C) 2002 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// Description:
//
#include "_pch_cpp.h"
#include "mp_manager.hpp"
#include "mp_modeDm.hpp"
CLASS_DECLARATION( MultiplayerModeBase, ModeDeathmatch, NULL )
{
{ NULL, NULL }
};
//================================================================
// Name: ModeDeathmatch
// Class: ModeDeathmatch
//
// Description: Constructor
//
// Parameters: const str& -- name of the arena
//
// Returns: None
//
//================================================================
ModeDeathmatch::ModeDeathmatch()
{
}
//================================================================
// Name: ~ModeDeathmatch
// Class: ModeDeathmatch
//
// Description: Destructor
//
// Parameters: None
//
// Returns: None
//
//================================================================
ModeDeathmatch::~ModeDeathmatch()
{
}
void ModeDeathmatch::respawnPlayer( Player *player )
{
Entity *spawnPoint;
assert(player);
if ( !player )
{
warning("ModeDeathmatch::respawnPlayer", "NULL player\n");
return ;
}
// Make sure we are allowed to respawn the player
if ( !multiplayerManager.checkRule( "respawnPlayer", true, player ) )
{
if ( multiplayerManager.checkRule( "allowSpectator", true ) )
{
multiplayerManager.makePlayerSpectator( player );
}
return;
}
// Respawn the player
MultiplayerModeBase::respawnPlayer(player);
multiplayerManager.initPlayer( player );
// Warp the player to a spawn point
spawnPoint = getSpawnPoint( player );
if ( spawnPoint )
{
player->WarpToPoint( spawnPoint );
}
KillBox( player );
ActivatePlayer(player);
}
//================================================================
// Name: AddPlayer
// Class: ModeDeathmatch
//
// Description: Adds a player to the arena. In deathmatch, this
// also sets their spawn point and immediately sets
// them up for fighting.
//
// Parameters: Player* -- Player to add and prepare for fighting
//
// Returns: None
//
//================================================================
void ModeDeathmatch::AddPlayer( Player *player )
{
Entity *spawnPoint;
assert(player);
if ( !player )
{
warning("ModeDeathmatch::AddPlayer", "NULL Player\n");
return ;
}
if ( !needToAddPlayer( player ) )
return;
MultiplayerModeBase::AddPlayer(player);
if ( !multiplayerManager.checkRule( "spawnPlayer", true, player ) )
{
if ( multiplayerManager.checkRule( "allowSpectator", true ) )
{
multiplayerManager.makePlayerSpectator( player );
}
return;
}
// Warp the player to a spawn point
spawnPoint = getSpawnPoint( player );
if ( spawnPoint )
{
player->WarpToPoint( spawnPoint );
}
KillBox( player );
ActivatePlayer(player);
// If the game hasn't started yet just make the player a spectator
if ( !_gameStarted )
{
multiplayerManager.makePlayerSpectator( player );
}
}
void ModeDeathmatch::init( int maxPlayers )
{
MultiplayerModeBase::init( maxPlayers );
readMultiplayerConfig( "global/mp_dm.cfg" );
multiplayerManager.cacheMultiplayerFiles( "mp_dm" );
}
bool ModeDeathmatch::checkGameType( const char *gameType )
{
if ( stricmp( gameType, "dm" ) == 0 )
return true;
else
return false;
}
int ModeDeathmatch::getHighestPoints( int entnum )
{
int highestPoints = -999999999;
for ( unsigned i = 0 ; i < _maxPlayers ; i++ )
{
if ( _playerGameData[ i ]._playing && ( _playerGameData[ i ]._entnum != entnum ) )
{
if ( _playerGameData[ i ]._points > highestPoints )
{
highestPoints = _playerGameData[ i ]._points;
}
}
}
return highestPoints;
}
bool ModeDeathmatch::checkRule( const char *rule, bool defaultValue, Player *player )
{
Q_UNUSED(player);
if ( stricmp( rule, "usingIndividualScore" ) == 0 )
return true;
else
return defaultValue;
}
void ModeDeathmatch::update( float frameTime )
{
Player *player;
int place;
bool tied;
MultiplayerModeBase::update( frameTime );
// Update the players about their ranking
if ( _gameStarted )
{
for ( unsigned i = 0 ; i < _maxPlayers ; i++ )
{
player = multiplayerManager.getPlayer( i );
if ( !player )
continue;
place = getPlace( player, &tied );
if ( ( place != _playerGameData[ i ]._lastPlace ) || ( tied != _playerGameData[ i ]._lastTied ) )
{
if ( _playerGameData[ i ]._lastPlace != -1 )
{
if ( ( place == 1 ) && ( !tied ) )
{
// Now in first place
multiplayerManager.playerSound( _playerGameData[ i ]._entnum, "localization/sound/dialog/dm/comp_1stplace.mp3", CHAN_AUTO, DEFAULT_VOL, DEFAULT_MIN_DIST, 1.0f );
}
else if ( ( place == 1 ) && ( tied ) )
{
// Now tied for the lead
multiplayerManager.playerSound( _playerGameData[ i ]._entnum, "localization/sound/dialog/dm/comp_tiedlead.mp3", CHAN_AUTO, DEFAULT_VOL, DEFAULT_MIN_DIST, 1.0f );
}
else if ( ( _playerGameData[ i ]._lastPlace == 1 ) && ( ( place != 1 ) || ( tied ) ) )
{
// No longer in the lead
multiplayerManager.playerSound( _playerGameData[ i ]._entnum, "localization/sound/dialog/dm/comp_nolead.mp3", CHAN_AUTO, DEFAULT_VOL, DEFAULT_MIN_DIST, 1.0f );
}
}
_playerGameData[ i ]._lastPlace = place;
_playerGameData[ i ]._lastTied = tied;
}
}
}
}