From 4c0a773f2aa9e0d7273a470c8dbfb207286c359c Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 11 Jun 2001 15:42:07 +0000 Subject: [PATCH] --- source/friend/fgary.cpp | 4 +- source/player/pmnet.cpp | 2 +- source/projectl/projectl.cpp | 109 ++++++++++++++++++++++++++++++----- source/projectl/projectl.h | 4 ++ 4 files changed, 100 insertions(+), 19 deletions(-) diff --git a/source/friend/fgary.cpp b/source/friend/fgary.cpp index f843f65b3..937801263 100644 --- a/source/friend/fgary.cpp +++ b/source/friend/fgary.cpp @@ -169,7 +169,7 @@ void CNpcGaryFriend::think( int _frames ) if ( m_started ) { - CSoundMediator::playSfx( CSoundMediator::SFX_GARY_DE_SNAIL ); + //CSoundMediator::playSfx( CSoundMediator::SFX_GARY_DE_SNAIL ); Pos.vx += multiplier * 2 * _frames; } @@ -195,7 +195,7 @@ void CNpcGaryFriend::think( int _frames ) { if ( m_started ) { - CSoundMediator::playSfx( CSoundMediator::SFX_GARY_DE_SNAIL ); + //CSoundMediator::playSfx( CSoundMediator::SFX_GARY_DE_SNAIL ); Pos.vx += multiplier * 2 * _frames; } diff --git a/source/player/pmnet.cpp b/source/player/pmnet.cpp index e13178c56..bbaf0fd36 100644 --- a/source/player/pmnet.cpp +++ b/source/player/pmnet.cpp @@ -233,7 +233,7 @@ void CPlayerModeNet::think() projectile->init( launchPos, fireHeading, - CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, + CPlayerProjectile::PLAYER_PROJECTILE_BOUNCING, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, 5*60); diff --git a/source/projectl/projectl.cpp b/source/projectl/projectl.cpp index c3d58f840..148cd6b3b 100644 --- a/source/projectl/projectl.cpp +++ b/source/projectl/projectl.cpp @@ -419,6 +419,9 @@ void CPlayerProjectile::init( DVECTOR initPos, s16 initHeading ) m_heading = initHeading; m_initPos = Pos = initPos; + m_vertVelocity = 0; + m_bounceCount = 0; + m_hitTarget = false; if ( m_heading > 1024 && m_heading < 3072 ) { @@ -489,6 +492,68 @@ void CPlayerProjectile::think(int _frames) 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: default: { @@ -497,7 +562,7 @@ void CPlayerProjectile::think(int _frames) // destroy destructable tiles CLevel &level = GameScene.GetLevel(); - + level.destroyMapArea( Pos ); setToShutdown(); @@ -531,29 +596,41 @@ void CPlayerProjectile::render() int x,y; int scrnWidth = VidGetScrW(); int scrnHeight = VidGetScrH(); - int spriteWidth = CGameScene::getSpriteBank()->getFrameWidth(m_frame); - int spriteHeight = CGameScene::getSpriteBank()->getFrameHeight(m_frame); 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 { - 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() diff --git a/source/projectl/projectl.h b/source/projectl/projectl.h index b1a92c11e..e0219af50 100644 --- a/source/projectl/projectl.h +++ b/source/projectl/projectl.h @@ -92,6 +92,7 @@ public: enum PLAYER_PROJECTILE_MOVEMENT_TYPE { PLAYER_PROJECTILE_DUMBFIRE = 0, + PLAYER_PROJECTILE_BOUNCING = 1, }; enum PLAYER_PROJECTILE_LIFETIME_TYPE @@ -135,6 +136,9 @@ protected: POLY_FT4 *SprFrame; u8 m_reversed; CVECTOR m_RGB; + s16 m_vertVelocity; + u8 m_bounceCount; + u8 m_hitTarget; };