diff --git a/makefile.gaz b/makefile.gaz index c3c666000..10d96ff0a 100644 --- a/makefile.gaz +++ b/makefile.gaz @@ -159,6 +159,7 @@ player_src := demoplay \ player \ pmodes \ pmbloon \ + pmchop \ pmdead \ pmfly \ psbutt \ diff --git a/source/player/pmbloon.cpp b/source/player/pmbloon.cpp index 45a4af663..aa62c4bb7 100644 --- a/source/player/pmbloon.cpp +++ b/source/player/pmbloon.cpp @@ -17,6 +17,14 @@ #include "player\pmbloon.h" +#ifndef __GFX_SPRBANK_H__ +#include "gfx\sprbank.h" +#endif + +#ifndef __LEVEL_LEVEL_H__ +#include "level\level.h" +#endif + /* Std Lib ------- */ @@ -24,6 +32,11 @@ /* Data ---- */ +#ifndef __SPR_INGAMEFX_H__ +#include +#endif + + /*---------------------------------------------------------------------- Tyepdefs && Defines ------------------- */ @@ -54,6 +67,31 @@ static PlayerMetrics s_playerMetrics= } }; +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CPlayerModeBalloon::initialise(class CPlayer *_player) +{ + CPlayerModeBase::initialise(_player); + m_sprites=new ("BalloonSprite") SpriteBank(); + m_sprites->load(INGAMEFX_INGAMEFX_SPR); +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CPlayerModeBalloon::shutdown() +{ + m_sprites->dump(); delete m_sprites; + CPlayerModeBase::shutdown(); +} + /*---------------------------------------------------------------------- Function: Purpose: @@ -63,7 +101,7 @@ static PlayerMetrics s_playerMetrics= void CPlayerModeBalloon::enter() { CPlayerModeBase::enter(); - m_ballonTimer=BALLOON_TIME; + m_balloonTimer=BALLOON_TIME; } /*---------------------------------------------------------------------- @@ -75,13 +113,37 @@ void CPlayerModeBalloon::enter() void CPlayerModeBalloon::think() { CPlayerModeBase::think(); - if(--m_ballonTimer==0) + if(--m_balloonTimer==0||getPadInputDown()&PI_ACTION) { PAUL_DBGMSG("*pop*"); m_player->setMode(PLAYER_MODE_FULLUNARMED); } } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int balloonx=-14; +int balloony=-90; +void CPlayerModeBalloon::render() +{ + DVECTOR ofs,pos; + CPlayerModeBase::render(); + + if(m_balloonTimer>BALLOON_FLASH_TIME|| + m_balloonTimer&2) + { + ofs=CLevel::getCameraPos(); + pos=m_player->getPlayerPos(); + pos.vx+=balloonx-ofs.vx; + pos.vy+=balloony-ofs.vy; + m_sprites->printFT4(FRM__BALLOON,pos.vx,pos.vy,0,0,0); + } +} + /*---------------------------------------------------------------------- Function: Purpose: diff --git a/source/player/pmbloon.h b/source/player/pmbloon.h index 7d81de53c..1ed798fb2 100644 --- a/source/player/pmbloon.h +++ b/source/player/pmbloon.h @@ -37,8 +37,11 @@ class CPlayerModeBalloon : public CPlayerModeBase { public: + virtual void initialise(class CPlayer *_player); + virtual void shutdown(); virtual void enter(); virtual void think(); + virtual void render(); virtual int canFallForever() {return true;} virtual const struct PlayerMetrics *getPlayerMetrics(); @@ -47,8 +50,11 @@ private: enum { BALLOON_TIME=10*60, + BALLOON_FLASH_TIME=2*60, }; - int m_ballonTimer; + int m_balloonTimer; + + class SpriteBank *m_sprites; }; diff --git a/source/player/pmchop.cpp b/source/player/pmchop.cpp index 742e6b352..73b263165 100644 --- a/source/player/pmchop.cpp +++ b/source/player/pmchop.cpp @@ -24,6 +24,11 @@ /* Data ---- */ +#ifndef __ANIM_SPONGEBOB_HEADER__ +#include +#endif + + /*---------------------------------------------------------------------- Tyepdefs && Defines ------------------- */ @@ -46,7 +51,121 @@ Params: Returns: ---------------------------------------------------------------------- */ +void CPlayerModeChop::enter() +{ + m_chopping=false; +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CPlayerModeChop::think() +{ + // If we're chopping 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_chopping) + { + setAnimNo(m_savedAnimNo); + setAnimFrame(m_savedAnimFrame); + } + CPlayerModeBase::think(); + + // Start to chop? + if(!m_chopping&&getPadInputDown()&PI_ACTION&&canAttackFromThisState()) + { + m_chopFrame=0; + m_chopping=true; + } + + // Chopping? + if(m_chopping) + { + m_player->setAnimNo(ANIM_SPONGEBOB_KARATE); + m_player->setAnimFrame(m_chopFrame); + m_chopFrame++; + if(m_chopFrame>=m_player->getAnimFrameCount()) + { +PAUL_DBGMSG("restore %d,%d",m_savedAnimNo,m_savedAnimFrame); + m_player->setAnimNo(m_savedAnimNo); + m_player->setAnimFrame(m_savedAnimFrame); + m_chopping=false; + } + } +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CPlayerModeChop::setAnimNo(int _animNo) +{ + CPlayerModeBase::setAnimNo(_animNo); + m_savedAnimNo=_animNo; +} + +int pdbg=false; +void CPlayerModeChop::setAnimFrame(int _animFrame) +{ +//if(getAnimNo()==12) +//{ + if(pdbg) + { + PAUL_DBGMSG("fallf %d,%d (%c)",getAnimNo(),_animFrame,m_chopping?'M':'-'); + } +//} + CPlayerModeBase::setAnimFrame(_animFrame); + m_savedAnimFrame=_animFrame; +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int CPlayerModeChop::isInAttackState() +{ + return m_chopping||CPlayerModeBase::isInAttackState(); +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int CPlayerModeChop::canAttackFromThisState() +{ + int ret=false; + + switch(getState()) + { + case STATE_IDLE: + case STATE_IDLETEETER: + case STATE_JUMP: + case STATE_RUN: + case STATE_FALL: + ret=true; + break; + + case STATE_FALLFAR: + case STATE_BUTTBOUNCE: + case STATE_BUTTFALL: + case STATE_BUTTLAND: + case STATE_DUCK: + case STATE_SOAKUP: + case STATE_GETUP: + break; + } + + return ret; +} - /*=========================================================================== end */ diff --git a/source/player/pmchop.h b/source/player/pmchop.h index 6cbde2784..dd607bac0 100644 --- a/source/player/pmchop.h +++ b/source/player/pmchop.h @@ -36,6 +36,22 @@ class CPlayerModeChop : public CPlayerModeBase { +public: + virtual void enter(); + virtual void think(); + + virtual void setAnimNo(int _animNo); + virtual void setAnimFrame(int _animFrame); + + virtual int isInAttackState(); + +private: + int canAttackFromThisState(); + + int m_savedAnimNo,m_savedAnimFrame; + int m_chopFrame; + int m_chopping; + }; diff --git a/source/player/pmodes.cpp b/source/player/pmodes.cpp index 6cbd3804b..e2c63e66b 100644 --- a/source/player/pmodes.cpp +++ b/source/player/pmodes.cpp @@ -133,6 +133,13 @@ static PlayerMetrics s_playerMetrics= ---------------------------------------------------------------------- */ int CPlayerMode::getPadInputHeld() {return m_player->getPadInputHeld();} int CPlayerMode::getPadInputDown() {return m_player->getPadInputDown();} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ DVECTOR CPlayerMode::getPlayerPos() {return m_player->getPlayerPos();} void CPlayerMode::setPlayerPos(DVECTOR *_pos) {m_player->setPlayerPos(_pos);} @@ -187,6 +194,39 @@ void CPlayerModeBase::render() { } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int CPlayerModeBase::isInAttackState() +{ + int ret=false; + + switch(getState()) + { + case STATE_BUTTFALL: + case STATE_BUTTLAND: + ret=true; + break; + + case STATE_IDLE: + case STATE_IDLETEETER: + case STATE_JUMP: + case STATE_RUN: + case STATE_FALL: + case STATE_FALLFAR: + case STATE_BUTTBOUNCE: + case STATE_DUCK: + case STATE_SOAKUP: + case STATE_GETUP: + break; + } + + return ret; +} + /*---------------------------------------------------------------------- Function: Purpose: diff --git a/source/player/pmodes.h b/source/player/pmodes.h index 9be57c6cb..32c9f3ba5 100644 --- a/source/player/pmodes.h +++ b/source/player/pmodes.h @@ -77,6 +77,7 @@ class CPlayerMode { public: virtual void initialise(class CPlayer *_player) {m_player=_player;} + virtual void shutdown() {;} virtual void enter() {;} virtual void think() {;} virtual void render() {;} @@ -84,6 +85,8 @@ public: int getPadInputHeld(); int getPadInputDown(); + virtual int isInAttackState() {return false;} + protected: DVECTOR getPlayerPos(); void setPlayerPos(DVECTOR *_pos); @@ -107,6 +110,8 @@ public: virtual void think(); virtual void render(); + virtual int isInAttackState(); + virtual int canTeeter() {return m_currentState==STATE_IDLE;} virtual int canFallForever() {return m_currentState==STATE_BUTTFALL;} @@ -116,12 +121,15 @@ public: virtual const struct PlayerMetrics *getPlayerMetrics(); int setState(int _state); + int getState() {return m_currentState;} // virtual void setMode(class CPlayer *_player,int _mode); int getFacing(); void setFacing(int _facing); -// virtual int getAnimNo(class CPlayer *_player); - void setAnimNo(int _animNo); - void setAnimFrame(int _animFrame); + virtual int getAnimNo(); + virtual void setAnimNo(int _animNo); + virtual void setAnimFrame(int _animFrame); + virtual int getAnimFrame(); + virtual int getAnimFrameCount(); int advanceAnimFrameAndCheckForEndOfAnim(); // virtual int retreatAnimFrameAndCheckForEndOfAnim(class CPlayer *_player); DVECTOR getMoveVelocity();