This commit is contained in:
Charles 2001-05-10 21:30:17 +00:00
parent 47d5bb7fc7
commit 58756ef755
11 changed files with 287 additions and 33 deletions

View File

@ -82,7 +82,8 @@ enemy_src := npc \
npbug \
nprojjf \
nmjback \
nsjback
nsjback \
nsj2back
friend_src := friend \
fdata \

View File

@ -252,8 +252,8 @@ void CNpcAnemone2Enemy::postInit()
// move appropriate to scaling (anemone origin is 90 degrees off, hence:)
xDiff = ( m_scaleY * 40 ) >> 12;
yDiff = ( m_scaleX * 40 ) >> 12;
xDiff = ( m_scaleY * SPIKE_RADIUS ) >> 12;
yDiff = ( m_scaleX * SPIKE_RADIUS ) >> 12;
offset.vx = ( xDiff * rcos( relativeHeading ) ) >> 12;
offset.vy = ( yDiff * rsin( relativeHeading ) ) >> 12;
@ -280,12 +280,123 @@ void CNpcAnemone2Enemy::postInit()
void CNpcAnemone2Enemy::shutdown()
{
deleteAllChild();
CNpcEnemy::shutdown();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CNpcAnemone2Enemy::processShot( int _frames )
{
switch( m_data[m_type].shotFunc )
{
case NPC_SHOT_NONE:
{
// do nothing
break;
}
case NPC_SHOT_GENERIC:
{
switch ( m_state )
{
case NPC_GENERIC_HIT_CHECK_HEALTH:
{
if ( CLevel::getCurrentChapter() == 1 && CLevel::getCurrentChapterLevel() == 1 )
{
m_state = NPC_GENERIC_HIT_DEATH_START;
}
else
{
m_health -= 5;
if ( m_health < 0 )
{
m_state = NPC_GENERIC_HIT_DEATH_START;
}
else
{
m_state = NPC_GENERIC_HIT_RECOIL;
m_animPlaying = true;
m_animNo = m_data[m_type].recoilAnim;
m_frame = 0;
}
}
break;
}
case NPC_GENERIC_HIT_RECOIL:
{
if ( !m_animPlaying )
{
m_state = 0;
m_controlFunc = NPC_CONTROL_MOVEMENT;
}
break;
}
case NPC_GENERIC_HIT_DEATH_START:
{
m_animPlaying = true;
m_animNo = m_data[m_type].dieAnim;
m_frame = 0;
m_state = NPC_GENERIC_HIT_DEATH_END;
deleteAllChild();
m_isDying = true;
m_speed = -5;
if (m_data[m_type].skelType)
{
m_actorGfx->SetOtPos( 0 );
}
break;
}
case NPC_GENERIC_HIT_DEATH_END:
{
m_drawRotation += 64 * _frames;
m_drawRotation &= 4095;
Pos.vy += m_speed * _frames;
if ( m_speed < 5 )
{
m_speed++;
}
DVECTOR offset = CLevel::getCameraPos();
if ( Pos.vy - offset.vy > VidGetScrH() )
{
if ( m_data[m_type].respawning )
{
m_isActive = false;
m_timerFunc = NPC_TIMER_RESPAWN;
m_timerTimer = 4 * GameState::getOneSecondInFrames();
}
else
{
setToShutdown();
}
}
break;
}
}
break;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CNpcAnemone2Enemy::processClose( int _frames )
{
int fireLoop;
@ -354,8 +465,8 @@ void CNpcAnemone2Enemy::processClose( int _frames )
// move appropriate to scaling (anemone origin is 90 degrees off, hence:)
xDiff = ( m_scaleY * 40 ) >> 12;
yDiff = ( m_scaleX * 40 ) >> 12;
xDiff = ( m_scaleY * SPIKE_RADIUS ) >> 12;
yDiff = ( m_scaleX * SPIKE_RADIUS ) >> 12;
offset.vx = ( xDiff * rcos( relativeHeading ) ) >> 12;
offset.vy = ( yDiff * rsin( relativeHeading ) ) >> 12;
@ -426,8 +537,8 @@ void CNpcAnemone2Enemy::processMovementModifier( int _frames, s32 distX, s32 dis
// move appropriate to scaling (anemone origin is 90 degrees off, hence:)
xDiff = ( m_scaleY * 40 ) >> 12;
yDiff = ( m_scaleX * 40 ) >> 12;
xDiff = ( m_scaleY * SPIKE_RADIUS ) >> 12;
yDiff = ( m_scaleX * SPIKE_RADIUS ) >> 12;
offset.vx = ( xDiff * rcos( relativeHeading ) ) >> 12;
offset.vy = ( yDiff * rsin( relativeHeading ) ) >> 12;

View File

@ -39,11 +39,17 @@ public:
virtual void postInit();
virtual void shutdown();
virtual void render();
virtual void processShot( int _frames );
protected:
virtual void processClose( int _frames );
virtual void processMovementModifier( int _frames, s32 distX, s32 distY, s32 dist, s16 headingChange );
u16 m_scaleX, m_scaleY;
enum
{
SPIKE_RADIUS = 20,
};
};
class CNpcAnemone3Enemy : public CNpcAnemoneEnemy

View File

@ -83,6 +83,7 @@ public:
NPC_PROJECTILE_JELLYFISH,
NPC_MOTHER_JELLYFISH_BACKGROUND,
NPC_SMALL_JELLYFISH_BACKGROUND,
NPC_SMALL_JELLYFISH_2_BACKGROUND,
NPC_UNIT_TYPE_MAX,
};

View File

@ -1056,6 +1056,29 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false,
false,
},
{ // NPC_SMALL_JELLYFISH_2_BACKGROUND
0,//ACTORS_JELLYFISH1_SBK,
FRM_JELLYFISH1_SWIM1,
NPC_SENSOR_USER_CLOSE,
NPC_MOVEMENT_FIXED_PATH,
NPC_CLOSE_NONE,
NPC_TIMER_NONE,
false,
2,
128,
DETECT_ALL_COLLISION,
DAMAGE__SHOCK_ENEMY,
16,
FRM_JELLYFISH1_SWIM1,
NPC_SHOT_GENERIC,
0,
FRM_JELLYFISH1_SWIM1,
true,
false,
false,
false,
},
};
CNpcEnemy::NPC_UNIT_TYPE CNpcEnemy::mapEditConvertTable[NPC_UNIT_TYPE_MAX] =

View File

@ -195,6 +195,16 @@ void CNpcSmallJellyfishBackgroundEnemy::processUserCollision( CThing *thisThing
if ( !otherDelta.vx && !otherDelta.vy )
{
if ( !xDist )
{
xDist = 1;
}
if ( !yDist )
{
yDist = 1;
}
otherDelta.vx = ( 1 * xDist ) / abs( xDist );
otherDelta.vy = ( 1 * yDist ) / abs( yDist );
}

View File

@ -23,6 +23,11 @@
#include "utils\utils.h"
#endif
#ifndef __VID_HEADER_
#include "system\vid.h"
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CNpcFallingHazard::init()
@ -32,6 +37,7 @@ void CNpcFallingHazard::init()
m_movementTimer = 2 * GameState::getOneSecondInFrames();
m_respawnRate = 4;
m_bounceFinish = false;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -41,41 +47,73 @@ void CNpcFallingHazard::processMovement( int _frames )
s8 groundHeight;
s8 yMovement;
if ( m_movementTimer > 0 )
if ( m_bounceFinish )
{
m_movementTimer -= _frames;
if ( m_movementTimer <= 0 )
if ( m_bounceDir )
{
Pos = m_base;
Pos.vx += 2 * _frames;
}
else
{
Pos.vx = m_base.vx + ( -3 + ( getRnd() % 7 ) );
Pos.vy = m_base.vy + ( -3 + ( getRnd() % 7 ) );
Pos.vx -= 2 * _frames;
}
}
else
{
yMovement = 3 * _frames;
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
Pos.vy += m_speed * _frames;
if ( groundHeight < yMovement )
if ( m_speed < 5 )
{
// colliding with ground
m_speed++;
}
Pos.vy += groundHeight;
DVECTOR offset = CLevel::getCameraPos();
s32 yPos = Pos.vy - offset.vy;
if ( yPos > VidGetScrH() || yPos < 0 )
{
m_isActive = false;
m_timerActive = true;
m_timer = ( m_respawnRate - 1 ) * GameState::getOneSecondInFrames();
}
}
else
{
if ( m_movementTimer > 0 )
{
m_movementTimer -= _frames;
if ( m_movementTimer <= 0 )
{
Pos = m_base;
}
else
{
Pos.vx = m_base.vx + ( -3 + ( getRnd() % 7 ) );
Pos.vy = m_base.vy + ( -3 + ( getRnd() % 7 ) );
}
}
else
{
// drop down
yMovement = 3 * _frames;
Pos.vy += yMovement;
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight < yMovement )
{
// colliding with ground
Pos.vy += groundHeight;
m_bounceFinish = true;
m_speed = -5;
m_bounceDir = getRnd() % 2;
}
else
{
// drop down
Pos.vy += yMovement;
}
}
}
}
@ -92,5 +130,6 @@ void CNpcFallingHazard::processTimer( int _frames )
m_isActive = true;
Pos = m_base;
m_movementTimer = 2 * GameState::getOneSecondInFrames();
m_bounceFinish = false;
}
}

