This commit is contained in:
Charles 2001-03-12 19:14:38 +00:00
parent 15eb72b545
commit a699fccb14
3 changed files with 140 additions and 61 deletions

View file

@ -23,6 +23,9 @@
#include "player\player.h" #include "player\player.h"
#endif #endif
#define MJ_CYCLE_WIDTH 400
#define MJ_HALF_CYCLE_WIDTH ( MJ_CYCLE_WIDTH >> 1 )
void CNpcEnemy::processMotherJellyfishMovement( int _frames ) void CNpcEnemy::processMotherJellyfishMovement( int _frames )
{ {
@ -31,9 +34,11 @@ void CNpcEnemy::processMotherJellyfishMovement( int _frames )
switch( m_state ) switch( m_state )
{ {
case MOTHER_JELLYFISH_RETURN_TO_START: case MOTHER_JELLYFISH_RETURN_TO_START_1:
case MOTHER_JELLYFISH_RETURN_TO_START_2:
case MOTHER_JELLYFISH_RETURN_TO_START_3:
{ {
xDist = m_base.vx - this->Pos.vx; xDist = m_base.vx - this->Pos.vx - MJ_HALF_CYCLE_WIDTH;
xDistSqr = xDist * xDist; xDistSqr = xDist * xDist;
yDist = m_base.vy - this->Pos.vy; yDist = m_base.vy - this->Pos.vy;
yDistSqr = yDist * yDist; yDistSqr = yDist * yDist;
@ -46,56 +51,70 @@ void CNpcEnemy::processMotherJellyfishMovement( int _frames )
{ {
// have arrived at base position // have arrived at base position
m_movementTimer = GameState::getOneSecondInFrames() * 5; m_movementTimer = GameState::getOneSecondInFrames() * 10;
m_state = MOTHER_JELLYFISH_CYCLE; m_state++;
m_extension = 0; m_extension = -MJ_HALF_CYCLE_WIDTH;
m_extendDir = EXTEND_RIGHT; m_extendDir = EXTEND_RIGHT;
} }
break; break;
} }
case MOTHER_JELLYFISH_CYCLE: case MOTHER_JELLYFISH_CYCLE_1:
case MOTHER_JELLYFISH_CYCLE_2:
case MOTHER_JELLYFISH_CYCLE_3:
{ {
if ( m_movementTimer > 0 ) m_movementTimer -= _frames;
s32 xExtension;
if ( m_extendDir == EXTEND_RIGHT )
{ {
m_movementTimer -= _frames; if ( m_extension < MJ_HALF_CYCLE_WIDTH )
if ( m_extendDir == EXTEND_RIGHT )
{ {
if ( m_extension < 200 ) m_extension += 3 * _frames;
{
m_extension += 3 * _frames;
Pos.vx = m_base.vx + m_extension; xExtension = ( MJ_HALF_CYCLE_WIDTH * rsin( ( m_extension << 10 ) / MJ_HALF_CYCLE_WIDTH ) ) >> 12;
m_heading = 0; Pos.vx = m_base.vx + xExtension;
} Pos.vy = m_base.vy - ( ( 50 * rsin( ( xExtension << 12 ) / MJ_CYCLE_WIDTH ) ) >> 12 );
else
{ m_heading = 0;
m_extendDir = EXTEND_LEFT;
}
} }
else else
{ {
if ( m_extension > -200 ) m_extendDir = EXTEND_LEFT;
{
m_extension -= 3 * _frames;
Pos.vx = m_base.vx + m_extension; if ( m_movementTimer < 0 )
m_heading = 2048;
}
else
{ {
m_extendDir = EXTEND_RIGHT; m_controlFunc = NPC_CONTROL_CLOSE;
m_state++;
} }
} }
} }
else else
{ {
m_controlFunc = NPC_CONTROL_CLOSE; if ( m_extension > -MJ_HALF_CYCLE_WIDTH )
m_state = MOTHER_JELLYFISH_ATTACK_PLAYER; {
m_extension -= 3 * _frames;
xExtension = ( MJ_HALF_CYCLE_WIDTH * rsin( ( m_extension << 10 ) / MJ_HALF_CYCLE_WIDTH ) ) >> 12;
Pos.vx = m_base.vx + xExtension;
Pos.vy = m_base.vy + ( ( 50 * rsin( ( xExtension << 12 ) / MJ_CYCLE_WIDTH ) ) >> 12 );
m_heading = 2048;
}
else
{
m_extendDir = EXTEND_RIGHT;
if ( m_movementTimer < 0 )
{
m_controlFunc = NPC_CONTROL_CLOSE;
m_state++;
}
}
} }
break; break;
@ -108,31 +127,85 @@ void CNpcEnemy::processMotherJellyfishMovement( int _frames )
void CNpcEnemy::processCloseMotherJellyfishAttack( int _frames ) void CNpcEnemy::processCloseMotherJellyfishAttack( int _frames )
{ {
// seek position above user switch( m_state )
CPlayer *player = GameScene.getPlayer();
DVECTOR playerPos = player->getPos();
DVECTOR seekPos;
s32 xDist, yDist;
s32 xDistSqr, yDistSqr;
seekPos = playerPos;
seekPos.vy -= 100;
xDist = seekPos.vx - this->Pos.vx;
xDistSqr = xDist * xDist;
yDist = seekPos.vy - this->Pos.vy;
yDistSqr = yDist * yDist;
if ( xDistSqr + yDistSqr > 400 )
{ {
processGenericGotoTarget( _frames, xDist, yDist, m_data[m_type].speed ); case MOTHER_JELLYFISH_ATTACK_PLAYER_SHOCK:
} {
else // seek position above user
{
// fire at user
m_controlFunc = NPC_CONTROL_MOVEMENT; CPlayer *player = GameScene.getPlayer();
m_state = MOTHER_JELLYFISH_RETURN_TO_START; DVECTOR playerPos = player->getPos();
DVECTOR seekPos;
s32 xDist, yDist;
s32 xDistSqr, yDistSqr;
seekPos = playerPos;
seekPos.vy -= 100;
xDist = seekPos.vx - this->Pos.vx;
xDistSqr = xDist * xDist;
yDist = seekPos.vy - this->Pos.vy;
yDistSqr = yDist * yDist;
if ( xDistSqr + yDistSqr > 400 )
{
processGenericGotoTarget( _frames, xDist, yDist, m_data[m_type].speed );
}
else
{
// fire at user
m_controlFunc = NPC_CONTROL_MOVEMENT;
m_state = MOTHER_JELLYFISH_RETURN_TO_START_1;
}
break;
}
default:
{
s32 xExtension;
if ( m_extendDir == EXTEND_RIGHT )
{
if ( m_extension < MJ_HALF_CYCLE_WIDTH )
{
m_extension += 3 * _frames;
xExtension = ( MJ_HALF_CYCLE_WIDTH * rsin( ( m_extension << 10 ) / MJ_HALF_CYCLE_WIDTH ) ) >> 12;
Pos.vx = m_base.vx + xExtension;
Pos.vy = m_base.vy - ( ( 50 * rcos( ( xExtension << 11 ) / MJ_CYCLE_WIDTH ) ) >> 12 );
m_heading = 0;
}
else
{
m_controlFunc = NPC_CONTROL_MOVEMENT;
m_state++;
}
}
else
{
if ( m_extension > -MJ_HALF_CYCLE_WIDTH )
{
m_extension -= 3 * _frames;
xExtension = ( MJ_HALF_CYCLE_WIDTH * rsin( ( m_extension << 10 ) / MJ_HALF_CYCLE_WIDTH ) ) >> 12;
Pos.vx = m_base.vx + xExtension;
Pos.vy = m_base.vy + ( ( 50 * rcos( ( xExtension << 11 ) / MJ_CYCLE_WIDTH ) ) >> 12 );
m_heading = 2048;
}
else
{
m_controlFunc = NPC_CONTROL_MOVEMENT;
m_state++;
}
}
break;
}
} }
} }

View file

@ -209,7 +209,7 @@ void CNpcEnemy::init()
{ {
CEnemyThing::init(); CEnemyThing::init();
m_type = NPC_CLAM_STATIC; m_type = NPC_MOTHER_JELLYFISH;
// sActorHdr *Hdr = m_skel.Load( m_data[m_type].skelType ); // sActorHdr *Hdr = m_skel.Load( m_data[m_type].skelType );
// m_skel.Init( Hdr ); // m_skel.Init( Hdr );
@ -234,7 +234,7 @@ void CNpcEnemy::init()
m_extension = EXTEND_RIGHT; m_extension = EXTEND_RIGHT;
Pos.vx = 100; Pos.vx = 400;
Pos.vy = 100; Pos.vy = 100;
m_base = Pos; m_base = Pos;
@ -297,7 +297,7 @@ void CNpcEnemy::init()
case NPC_INIT_MOTHER_JELLYFISH: case NPC_INIT_MOTHER_JELLYFISH:
{ {
m_state = MOTHER_JELLYFISH_RETURN_TO_START; m_state = MOTHER_JELLYFISH_RETURN_TO_START_1;
break; break;
} }

View file

@ -272,9 +272,15 @@ protected:
enum NPC_MOTHER_JELLYFISH_STATE enum NPC_MOTHER_JELLYFISH_STATE
{ {
MOTHER_JELLYFISH_RETURN_TO_START = 0, MOTHER_JELLYFISH_RETURN_TO_START_1 = 0,
MOTHER_JELLYFISH_CYCLE = 1, MOTHER_JELLYFISH_CYCLE_1 = 1,
MOTHER_JELLYFISH_ATTACK_PLAYER, MOTHER_JELLYFISH_ATTACK_PLAYER_SPAWN_1,
MOTHER_JELLYFISH_RETURN_TO_START_2,
MOTHER_JELLYFISH_CYCLE_2,
MOTHER_JELLYFISH_ATTACK_PLAYER_SPAWN_2,
MOTHER_JELLYFISH_RETURN_TO_START_3,
MOTHER_JELLYFISH_CYCLE_3,
MOTHER_JELLYFISH_ATTACK_PLAYER_SHOCK,
}; };
enum NPC_SUB_SHARK_STATE enum NPC_SUB_SHARK_STATE