This commit is contained in:
parent
efade374fe
commit
4ef031e3ad
3 changed files with 130 additions and 6 deletions
|
@ -434,7 +434,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
|
||||||
NPC_CLOSE_NONE,
|
NPC_CLOSE_NONE,
|
||||||
NPC_TIMER_NONE,
|
NPC_TIMER_NONE,
|
||||||
false,
|
false,
|
||||||
3,
|
5,
|
||||||
64,
|
64,
|
||||||
DETECT_ALL_COLLISION,
|
DETECT_ALL_COLLISION,
|
||||||
DAMAGE__SHOCK_ENEMY,
|
DAMAGE__SHOCK_ENEMY,
|
||||||
|
|
|
@ -224,6 +224,129 @@ bool CNpcSeaSnakeEnemy::processSensor()
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
u8 CNpcSeaSnakeEnemy::processPathMove( int _frames, s32 *moveX, s32 *moveY, s32 *moveVel, s32 *moveDist )
|
||||||
|
{
|
||||||
|
bool pathComplete;
|
||||||
|
bool waypointChange;
|
||||||
|
s32 xDist, yDist;
|
||||||
|
|
||||||
|
s16 headingToTarget = m_npcPath.think( Pos, &pathComplete, &waypointChange, &xDist, &yDist );
|
||||||
|
|
||||||
|
/*if ( waypointChange )
|
||||||
|
{
|
||||||
|
m_movementTimer = 0;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
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 speed = m_speed;
|
||||||
|
|
||||||
|
if ( abs( *moveDist ) > 10 )
|
||||||
|
{
|
||||||
|
speed = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 preShiftX = _frames * speed * rcos( m_heading );
|
||||||
|
s32 preShiftY = _frames * speed * rsin( m_heading );
|
||||||
|
|
||||||
|
*moveX = preShiftX >> 12;
|
||||||
|
if ( !(*moveX) && preShiftX )
|
||||||
|
{
|
||||||
|
*moveX = preShiftX / abs( preShiftX );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( xDist > 0 )
|
||||||
|
{
|
||||||
|
if ( *moveX > xDist )
|
||||||
|
{
|
||||||
|
*moveX = xDist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( xDist < 0 )
|
||||||
|
{
|
||||||
|
if ( *moveX < xDist )
|
||||||
|
{
|
||||||
|
*moveX = xDist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*moveX = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*moveY = preShiftY >> 12;
|
||||||
|
if ( !(*moveY) && preShiftY )
|
||||||
|
{
|
||||||
|
*moveY = preShiftY / abs( preShiftY );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( yDist > 0 )
|
||||||
|
{
|
||||||
|
if ( *moveY > yDist )
|
||||||
|
{
|
||||||
|
*moveY = yDist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( yDist < 0 )
|
||||||
|
{
|
||||||
|
if ( *moveY < yDist )
|
||||||
|
{
|
||||||
|
*moveY = yDist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*moveY = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*moveVel = ( _frames * m_speed ) << 8;
|
||||||
|
|
||||||
|
//processGroundCollisionReverse( moveX, moveY );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( waypointChange );
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void CNpcSeaSnakeEnemy::processMovement( int _frames )
|
void CNpcSeaSnakeEnemy::processMovement( int _frames )
|
||||||
{
|
{
|
||||||
s32 moveX = 0, moveY = 0;
|
s32 moveX = 0, moveY = 0;
|
||||||
|
@ -275,8 +398,8 @@ void CNpcSeaSnakeEnemy::processMovement( int _frames )
|
||||||
|
|
||||||
m_heading = ( m_origHeading + m_circleHeading ) & 4095;
|
m_heading = ( m_origHeading + m_circleHeading ) & 4095;
|
||||||
|
|
||||||
s32 preShiftX = _frames * m_speed * rcos( m_heading );
|
s32 preShiftX = _frames * 3 * rcos( m_heading );
|
||||||
s32 preShiftY = _frames * m_speed * rsin( m_heading );
|
s32 preShiftY = _frames * 3 * rsin( m_heading );
|
||||||
|
|
||||||
s32 moveX = preShiftX >> 12;
|
s32 moveX = preShiftX >> 12;
|
||||||
if ( !moveX && preShiftX )
|
if ( !moveX && preShiftX )
|
||||||
|
@ -308,8 +431,8 @@ void CNpcSeaSnakeEnemy::processMovement( int _frames )
|
||||||
|
|
||||||
m_heading = ( m_origHeading + m_circleHeading ) & 4095;
|
m_heading = ( m_origHeading + m_circleHeading ) & 4095;
|
||||||
|
|
||||||
s32 preShiftX = _frames * m_speed * rcos( m_heading );
|
s32 preShiftX = _frames * 3 * rcos( m_heading );
|
||||||
s32 preShiftY = _frames * m_speed * rsin( m_heading );
|
s32 preShiftY = _frames * 3 * rsin( m_heading );
|
||||||
|
|
||||||
s32 moveX = preShiftX >> 12;
|
s32 moveX = preShiftX >> 12;
|
||||||
if ( !moveX && preShiftX )
|
if ( !moveX && preShiftX )
|
||||||
|
@ -379,7 +502,7 @@ void CNpcSeaSnakeEnemy::processMovement( int _frames )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( processGenericFixedPathMove( _frames, &moveX, &moveY, &moveVel, &moveDist ) )
|
if ( processPathMove( _frames, &moveX, &moveY, &moveVel, &moveDist ) )
|
||||||
{
|
{
|
||||||
// path has changed
|
// path has changed
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,7 @@ protected:
|
||||||
virtual void processShot( int _frames );
|
virtual void processShot( int _frames );
|
||||||
virtual void processEnemyCollision( CThing *thisThing );
|
virtual void processEnemyCollision( CThing *thisThing );
|
||||||
virtual void processUserCollision( CThing *thisThing );
|
virtual void processUserCollision( CThing *thisThing );
|
||||||
|
u8 processPathMove( int _frames, s32 *moveX, s32 *moveY, s32 *moveVel, s32 *moveDist );
|
||||||
u8 isSnakeStopped();
|
u8 isSnakeStopped();
|
||||||
void moveEntireSnake( DVECTOR newPos );
|
void moveEntireSnake( DVECTOR newPos );
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue