diff --git a/source/platform/plinear.cpp b/source/platform/plinear.cpp new file mode 100644 index 000000000..765f54ebe --- /dev/null +++ b/source/platform/plinear.cpp @@ -0,0 +1,97 @@ +/*========================================================================= + + plinear.cpp + + Author: CRB + Created: + Project: Spongebob + Purpose: + + Copyright (c) 2001 Climax Development Ltd + +===========================================================================*/ + +#ifndef __PLATFORM_PLINEAR_H__ +#include "platform\plinear.h" +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void CNpcLinearPlatform::postInit() +{ + m_npcPath.setPathType( CNpcPath::PONG_PATH ); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void CNpcLinearPlatform::processMovement( int _frames ) +{ + s32 moveX = 0, moveY = 0; + s32 moveDist = 0; + + bool pathComplete; + bool waypointChange; + + s16 headingToTarget = m_npcPath.think( Pos, &pathComplete, &waypointChange ); + + if ( !pathComplete ) + { + s16 decDir, incDir; + s16 maxTurnRate = m_data[m_type].turnSpeed; + + decDir = m_heading - headingToTarget; + + if ( decDir < 0 ) + { + decDir += ONE; + } + + incDir = headingToTarget - m_heading; + + if ( incDir < 0 ) + { + incDir += ONE; + } + + if ( decDir < incDir ) + { + *moveDist = -decDir; + } + else + { + *moveDist = incDir; + } + + if ( *moveDist < -maxTurnRate ) + { + *moveDist = -maxTurnRate; + } + else if ( *moveDist > maxTurnRate ) + { + *moveDist = maxTurnRate; + } + + m_heading += *moveDist; + m_heading &= 4095; + + s32 preShiftX = _frames * m_data[m_type].speed * rcos( m_heading ); + s32 preShiftY = _frames * m_data[m_type].speed * rsin( m_heading ); + + *moveX = preShiftX >> 12; + if ( !(*moveX) && preShiftX ) + { + *moveX = preShiftX / abs( preShiftX ); + } + + *moveY = preShiftY >> 12; + if ( !(*moveY) && preShiftY ) + { + *moveY = preShiftY / abs( preShiftY ); + } + + //processGroundCollisionReverse( moveX, moveY ); + } + + Pos.vx += moveX; + Pos.vy += moveY; +} diff --git a/source/platform/plinear.h b/source/platform/plinear.h new file mode 100644 index 000000000..8dda3ef7a --- /dev/null +++ b/source/platform/plinear.h @@ -0,0 +1,29 @@ +/*========================================================================= + + plinear.h + + Author: CRB + Created: + Project: Spongebob + Purpose: + + Copyright (c) 2001 Climax Development Ltd + +===========================================================================*/ + +#ifndef __PLATFORM_PLINEAR_H__ +#define __PLATFORM_PLINEAR_H__ + +#ifndef __PLATFORM_PLATFORM_H__ +#include "platform\platform.h" +#endif + +class CNpcLinearPlatform : public CNpcPlatform +{ +public: + virtual void postInit(); +protected: + void processMovement( int _frames ); +}; + +#endif \ No newline at end of file