/* $Id: skwoermzone.cpp,v 1.5.2.1 2006/01/20 11:33:53 chfreund Exp $ */ #include "skwoermzone.hpp" #include "avatar.hpp" #include "audio.hpp" #define ALIVE_INCREMENT -0.06 #define DECAYING_INCREMENT +0.03 SkwoermZone::SkwoermZone( AttachableObject* object, real dt ) : m_radius( 80.0 ), m_decayRadius( 10.0 ), m_dt( dt ), m_currentDt( 1.0 ), m_szState( ALIVE ) { LOG( 5 ) INFO( "SkwoermZone::SkwoermZone: started\n" ); attachTo( object ); Avatar* avatar = dynamic_cast( object ); // if attached to avatar if( avatar ) { DBG( 2 ) CHECK( ! avatar->isInSkwoermZone(), "SkwoermZone::SkwoermZone: avatar already is in SkwoermZone\n" ); // set IN_SKWOERMZONE state avatar->setState( Avatar::IN_SKWOERMZONE, true ); } LOG( 5 ) INFO( "SkwoermZone::SkwoermZone: done\n" ); } SkwoermZone::SkwoermZone( const Vector& pos, real dt ) : m_radius( 80.0 ), m_decayRadius( 10.0 ), m_dt( dt ), m_currentDt( 1.0 ), m_szState( ALIVE ) { CHECK( false, "SkwoermZone::SkwoermZone: should not be called with position\n" ); m_pos = pos; } SkwoermZone::~SkwoermZone() { LOG( 5 ) INFO( "SkwoermZone::~SkwoermZone: started\n" ); // remove IN_SKWOERMZONE state from all attached avatars for( int a = 0; a < getNAttachedObjects(); a++ ) { Avatar* avatar = dynamic_cast( getAttachedObject( a )); if( avatar ) { avatar->setState( Avatar::IN_SKWOERMZONE, false ); if( avatar->getPlayer()->isLocalPlayer() ) { Audio::getInstance()->setLowPassFilter( -1.0 ); } } } LOG( 5 ) INFO( "SkwoermZone::~SkwoermZone: done\n" ); } void SkwoermZone::update() { m_currentDt += (m_szState == ALIVE ? ALIVE_INCREMENT : DECAYING_INCREMENT); real one = 1.0; if( m_currentDt >= one ) setRemoveMeAfterUpdate( true ); m_currentDt = min( one, m_currentDt ); m_currentDt = max( m_dt, m_currentDt ); if( getNAttachedObjects() > 0 ) { m_pos = getAttachedObject( 0 )->getPos(); m_vel = getAttachedObject( 0 )->getVel(); Avatar* avatar = dynamic_cast( getAttachedObject( 0 )); if( avatar && avatar->getPlayer()->isLocalPlayer() ) { // if local player's avatar if( avatar->getPlayer()->isLocalPlayer() ) { // turn on low-pass filter Audio::getInstance()->setLowPassFilter( 1.0 - (m_currentDt-m_dt)/(1.0-m_dt) ); } } } else { m_vel.set( 0.0, 0.0 ); } m_szState = DECAYING; } void SkwoermZone::setRadii( const real radius, const real decayRadius ) { DBG( 1 ) ASSERT( decayRadius < radius, "SkwoermZone::setRadii: decayRadius " "has to be smaller than radius\n" ); m_radius = radius; m_decayRadius = decayRadius; } real SkwoermZone::getDT( const Vector& point ) const { const real dist = (point-m_pos).abs(); if ( dist > m_radius ) return 1.0; if ( dist > m_decayRadius ) //return (( ( dist - m_radius + m_decayRadius ) / m_decayRadius ) * 1.0 + // ( ( m_radius - dist ) / m_decayRadius ) * m_currentDt ); return m_currentDt + (dist-m_decayRadius)* ((1.0-m_currentDt)/(m_radius-m_decayRadius)); else return m_currentDt; } void SkwoermZone::serialize( Uint8*& bufferPointer ) const { AttachableObject::serialize( bufferPointer ); Serialize::serialize( m_radius , bufferPointer ); Serialize::serialize( m_decayRadius , bufferPointer ); Serialize::serialize( m_dt , bufferPointer ); Serialize::serialize( m_currentDt , bufferPointer ); Serialize::serialize( m_szState , bufferPointer ); } void SkwoermZone::deserialize( Uint8*& bufferPointer ) { AttachableObject::deserialize( bufferPointer ); Serialize::deserialize( bufferPointer, m_radius ); Serialize::deserialize( bufferPointer, m_decayRadius ); Serialize::deserialize( bufferPointer, m_dt ); Serialize::deserialize( bufferPointer, m_currentDt ); Serialize::deserialize( bufferPointer, m_szState ); } Uint32 SkwoermZone::getSerializeBufferSize() const { return AttachableObject::getSerializeBufferSize() + 4 * Serialize::sizeOf() + Serialize::sizeOf(); }