diff --git a/Graphics/levels/Chapter04/Level04/Level04.MEX b/Graphics/levels/Chapter04/Level04/Level04.MEX index 313efeb27..f1e9757a5 100644 Binary files a/Graphics/levels/Chapter04/Level04/Level04.MEX and b/Graphics/levels/Chapter04/Level04/Level04.MEX differ diff --git a/Graphics/levels/Chapter04/Level04/level04.Mep b/Graphics/levels/Chapter04/Level04/level04.Mep index 8f9bc2cac..79c938ef4 100644 Binary files a/Graphics/levels/Chapter04/Level04/level04.Mep and b/Graphics/levels/Chapter04/Level04/level04.Mep differ diff --git a/source/enemy/nfdutch.cpp b/source/enemy/nfdutch.cpp index a4b02720e..a71491d45 100644 --- a/source/enemy/nfdutch.cpp +++ b/source/enemy/nfdutch.cpp @@ -95,25 +95,24 @@ void CNpcFlyingDutchmanEnemy::processMovement( int _frames ) m_frame = 0; } - if ( m_movementTimer > 0 ) + s32 xDist = m_extension - Pos.vx; + s32 xDistSqr = xDist * xDist; + + if ( xDistSqr > 100 ) { - m_movementTimer -= _frames; - - s32 xDist = m_extension - Pos.vx; - s32 xDistSqr = xDist * xDist; - - if ( xDistSqr > 100 ) - { - processGenericGotoTarget( _frames, xDist, 0, m_speed ); - } - else + processGenericGotoTarget( _frames, xDist, 0, m_speed ); + } + else + { + if ( m_movementTimer > 0 ) { + m_movementTimer -= _frames; + if ( m_extendDir == EXTEND_UP ) { s32 yDist = m_minY - Pos.vy; - s32 yDistSqr = yDist * yDist; - if ( yDistSqr > 100 ) + if ( abs( yDist ) > 10 ) { processGenericGotoTarget( _frames, 0, yDist, m_speed ); } @@ -125,9 +124,8 @@ void CNpcFlyingDutchmanEnemy::processMovement( int _frames ) else { s32 yDist = m_maxY - Pos.vy; - s32 yDistSqr = yDist * yDist; - if ( yDistSqr > 100 ) + if ( abs( yDist ) > 10 ) { processGenericGotoTarget( _frames, 0, yDist, m_speed ); } @@ -137,10 +135,25 @@ void CNpcFlyingDutchmanEnemy::processMovement( int _frames ) } } } - } - else - { - m_controlFunc = NPC_CONTROL_CLOSE; + else + { + CPlayer *player = GameScene.getPlayer(); + + DVECTOR playerPos = player->getPos(); + + s32 minX, maxX; + m_npcPath.getPathXExtents( &minX, &maxX ); + + if ( playerPos.vx >= minX && playerPos.vx <= maxX && + playerPos.vy >= m_minY && playerPos.vy <= m_maxY ) + { + m_controlFunc = NPC_CONTROL_CLOSE; + } + else + { + m_movementTimer = GameState::getOneSecondInFrames() * 3; + } + } } if ( playerXDist > 0 )