View File

@ -27,6 +27,9 @@ protected:
void processTimer( int _frames );
s32 m_movementTimer;
u8 m_bounceFinish;
s32 m_speed;
u8 m_bounceDir;
};
#endif

View File

@ -23,6 +23,10 @@
#include "enemy\nsjback.h"
#endif
#ifndef __ENEMY_NSJ2BACK_H__
#include "enemy\nsj2back.h"
#endif
#ifndef __ENEMY_NPC_H__
#include "enemy\npc.h"
#endif
@ -41,6 +45,7 @@
u8 CJellyfishGenerator::m_jellyfishCount;
s32 CJellyfishGenerator::m_timer;
u8 CJellyfishGenerator::m_on;
u8 CJellyfishGenerator::m_level;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -50,6 +55,7 @@ void CJellyfishGenerator::init()
m_jellyfishCount = 0;
m_on = true;
m_level = 1;
switch( CLevel::getCurrentChapter() )
{
@ -60,6 +66,15 @@ void CJellyfishGenerator::init()
case 2:
{
m_on = false;
break;
}
case 4:
{
m_level = 2;
break;
}
}
@ -85,26 +100,62 @@ void CJellyfishGenerator::think( int _frames, CLevel *level )
m_jellyfishCount++;
CNpcEnemy *enemy;
enemy = new( "jellyfish" ) CNpcSmallJellyfishBackgroundEnemy;
if ( m_level == 1 )
{
enemy = new( "jellyfish" ) CNpcSmallJellyfishBackgroundEnemy;
}
else
{
enemy = new( "jellyfish" ) CNpcSmallJellyfish2BackgroundEnemy;
}
ASSERT(enemy);
enemy->setType( CNpcEnemy::NPC_SMALL_JELLYFISH_BACKGROUND );
if ( m_level == 1 )
{
enemy->setType( CNpcEnemy::NPC_SMALL_JELLYFISH_BACKGROUND );
}
else
{
enemy->setType( CNpcEnemy::NPC_SMALL_JELLYFISH_2_BACKGROUND );
}
enemy->init();
enemy->setLayerCollision( level->getCollisionLayer() );
DVECTOR offset = CLevel::getCameraPos();
DVECTOR startPos;
if ( ( getRnd() % 10 ) > 4 )
if ( m_level == 1 )
{
CNpcSmallJellyfishBackgroundEnemy *jfish = ( CNpcSmallJellyfishBackgroundEnemy * ) enemy;
jfish->setTargetHeading( 0 );
startPos.vx = offset.vx - 20;
if ( ( getRnd() % 10 ) > 4 )
{
jfish->setTargetHeading( 0 );
startPos.vx = offset.vx - 20;
}
else
{
jfish->setTargetHeading( 2048 );
startPos.vx = offset.vx + VidGetScrW() + 20;
}
}
else
{
CNpcSmallJellyfishBackgroundEnemy *jfish = ( CNpcSmallJellyfishBackgroundEnemy * ) enemy;
jfish->setTargetHeading( 2048 );
startPos.vx = offset.vx + VidGetScrW() + 20;
CNpcSmallJellyfish2BackgroundEnemy *jfish = ( CNpcSmallJellyfish2BackgroundEnemy * ) enemy;
if ( ( getRnd() % 10 ) > 4 )
{
jfish->setTargetHeading( 0 );
startPos.vx = offset.vx - 20;
}
else
{
jfish->setTargetHeading( 2048 );
startPos.vx = offset.vx + VidGetScrW() + 20;
}
}
startPos.vy = offset.vy + ( getRnd() % VidGetScrH() );

View File

@ -32,6 +32,7 @@ protected:
static u8 m_jellyfishCount;
static s32 m_timer;
static u8 m_on;
static u8 m_level;
};
#endif

View File

@ -329,6 +329,14 @@ SOURCE=..\..\..\source\enemy\nshrkman.h
# End Source File
# Begin Source File
SOURCE=..\..\..\source\enemy\nsj2back.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\source\enemy\nsj2back.h
# End Source File
# Begin Source File
SOURCE=..\..\..\source\enemy\nsjback.cpp
# End Source File
# Begin Source File