diff --git a/source/player/player.cpp b/source/player/player.cpp index 89f380491..7e6f0079d 100644 --- a/source/player/player.cpp +++ b/source/player/player.cpp @@ -209,7 +209,29 @@ CPlayerMode *CPlayer::s_playerModes[NUM_PLAYERMODES]= &PLAYERMODEFLY, // PLAYER_MODE_FLY }; -int sbanimspeed=0; + +// A big bunch of 'temporary' variables for tweaking things +// This #def makes them static under a release build.. +#ifdef __VERSION_DEBUG__s +#define pint int +#else +#define pint static const int +#endif + +pint sbanimspeed=0; + +pint looktimeout=20; +pint lookmaxoffsetup=3*MAP2D_BLOCKSTEPSIZE; +pint lookmaxoffsetdown=6*MAP2D_BLOCKSTEPSIZE; +pint lookspeed=2; +pint lookreturnspeed=5; + +pint ledgeTimer=50; +pint ledgeSpeedIn=1; +pint ledgeSpeedOut=3; +pint ledgeShift=1; + +pint cammove=2; /*---------------------------------------------------------------------- @@ -231,9 +253,6 @@ void CPlayer::init() m_layerCollision=NULL; -// m_onPlatform = false; -// m_prevOnPlatform = false; - m_actorGfx=CActorPool::GetActor(ACTORS_SPONGEBOB_SBK); for(int i=0;im_mapEdge.vy-64)Pos.vy=m_mapEdge.vy-64; // Look around int pad=getPadInputHeld(); - if(pad&PI_UP) + if(pad&PI_UP&&canDoLookAround()) { if(m_padLookAroundTimer>0) { @@ -376,7 +381,7 @@ else if(Pos.vy>m_mapEdge.vy-64)Pos.vy=m_mapEdge.vy-64; } } } - else if(pad&PI_DOWN) + else if(pad&PI_DOWN&&canDoLookAround()) { if(m_padLookAroundTimer<0) { @@ -726,6 +731,7 @@ ATTACK_STATE CPlayer::getAttackState() ---------------------------------------------------------------------- */ void CPlayer::setMode(PLAYER_MODE _mode) { + resetPlayerCollisionSizeToBase(); m_currentMode=_mode; m_currentPlayerModeClass=s_playerModes[_mode]; m_currentPlayerModeClass->enter(); @@ -862,6 +868,17 @@ void CPlayer::renderSb(DVECTOR *_pos,int _animNo,int _animFrame) } +/*---------------------------------------------------------------------- + Function: + Purpose: Says whether SB can do the look up/down thing + Params: + Returns: + ---------------------------------------------------------------------- */ +int CPlayer::canDoLookAround() +{ + return m_currentPlayerModeClass->canDoLookAround(); +} + /*---------------------------------------------------------------------- Function: Purpose: @@ -1116,5 +1133,28 @@ bool CPlayer::getHasPlatformCollided() } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CPlayer::resetPlayerCollisionSizeToBase() +{ + setPlayerCollisionSize(0,-COLSIZE_BASE_HEIGHT/2,COLSIZE_BASE_WIDTH,COLSIZE_BASE_HEIGHT); +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CPlayer::setPlayerCollisionSize(int _x,int _y,int _w,int _h) +{ + setCollisionSize(_w,_h); + setCollisionCentreOffset(_x,_y); +} + /*=========================================================================== end */ diff --git a/source/player/player.h b/source/player/player.h index 902b0d932..93a2aee44 100644 --- a/source/player/player.h +++ b/source/player/player.h @@ -196,6 +196,9 @@ public: CSoundMediator::SFXID m_sfxId; } AnimFrameSfx; void renderSb(DVECTOR *_pos,int _animNo,int _animFrame); + + int canDoLookAround(); + private: typedef struct { @@ -291,18 +294,24 @@ public: private: CThing *m_platform; - /* -private: - CThing *m_platform; - bool m_onPlatform; - bool m_prevOnPlatform; - DVECTOR m_prevPlatformPos; - */ private: bool m_hasPlatformCollided; + // Player collision size +public: + enum + { + COLSIZE_BASE_WIDTH=30, + COLSIZE_BASE_HEIGHT=60, + }; + void resetPlayerCollisionSizeToBase(); + void setPlayerCollisionSize(int _x,int _y,int _w,int _h); + + + + // Graphical resources public: class FontBank *getFontBank() {return m_fontBank;} diff --git a/source/player/pmodes.cpp b/source/player/pmodes.cpp index 9951134fa..126e90716 100644 --- a/source/player/pmodes.cpp +++ b/source/player/pmodes.cpp @@ -183,8 +183,32 @@ void CPlayerModeBase::think() Params: Returns: ---------------------------------------------------------------------- */ -void CPlayerModeBase::render() +int CPlayerModeBase::canDoLookAround() { + int ret=false; + + switch(getState()) + { + case STATE_IDLE: + case STATE_IDLETEETER: + case STATE_SOAKUP: + ret=true; + break; + + case STATE_JUMP: + case STATE_RUN: + case STATE_FALL: + case STATE_FALLFAR: + case STATE_HITGROUND: + case STATE_BUTTBOUNCE: + case STATE_BUTTFALL: + case STATE_BUTTLAND: + case STATE_DUCK: + case STATE_GETUP: + break; + } + + return ret; } /*---------------------------------------------------------------------- @@ -458,6 +482,7 @@ int CPlayerModeBase::setState(int _state) nextState=getStateTable()[_state]; if(nextState) { + m_player->resetPlayerCollisionSizeToBase(); m_currentStateClass=nextState; m_currentStateClass->enter(this); m_currentState=(PLAYER_STATE)_state; @@ -563,6 +588,17 @@ int CPlayerModeBase::canMoveRight() return m_player->getHeightFromGround(pos.vx+1,pos.vy,16)>-8?true:false; } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CPlayerModeBase::setPlayerCollisionSize(int _x,int _y,int _w,int _h) +{ + m_player->setPlayerCollisionSize(_x,_y,_w,_h); +} + /*---------------------------------------------------------------------- Function: Purpose: diff --git a/source/player/pmodes.h b/source/player/pmodes.h index ebd0cf15f..efdcb779e 100644 --- a/source/player/pmodes.h +++ b/source/player/pmodes.h @@ -84,6 +84,8 @@ public: virtual void think() {;} virtual void render(DVECTOR *_pos) {;} virtual void renderModeUi() {;} // Ui specific to this mode (eg: ammo) + virtual int canDoLookAround() {return false;} + int getPadInputHeld(); int getPadInputDown(); @@ -112,7 +114,8 @@ public: virtual void enter(); virtual void think(); - virtual void render(); + virtual void render() {;} + virtual int canDoLookAround(); virtual ATTACK_STATE getAttackState(); @@ -127,7 +130,6 @@ public: virtual const struct PlayerMetrics *getPlayerMetrics(); virtual 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(); @@ -136,13 +138,13 @@ public: virtual int getAnimFrame(); virtual int getAnimFrameCount(); int advanceAnimFrameAndCheckForEndOfAnim(); -// virtual int retreatAnimFrameAndCheckForEndOfAnim(class CPlayer *_player); DVECTOR getMoveVelocity(); void zeroMoveVelocity(); void setMoveVelocity(DVECTOR *_moveVel); int isOnEdge(); int canMoveLeft(); int canMoveRight(); + void setPlayerCollisionSize(int _x,int _y,int _w,int _h); void moveLeft(); void moveRight(); diff --git a/source/player/psduck.cpp b/source/player/psduck.cpp index 2e936643a..1101c4884 100644 --- a/source/player/psduck.cpp +++ b/source/player/psduck.cpp @@ -98,6 +98,7 @@ void CPlayerStateSoakUp::enter(CPlayerModeBase *_playerMode) { _playerMode->zeroMoveVelocity(); _playerMode->setAnimNo(ANIM_SPONGEBOB_GETUP); + _playerMode->setPlayerCollisionSize(0,-10,60,20); }