This commit is contained in:
parent
64c4918131
commit
398d250275
@ -48,7 +48,6 @@
|
|||||||
|
|
||||||
void CNpcFlyingDutchmanEnemy::postInit()
|
void CNpcFlyingDutchmanEnemy::postInit()
|
||||||
{
|
{
|
||||||
m_state = FLYING_DUTCHMAN_ATTACK_PLAYER_1;
|
|
||||||
m_extendDir = EXTEND_UP;
|
m_extendDir = EXTEND_UP;
|
||||||
|
|
||||||
s32 minX, maxX;
|
s32 minX, maxX;
|
||||||
@ -65,10 +64,8 @@ void CNpcFlyingDutchmanEnemy::postInit()
|
|||||||
|
|
||||||
m_fireCount = 0;
|
m_fireCount = 0;
|
||||||
|
|
||||||
m_invulnerableTimer = 0;
|
|
||||||
|
|
||||||
m_fadeVal = 128;
|
m_fadeVal = 128;
|
||||||
m_fadeDown = false;
|
m_fadeDown = true;
|
||||||
|
|
||||||
CNpcBossEnemy::postInit();
|
CNpcBossEnemy::postInit();
|
||||||
}
|
}
|
||||||
@ -77,32 +74,23 @@ void CNpcFlyingDutchmanEnemy::postInit()
|
|||||||
|
|
||||||
void CNpcFlyingDutchmanEnemy::think( int _frames )
|
void CNpcFlyingDutchmanEnemy::think( int _frames )
|
||||||
{
|
{
|
||||||
if ( m_invulnerableTimer > 0 )
|
|
||||||
{
|
|
||||||
m_invulnerableTimer -= _frames;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( m_fadeDown )
|
if ( m_fadeDown )
|
||||||
{
|
{
|
||||||
if ( m_fadeVal > 0 )
|
if ( m_fadeVal > 0 )
|
||||||
{
|
{
|
||||||
m_fadeVal -= _frames;
|
m_fadeVal -= 4 * _frames;
|
||||||
|
|
||||||
if ( m_fadeVal < 0 )
|
if ( m_fadeVal < 0 )
|
||||||
{
|
{
|
||||||
m_fadeVal = 0;
|
m_fadeVal = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
m_fadeDown = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( m_fadeVal < 128 )
|
if ( m_fadeVal < 128 )
|
||||||
{
|
{
|
||||||
m_fadeVal += _frames;
|
m_fadeVal += 4 * _frames;
|
||||||
|
|
||||||
if ( m_fadeVal > 128 )
|
if ( m_fadeVal > 128 )
|
||||||
{
|
{
|
||||||
@ -178,6 +166,7 @@ void CNpcFlyingDutchmanEnemy::processMovement( int _frames )
|
|||||||
playerPos.vy >= m_minY && playerPos.vy <= m_maxY )
|
playerPos.vy >= m_minY && playerPos.vy <= m_maxY )
|
||||||
{
|
{
|
||||||
m_controlFunc = NPC_CONTROL_CLOSE;
|
m_controlFunc = NPC_CONTROL_CLOSE;
|
||||||
|
m_state = FLYING_DUTCHMAN_GOTO_PLAYER;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -209,22 +198,166 @@ void CNpcFlyingDutchmanEnemy::processClose( int _frames )
|
|||||||
m_extendDir = EXTEND_UP;
|
m_extendDir = EXTEND_UP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !m_inRange && playerYDistSqr > 100 )
|
if ( !m_inRange )
|
||||||
{
|
{
|
||||||
if ( !m_animPlaying )
|
if ( playerYDistSqr > 100 )
|
||||||
{
|
{
|
||||||
m_animPlaying = true;
|
if ( !m_animPlaying )
|
||||||
m_animNo = m_data[m_type].moveAnim;
|
{
|
||||||
m_frame = 0;
|
m_animPlaying = true;
|
||||||
}
|
m_animNo = m_data[m_type].moveAnim;
|
||||||
|
m_frame = 0;
|
||||||
|
}
|
||||||
|
|
||||||
processGenericGotoTarget( _frames, 0, playerYDist, m_speed );
|
processGenericGotoTarget( _frames, 0, playerYDist, m_speed );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_inRange = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_inRange = true;
|
|
||||||
|
|
||||||
switch( m_state )
|
switch( m_state )
|
||||||
|
{
|
||||||
|
case FLYING_DUTCHMAN_GOTO_PLAYER:
|
||||||
|
{
|
||||||
|
if ( !m_animPlaying )
|
||||||
|
{
|
||||||
|
m_animPlaying = true;
|
||||||
|
m_animNo = m_data[m_type].moveAnim;
|
||||||
|
m_frame = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// charge player
|
||||||
|
|
||||||
|
if ( ( playerXDistSqr + playerYDistSqr ) > 20000 )
|
||||||
|
{
|
||||||
|
processGenericGotoTarget( _frames, playerXDist, playerYDist, 8 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_state = FLYING_DUTCHMAN_ATTACK_PLAYER;
|
||||||
|
m_fadeDown = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case FLYING_DUTCHMAN_ATTACK_PLAYER:
|
||||||
|
{
|
||||||
|
if ( m_fadeVal == 128 )
|
||||||
|
{
|
||||||
|
if ( m_timerTimer > 0 )
|
||||||
|
{
|
||||||
|
if ( !m_animPlaying )
|
||||||
|
{
|
||||||
|
m_animNo = m_data[m_type].moveAnim;
|
||||||
|
m_animPlaying = true;
|
||||||
|
m_frame = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_timerTimer -= _frames;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( m_animNo != ANIM_FLYINGDUTCHMAN_FIREATTACK )
|
||||||
|
{
|
||||||
|
m_animNo = ANIM_FLYINGDUTCHMAN_FIREATTACK;
|
||||||
|
m_animPlaying = true;
|
||||||
|
m_frame = 0;
|
||||||
|
}
|
||||||
|
//else if ( !m_animPlaying )
|
||||||
|
else if ( m_frame > ( getFrameCount() >> 1 ) )
|
||||||
|
{
|
||||||
|
// fire at player
|
||||||
|
|
||||||
|
s16 heading;
|
||||||
|
|
||||||
|
if ( playerXDist > 0 )
|
||||||
|
{
|
||||||
|
heading = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
heading = 2048;
|
||||||
|
}
|
||||||
|
|
||||||
|
CProjectile *projectile;
|
||||||
|
projectile = CProjectile::Create();
|
||||||
|
DVECTOR newPos = Pos;
|
||||||
|
newPos.vy -= 50;
|
||||||
|
projectile->init( newPos, heading );
|
||||||
|
projectile->setGraphic( FRM__SNAKEBILE );
|
||||||
|
projectile->setSpeed( 6 );
|
||||||
|
|
||||||
|
m_fireCount++;
|
||||||
|
|
||||||
|
if ( m_health < ( m_data[m_type].initHealth >> 2 ) && m_fireCount < 2 )
|
||||||
|
{
|
||||||
|
m_timerTimer = GameState::getOneSecondInFrames() >> 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_state = FLYING_DUTCHMAN_RETURN;
|
||||||
|
m_timerTimer = GameState::getOneSecondInFrames();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( !m_animPlaying )
|
||||||
|
{
|
||||||
|
m_animPlaying = true;
|
||||||
|
m_animNo = m_data[m_type].moveAnim;
|
||||||
|
m_frame = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case FLYING_DUTCHMAN_RETURN:
|
||||||
|
{
|
||||||
|
if ( m_timerTimer > 0 )
|
||||||
|
{
|
||||||
|
if ( !m_animPlaying )
|
||||||
|
{
|
||||||
|
m_animNo = m_data[m_type].moveAnim;
|
||||||
|
m_animPlaying = true;
|
||||||
|
m_frame = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_timerTimer -= _frames;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_controlFunc = NPC_CONTROL_MOVEMENT;
|
||||||
|
m_movementTimer = GameState::getOneSecondInFrames() * 2;
|
||||||
|
m_inRange = false;
|
||||||
|
m_fadeDown = true;
|
||||||
|
m_timerTimer = 0;
|
||||||
|
m_fireCount = 0;
|
||||||
|
|
||||||
|
s32 minX, maxX;
|
||||||
|
m_npcPath.getPathXExtents( &minX, &maxX );
|
||||||
|
|
||||||
|
if ( m_extension == minX )
|
||||||
|
{
|
||||||
|
m_extension = maxX;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_extension = minX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*switch( m_state )
|
||||||
{
|
{
|
||||||
case FLYING_DUTCHMAN_ATTACK_PLAYER_1:
|
case FLYING_DUTCHMAN_ATTACK_PLAYER_1:
|
||||||
case FLYING_DUTCHMAN_ATTACK_PLAYER_2:
|
case FLYING_DUTCHMAN_ATTACK_PLAYER_2:
|
||||||
@ -331,7 +464,7 @@ void CNpcFlyingDutchmanEnemy::processClose( int _frames )
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( playerXDist > 0 )
|
if ( playerXDist > 0 )
|
||||||
@ -350,9 +483,9 @@ void CNpcFlyingDutchmanEnemy::processShotRecoil( int _frames )
|
|||||||
{
|
{
|
||||||
if ( !m_animPlaying )
|
if ( !m_animPlaying )
|
||||||
{
|
{
|
||||||
m_state = m_oldState;
|
|
||||||
m_controlFunc = NPC_CONTROL_MOVEMENT;
|
m_controlFunc = NPC_CONTROL_MOVEMENT;
|
||||||
m_fadeDown = true;
|
m_fadeDown = true;
|
||||||
|
m_movementTimer = GameState::getOneSecondInFrames() * 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -420,60 +553,64 @@ void CNpcFlyingDutchmanEnemy::collidedWith(CThing *_thisThing)
|
|||||||
{
|
{
|
||||||
case TYPE_PLAYER:
|
case TYPE_PLAYER:
|
||||||
{
|
{
|
||||||
CPlayer *player = (CPlayer *) _thisThing;
|
if ( m_fadeVal == 128 )
|
||||||
|
|
||||||
ATTACK_STATE playerState = player->getAttackState();
|
|
||||||
|
|
||||||
if(playerState==ATTACK_STATE__NONE)
|
|
||||||
{
|
{
|
||||||
if ( !player->isRecoveringFromHit() )
|
CPlayer *player = (CPlayer *) _thisThing;
|
||||||
|
|
||||||
|
ATTACK_STATE playerState = player->getAttackState();
|
||||||
|
|
||||||
|
if(playerState==ATTACK_STATE__NONE)
|
||||||
{
|
{
|
||||||
switch( m_data[m_type].detectCollision )
|
if ( !player->isRecoveringFromHit() )
|
||||||
{
|
{
|
||||||
case DETECT_NO_COLLISION:
|
switch( m_data[m_type].detectCollision )
|
||||||
{
|
{
|
||||||
// ignore
|
case DETECT_NO_COLLISION:
|
||||||
|
{
|
||||||
|
// ignore
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case DETECT_ALL_COLLISION:
|
case DETECT_ALL_COLLISION:
|
||||||
{
|
{
|
||||||
m_oldControlFunc = m_controlFunc;
|
m_oldControlFunc = m_controlFunc;
|
||||||
m_controlFunc = NPC_CONTROL_COLLISION;
|
m_controlFunc = NPC_CONTROL_COLLISION;
|
||||||
|
|
||||||
processUserCollision( _thisThing );
|
processUserCollision( _thisThing );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case DETECT_ATTACK_COLLISION_GENERIC:
|
case DETECT_ATTACK_COLLISION_GENERIC:
|
||||||
{
|
{
|
||||||
processAttackCollision();
|
processAttackCollision();
|
||||||
processUserCollision( _thisThing );
|
processUserCollision( _thisThing );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
else if ( m_invulnerableTimer <= 0 )
|
|
||||||
{
|
|
||||||
// player is attacking, respond appropriately
|
|
||||||
|
|
||||||
if ( m_controlFunc != NPC_CONTROL_SHOT )
|
|
||||||
{
|
{
|
||||||
if(playerState==ATTACK_STATE__BUTT_BOUNCE)
|
// player is attacking, respond appropriately
|
||||||
|
|
||||||
|
if ( m_controlFunc != NPC_CONTROL_SHOT )
|
||||||
{
|
{
|
||||||
player->justButtBouncedABadGuy();
|
if(playerState==ATTACK_STATE__BUTT_BOUNCE)
|
||||||
|
{
|
||||||
|
player->justButtBouncedABadGuy();
|
||||||
|
}
|
||||||
|
m_controlFunc = NPC_CONTROL_MOVEMENT;
|
||||||
|
m_movementTimer = GameState::getOneSecondInFrames() * 2;
|
||||||
|
m_inRange = false;
|
||||||
|
m_fadeDown = true;
|
||||||
|
m_timerTimer = 0;
|
||||||
|
m_fireCount = 0;
|
||||||
|
|
||||||
|
drawAttackEffect();
|
||||||
}
|
}
|
||||||
m_controlFunc = NPC_CONTROL_SHOT;
|
|
||||||
m_oldState = m_state;
|
|
||||||
m_state = NPC_GENERIC_HIT_CHECK_HEALTH;
|
|
||||||
|
|
||||||
drawAttackEffect();
|
|
||||||
|
|
||||||
m_invulnerableTimer = 4 * GameState::getOneSecondInFrames();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -503,15 +640,16 @@ void CNpcFlyingDutchmanEnemy::collidedWith(CThing *_thisThing)
|
|||||||
|
|
||||||
u8 CNpcFlyingDutchmanEnemy::hasBeenAttacked()
|
u8 CNpcFlyingDutchmanEnemy::hasBeenAttacked()
|
||||||
{
|
{
|
||||||
if ( m_invulnerableTimer <= 0 )
|
if ( m_fadeVal == 128 )
|
||||||
{
|
{
|
||||||
if ( m_controlFunc != NPC_CONTROL_SHOT )
|
if ( m_controlFunc != NPC_CONTROL_SHOT )
|
||||||
{
|
{
|
||||||
m_invulnerableTimer = 4 * GameState::getOneSecondInFrames();
|
m_controlFunc = NPC_CONTROL_MOVEMENT;
|
||||||
|
m_movementTimer = GameState::getOneSecondInFrames() * 2;
|
||||||
m_controlFunc = NPC_CONTROL_SHOT;
|
m_inRange = false;
|
||||||
m_oldState = m_state;
|
m_fadeDown = true;
|
||||||
m_state = NPC_GENERIC_HIT_CHECK_HEALTH;
|
m_timerTimer = 0;
|
||||||
|
m_fireCount = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,15 +36,17 @@ protected:
|
|||||||
|
|
||||||
enum NPC_FLYING_DUTCHMAN_STATE
|
enum NPC_FLYING_DUTCHMAN_STATE
|
||||||
{
|
{
|
||||||
FLYING_DUTCHMAN_ATTACK_PLAYER_1 = 0,
|
//FLYING_DUTCHMAN_ATTACK_PLAYER_1 = 0,
|
||||||
FLYING_DUTCHMAN_ATTACK_PLAYER_2 = 1,
|
//FLYING_DUTCHMAN_ATTACK_PLAYER_2 = 1,
|
||||||
FLYING_DUTCHMAN_ATTACK_PLAYER_3,
|
//FLYING_DUTCHMAN_ATTACK_PLAYER_3,
|
||||||
|
FLYING_DUTCHMAN_GOTO_PLAYER = 0,
|
||||||
|
FLYING_DUTCHMAN_ATTACK_PLAYER = 1,
|
||||||
|
FLYING_DUTCHMAN_RETURN,
|
||||||
};
|
};
|
||||||
|
|
||||||
s32 m_minY, m_maxY;
|
s32 m_minY, m_maxY;
|
||||||
u8 m_inRange;
|
u8 m_inRange;
|
||||||
u8 m_fireCount;
|
u8 m_fireCount;
|
||||||
s32 m_invulnerableTimer;
|
|
||||||
u8 m_oldState;
|
u8 m_oldState;
|
||||||
s16 m_fadeVal;
|
s16 m_fadeVal;
|
||||||
u8 m_fadeDown;
|
u8 m_fadeDown;
|
||||||
|
Loading…
Reference in New Issue
Block a user