From bb454ee0a7f63d58b8955a1272fdffe7b25f5213 Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 11 May 2001 00:36:17 +0000 Subject: [PATCH] --- source/pickups/pnet.cpp | 1 + source/player/player.cpp | 36 +++++-- source/player/pmnet.cpp | 211 +++++++++++++++++++++------------------ source/player/pmnet.h | 8 +- source/player/pmodes.h | 1 + 5 files changed, 148 insertions(+), 109 deletions(-) diff --git a/source/pickups/pnet.cpp b/source/pickups/pnet.cpp index 9489d361f..b9f6d1d65 100644 --- a/source/pickups/pnet.cpp +++ b/source/pickups/pnet.cpp @@ -77,6 +77,7 @@ void CNetPickup::init() setCollisionSize(fh->W,fh->H); GameScene.getPlayer()->registerAddon(PLAYER_ADDON_NET); + GameScene.getPlayer()->registerAddon(PLAYER_ADDON_JELLYFISHINNET); } /*---------------------------------------------------------------------- diff --git a/source/player/player.cpp b/source/player/player.cpp index ede4d119c..dd9403ca2 100644 --- a/source/player/player.cpp +++ b/source/player/player.cpp @@ -562,6 +562,7 @@ m_animFrame=0; // registerAddon(PLAYER_ADDON_JELLYLAUNCHER); // registerAddon(PLAYER_ADDON_GLASSES); // registerAddon(PLAYER_ADDON_BUBBLEWAND); +// registerAddon(PLAYER_ADDON_JELLYFISHINNET); } /*---------------------------------------------------------------------- @@ -637,7 +638,7 @@ else if(oldmode!=-1&&!(PadGetHeld(0)&PAD_L1)) if(PadGetHeld(0)&PAD_L1&&PadGetHeld(0)&PAD_L2) { - respawn(); + CGameScene::restartlevel(); } if(newmode!=-1) { @@ -894,10 +895,6 @@ int mouth=-1,eyes=-1; #include "gui\gui.h" void CPlayer::render() { - -//drawSpeechBubbleBorder(125,140,357,80,0,FRM_BARNACLEBOY); - - CPlayerThing::render(); @@ -1410,14 +1407,15 @@ void CPlayer::respawn() clearPlatform(); - GameScene.respawnLevel(); updateCollisionArea(); } /*---------------------------------------------------------------------- Function: - Purpose: + Purpose: Yes - This function is fat! It can be tidied up when all of the anims + are finalised. Etracting the repeated code to a function will probly not + improve things cos of the amount of data that would need to be passed about. Params: Returns: ---------------------------------------------------------------------- */ @@ -1452,6 +1450,28 @@ void CPlayer::renderSb(DVECTOR *_pos,int _animNo,int _animFrame) } } + // Render JFish in a net? + if(m_currentMode==PLAYER_MODE_NET&&m_currentPlayerModeClass->isJellyfishNetFull()) + { + s8 addonAnimNo=s_animMapNet[PLAYER_ADDON_JELLYFISHINNET][_animNo]; + if(addonAnimNo!=-1) + { + CActorGfx *addonGfx=s_addonActorGfx[PLAYER_ADDON_JELLYFISHINNET]; + if(addonGfx) + { + if(_animFrame>=addonGfx->getFrameCount(addonAnimNo)) + { + PAUL_DBGMSG("FRAME OVERRUN ON SPONGEBOB JELLYFISH ADDON! ( %d vs %d )",m_actorGfx->getFrameCount(_animNo),addonGfx->getFrameCount(addonAnimNo)); + } + else + { + ft4=addonGfx->Render(*_pos,addonAnimNo,_animFrame,m_facing==FACING_RIGHT?0:1); + setRGB0(ft4,255,128,255); + setSemiTrans(ft4,trans); + } + } + } + } // Render glasses addon? if(isWearingGlasses()) { @@ -1485,7 +1505,7 @@ void CPlayer::renderSb(DVECTOR *_pos,int _animNo,int _animFrame) { if(_animFrame>=addonGfx->getFrameCount(addonAnimNo)) { - PAUL_DBGMSG("FRAME OVERRUN ON SPONGEBOB GLASSES ADDON! ( %d vs %d )",m_actorGfx->getFrameCount(_animNo),addonGfx->getFrameCount(addonAnimNo)); + PAUL_DBGMSG("FRAME OVERRUN ON SPONGEBOB GLOVE ADDON! ( %d vs %d )",m_actorGfx->getFrameCount(_animNo),addonGfx->getFrameCount(addonAnimNo)); } else { diff --git a/source/player/pmnet.cpp b/source/player/pmnet.cpp index 9fa7cfee5..1a0395f26 100644 --- a/source/player/pmnet.cpp +++ b/source/player/pmnet.cpp @@ -34,7 +34,11 @@ #endif #ifndef __UTILS_HEADER__ -#include "utils\utils.h" +#include "utils\utils.h" +#endif + +#ifndef __GFX_FONT_H__ +#include "gfx\font.h" #endif @@ -82,8 +86,8 @@ int npsize=40; ---------------------------------------------------------------------- */ void CPlayerModeNet::enter() { - m_netting=false; - m_netState=NET_STATE__EMPTY; + m_netState=NET_STATE__INERT; + m_jellyfishHeld=0; } /*---------------------------------------------------------------------- @@ -92,121 +96,136 @@ void CPlayerModeNet::enter() Params: Returns: ---------------------------------------------------------------------- */ -DVECTOR netCatchPos={0,-80}; -DVECTOR netCatchSize={30,30}; -DVECTOR netLaunchPos={-10,-70}; +DVECTOR netCatchPos={-15,-90}; +DVECTOR netCatchSize={50,30}; +DVECTOR netLaunchPos={-15,-90}; void CPlayerModeNet::think() { // If we're netting then restore the 'real' anim number/frame before // doing the think so that the rest of the code doesn't know what // is going on ;) - if(m_netting) + if(m_netState!=NET_STATE__INERT) { setAnimNo(m_savedAnimNo); setAnimFrame(m_savedAnimFrame); } CPlayerModeBase::think(); - // Start to net? - if(!m_netting&&getPadInputDown()&PI_FIRE&&canSwingNetFromThisState()) - { - m_netFrame=0; - m_netting=true; - } - // Netting? - if(m_netting) + switch(m_netState) { - switch(m_netState) - { - case NET_STATE__EMPTY: + case NET_STATE__INERT: + { + int padDown; + padDown=getPadInputDown(); + if(padDown&(PI_CATCH|PI_FIRE)&&canSwingNetFromThisState()) { - DVECTOR playerPos; - int playerFacing; - CRECT netRect; - CThing *thing; - - playerPos=m_player->getPos(); - playerFacing=m_player->getFacing(); - - netRect.x1=playerPos.vx+(netCatchPos.vx*playerFacing)-(netCatchSize.vx/2); - netRect.y1=playerPos.vy+netCatchPos.vy-(netCatchSize.vy/2); - netRect.x2=netRect.x1+netCatchSize.vx; - netRect.y2=netRect.y1+netCatchSize.vy; - - #ifdef __USER_paul__ + if(padDown&PI_CATCH&&m_jellyfishHeld<5) { - CRECT area=netRect; - DVECTOR ofs=CLevel::getCameraPos(); - area.x1-=ofs.vx; - area.y1-=ofs.vy; - area.x2-=ofs.vx; - area.y2-=ofs.vy; - DrawLine(area.x1,area.y1,area.x2,area.y1,255,255,255,0); - DrawLine(area.x2,area.y1,area.x2,area.y2,255,255,255,0); - DrawLine(area.x2,area.y2,area.x1,area.y2,255,255,255,0); - DrawLine(area.x1,area.y2,area.x1,area.y1,255,255,255,0); + m_netState=NET_STATE__CATCHING; } - #endif - - thing=CThingManager::checkCollisionAreaAgainstThings(&netRect,CThing::TYPE_ENEMY,false); - while(thing) + else if(padDown&PI_FIRE&&m_jellyfishHeld) { - if(((CNpcEnemy*)thing)->canBeCaughtByNet()) + m_netState=NET_STATE__LAUNCHING; + } + m_netFrame=0; + } + } + break; + + case NET_STATE__CATCHING: + { + DVECTOR playerPos; + int playerFacing; + CRECT netRect; + CThing *thing; + + playerPos=m_player->getPos(); + playerFacing=m_player->getFacing(); + + netRect.x1=playerPos.vx+(netCatchPos.vx*playerFacing)-(netCatchSize.vx/2); + netRect.y1=playerPos.vy+netCatchPos.vy-(netCatchSize.vy/2); + netRect.x2=netRect.x1+netCatchSize.vx; + netRect.y2=netRect.y1+netCatchSize.vy; + + #ifdef __USER_paul__ + { + CRECT area=netRect; + DVECTOR ofs=CLevel::getCameraPos(); + area.x1-=ofs.vx; + area.y1-=ofs.vy; + area.x2-=ofs.vx; + area.y2-=ofs.vy; + DrawLine(area.x1,area.y1,area.x2,area.y1,255,255,255,0); + DrawLine(area.x2,area.y1,area.x2,area.y2,255,255,255,0); + DrawLine(area.x2,area.y2,area.x1,area.y2,255,255,255,0); + DrawLine(area.x1,area.y2,area.x1,area.y1,255,255,255,0); + } + #endif + + thing=CThingManager::checkCollisionAreaAgainstThings(&netRect,CThing::TYPE_ENEMY,false); + while(thing) + { + if(((CNpcEnemy*)thing)->canBeCaughtByNet()) + { + ((CNpcEnemy*)thing)->caughtWithNet(); + m_netState=NET_STATE__JUST_CAUGHT_SOMETHING; + thing=NULL; + if(m_jellyfishHeld==0) { - ((CNpcEnemy*)thing)->caughtWithNet(); - m_netState=NET_STATE__JUST_CAUGHT_SOMETHING; - thing=NULL; m_netSin=0; } - else - { - thing=CThingManager::checkCollisionAreaAgainstThings(&netRect,CThing::TYPE_ENEMY,true); - } + m_jellyfishHeld++; + } + else + { + thing=CThingManager::checkCollisionAreaAgainstThings(&netRect,CThing::TYPE_ENEMY,true); } } - break; + } + break; - case NET_STATE__JUST_CAUGHT_SOMETHING: - break; + case NET_STATE__JUST_CAUGHT_SOMETHING: + break; - case NET_STATE__FULL: - if(m_netFrame==0) - { - // Launch projectile at halfway through the swing.. - CPlayerProjectile *projectile; + case NET_STATE__LAUNCHING: + // Launch projectile at halfway through the swing.. + if(m_netFrame==4) + { + CPlayerProjectile *projectile; - int playerFacing; - int fireHeading; - DVECTOR launchPos; + int playerFacing; + int fireHeading; + DVECTOR launchPos; - playerFacing=m_player->getFacing(); - fireHeading=1024+(512*playerFacing); - launchPos=m_player->getPos(); - launchPos.vx+=netLaunchPos.vx*playerFacing; - launchPos.vy+=netLaunchPos.vy; + playerFacing=m_player->getFacing(); + fireHeading=1024+(512*playerFacing); + launchPos=m_player->getPos(); + launchPos.vx+=netLaunchPos.vx*playerFacing; + launchPos.vy+=netLaunchPos.vy; - projectile = new( "user projectile" ) CPlayerProjectile; - - projectile->init( launchPos, - fireHeading, - CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, - CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, - 5*60); - projectile->setLayerCollision( m_player->getLayerCollision() ); - projectile->updateCollisionArea(); - + projectile = new( "user projectile" ) CPlayerProjectile; + + projectile->init( launchPos, + fireHeading, + CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, + CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, + 5*60); + projectile->setLayerCollision( m_player->getLayerCollision() ); + projectile->updateCollisionArea(); + m_netState=NET_STATE__JUST_LAUNCHED_SOMETHING; + m_jellyfishHeld--; + } + break; - m_netState=NET_STATE__JUST_LAUNCHED_SOMETHING; - } - break; - - case NET_STATE__JUST_LAUNCHED_SOMETHING: - break; - } + case NET_STATE__JUST_LAUNCHED_SOMETHING: + break; + } + if(m_netState!=NET_STATE__INERT) + { m_player->setAnimNo(ANIM_SPONGEBOB_SWIPE); m_player->setAnimFrame(m_netFrame); m_netFrame++; @@ -214,20 +233,12 @@ void CPlayerModeNet::think() { m_player->setAnimNo(m_savedAnimNo); m_player->setAnimFrame(m_savedAnimFrame); - m_netting=false; - if(m_netState==NET_STATE__JUST_CAUGHT_SOMETHING) - { - m_netState=NET_STATE__FULL; - } - else if(m_netState==NET_STATE__JUST_LAUNCHED_SOMETHING) - { - m_netState=NET_STATE__EMPTY; - } + m_netState=NET_STATE__INERT; } } - if(m_netState==NET_STATE__FULL) + if(m_jellyfishHeld) { m_netSin=(m_netSin+npspeed)&4095; } @@ -243,10 +254,11 @@ void CPlayerModeNet::think() { SpriteBank *sb; sFrameHdr *fh; + char buf[4]; sb=m_player->getSpriteBank(); fh=sb->getFrameHeader(FRM__NET); - if(m_netState==NET_STATE__FULL) + if(m_jellyfishHeld) { POLY_FT4 *ft4; @@ -261,6 +273,9 @@ void CPlayerModeNet::think() { sb->printFT4(fh,CPlayer::POWERUPUI_ICONX,CPlayer::POWERUPUI_ICONY,0,0,CPlayer::POWERUPUI_OT); } + + sprintf(buf,"x%d",m_jellyfishHeld); + m_player->getFontBank()->print(CPlayer::POWERUPUI_TEXTX,CPlayer::POWERUPUI_TEXTY,buf); } /*---------------------------------------------------------------------- diff --git a/source/player/pmnet.h b/source/player/pmnet.h index 4d06d7996..70d3e161c 100644 --- a/source/player/pmnet.h +++ b/source/player/pmnet.h @@ -40,6 +40,7 @@ public: virtual void enter(); virtual void think(); virtual void renderModeUi(); + virtual int isJellyfishNetFull() {return m_jellyfishHeld!=0;} virtual void setAnimNo(int _animNo); virtual void setAnimFrame(int _animFrame); @@ -47,9 +48,10 @@ public: private: typedef enum { - NET_STATE__EMPTY, + NET_STATE__INERT, + NET_STATE__CATCHING, NET_STATE__JUST_CAUGHT_SOMETHING, - NET_STATE__FULL, + NET_STATE__LAUNCHING, NET_STATE__JUST_LAUNCHED_SOMETHING, } NetState; @@ -57,9 +59,9 @@ private: int m_savedAnimNo,m_savedAnimFrame; int m_netFrame; - int m_netting; NetState m_netState; int m_netSin; + int m_jellyfishHeld; }; diff --git a/source/player/pmodes.h b/source/player/pmodes.h index c8b138028..96ec9cd1e 100644 --- a/source/player/pmodes.h +++ b/source/player/pmodes.h @@ -87,6 +87,7 @@ public: virtual int canDoLookAround() {return false;} virtual void springPlayerUp() {;} void inSoakUpState(); + virtual int isJellyfishNetFull() {ASSERT(0);return false;} // Fugly.. int getPadInputHeld();