quake4-sdk/source/mpgame/mp/Tourney.h

157 lines
4.8 KiB
C++

//----------------------------------------------------------------
// Tourney.h
//
// Copyright 2002-2004 Raven Software
//----------------------------------------------------------------
#ifndef __TOURNEY_H__
#define __TOURNEY_H__
#include "../Game_local.h"
enum arenaState_t {
AS_INACTIVE = 0,
AS_WARMUP,
AS_ROUND,
AS_SUDDEN_DEATH,
AS_DONE
};
#define MAX_TOURNEY_HISTORY_NAME_LEN 32
typedef struct arenaOutcome_s {
// for clients that have disconnected, copy their names for history purposes
char playerOne[ MAX_TOURNEY_HISTORY_NAME_LEN ];
char playerTwo[ MAX_TOURNEY_HISTORY_NAME_LEN ];
// for currently connected clients, use clientnum to get current name
int playerOneNum;
int playerTwoNum;
int playerOneScore;
int playerTwoScore;
} arenaOutcome_t;
// shouldn't exceed MAX_INSTANCES from idMultiplayerGame
const int MAX_ARENAS = 8;
const int MAX_ROUNDS = 4;
class rvTourneyArena {
public:
rvTourneyArena();
void AddPlayers( idPlayer* playerOne, idPlayer* playerTwo );
void ClearPlayers( idPlayer* clearPlayer = NULL );
void Clear( bool respawnPlayers = true );
void Ready( void );
idPlayer* GetLeader( void );
idPlayer* GetLoser( void );
idPlayer* GetWinner( void ) { return winner; }
void UpdateState( void );
void NewState( arenaState_t newState );
idPlayer** GetPlayers( void );
void SetArenaID( int id );
int GetArenaID( void ) const;
arenaState_t GetState( void ) const;
void SetState( arenaState_t newState );
void SetNextStateTime( int time );
int GetNextStateTime( void );
int GetMatchStartTime( void ) { return matchStartTime; }
void PackState( idBitMsg& outMsg );
void UnpackState( const idBitMsg& inMsg );
void RemovePlayer( idPlayer* player );
bool TimeLimitHit( void );
bool IsPlaying( idPlayer* player ) { return ( arenaState != AS_INACTIVE && arenaState != AS_DONE && ( player == players[ 0 ] || player == players[ 1 ] ) ); }
bool HasPlayer( idPlayer* player ) { return ( player == players[0] || player == players[1] ); }
bool IsPlaying( void ) { return ( arenaState != AS_INACTIVE && arenaState != AS_DONE ); }
const char* GetPlayerName( int player );
int GetPlayerScore( int player );
int GetFraglimitTimeout( void ) { return fragLimitTimeout; }
bool operator==( const rvTourneyArena& rhs ) const;
bool operator!=( const rvTourneyArena& rhs ) const;
rvTourneyArena& operator=( const rvTourneyArena& rhs );
private:
// players - players in arena
idPlayer* players[ 2 ];
// arenaID - this arena's ID
int arenaID;
// arenaState - state of the arena
arenaState_t arenaState;
// nextStateTime - transition time to next state
int nextStateTime;
// winner - the winner of the arena
idPlayer* winner;
// fragLimitTimeout - timeout to let death anims play
int fragLimitTimeout;
// matchStartTime - time arena started
int matchStartTime;
};
ID_INLINE idPlayer** rvTourneyArena::GetPlayers( void ) {
return players;
}
ID_INLINE void rvTourneyArena::SetArenaID( int id ) {
arenaID = id;
}
ID_INLINE int rvTourneyArena::GetArenaID( void ) const {
return arenaID;
}
ID_INLINE bool rvTourneyArena::operator==( const rvTourneyArena& rhs ) const {
return ( arenaState == rhs.arenaState && players[ 0 ] == rhs.players[ 0 ] && players[ 1 ] == rhs.players[ 1 ] && nextStateTime == rhs.nextStateTime && arenaID == rhs.arenaID && fragLimitTimeout == rhs.fragLimitTimeout && matchStartTime == rhs.matchStartTime );
}
ID_INLINE bool rvTourneyArena::operator!=( const rvTourneyArena& rhs ) const {
return ( arenaState != rhs.arenaState || players[ 0 ] != rhs.players[ 0 ] || players[ 1 ] != rhs.players[ 1 ] || nextStateTime != rhs.nextStateTime || arenaID != rhs.arenaID || fragLimitTimeout != rhs.fragLimitTimeout || matchStartTime != rhs.matchStartTime );
}
ID_INLINE rvTourneyArena& rvTourneyArena::operator=( const rvTourneyArena& rhs ) {
players[ 0 ] = rhs.players[ 0 ];
players[ 1 ] = rhs.players[ 1 ];
arenaState = rhs.arenaState;
nextStateTime = rhs.nextStateTime;
arenaID = rhs.arenaID;
fragLimitTimeout = rhs.fragLimitTimeout;
matchStartTime = rhs.matchStartTime;
return (*this);
}
typedef enum {
TGH_BRACKET,
TGH_PLAYER_ONE,
TGH_PLAYER_TWO
} tourneyGUIHighlight_t;
class rvTourneyGUI {
public:
rvTourneyGUI();
void SetupTourneyGUI( idUserInterface* newTourneyGUI, idUserInterface* newTourneyScoreboard );
void RoundStart( void );
void ArenaStart( int arena );
void ArenaDone( int arena );
void ArenaSelect( int arena, tourneyGUIHighlight_t highlightType );
void UpdateScores( void );
void PreTourney( void );
void TourneyStart( void );
//void UpdateByePlayer( void );
void SetupTourneyHistory( int startHistory, int endHistory, arenaOutcome_t tourneyHistory[ MAX_ROUNDS ][ MAX_ARENAS ] );
private:
idUserInterface* tourneyGUI;
idUserInterface* tourneyScoreboard;
};
#endif