diff --git a/source/player/player.cpp b/source/player/player.cpp index 386332b06..38fb313a9 100644 --- a/source/player/player.cpp +++ b/source/player/player.cpp @@ -1574,6 +1574,18 @@ void CPlayer::springPlayerUp() m_currentPlayerModeClass->springPlayerUp(); } +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int haha=25; +void CPlayer::floatPlayerUp() +{ + m_moveVelocity.vy-=haha; +} + /*---------------------------------------------------------------------- Function: Purpose: @@ -2400,7 +2412,6 @@ int CPlayer::moveVertical(int _moveDistance) } else if(_moveDistance<0) { - // Must be below ground // Are we jumping into an impassable block? if((CGameScene::getCollision()->getCollisionBlock(pos.vx,pos.vy+_moveDistance)&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_NORMAL&& getHeightFromGround(pos.vx,pos.vy+_moveDistance)<=0) @@ -2409,6 +2420,14 @@ int CPlayer::moveVertical(int _moveDistance) _moveDistance=0; hitGround=true; } + else if((CGameScene::getCollision()->getCollisionBlock(pos.vx,pos.vy+_moveDistance-HEIGHT_FOR_HEAD_COLLISION)&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_NORMAL&& + getHeightFromGround(pos.vx,pos.vy+_moveDistance-HEIGHT_FOR_HEAD_COLLISION)<=0) + { + pos.vy=((pos.vy+_moveDistance)&0xfff0); + _moveDistance=0; + hitGround=true; + } + } else { diff --git a/source/player/player.h b/source/player/player.h index ce1499f4c..1b3cc879c 100644 --- a/source/player/player.h +++ b/source/player/player.h @@ -244,7 +244,8 @@ public: int getAnimNo(); void setAnimNo(int _animNo); - void springPlayerUp(); + void springPlayerUp(); // Springy branches + void floatPlayerUp(); // Geysers void teleportTo(int _x,int _y); private: @@ -425,6 +426,7 @@ public: { COLSIZE_BASE_WIDTH=30, COLSIZE_BASE_HEIGHT=60, + HEIGHT_FOR_HEAD_COLLISION=64, }; void resetPlayerCollisionSizeToBase(); void setPlayerCollisionSize(int _x,int _y,int _w,int _h);