diff --git a/source/player/player.cpp b/source/player/player.cpp index 4f8d6d5ee..7f8a8977d 100644 --- a/source/player/player.cpp +++ b/source/player/player.cpp @@ -99,6 +99,8 @@ m_animFrame=0; m_cameraOffsetTarget.vy=0; m_cameraOffset.vx=0; m_cameraOffset.vy=0; + + m_lastPadInput=m_padInput=0; } /*---------------------------------------------------------------------- @@ -120,12 +122,22 @@ void CPlayer::shutdown() ---------------------------------------------------------------------- */ DVECTOR ofs={-240,-134}; // nearly -256,-128 ;) int psize=0; +int newmode=-1; void CPlayer::think(int _frames) { int i; CThing::think(_frames); + +if(newmode!=-1) +{ + setMode((PLAYER_MODE)newmode); + newmode=-1; +} + + + #ifndef __USER_paul__ int padInput=PadGetHeld(0); int move=7*_frames; @@ -140,6 +152,7 @@ void CPlayer::think(int _frames) for(i=0;i<_frames;i++) { // Think + updatePadInput(); m_currentStateClass->think(this); // Horizontal movement @@ -397,9 +410,13 @@ DVECTOR CPlayer::getPlayerPos() { return Pos; } -int CPlayer::getPadInput() +int CPlayer::getPadInputHeld() { - return PadGetHeld(0); + return m_padInput; +} +int CPlayer::getPadInputDown() +{ + return m_padInputDown; } @@ -429,7 +446,6 @@ int CPlayer::isOnSolidGround() Params: Returns: ---------------------------------------------------------------------- */ - void CPlayer::moveLeft() { const PlayerMetrics *metrics; @@ -493,5 +509,31 @@ void CPlayer::fall() } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void CPlayer::updatePadInput() +{ + m_lastPadInput=m_padInput; + m_padInput=readPadInput(); + m_padInputDown=m_padInput&(m_lastPadInput^-1); +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int CPlayer::readPadInput() +{ + return PadGetHeld(0); +} + + /*=========================================================================== end */ diff --git a/source/player/player.h b/source/player/player.h index 765e79afe..7bdd30e70 100644 --- a/source/player/player.h +++ b/source/player/player.h @@ -66,6 +66,7 @@ typedef enum { PLAYER_MODE_BASICUNARMED, PLAYER_MODE_FULLUNARMED, + PLAYER_MODE_CORALBLOWER, NUM_PLAYERMODES, }PLAYER_MODE; @@ -133,7 +134,8 @@ protected: DVECTOR getMoveVelocity(); void setMoveVelocity(DVECTOR *_moveVel); DVECTOR getPlayerPos(); - virtual int getPadInput(); + int getPadInputHeld(); + int getPadInputDown(); // Collision int isOnSolidGround(); @@ -183,6 +185,12 @@ private: DVECTOR m_cameraOffsetTarget; DVECTOR m_cameraOffset; + void updatePadInput(); + virtual int readPadInput(); + int m_padInput; // Controls that are being held down + int m_lastPadInput; // Last frames controls + int m_padInputDown; // Controls that were pressed this frame + }; diff --git a/source/player/pmodes.cpp b/source/player/pmodes.cpp index 2b559102c..4b71db1a9 100644 --- a/source/player/pmodes.cpp +++ b/source/player/pmodes.cpp @@ -72,7 +72,8 @@ Vars ---- */ -CPlayerStateIdle stateIdle; +CPlayerStateUnarmedIdle stateUnarmedIdle; +CPlayerStateCoralBlowerIdle stateCoralBlowerIdle; CPlayerStateJump stateJump; CPlayerStateRun stateRun; CPlayerStateFall stateFall; @@ -113,7 +114,7 @@ CPlayer::PlayerMode CPlayer::s_modes[NUM_PLAYERMODES]= 1, // PM__RUN_SLOWDOWN } }, { - &stateIdle, // STATE_IDLE + &stateUnarmedIdle, // STATE_IDLE &stateJump, // STATE_JUMP &stateRun, // STATE_RUN &stateFall, // STATE_FALL @@ -146,7 +147,7 @@ CPlayer::PlayerMode CPlayer::s_modes[NUM_PLAYERMODES]= 1, // PM__RUN_SLOWDOWN } }, { - &stateIdle, // STATE_IDLE + &stateUnarmedIdle, // STATE_IDLE &stateJump, // STATE_JUMP &stateRun, // STATE_RUN &stateFall, // STATE_FALL @@ -161,7 +162,40 @@ CPlayer::PlayerMode CPlayer::s_modes[NUM_PLAYERMODES]= &stateSoackUp, // STATE_SOAKUP &stateGetup, // STATE_GETUP } - } + }, + + // + // Armed with coral blower + // + { + { { + 8, // PM__JUMP_VELOCITY + 10, // PM__MAX_JUMP_FRAMES + 20, // PM__MAX_SAFE_FALL_FRAMES + 4, // PM__GRAVITY_VALUE + 8, // PM__TERMINAL_VELOCITY + 4,//8, // PM__MAX_RUN_VELOCITY + 2,//4, // PM__RUN_SPEEDUP + 2, // PM__RUN_REVERSESLOWDOWN + 2,//1, // PM__RUN_SLOWDOWN + } }, + { + &stateCoralBlowerIdle, // STATE_IDLE + NULL, // STATE_JUMP + &stateRun, // STATE_RUN + &stateFall, // STATE_FALL + &stateFallFar, // STATE_FALLFAR + NULL, // STATE_BUTTBOUNCE + NULL, // STATE_BUTTFALL + NULL, // STATE_BUTTLAND + NULL, // STATE_ATTACK + NULL, // STATE_RUNATTACK + NULL, // STATE_AIRATTACK + NULL, // STATE_DUCK + NULL, // STATE_SOAKUP + NULL, // STATE_GETUP + } + }, }; diff --git a/source/player/pschop.cpp b/source/player/pschop.cpp index aa8a645d3..d24af28b1 100644 --- a/source/player/pschop.cpp +++ b/source/player/pschop.cpp @@ -90,14 +90,14 @@ void CPlayerStateChop::think(CPlayer *_player) ---------------------------------------------------------------------- */ void CPlayerStateRunChop::think(CPlayer *_player) { - int control; - control=getPadInput(_player); + int controlHeld; + controlHeld=getPadInputHeld(_player); - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) + if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) { moveLeft(_player); } - else if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) + else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) { moveRight(_player); } @@ -128,14 +128,14 @@ void CPlayerStateRunChop::think(CPlayer *_player) ---------------------------------------------------------------------- */ void CPlayerStateAirChop::think(CPlayer *_player) { - int control; - control=getPadInput(_player); + int controlHeld; + controlHeld=getPadInputHeld(_player); - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) + if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) { moveLeft(_player); } - else if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) + else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) { moveRight(_player); } diff --git a/source/player/psduck.cpp b/source/player/psduck.cpp index f8f40423f..c57e026a6 100644 --- a/source/player/psduck.cpp +++ b/source/player/psduck.cpp @@ -111,10 +111,10 @@ void CPlayerStateSoakUp::enter(CPlayer *_player) ---------------------------------------------------------------------- */ void CPlayerStateSoakUp::think(CPlayer *_player) { - int control; + int controlHeld; - control=getPadInput(_player); - if(!(control&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN))) + controlHeld=getPadInputHeld(_player); + if(!(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN))) { setState(_player,STATE_GETUP); } diff --git a/source/player/psfall.cpp b/source/player/psfall.cpp index e0ece7ef9..78daec84e 100644 --- a/source/player/psfall.cpp +++ b/source/player/psfall.cpp @@ -77,17 +77,17 @@ void CPlayerStateFall::enter(CPlayer *_player) void CPlayerStateFall::think(CPlayer *_player) { const PlayerMetrics *metrics; - int control; + int controlHeld; DVECTOR move; metrics=getPlayerMetrics(_player); - control=getPadInput(_player); + controlHeld=getPadInputHeld(_player); - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) + if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) { moveLeft(_player); } - else if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) + else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) { moveRight(_player); } @@ -96,11 +96,11 @@ void CPlayerStateFall::think(CPlayer *_player) slowdown(_player); } - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION)) + if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION)) { setState(_player,STATE_AIRATTACK); } - else if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN)) + else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN)) { move.vx=0; move.vy=0; @@ -131,16 +131,16 @@ void CPlayerStateFallFar::enter(CPlayer *_player) ---------------------------------------------------------------------- */ void CPlayerStateFallFar::think(CPlayer *_player) { - int control; - DVECTOR move; + int controlHeld; + DVECTOR move; - control=getPadInput(_player); + controlHeld=getPadInputHeld(_player); - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) + if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) { moveLeft(_player); } - else if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) + else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) { moveRight(_player); } diff --git a/source/player/psidle.cpp b/source/player/psidle.cpp index 2222e8d48..2e8aa2481 100644 --- a/source/player/psidle.cpp +++ b/source/player/psidle.cpp @@ -58,19 +58,6 @@ Vars ---- */ -CPlayerStateIdle::IdleAnims CPlayerStateIdle::s_idleAnims[]= -{ - // start frame loop frame end frame loop count -// { -1, ANIM_PLAYER_ANIM_IDLEGENERIC04, -1, 4 }, -// { -1, ANIM_PLAYER_ANIM_IDLEGENERIC04, -1, 10 }, -// { -1, ANIM_PLAYER_ANIM_IDLEGENERIC03, -1, 3 }, - { -1, ANIM_PLAYER_ANIM_IDLEBOOTS, -1, 4 }, - { -1, ANIM_PLAYER_ANIM_IDLECORAL, -1, 10 }, - { -1, ANIM_PLAYER_ANIM_WAKEUP, -1, 1 }, -}; -int CPlayerStateIdle::s_numIdleAnims=sizeof(CPlayerStateIdle::s_idleAnims)/sizeof(CPlayerStateIdle::IdleAnims); - - /*---------------------------------------------------------------------- Function: Purpose: @@ -95,27 +82,28 @@ void CPlayerStateIdle::enter(CPlayer *_player) ---------------------------------------------------------------------- */ void CPlayerStateIdle::think(CPlayer *_player) { - int control; - control=getPadInput(_player); + int controlDown,controlHeld; + controlDown=getPadInputDown(_player); + controlHeld=getPadInputHeld(_player); if(advanceAnimFrameAndCheckForEndOfAnim(_player)) { setNextIdleAnim(_player); } - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_JUMP)) + if(controlDown&CPadConfig::getButton(CPadConfig::PAD_CFG_JUMP)) { setState(_player,STATE_JUMP); } - else if(control&(CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)|CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT))) + else if(controlHeld&(CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)|CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT))) { setState(_player,STATE_RUN); } - else if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION)) + else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION)) { setState(_player,STATE_ATTACK); } - else if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN)) + else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN)) { setState(_player,STATE_DUCK); } @@ -131,9 +119,9 @@ void CPlayerStateIdle::think(CPlayer *_player) void CPlayerStateIdle::setNextIdleAnim(CPlayer *_player) { IdleAnims *anims; - int finished=false; + int finished=false; - anims=&s_idleAnims[m_currentIdleAnim]; + anims=getIdleAnimsDb(m_currentIdleAnim); switch(m_animState) { case ANIMSTATE_START: @@ -172,14 +160,14 @@ void CPlayerStateIdle::setNextIdleAnim(CPlayer *_player) } else { - if(s_numIdleAnims) + if(getNumIdleAnims()>1) { // Randomly choose the next anim to run int lastAnim; lastAnim=m_currentIdleAnim; do { - m_currentIdleAnim=getRndRange(s_numIdleAnims); + m_currentIdleAnim=getRndRange(getNumIdleAnims()); }while(m_currentIdleAnim==lastAnim); } else @@ -189,7 +177,7 @@ void CPlayerStateIdle::setNextIdleAnim(CPlayer *_player) } // Start playing the anim - anims=&s_idleAnims[m_currentIdleAnim]; + anims=getIdleAnimsDb(m_currentIdleAnim); if(anims->m_startFrame==-1) { // No start anim - go straight into loop @@ -211,5 +199,53 @@ void CPlayerStateIdle::setNextIdleAnim(CPlayer *_player) } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +static IdleAnims s_unarmedIdleAnims[]= +{ + // start frame loop frame end frame loop count + { -1, ANIM_PLAYER_ANIM_IDLEBOOTS, -1, 4 }, + { -1, ANIM_PLAYER_ANIM_IDLECORAL, -1, 10 }, + { -1, ANIM_PLAYER_ANIM_WAKEUP, -1, 1 }, +}; +static int s_numUnarmedIdleAnims=sizeof(s_unarmedIdleAnims)/sizeof(IdleAnims); +IdleAnims *CPlayerStateUnarmedIdle::getIdleAnimsDb(int _animNo) +{ + ASSERT(_animNom_metric[PM__MAX_JUMP_FRAMES]&&control&CPadConfig::getButton(CPadConfig::PAD_CFG_JUMP)) + if(m_jumpFrames<=metrics->m_metric[PM__MAX_JUMP_FRAMES]&&controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_JUMP)) { m_jumpFrames++; } @@ -98,15 +98,15 @@ void CPlayerStateJump::think(CPlayer *_player) setState(_player,STATE_FALL); } - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION)) + if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION)) { setState(_player,STATE_AIRATTACK); } - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) + if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) { moveLeft(_player); } - else if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) + else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) { moveRight(_player); } diff --git a/source/player/psrun.cpp b/source/player/psrun.cpp index fea50caad..40a73ea39 100644 --- a/source/player/psrun.cpp +++ b/source/player/psrun.cpp @@ -66,8 +66,8 @@ ---------------------------------------------------------------------- */ void CPlayerStateRun::enter(CPlayer *_player) { - int control; - control=getPadInput(_player); + int controlHeld; + controlHeld=getPadInputHeld(_player); if(getMoveVelocity(_player).vx) { @@ -78,11 +78,11 @@ void CPlayerStateRun::enter(CPlayer *_player) setAnimNo(_player,ANIM_PLAYER_ANIM_RUNSTART); } - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) + if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) { setFacing(_player,FACING_LEFT); } - else if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) + else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) { setFacing(_player,FACING_RIGHT); } @@ -99,27 +99,28 @@ void CPlayerStateRun::enter(CPlayer *_player) ---------------------------------------------------------------------- */ void CPlayerStateRun::think(CPlayer *_player) { - int control; - control=getPadInput(_player); + int controlDown,controlHeld; + controlDown=getPadInputDown(_player); + controlHeld=getPadInputHeld(_player); - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_JUMP)) + if(controlDown&CPadConfig::getButton(CPadConfig::PAD_CFG_JUMP)) { setState(_player,STATE_JUMP); } - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN)) + if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_DOWN)) { setState(_player,STATE_DUCK); } - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION)) + if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION)) { setState(_player,STATE_RUNATTACK); } - if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) + if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_LEFT)) { moveLeft(_player); } - else if(control&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) + else if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_RIGHT)) { moveRight(_player); } diff --git a/source/player/pstates.cpp b/source/player/pstates.cpp index 11f40f202..647cc2279 100644 --- a/source/player/pstates.cpp +++ b/source/player/pstates.cpp @@ -216,9 +216,21 @@ DVECTOR CPlayerState::getPlayerPos(CPlayer *_player) Params: Returns: ---------------------------------------------------------------------- */ -int CPlayerState::getPadInput(CPlayer *_player) +int CPlayerState::getPadInputHeld(CPlayer *_player) { - return _player->getPadInput(); + return _player->getPadInputHeld(); +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int CPlayerState::getPadInputDown(CPlayer *_player) +{ + return _player->getPadInputDown(); } diff --git a/source/player/pstates.h b/source/player/pstates.h index 2c658c6b8..fdad7feaa 100644 --- a/source/player/pstates.h +++ b/source/player/pstates.h @@ -54,7 +54,8 @@ protected: DVECTOR getMoveVelocity(class CPlayer *_player); void setMoveVelocity(class CPlayer *_player,DVECTOR *_moveVel); DVECTOR getPlayerPos(class CPlayer *_player); - int getPadInput(class CPlayer *_player); + int getPadInputHeld(class CPlayer *_player); + int getPadInputDown(class CPlayer *_player); int isOnSolidGround(class CPlayer *_player);