/* $Id: player.cpp,v 1.52.4.1 2006/01/20 11:33:53 chfreund Exp $ */ #include "player.hpp" #include #include "global.hpp" #include "serialize.hpp" #include "wopsettings.hpp" #include "loader.hpp" #include "avatar.hpp" #include "weapongrenade.hpp" /**********************************************************/ Player::Player() : m_playerColor( 0x00ffffff ), m_teamID( 0 ), m_avatarType( AVATAR_WORM ), m_isLocalPlayer( false ), m_avatar( NULL ) { // don't forget to increase m_MAX_WEAPONS in player.hpp m_weapon[ 0] = Weapon::newWeapon( WEAPON_SHOTGUN ); m_weapon[ 1] = Weapon::newWeapon( WEAPON_UZI ); m_weapon[ 2] = Weapon::newWeapon( WEAPON_RUBBERGUN ); m_weapon[ 3] = Weapon::newWeapon( WEAPON_GRENADE ); m_weapon[ 4] = Weapon::newWeapon( WEAPON_MISSILE ); m_weapon[ 5] = Weapon::newWeapon( WEAPON_HOMING_MISSILE ); m_weapon[ 6] = Weapon::newWeapon( WEAPON_HELICOPTER ); m_weapon[ 7] = Weapon::newWeapon( WEAPON_ZAPPER ); m_weapon[ 8] = Weapon::newWeapon( WEAPON_MINE ); m_weapon[ 9] = Weapon::newWeapon( WEAPON_GRENADE ); dynamic_cast( m_weapon[ 9] )->setType( Grenade::CONTACT_TRIGGERED | Grenade::DIRT ); m_weapon[ 9]->setMaximumAmmo( 3 ); m_weapon[10] = Weapon::newWeapon( WEAPON_HOOK ); m_weapon[11] = Weapon::newWeapon( WEAPON_HOOK_REL ); m_weapon[12] = Weapon::newWeapon( WEAPON_HOOK_CUT ); // don't forget to increase m_MAX_WEAPONS in player.hpp m_activeWeaponIndex = 0; } /**********************************************************/ Player::~Player() { DBG( 1 ) { CHECK( m_avatar == NULL, "Player::~Player: m_avatar (%s) should be detached " "before deleting the Player object which might generate " "a memory hole\n", getName().getString() ); } // cleanup all weapons for ( int i = 0; i < m_MAX_WEAPONS; i++ ) delete m_weapon[i]; } /**********************************************************/ void Player::updateAvatarData() { DBG(1) if( !CHECK(m_avatar != NULL, "Player::updateAvatarData(): " "avatar == NULL\n") ) return; setPlayerColor( m_playerColor ); } /**********************************************************/ void Player::update() { } /**********************************************************/ void Player::attachAvatar( Avatar* const avatar ) { DBG( 1 ){ const char fn[] = "Player::attachAvatar:"; ASSERT( avatar != NULL, "%s passed avatar == NULL\n", fn ); ASSERT( NULL == m_avatar, "%s attaching avatar to a player, " "that already has one\n", fn ); ASSERT( NULL == avatar->m_Player, "%s avatar already has an " "attached player\n", fn ); } // plug in bidirectional connection m_avatar = avatar; avatar->m_Player = this; // update the data of the avatar updateAvatarData(); } /**********************************************************/ void Player::setPlayerColor( const Uint32 color ) { m_playerColor = color; if( m_avatar ) { m_avatar->setPlayerColor( m_playerColor ); m_avatar->setTeamColor( TEAM_COLOR[getTeamID()] ); } } /**********************************************************/ void Player::setLocalPlayer( const bool flag ) { m_isLocalPlayer = flag; if( m_avatar ) { m_avatar->setFocusPriority( FOCUS_PRIO_AVATAR_BASE + (flag ? FOCUS_PRIO_AVATAR_LOCAL : 0) ); } } Uint8 Player::getPlayerOrTeamID( void ) const { return ( m_avatar->m_worldPointer->getScorekeeper()->isTeamPlay() ? m_teamID : m_playerID); } /**********************************************************/ Avatar* Player::detachAvatar() { LOG( 2 ) INFO( "Player::detachAvatar: detaching avatar\n" ); DBG( 2 ) { ASSERT( m_avatar != NULL, "Player::detachAvatar: m_avatar == NULL\n" ); ASSERT( m_avatar->m_Player == this, "Player::detachAvatar: avatar did not have me " "as its player\n" ); } // cut the bidirectional connection Avatar* temp = m_avatar; m_avatar->m_Player = NULL; m_avatar = NULL; return temp; } /**********************************************************/ void Player::serialize( Uint8*& bufferPointer ) const { START_SERIALIZED_SIZE_CHECK( bufferPointer ); // player name m_name.serialize( bufferPointer, -1 ); Serialize::serialize( m_playerColor, bufferPointer ); Serialize::serialize( m_teamID, bufferPointer ); Serialize::serialize( m_avatarType, bufferPointer ); Serialize::serialize( m_playerID, bufferPointer ); Serialize::serialize( m_activeWeaponIndex, bufferPointer ); for ( int i = 0; i < m_MAX_WEAPONS; i++ ) { m_weapon[i]->serialize( bufferPointer ); } END_SERIALIZED_SIZE_CHECK( bufferPointer, Player ); } /**********************************************************/ void Player::deserialize( Uint8*& bufferPointer ) { // player name m_name.deserialize( bufferPointer ); Serialize::deserialize( bufferPointer, m_playerColor ); Serialize::deserialize( bufferPointer, m_teamID ); Serialize::deserialize( bufferPointer, m_avatarType ); Serialize::deserialize( bufferPointer, m_playerID ); Serialize::deserialize( bufferPointer, m_activeWeaponIndex ); for ( int i = 0; i < m_MAX_WEAPONS; i++ ) { m_weapon[i]->deserialize( bufferPointer ); } } /**********************************************************/ Uint32 Player::getSerializeBufferSize() const { Uint32 weaponSize = 0; for ( int i = 0; i < m_MAX_WEAPONS; i++ ) { weaponSize += m_weapon[i]->getSerializeBufferSize(); } return m_name.getSerializeBufferSize() + // size of the player's name Serialize::sizeOf( m_playerColor ) + Serialize::sizeOf( m_teamID ) + Serialize::sizeOf( m_avatarType ) + Serialize::sizeOf( m_playerID ) + Serialize::sizeOf( m_activeWeaponIndex ) + weaponSize; } /**********************************************************/ void Player::dump( std::ostream& out ) const { using namespace std; out << "Player " << m_name << endl; out << "\tID " << m_playerID << ", Team ID " << m_teamID << endl; }