This commit is contained in:
Charles 2001-08-02 13:48:17 +00:00
parent 5378d9a1ab
commit 1ab34685db
3 changed files with 105 additions and 71 deletions

View File

@ -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,

View File

@ -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;

View File

@ -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,
};
};