diff --git a/source/enemy/npcdata.cpp b/source/enemy/npcdata.cpp index a77b2c2b4..68eefd98d 100644 --- a/source/enemy/npcdata.cpp +++ b/source/enemy/npcdata.cpp @@ -563,7 +563,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = NPC_CLOSE_NONE, NPC_TIMER_NONE, false, - 3, + 2, 2048, DETECT_ATTACK_COLLISION_GENERIC, DAMAGE__PINCH_ENEMY, diff --git a/source/enemy/nscrab.cpp b/source/enemy/nscrab.cpp index 0a41b69f2..cab1c4c40 100644 --- a/source/enemy/nscrab.cpp +++ b/source/enemy/nscrab.cpp @@ -46,6 +46,10 @@ void CNpcSpiderCrabEnemy::postInit() m_state = SPIDER_CRAB_INIT_JUMP; } + else + { + m_velocity = m_data[m_type].speed; + } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -96,6 +100,8 @@ bool CNpcSpiderCrabEnemy::processSensor() m_extension = 0; m_velocity = 5; m_base = Pos; + m_jumpDelay = GameState::getOneSecondInFrames() >> 1; + m_animPlaying = false; // sound @@ -120,90 +126,97 @@ bool CNpcSpiderCrabEnemy::processSensor() void CNpcSpiderCrabEnemy::processClose( int _frames ) { - s32 velocity; - DVECTOR newPos = Pos; - - if ( m_animNo != ANIM_SPIDERCRAB_JUMP ) + if ( m_jumpDelay > 0 ) { - m_animPlaying = true; - m_animNo = ANIM_SPIDERCRAB_JUMP; - m_frame = 0; - } - - velocity = m_velocity * _frames; - - if ( m_extendDir == EXTEND_RIGHT ) - { - m_extension += velocity; - m_heading = 0; + m_jumpDelay -= _frames; } else { - m_extension -= velocity; - m_heading = 2048; - } + s32 velocity; + DVECTOR newPos = Pos; - bool completed = false; + if ( m_animNo != ANIM_SPIDERCRAB_JUMP ) + { + m_animPlaying = true; + m_animNo = ANIM_SPIDERCRAB_JUMP; + m_frame = 0; + } - if ( m_extension > m_attackDist ) - { - m_extension = m_attackDist; - completed = true; - } - else if ( m_extension < -m_attackDist ) - { - m_extension = -m_attackDist; - completed = true; - } + velocity = ( m_velocity * _frames ) >> 1; - newPos.vx = m_base.vx + m_extension; - newPos.vy = m_base.vy - ( ( SPIDER_CRAB_HEIGHT * rsin( abs( ( m_extension << 11 ) / m_attackDist ) ) ) >> 12 ); + if ( m_extendDir == EXTEND_RIGHT ) + { + m_extension += velocity; + m_heading = 0; + } + else + { + m_extension -= velocity; + m_heading = 2048; + } - s32 minX, maxX; + bool completed = false; - m_npcPath.getPathXExtents( &minX, &maxX ); + if ( m_extension > m_attackDist ) + { + m_extension = m_attackDist; + completed = true; + } + else if ( m_extension < -m_attackDist ) + { + m_extension = -m_attackDist; + completed = true; + } - if ( newPos.vx < minX ) - { - newPos.vx = minX; - } - else if ( newPos.vx > maxX ) - { - newPos.vx = maxX; - } + newPos.vx = m_base.vx + m_extension; + newPos.vy = m_base.vy - ( ( SPIDER_CRAB_HEIGHT * rsin( abs( ( m_extension << 11 ) / m_attackDist ) ) ) >> 12 ); - // check for collision with ground + s32 minX, maxX; - s16 extensionDist = abs( newPos.vy - ( m_base.vy - SPIDER_CRAB_HEIGHT ) ); - s16 groundHeight = CGameScene::getCollision()->getHeightFromGround( newPos.vx, m_base.vy - SPIDER_CRAB_HEIGHT, extensionDist ); + m_npcPath.getPathXExtents( &minX, &maxX ); - if ( groundHeight < extensionDist ) - { - // abort jump + if ( newPos.vx < minX ) + { + newPos.vx = minX; + } + else if ( newPos.vx > maxX ) + { + newPos.vx = maxX; + } - m_controlFunc = NPC_CONTROL_MOVEMENT; - m_timerFunc = NPC_TIMER_ATTACK_DONE; - m_timerTimer = GameState::getOneSecondInFrames(); - m_sensorFunc = NPC_SENSOR_NONE; + // check for collision with ground - m_extension = 0; - completed = false; - Pos = newPos; - Pos.vy = m_base.vy - SPIDER_CRAB_HEIGHT + groundHeight; - } - else - { - Pos = newPos; - } + s16 extensionDist = abs( newPos.vy - ( m_base.vy - SPIDER_CRAB_HEIGHT ) ); + s16 groundHeight = CGameScene::getCollision()->getHeightFromGround( newPos.vx, m_base.vy - SPIDER_CRAB_HEIGHT, extensionDist ); - if ( completed ) - { - m_controlFunc = NPC_CONTROL_MOVEMENT; - m_timerFunc = NPC_TIMER_ATTACK_DONE; - m_timerTimer = GameState::getOneSecondInFrames(); - m_sensorFunc = NPC_SENSOR_NONE; + if ( groundHeight < extensionDist ) + { + // abort jump - m_extension = 0; + m_controlFunc = NPC_CONTROL_MOVEMENT; + m_timerFunc = NPC_TIMER_ATTACK_DONE; + m_timerTimer = GameState::getOneSecondInFrames(); + m_sensorFunc = NPC_SENSOR_NONE; + + m_extension = 0; + completed = false; + Pos = newPos; + Pos.vy = m_base.vy - SPIDER_CRAB_HEIGHT + groundHeight; + } + else + { + Pos = newPos; + } + + if ( completed ) + { + m_controlFunc = NPC_CONTROL_MOVEMENT; + m_timerFunc = NPC_TIMER_ATTACK_DONE; + m_timerTimer = GameState::getOneSecondInFrames(); + m_sensorFunc = NPC_SENSOR_NONE; + + m_extension = 0; + } } } @@ -290,6 +303,7 @@ void CNpcSpiderCrabEnemy::processSpiderCrabInitJumpMovement( int _frames ) if ( m_extension > 64 ) { m_state = SPIDER_CRAB_DEFAULT; + m_velocity = m_data[m_type].speed; } } @@ -324,6 +338,8 @@ void CNpcSpiderCrabEnemy::processMovement(int _frames) void CNpcSpiderCrabEnemy::processMovementModifier( int _frames, s32 distX, s32 distY, s32 dist, s16 headingChange ) { + int groundDist; + Pos.vx += distX; Pos.vy += distY; @@ -335,8 +351,25 @@ void CNpcSpiderCrabEnemy::processMovementModifier( int _frames, s32 distX, s32 d testPos1.vx -= 10; testPos2.vx += 10; - testPos1.vy += CGameScene::getCollision()->getHeightFromGround( testPos1.vx, testPos1.vy, 16 ); - testPos2.vy += CGameScene::getCollision()->getHeightFromGround( testPos2.vx, testPos2.vy, 16 ); + groundDist = CGameScene::getCollision()->getHeightFromGround( testPos1.vx, testPos1.vy, 12 ); + + if ( abs( groundDist ) > 12 ) + { + m_drawRotation = 0; + return; + } + + testPos1.vy += groundDist; + + groundDist = CGameScene::getCollision()->getHeightFromGround( testPos2.vx, testPos2.vy, 12 ); + + if ( abs( groundDist ) > 12 ) + { + m_drawRotation = 0; + return; + } + + testPos2.vy += groundDist; s32 xDist = testPos2.vx - testPos1.vx; s32 yDist = testPos2.vy - testPos1.vy; diff --git a/source/enemy/nscrab.h b/source/enemy/nscrab.h index eccebf15d..7ecdd1132 100644 --- a/source/enemy/nscrab.h +++ b/source/enemy/nscrab.h @@ -33,6 +33,7 @@ protected: void processSpiderCrabInitJumpMovement( int _frames ); s32 m_attackDist; + int m_jumpDelay; enum NPC_SPIDER_CRAB_STATE { @@ -43,7 +44,7 @@ protected: enum NPC_SPIDER_CRAB_CONSTANTS { SPIDER_CRAB_EXTENSION = 64, - SPIDER_CRAB_HEIGHT = 50, + SPIDER_CRAB_HEIGHT = 40, }; };