diff --git a/source/platform/pseesaw.cpp b/source/platform/pseesaw.cpp new file mode 100644 index 000000000..5c6920e8f --- /dev/null +++ b/source/platform/pseesaw.cpp @@ -0,0 +1,102 @@ +/*========================================================================= + + pseesaw.cpp + + Author: CRB + Created: + Project: Spongebob + Purpose: + + Copyright (c) 2001 Climax Development Ltd + +===========================================================================*/ + +#ifndef __PLATFORM_PSEESAW_H__ +#include "platform\pseesaw.h" +#endif + +#ifndef __GAME_GAME_H__ +#include "game\game.h" +#endif + + +void CNpcSeesawPlatform::postInit() +{ + CNpcPlatform::postInit(); + + m_angularVelocity = 0; + m_currentAngle = 0; +} + +void CNpcSeesawPlatform::processMovement( int _frames ) +{ + s32 forceActing = 0; + + if ( m_contact ) + { + // find if user is to left or right of platform centre + + CPlayer *player = GameScene.getPlayer(); + + DVECTOR playerPos = player->getPos(); + + s32 distX = playerPos.vx - this->Pos.vx; + + if ( distX > 0 ) + { + forceActing = 64 * _frames; + + m_angularVelocity += forceActing; + } + else if ( distX < 0 ) + { + forceActing = -64 * _frames; + + m_angularVelocity += forceActing; + } + } + + if ( !forceActing && m_angularVelocity ) + { + // reduce velocity until 0 + + s32 m_angularResistance = -( 64 * _frames * m_angularVelocity ) / abs( m_angularVelocity ); + + if ( m_angularResistance < -m_angularVelocity ) + { + m_angularResistance = -m_angularVelocity; + } + else if ( m_angularResistance > m_angularVelocity ) + { + m_angularResistance = m_angularVelocity; + } + + m_angularVelocity += m_angularResistance; + } + + if ( m_angularVelocity > ( 20 << 8 ) ) + { + m_angularVelocity = 20 << 8; + } + else if ( m_angularVelocity < -( 20 << 8 ) ) + { + m_angularVelocity = -( 20 << 8 ); + } + + s32 newAngle = m_currentAngle + m_angularVelocity; + + if ( newAngle > ( 512 << 8 ) ) + { + newAngle = 512 << 8; + m_angularVelocity = 0; + } + else if ( newAngle < -( 512 << 8 ) ) + { + newAngle = -( 512 << 8 ); + m_angularVelocity = 0; + } + + m_currentAngle = newAngle; + + setCollisionAngle( newAngle >> 8 ); +} \ No newline at end of file diff --git a/source/platform/pseesaw.h b/source/platform/pseesaw.h new file mode 100644 index 000000000..827eed060 --- /dev/null +++ b/source/platform/pseesaw.h @@ -0,0 +1,32 @@ +/*========================================================================= + + pseesaw.h + + Author: CRB + Created: + Project: Spongebob + Purpose: + + Copyright (c) 2001 Climax Development Ltd + +===========================================================================*/ + +#ifndef __PLATFORM_PSEESAW_H__ +#define __PLATFORM_PSEESAW_H__ + +#ifndef __PLATFORM_PLATFORM_H__ +#include "platform\platform.h" +#endif + +class CNpcSeesawPlatform : public CNpcPlatform +{ +public: + virtual void postInit(); +protected: + virtual void processMovement( int _frames ); + + s32 m_angularVelocity; + s32 m_currentAngle; +}; + +#endif \ No newline at end of file