diff --git a/source/player/player.cpp b/source/player/player.cpp index 4763077bb..9d19e33f4 100644 --- a/source/player/player.cpp +++ b/source/player/player.cpp @@ -2609,9 +2609,17 @@ int CPlayer::moveVertical(int _moveDistance) { if(colHeightBefore[i]>=0&&colHeightAfter[i]<=0) { - moveRequired[i]=colHeightAfter[i]; - hitGround=true; - if(!hitThisSuspectBlock)hitThisSuspectBlock=blockAfter[i]; + int goingIntoThisBlock=blockAfter[i]&COLLISION_TYPE_MASK; + if(goingIntoThisBlock!=COLLISION_TYPE_FLAG_DEATH_FALL) + { + moveRequired[i]=colHeightAfter[i]; + hitGround=true; + } + else + { + moveRequired[i]=0; + } + if(!hitThisSuspectBlock)hitThisSuspectBlock=goingIntoThisBlock; } else { @@ -2720,6 +2728,7 @@ int CPlayer::moveVertical(int _moveDistance) // Stood on any important types of collision? hitThisSuspectBlock=CGameScene::getCollision()->getCollisionBlock(pos.vx,pos.vy+_moveDistance); } + pos.vy+=_moveDistance; setPlayerPos(&pos); diff --git a/source/player/pmdead.cpp b/source/player/pmdead.cpp index 7e8517d0a..b15c493bd 100644 --- a/source/player/pmdead.cpp +++ b/source/player/pmdead.cpp @@ -53,6 +53,8 @@ Vars ---- */ +static int anim=0; + /*---------------------------------------------------------------------- Function: Purpose: @@ -61,38 +63,35 @@ ---------------------------------------------------------------------- */ void CPlayerModeDead::enter() { - int deathAnim; - m_deadTime=0; switch(m_player->getDeathType()) { default: case DEATHTYPE__NORMAL: - deathAnim=ANIM_SPONGEBOB_DEATHFORWARDS; + m_deathAnim=ANIM_SPONGEBOB_DEATHFORWARDS; break; case DEATHTYPE__DRYUP: - deathAnim=ANIM_SPONGEBOB_DEATHDRY; + m_deathAnim=ANIM_SPONGEBOB_DEATHDRY; break; case DEATHTYPE__SQUASH: - deathAnim=ANIM_SPONGEBOB_DEATHSQUASH; + m_deathAnim=ANIM_SPONGEBOB_DEATHSQUASH; break; case DEATHTYPE__LIQUID: - deathAnim=ANIM_SPONGEBOB_DEATHFORWARDS; + m_deathAnim=ANIM_SPONGEBOB_DEATHFORWARDS; break; case DEATHTYPE__FALL_TO_DEATH: - deathAnim=-1; + m_deathAnim=-1; break; } - if(deathAnim!=-1) + if(m_deathAnim!=-1) { - m_player->setAnimNo(deathAnim); + m_player->setAnimNo(m_deathAnim); } CSoundMediator::stopSpeech(); - m_killed=false; } @@ -107,23 +106,37 @@ void CPlayerModeDead::think() m_deadTime++; if(m_player->getDeathType()!=DEATHTYPE__FALL_TO_DEATH) { - if(m_deadTimegetAnimFrameCount()) + int frameCount,frame; + + if(m_deathAnim!=-1) { - m_player->setAnimFrame(m_deadTime); + m_player->setAnimNo(m_deathAnim); } + frameCount=m_player->getAnimFrameCount()-1; + if(m_deadTime<=frameCount) + { + frame=m_deadTime; + } + else + { + frame=frameCount; + } + m_player->setAnimFrame(frame); } m_player->moveVertical(5); if(!m_killed) - if((m_deadTime>DEATH_DELAY&&m_player->getPadInputDown()&(PI_JUMP|PI_FIRE))|| - m_deadTime>DEATH_TIMEOUT) { - // Take a life off.. - CGameSlotManager::getSlotData()->m_lives--; + if((m_deadTime>DEATH_DELAY&&m_player->getPadInputDown()&(PI_JUMP|PI_FIRE))|| + m_deadTime>DEATH_TIMEOUT) + { + // Take a life off.. + CGameSlotManager::getSlotData()->m_lives--; - CGameScene::restartlevel(); - m_killed=true; + CGameScene::restartlevel(); + m_killed=true; + } } } diff --git a/source/player/pmdead.h b/source/player/pmdead.h index 30c561a2d..33780bc39 100644 --- a/source/player/pmdead.h +++ b/source/player/pmdead.h @@ -49,12 +49,14 @@ private: DEATH_TIMEOUT=5*60, // SB respawns automatically after this long }; int m_deadTime; + int m_deathAnim; void fall(); int m_yVelocity; int m_killed; + };