This commit is contained in:
parent
7d427ff926
commit
b2d3ef1445
9 changed files with 474 additions and 24 deletions
|
@ -56,6 +56,10 @@ enemy_src := 2denemy \
|
||||||
npcpath \
|
npcpath \
|
||||||
nsjfish \
|
nsjfish \
|
||||||
nclam \
|
nclam \
|
||||||
|
nscrab \
|
||||||
|
nnsfish \
|
||||||
|
ngpirate \
|
||||||
|
nshrkman \
|
||||||
enemy
|
enemy
|
||||||
|
|
||||||
fileio_src := fileio \
|
fileio_src := fileio \
|
||||||
|
|
|
@ -28,7 +28,7 @@ void CNpc::processCloseClamAttack( int _frames )
|
||||||
{
|
{
|
||||||
s32 velocity;
|
s32 velocity;
|
||||||
|
|
||||||
if ( m_extendOut )
|
if ( m_extendDir == EXTEND_UP )
|
||||||
{
|
{
|
||||||
m_movementTimer -= _frames;
|
m_movementTimer -= _frames;
|
||||||
|
|
||||||
|
@ -45,10 +45,10 @@ void CNpc::processCloseClamAttack( int _frames )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_extendOut = false;
|
m_extendDir = EXTEND_DOWN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if ( m_extendDir == EXTEND_DOWN )
|
||||||
{
|
{
|
||||||
// retract
|
// retract
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,7 @@ CNpc::NPC_DATA CNpc::m_data[NPC_UNIT_TYPE_MAX] =
|
||||||
NPC_CLOSE_NONE,
|
NPC_CLOSE_NONE,
|
||||||
NPC_TIMER_NONE,
|
NPC_TIMER_NONE,
|
||||||
false,
|
false,
|
||||||
3,
|
0,
|
||||||
128,
|
128,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ CNpc::NPC_DATA CNpc::m_data[NPC_UNIT_TYPE_MAX] =
|
||||||
NPC_MOVEMENT_MODIFIER_NONE,
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
NPC_CLOSE_CLAM_ATTACK,
|
NPC_CLOSE_CLAM_ATTACK,
|
||||||
NPC_TIMER_NONE,
|
NPC_TIMER_NONE,
|
||||||
3,
|
0,
|
||||||
128,
|
128,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -163,12 +163,203 @@ CNpc::NPC_DATA CNpc::m_data[NPC_UNIT_TYPE_MAX] =
|
||||||
128,
|
128,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // NPC_SEA_SNAKE_1
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_FIXED_PATH,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
3,
|
||||||
|
256,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_SEA_SNAKE_2
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_FIXED_PATH,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
3,
|
||||||
|
256,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_PUFFA_FISH
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_FIXED_PATH,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
2,
|
||||||
|
128,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_ANGLER_FISH
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_FIXED_PATH,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
1,
|
||||||
|
128,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_HERMIT_CRAB
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_FIXED_PATH,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
2,
|
||||||
|
128,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_MINE
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_STATIC,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
0,
|
||||||
|
128,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_BOOGER_MONSTER
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_STATIC,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
0,
|
||||||
|
128,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_SPIDER_CRAB
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_SPIDER_CRAB_USER_CLOSE,
|
||||||
|
NPC_MOVEMENT_FIXED_PATH,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_SPIDER_CRAB_ATTACK,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
3,
|
||||||
|
2048,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_EYEBALL
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_STATIC,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
0,
|
||||||
|
128,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_BABY_OCTOPUS
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_FIXED_PATH,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
2,
|
||||||
|
128,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_ZOMBIE_FISH_FOLK
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_FIXED_PATH,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
2,
|
||||||
|
128,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_NINJA_STARFISH
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NINJA_STARFISH_USER_CLOSE,
|
||||||
|
NPC_MOVEMENT_STATIC,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NINJA_STARFISH_ATTACK,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
3,
|
||||||
|
64,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_GHOST
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_FIXED_PATH,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
2,
|
||||||
|
128,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_GHOST_PIRATE
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_GHOST_PIRATE_USER_CLOSE,
|
||||||
|
NPC_MOVEMENT_STATIC,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_GHOST_PIRATE_ATTACK,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
0,
|
||||||
|
128,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_FLAMING_SKULL
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_NONE,
|
||||||
|
NPC_MOVEMENT_STATIC,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_NONE,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
0,
|
||||||
|
128,
|
||||||
|
},
|
||||||
|
|
||||||
|
{ // NPC_SHARK_MAN
|
||||||
|
NPC_INIT_DEFAULT,
|
||||||
|
NPC_SENSOR_SHARK_MAN_USER_VISIBLE,
|
||||||
|
NPC_MOVEMENT_FIXED_PATH,
|
||||||
|
NPC_MOVEMENT_MODIFIER_NONE,
|
||||||
|
NPC_CLOSE_SHARK_MAN_ATTACK,
|
||||||
|
NPC_TIMER_NONE,
|
||||||
|
false,
|
||||||
|
3,
|
||||||
|
2048,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void CNpc::init()
|
void CNpc::init()
|
||||||
{
|
{
|
||||||
m_type = NPC_FISH_FOLK;
|
m_type = NPC_SHARK_MAN;
|
||||||
|
|
||||||
m_heading = 3072;
|
m_heading = 3072;
|
||||||
m_movementTimer = 0;
|
m_movementTimer = 0;
|
||||||
|
@ -201,7 +392,7 @@ void CNpc::init()
|
||||||
|
|
||||||
m_npcPath.addWaypoint( newPos );
|
m_npcPath.addWaypoint( newPos );
|
||||||
|
|
||||||
newPos.vx = 500;
|
/*newPos.vx = 500;
|
||||||
newPos.vy = 100;
|
newPos.vy = 100;
|
||||||
|
|
||||||
m_npcPath.addWaypoint( newPos );
|
m_npcPath.addWaypoint( newPos );
|
||||||
|
@ -209,7 +400,7 @@ void CNpc::init()
|
||||||
newPos.vx = 100;
|
newPos.vx = 100;
|
||||||
newPos.vy = 100;
|
newPos.vy = 100;
|
||||||
|
|
||||||
m_npcPath.addWaypoint( newPos );
|
m_npcPath.addWaypoint( newPos );*/
|
||||||
|
|
||||||
m_npcPath.setPathType( REPEATING_PATH );
|
m_npcPath.setPathType( REPEATING_PATH );
|
||||||
|
|
||||||
|
@ -277,13 +468,14 @@ bool CNpc::processSensor()
|
||||||
|
|
||||||
DVECTOR playerPos = player->getPos();
|
DVECTOR playerPos = player->getPos();
|
||||||
|
|
||||||
|
s32 xDist, yDist;
|
||||||
s32 xDistSqr, yDistSqr;
|
s32 xDistSqr, yDistSqr;
|
||||||
|
|
||||||
xDistSqr = playerPos.vx - this->Pos.vx;
|
xDist = playerPos.vx - this->Pos.vx;
|
||||||
xDistSqr *= xDistSqr;
|
xDistSqr = xDist * xDist;
|
||||||
|
|
||||||
yDistSqr = playerPos.vy - this->Pos.vy;
|
yDist = playerPos.vy - this->Pos.vy;
|
||||||
yDistSqr *= yDistSqr;
|
yDistSqr = yDist * yDist;
|
||||||
|
|
||||||
switch( m_sensorFunc )
|
switch( m_sensorFunc )
|
||||||
{
|
{
|
||||||
|
@ -291,8 +483,8 @@ bool CNpc::processSensor()
|
||||||
{
|
{
|
||||||
if ( xDistSqr + yDistSqr < 10000 )
|
if ( xDistSqr + yDistSqr < 10000 )
|
||||||
{
|
{
|
||||||
this->m_controlFunc = NPC_CONTROL_CLOSE;
|
m_controlFunc = NPC_CONTROL_CLOSE;
|
||||||
this->m_evadeClockwise = ( getRnd() % 2 ) - 1;
|
m_evadeClockwise = ( getRnd() % 2 ) - 1;
|
||||||
|
|
||||||
return( true );
|
return( true );
|
||||||
}
|
}
|
||||||
|
@ -306,11 +498,11 @@ bool CNpc::processSensor()
|
||||||
{
|
{
|
||||||
if ( xDistSqr + yDistSqr < 10000 )
|
if ( xDistSqr + yDistSqr < 10000 )
|
||||||
{
|
{
|
||||||
this->m_controlFunc = NPC_CONTROL_CLOSE;
|
m_controlFunc = NPC_CONTROL_CLOSE;
|
||||||
this->m_extendOut = true;
|
m_extendDir = EXTEND_UP;
|
||||||
this->m_extension = 0;
|
m_extension = 0;
|
||||||
this->m_movementTimer = GameState::getOneSecondInFrames() >> 3;
|
m_movementTimer = GameState::getOneSecondInFrames() >> 3;
|
||||||
this->m_velocity = ( getRnd() % 6 ) + 1;
|
m_velocity = ( getRnd() % 6 ) + 1;
|
||||||
|
|
||||||
return( true );
|
return( true );
|
||||||
}
|
}
|
||||||
|
@ -320,6 +512,167 @@ bool CNpc::processSensor()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case NPC_SENSOR_SPIDER_CRAB_USER_CLOSE:
|
||||||
|
{
|
||||||
|
if ( xDistSqr + yDistSqr < 10000 )
|
||||||
|
{
|
||||||
|
m_controlFunc = NPC_CONTROL_CLOSE;
|
||||||
|
m_extension = 0;
|
||||||
|
m_velocity = 5;
|
||||||
|
m_extensionBase = Pos;
|
||||||
|
|
||||||
|
if ( playerPos.vx < Pos.vx )
|
||||||
|
{
|
||||||
|
m_extendDir = EXTEND_LEFT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_extendDir = EXTEND_RIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case NPC_SENSOR_NINJA_STARFISH_USER_CLOSE:
|
||||||
|
{
|
||||||
|
if ( xDistSqr + yDistSqr < 10000 )
|
||||||
|
{
|
||||||
|
m_controlFunc = NPC_CONTROL_CLOSE;
|
||||||
|
m_velocity = m_data[m_type].speed;
|
||||||
|
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case NPC_SENSOR_GHOST_PIRATE_USER_CLOSE:
|
||||||
|
{
|
||||||
|
if ( xDistSqr + yDistSqr < 10000 )
|
||||||
|
{
|
||||||
|
m_controlFunc = NPC_CONTROL_CLOSE;
|
||||||
|
m_extendDir = EXTEND_UP;
|
||||||
|
m_extension = 0;
|
||||||
|
m_movementTimer = GameState::getOneSecondInFrames() >> 1;
|
||||||
|
m_velocity = 4;
|
||||||
|
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case NPC_SENSOR_SHARK_MAN_USER_VISIBLE:
|
||||||
|
{
|
||||||
|
s32 xDistWaypoint, yDistWaypoint;
|
||||||
|
|
||||||
|
if ( abs( xDist ) < 500 )
|
||||||
|
{
|
||||||
|
// within range
|
||||||
|
|
||||||
|
// make sure user is closer to shark man than next waypoint
|
||||||
|
|
||||||
|
s32 xDistWaypoint, yDistWaypoint;
|
||||||
|
|
||||||
|
m_npcPath.getDistToNextWaypoint( Pos, &xDistWaypoint, &yDistWaypoint );
|
||||||
|
|
||||||
|
if ( abs( xDist ) < abs( xDistWaypoint ) )
|
||||||
|
{
|
||||||
|
s16 headingToPlayer = ratan2( yDist, xDist );
|
||||||
|
|
||||||
|
s16 decDir, incDir, moveDist;
|
||||||
|
|
||||||
|
s32 headingToWaypoint = ratan2( yDistWaypoint, xDistWaypoint );
|
||||||
|
|
||||||
|
// check waypoint is in the same direction as the user
|
||||||
|
|
||||||
|
decDir = headingToPlayer - headingToWaypoint;
|
||||||
|
|
||||||
|
if ( decDir < 0 )
|
||||||
|
{
|
||||||
|
decDir += ONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
incDir = headingToWaypoint - headingToPlayer;
|
||||||
|
|
||||||
|
if ( incDir < 0 )
|
||||||
|
{
|
||||||
|
incDir += ONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( decDir < incDir )
|
||||||
|
{
|
||||||
|
moveDist = decDir;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
moveDist = incDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( moveDist > 512 )
|
||||||
|
{
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// check if shark man is facing user
|
||||||
|
|
||||||
|
decDir = m_heading - headingToPlayer;
|
||||||
|
|
||||||
|
if ( decDir < 0 )
|
||||||
|
{
|
||||||
|
decDir += ONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
incDir = headingToPlayer - m_heading;
|
||||||
|
|
||||||
|
if ( incDir < 0 )
|
||||||
|
{
|
||||||
|
incDir += ONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( decDir < incDir )
|
||||||
|
{
|
||||||
|
moveDist = decDir;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
moveDist = incDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( moveDist < 1024 )
|
||||||
|
{
|
||||||
|
m_controlFunc = NPC_CONTROL_CLOSE;
|
||||||
|
m_velocity = 8;
|
||||||
|
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return( false );
|
return( false );
|
||||||
}
|
}
|
||||||
|
@ -485,6 +838,26 @@ void CNpc::processClose(int _frames)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case NPC_CLOSE_SPIDER_CRAB_ATTACK:
|
||||||
|
processCloseSpiderCrabAttack( _frames );
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NPC_CLOSE_NINJA_STARFISH_ATTACK:
|
||||||
|
processCloseNinjaStarfishAttack( _frames );
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NPC_CLOSE_GHOST_PIRATE_ATTACK:
|
||||||
|
processCloseGhostPirateAttack( _frames );
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NPC_CLOSE_SHARK_MAN_ATTACK:
|
||||||
|
processCloseSharkManAttack( _frames );
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,22 @@ protected:
|
||||||
NPC_SQUID_DART,
|
NPC_SQUID_DART,
|
||||||
NPC_FISH_FOLK,
|
NPC_FISH_FOLK,
|
||||||
NPC_PRICKLY_BUG,
|
NPC_PRICKLY_BUG,
|
||||||
|
NPC_SEA_SNAKE_1,
|
||||||
|
NPC_SEA_SNAKE_2,
|
||||||
|
NPC_PUFFA_FISH,
|
||||||
|
NPC_ANGLER_FISH,
|
||||||
|
NPC_HERMIT_CRAB,
|
||||||
|
NPC_MINE,
|
||||||
|
NPC_BOOGER_MONSTER,
|
||||||
|
NPC_SPIDER_CRAB,
|
||||||
|
NPC_EYEBALL,
|
||||||
|
NPC_BABY_OCTOPUS,
|
||||||
|
NPC_ZOMBIE_FISH_FOLK,
|
||||||
|
NPC_NINJA_STARFISH,
|
||||||
|
NPC_GHOST,
|
||||||
|
NPC_GHOST_PIRATE,
|
||||||
|
NPC_FLAMING_SKULL,
|
||||||
|
NPC_SHARK_MAN,
|
||||||
NPC_UNIT_TYPE_MAX,
|
NPC_UNIT_TYPE_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -72,6 +88,10 @@ protected:
|
||||||
NPC_SENSOR_NONE = 0,
|
NPC_SENSOR_NONE = 0,
|
||||||
NPC_SENSOR_JELLYFISH_USER_CLOSE = 1,
|
NPC_SENSOR_JELLYFISH_USER_CLOSE = 1,
|
||||||
NPC_SENSOR_CLAM_USER_CLOSE,
|
NPC_SENSOR_CLAM_USER_CLOSE,
|
||||||
|
NPC_SENSOR_SPIDER_CRAB_USER_CLOSE,
|
||||||
|
NPC_SENSOR_NINJA_STARFISH_USER_CLOSE,
|
||||||
|
NPC_SENSOR_GHOST_PIRATE_USER_CLOSE,
|
||||||
|
NPC_SENSOR_SHARK_MAN_USER_VISIBLE,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum NPC_CLOSE_FUNC
|
enum NPC_CLOSE_FUNC
|
||||||
|
@ -79,6 +99,10 @@ protected:
|
||||||
NPC_CLOSE_NONE = 0,
|
NPC_CLOSE_NONE = 0,
|
||||||
NPC_CLOSE_JELLYFISH_EVADE = 1,
|
NPC_CLOSE_JELLYFISH_EVADE = 1,
|
||||||
NPC_CLOSE_CLAM_ATTACK,
|
NPC_CLOSE_CLAM_ATTACK,
|
||||||
|
NPC_CLOSE_SPIDER_CRAB_ATTACK,
|
||||||
|
NPC_CLOSE_NINJA_STARFISH_ATTACK,
|
||||||
|
NPC_CLOSE_GHOST_PIRATE_ATTACK,
|
||||||
|
NPC_CLOSE_SHARK_MAN_ATTACK,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum NPC_MOVEMENT_FUNC
|
enum NPC_MOVEMENT_FUNC
|
||||||
|
@ -106,6 +130,10 @@ protected:
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
NPC_JELLYFISH_RESISTANCE = 64,
|
NPC_JELLYFISH_RESISTANCE = 64,
|
||||||
|
EXTEND_UP = true,
|
||||||
|
EXTEND_DOWN = false,
|
||||||
|
EXTEND_RIGHT = true,
|
||||||
|
EXTEND_LEFT = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -143,6 +171,22 @@ protected:
|
||||||
|
|
||||||
void processCloseClamAttack( int _frames );
|
void processCloseClamAttack( int _frames );
|
||||||
|
|
||||||
|
// spider crab functions
|
||||||
|
|
||||||
|
void processCloseSpiderCrabAttack( int _frames );
|
||||||
|
|
||||||
|
// ninja starfish functions
|
||||||
|
|
||||||
|
void processCloseNinjaStarfishAttack( int _frames );
|
||||||
|
|
||||||
|
// ghost pirate functions
|
||||||
|
|
||||||
|
void processCloseGhostPirateAttack( int _frames );
|
||||||
|
|
||||||
|
// shark man functions
|
||||||
|
|
||||||
|
void processCloseSharkManAttack( int _frames );
|
||||||
|
|
||||||
// data
|
// data
|
||||||
|
|
||||||
static NPC_DATA m_data[NPC_UNIT_TYPE_MAX];
|
static NPC_DATA m_data[NPC_UNIT_TYPE_MAX];
|
||||||
|
@ -160,7 +204,8 @@ protected:
|
||||||
bool m_evadeClockwise;
|
bool m_evadeClockwise;
|
||||||
s32 m_timerTimer;
|
s32 m_timerTimer;
|
||||||
s32 m_extension;
|
s32 m_extension;
|
||||||
bool m_extendOut;
|
bool m_extendDir;
|
||||||
|
DVECTOR m_extensionBase;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,10 @@ bool CNpcWaypoint::isPointNear( DVECTOR testPos, s32 *xDist, s32 *yDist )
|
||||||
{
|
{
|
||||||
s32 xDistSqr, yDistSqr;
|
s32 xDistSqr, yDistSqr;
|
||||||
|
|
||||||
*xDist = testPos.vx - this->pos.vx;
|
*xDist = this->pos.vx - testPos.vx;
|
||||||
xDistSqr = (*xDist) * (*xDist);
|
xDistSqr = (*xDist) * (*xDist);
|
||||||
|
|
||||||
*yDist = testPos.vy - this->pos.vy;
|
*yDist = this->pos.vy - testPos.vy;
|
||||||
yDistSqr = (*yDist) * (*yDist);
|
yDistSqr = (*yDist) * (*yDist);
|
||||||
|
|
||||||
if ( xDistSqr + yDistSqr < 100 )
|
if ( xDistSqr + yDistSqr < 100 )
|
||||||
|
@ -117,6 +117,11 @@ bool CNpcPath::incPath()
|
||||||
return( false );
|
return( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CNpcPath::getDistToNextWaypoint( DVECTOR currentPos, s32 *distX, s32 *distY )
|
||||||
|
{
|
||||||
|
return( waypoint[currentWaypoint].isPointNear( currentPos, distX, distY ) );
|
||||||
|
}
|
||||||
|
|
||||||
s32 CNpcPath::think( DVECTOR currentPos, bool *pathComplete )
|
s32 CNpcPath::think( DVECTOR currentPos, bool *pathComplete )
|
||||||
{
|
{
|
||||||
s32 xDist, yDist;
|
s32 xDist, yDist;
|
||||||
|
@ -128,7 +133,7 @@ s32 CNpcPath::think( DVECTOR currentPos, bool *pathComplete )
|
||||||
*pathComplete = incPath();
|
*pathComplete = incPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 headingToTarget = ratan2( -yDist, -xDist );
|
s32 headingToTarget = ratan2( yDist, xDist );
|
||||||
|
|
||||||
return( headingToTarget );
|
return( headingToTarget );
|
||||||
}
|
}
|
|
@ -51,6 +51,7 @@ public:
|
||||||
void setPathType( NPC_PATH_TYPE newPathType );
|
void setPathType( NPC_PATH_TYPE newPathType );
|
||||||
bool incPath();
|
bool incPath();
|
||||||
s32 think( DVECTOR currentPos, bool *pathComplete );
|
s32 think( DVECTOR currentPos, bool *pathComplete );
|
||||||
|
bool getDistToNextWaypoint( DVECTOR currentPos, s32 *distX, s32 *distY );
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -33,10 +33,12 @@ void CNpc::processCloseSpiderCrabAttack( int _frames )
|
||||||
if ( m_extendDir == EXTEND_RIGHT )
|
if ( m_extendDir == EXTEND_RIGHT )
|
||||||
{
|
{
|
||||||
Pos.vx += velocity;
|
Pos.vx += velocity;
|
||||||
|
m_heading = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Pos.vx -= velocity;
|
Pos.vx -= velocity;
|
||||||
|
m_heading = 2048;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 horizontalExtension = abs( Pos.vx - m_extensionBase.vx );
|
s32 horizontalExtension = abs( Pos.vx - m_extensionBase.vx );
|
||||||
|
|
|
@ -61,7 +61,11 @@ void CNpc::processCloseSharkManAttack( int _frames )
|
||||||
moveDist = incDir;
|
moveDist = incDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( abs( moveDist ) < 1024 )
|
s32 xDistWaypoint, yDistWaypoint;
|
||||||
|
|
||||||
|
m_npcPath.getDistToNextWaypoint( Pos, &xDistWaypoint, &yDistWaypoint );
|
||||||
|
|
||||||
|
if ( abs( moveDist ) < 1024 && abs( xDistWaypoint ) >= abs( xDist ) )
|
||||||
{
|
{
|
||||||
// continue charge
|
// continue charge
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,14 @@ SOURCE=..\..\..\source\enemy\nclam.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\..\source\enemy\ngpirate.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\..\source\enemy\nnsfish.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\..\source\enemy\npc.cpp
|
SOURCE=..\..\..\source\enemy\npc.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
@ -145,6 +153,14 @@ SOURCE=..\..\..\source\enemy\npcpath.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\..\source\enemy\nscrab.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\..\source\enemy\nshrkman.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\..\source\enemy\nsjfish.cpp
|
SOURCE=..\..\..\source\enemy\nsjfish.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# End Group
|
# End Group
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue