This commit is contained in:
Charles 2001-06-11 15:42:07 +00:00
parent 367505e887
commit 4c0a773f2a
4 changed files with 100 additions and 19 deletions

View File

@ -169,7 +169,7 @@ void CNpcGaryFriend::think( int _frames )
if ( m_started ) if ( m_started )
{ {
CSoundMediator::playSfx( CSoundMediator::SFX_GARY_DE_SNAIL ); //CSoundMediator::playSfx( CSoundMediator::SFX_GARY_DE_SNAIL );
Pos.vx += multiplier * 2 * _frames; Pos.vx += multiplier * 2 * _frames;
} }
@ -195,7 +195,7 @@ void CNpcGaryFriend::think( int _frames )
{ {
if ( m_started ) if ( m_started )
{ {
CSoundMediator::playSfx( CSoundMediator::SFX_GARY_DE_SNAIL ); //CSoundMediator::playSfx( CSoundMediator::SFX_GARY_DE_SNAIL );
Pos.vx += multiplier * 2 * _frames; Pos.vx += multiplier * 2 * _frames;
} }

View File

@ -233,7 +233,7 @@ void CPlayerModeNet::think()
projectile->init( launchPos, projectile->init( launchPos,
fireHeading, fireHeading,
CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_BOUNCING,
CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE,
5*60); 5*60);

View File

@ -419,6 +419,9 @@ void CPlayerProjectile::init( DVECTOR initPos, s16 initHeading )
m_heading = initHeading; m_heading = initHeading;
m_initPos = Pos = initPos; m_initPos = Pos = initPos;
m_vertVelocity = 0;
m_bounceCount = 0;
m_hitTarget = false;
if ( m_heading > 1024 && m_heading < 3072 ) if ( m_heading > 1024 && m_heading < 3072 )
{ {
@ -489,6 +492,68 @@ void CPlayerProjectile::think(int _frames)
switch( m_movementType ) switch( m_movementType )
{ {
case PLAYER_PROJECTILE_BOUNCING:
{
if ( !m_hitTarget )
{
Pos.vx += ( _frames * 5 * rcos( m_heading ) ) >> 12;
m_vertVelocity += 128;
if ( m_vertVelocity > ( 5 << 8 ) )
{
m_vertVelocity = 5 << 8;
}
else if ( m_vertVelocity < -( 5 << 8 ) )
{
m_vertVelocity = -( 5 << 8 );
}
s16 moveY = ( m_vertVelocity >> 8 ) * _frames;
s32 groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy + moveY, 32 );
if ( groundHeight < 0 )
{
// destroy destructable tiles
CLevel &level = GameScene.GetLevel();
level.destroyMapArea( Pos );
if ( groundHeight < -16 )
{
m_hitTarget = true;
m_lifetimeType = PLAYER_PROJECTILE_FINITE_LIFE;
m_lifetime = GameState::getOneSecondInFrames() >> 2;
}
else
{
// reverse vertical velocity
m_vertVelocity = -m_vertVelocity;
if ( m_bounceCount > 2 )
{
m_hitTarget = true;
m_lifetimeType = PLAYER_PROJECTILE_FINITE_LIFE;
m_lifetime = GameState::getOneSecondInFrames() >> 2;
}
else
{
m_bounceCount++;
}
}
}
else
{
Pos.vy += moveY;
}
}
break;
}
case PLAYER_PROJECTILE_DUMBFIRE: case PLAYER_PROJECTILE_DUMBFIRE:
default: default:
{ {
@ -497,7 +562,7 @@ void CPlayerProjectile::think(int _frames)
// destroy destructable tiles // destroy destructable tiles
CLevel &level = GameScene.GetLevel(); CLevel &level = GameScene.GetLevel();
level.destroyMapArea( Pos ); level.destroyMapArea( Pos );
setToShutdown(); setToShutdown();
@ -531,29 +596,41 @@ void CPlayerProjectile::render()
int x,y; int x,y;
int scrnWidth = VidGetScrW(); int scrnWidth = VidGetScrW();
int scrnHeight = VidGetScrH(); int scrnHeight = VidGetScrH();
int spriteWidth = CGameScene::getSpriteBank()->getFrameWidth(m_frame);
int spriteHeight = CGameScene::getSpriteBank()->getFrameHeight(m_frame);
offset = getScreenOffset(); offset = getScreenOffset();
if ( m_reversed ) if ( m_hitTarget )
{ {
x = Pos.vx - offset.vx + ( spriteWidth >> 1 ); x = Pos.vx - offset.vx;
y = Pos.vy - offset.vy;
SprFrame = CGameScene::getSpriteBank()->printRotatedScaledSprite( FRM__BALLOONBURST, x, y, 4096 << 1, 4096 << 1, 0, 0 );
setRGB0( SprFrame, m_RGB.r, m_RGB.g, m_RGB.b );
} }
else else
{ {
x = Pos.vx - offset.vx - ( spriteWidth >> 1 ); int spriteWidth = CGameScene::getSpriteBank()->getFrameWidth(m_frame);
int spriteHeight = CGameScene::getSpriteBank()->getFrameHeight(m_frame);
if ( m_reversed )
{
x = Pos.vx - offset.vx + ( spriteWidth >> 1 );
}
else
{
x = Pos.vx - offset.vx - ( spriteWidth >> 1 );
}
y = Pos.vy - offset.vy - ( spriteHeight >> 1 );
if ( x < -spriteWidth || y < -spriteHeight || x > scrnWidth || y > scrnHeight )
{
return;
}
SprFrame = CGameScene::getSpriteBank()->printFT4(FRM_JELLYFISH1_SWIM1 + m_frame,x,y,m_reversed,0,0);
setRGB0( SprFrame, m_RGB.r, m_RGB.g, m_RGB.b );
} }
y = Pos.vy - offset.vy - ( spriteHeight >> 1 );
if ( x < -spriteWidth || y < -spriteHeight || x > scrnWidth || y > scrnHeight )
{
return;
}
SprFrame = CGameScene::getSpriteBank()->printFT4(FRM_JELLYFISH1_SWIM1 + m_frame,x,y,m_reversed,0,0);
setRGB0( SprFrame, m_RGB.r, m_RGB.g, m_RGB.b );
} }
DVECTOR CPlayerProjectile::getScreenOffset() DVECTOR CPlayerProjectile::getScreenOffset()

View File

@ -92,6 +92,7 @@ public:
enum PLAYER_PROJECTILE_MOVEMENT_TYPE enum PLAYER_PROJECTILE_MOVEMENT_TYPE
{ {
PLAYER_PROJECTILE_DUMBFIRE = 0, PLAYER_PROJECTILE_DUMBFIRE = 0,
PLAYER_PROJECTILE_BOUNCING = 1,
}; };
enum PLAYER_PROJECTILE_LIFETIME_TYPE enum PLAYER_PROJECTILE_LIFETIME_TYPE
@ -135,6 +136,9 @@ protected:
POLY_FT4 *SprFrame; POLY_FT4 *SprFrame;
u8 m_reversed; u8 m_reversed;
CVECTOR m_RGB; CVECTOR m_RGB;
s16 m_vertVelocity;
u8 m_bounceCount;
u8 m_hitTarget;
}; };