This commit is contained in:
Paul 2001-04-25 18:38:33 +00:00
parent a0467f42f5
commit 7bbfd89bba
5 changed files with 283 additions and 166 deletions

View File

@ -342,9 +342,9 @@ if(newmode!=-1)
{ {
m_squeakyBootsTimer--; m_squeakyBootsTimer--;
} }
if(m_invinvibilityRingTimer) if(m_invincibilityRingTimer)
{ {
m_invinvibilityRingTimer--; m_invincibilityRingTimer--;
} }
// Flashing.. // Flashing..
@ -542,6 +542,12 @@ int healthr=200;
int healthg=75; int healthg=75;
int healthb=75; int healthb=75;
#ifdef __USER_paul__
#define NUM_LASTPOS 50
static DVECTOR lastpos[NUM_LASTPOS];
static int lastposnum=0;
#endif
#ifdef __USER_paul__ #ifdef __USER_paul__
int mouth=-1,eyes=-1; int mouth=-1,eyes=-1;
#endif #endif
@ -554,6 +560,23 @@ sprintf(posBuf,"%03d (%02d) ,%03d (%02d) = dfg:%+02d",Pos.vx,Pos.vx&0x0f,Pos.vy,
m_fontBank->print(40,40,posBuf); m_fontBank->print(40,40,posBuf);
#endif #endif
#ifdef __USER_paul__
if(Pos.vx!=lastpos[lastposnum].vx||Pos.vy!=lastpos[lastposnum].vy)
{
lastposnum=(lastposnum+1)%NUM_LASTPOS;
lastpos[lastposnum]=Pos;
}
for(int i=0;i<NUM_LASTPOS;i++)
{
int x,y;
x=lastpos[i].vx-m_cameraPos.vx;
y=lastpos[i].vy-m_cameraPos.vy;
DrawLine(x-4,y-4,x+4,y+4,0,0,255,0);
DrawLine(x-4,y+4,x+4,y-4,0,0,255,0);
}
#endif
// Render // Render
if(m_invincibleFrameCount==0||m_invincibleFrameCount&2) if(m_invincibleFrameCount==0||m_invincibleFrameCount&2)
{ {
@ -882,7 +905,7 @@ void CPlayer::respawn()
m_glassesFlag=0; m_glassesFlag=0;
m_squeakyBootsTimer=0; m_squeakyBootsTimer=0;
m_invinvibilityRingTimer=0; m_invincibilityRingTimer=0;
m_bubbleAmmo=0; m_bubbleAmmo=0;
m_jellyAmmo=0; m_jellyAmmo=0;
@ -920,13 +943,11 @@ int CPlayer::canDoLookAround()
Params: Params:
Returns: Returns:
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
#ifdef __VERSION_DEBUG__
int invincibleSponge=false; // NB: This is for debugging purposes only so don't try and use it for a permenant cheat mode.. int invincibleSponge=false; // NB: This is for debugging purposes only so don't try and use it for a permenant cheat mode..
#endif
void CPlayer::takeDamage(DAMAGE_TYPE _damage) void CPlayer::takeDamage(DAMAGE_TYPE _damage)
{ {
if(m_invincibleFrameCount==0&& // Don't take damage if still recovering from the last hit if(m_invincibleFrameCount==0&& // Don't take damage if still recovering from the last hit
m_invinvibilityRingTimer==0&& // Or if we have the invincibility ring on m_invincibilityRingTimer==0&& // Or if we have the invincibility ring on
m_currentMode!=PLAYER_MODE_DEAD) // Or already dead! :) m_currentMode!=PLAYER_MODE_DEAD) // Or already dead! :)
{ {
int ouchThatHurt=true; int ouchThatHurt=true;
@ -960,9 +981,7 @@ void CPlayer::takeDamage(DAMAGE_TYPE _damage)
if(ouchThatHurt) if(ouchThatHurt)
{ {
#ifdef __VERSION_DEBUG__
if(invincibleSponge){m_invincibleFrameCount=INVINCIBLE_FRAMES__HIT;return;} if(invincibleSponge){m_invincibleFrameCount=INVINCIBLE_FRAMES__HIT;return;}
#endif
if(m_health) if(m_health)
{ {
m_invincibleFrameCount=INVINCIBLE_FRAMES__HIT; m_invincibleFrameCount=INVINCIBLE_FRAMES__HIT;
@ -1168,6 +1187,232 @@ bool CPlayer::getHasPlatformCollided()
} }
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
int CPlayer::moveVertical(int _moveDistance)
{
DVECTOR pos;
int hitGround;
// int colHeight;
pos=Pos;
hitGround=false;
// Are we falling?
if(_moveDistance>0)
{
int colHeightBefore,colHeightAfter;
// Yes.. Check to see if we're about to hit/go through the ground
colHeightBefore=getHeightFromGround(pos.vx,pos.vy,16);
colHeightAfter=getHeightFromGround(pos.vx,pos.vy+_moveDistance,16);
if(colHeightBefore>=0&&colHeightAfter<=0)
{
// Stick at ground level
pos.vy+=colHeightAfter+_moveDistance;
_moveDistance=0;
hitGround=true;
}
}
/*
}
else// if(getHeightFromGround(pos.vx,pos.vy+_moveDistance,1))
{
// Must be below ground
// Are we jumping into an impassable block?
if(_moveDistance>0&&
(m_layerCollision->getCollisionBlock(pos.vx,pos.vy+_moveDistance)&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_NORMAL)
{
pos.vy=(pos.vy&0xfff0);
_moveDistance=0;
hitGround=true;
}
else if(isOnPlatform()&&_moveDistance>=0)
{
pos.vy+=colHeight;
hitGround=true;
}
}
*/
pos.vy+=_moveDistance;
setPlayerPos(&pos);
return hitGround;
/*
DVECTOR pos;
int hitGround;
int colHeight;
pos=Pos;
hitGround=false;
colHeight=getHeightFromGround(pos.vx,pos.vy,1);
if(colHeight>=0)
{
// Above or on the ground
// Are we falling?
if(_moveDistance>0)
{
// Yes.. Check to see if we're about to hit/go through the ground
colHeight=getHeightFromGround(pos.vx,pos.vy+_moveDistance,16);
if(colHeight<=0)
{
// Stick at ground level
pos.vy+=colHeight+_moveDistance;
_moveDistance=0;
hitGround=true;
}
}
}
else// if(getHeightFromGround(pos.vx,pos.vy+_moveDistance,1))
{
// Must be below ground
// Are we jumping into an impassable block?
if(_moveDistance>0&&
(m_layerCollision->getCollisionBlock(pos.vx,pos.vy+_moveDistance)&COLLISION_TYPE_MASK)!=COLLISION_TYPE_FLAG_NORMAL)
{
pos.vy=(pos.vy&0xfff0);
_moveDistance=0;
hitGround=true;
}
else if(isOnPlatform()&&_moveDistance>=0)
{
pos.vy+=colHeight;
hitGround=true;
}
}
pos.vy+=_moveDistance;
setPlayerPos(&pos);
return hitGround;
*/
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
int CPlayer::moveHorizontal(int _moveDistance)
{
int hitWall;
hitWall=false;
if(_moveDistance)
{
CLayerCollision *collision;
DVECTOR pos;
int colHeight;
collision=getLayerCollision();
pos=getPlayerPos();
colHeight=getHeightFromGround(pos.vx,pos.vy,5);
if(colHeight==0)
{
// Ok.. we're on the ground. What happens if we move left/right
colHeight=getHeightFromGround(pos.vx+_moveDistance,pos.vy);
if(colHeight<-8)
{
// Big step up. Stop at the edge of the obstruction
int dir,vx,cx,i;
if(_moveDistance<0)
{
dir=-1;
vx=-_moveDistance;
}
else
{
dir=+1;
vx=_moveDistance;
}
cx=pos.vx;
for(i=0;i<vx;i++)
{
if(getHeightFromGround(cx,pos.vy)<-8)
{
break;
}
cx+=dir;
}
if(i)
pos.vx=cx-dir;
hitWall=true;
_moveDistance=0;
// Get the height at this new position and then try the step-up code below.
// Without this, there are problems when you run up a slope and hit a wall at the same time
colHeight=getHeightFromGround(pos.vx,pos.vy);
}
if(colHeight&&colHeight>=-8&&colHeight<=8)
{
// Small step up/down. Follow the contour of the level
pos.vy+=colHeight;
}
}
else
{
// In the air
/*
if((getLayerCollision()->getCollisionBlock(pos.vx+_moveDistance,pos.vy)&COLLISION_TYPE_MASK)==(6<<COLLISION_TYPE_FLAG_SHIFT))
{
// Hit an impassable block
pos.vx&=0xfff0;
if(_moveDistance>0)
{
pos.vx+=15;
}
_moveDistance=0;
}
else */if(colHeight>=0) // Lets you jump through platforms from below
{
colHeight=getHeightFromGround(pos.vx+_moveDistance,pos.vy,5);
if(colHeight<0)
{
// Stop at the edge of the obstruction
int dir,vx,cx,i;
if(_moveDistance<0)
{
dir=-1;
vx=_moveDistance;
}
else
{
dir=+1;
vx=_moveDistance;
}
cx=pos.vx;
for(i=0;i<vx;i++)
{
if(getHeightFromGround(cx,pos.vy)<0)
{
break;
}
cx+=dir;
}
if(i)
pos.vx=cx-dir;
_moveDistance=0;
}
}
}
pos.vx+=_moveDistance;
setPlayerPos(&pos);
}
return hitWall;
}
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
Function: Function:
Purpose: Purpose:

View File

@ -149,7 +149,8 @@ public:
virtual void think(int _frames); virtual void think(int _frames);
virtual void render(); virtual void render();
virtual void shove(DVECTOR move); virtual void shove(DVECTOR move);
// virtual int moveVertical(int _moveDistance); virtual int moveVertical(int _moveDistance);
virtual int moveHorizontal(int _moveDistance);
virtual void setHasPlatformCollided( bool newVal ); virtual void setHasPlatformCollided( bool newVal );
virtual bool getHasPlatformCollided(); virtual bool getHasPlatformCollided();
@ -271,7 +272,7 @@ public:
int isWearingGlasses() {return m_glassesFlag;} int isWearingGlasses() {return m_glassesFlag;}
void giveSqueakyBoots() {m_squeakyBootsTimer=SQUEAKY_BOOTS_TIME;} void giveSqueakyBoots() {m_squeakyBootsTimer=SQUEAKY_BOOTS_TIME;}
int isWearingBoots() {return m_squeakyBootsTimer;} int isWearingBoots() {return m_squeakyBootsTimer;}
void giveInvinvibilityRing() {m_invinvibilityRingTimer=INVINCIBILITY_RING_TIME;} void giveInvincibilityRing() {m_invincibilityRingTimer=INVINCIBILITY_RING_TIME;}
void giveDivingHelmet() {m_divingHelmet=true;} void giveDivingHelmet() {m_divingHelmet=true;}
void giveBubbleAmmo() {m_bubbleAmmo+=10;if(m_bubbleAmmo>99)m_bubbleAmmo=99;} void giveBubbleAmmo() {m_bubbleAmmo+=10;if(m_bubbleAmmo>99)m_bubbleAmmo=99;}
@ -285,7 +286,7 @@ public:
private: private:
int m_glassesFlag; int m_glassesFlag;
int m_squeakyBootsTimer; int m_squeakyBootsTimer;
int m_invinvibilityRingTimer; int m_invincibilityRingTimer;
int m_divingHelmet; int m_divingHelmet;
int m_bubbleAmmo; int m_bubbleAmmo;
int m_jellyAmmo; int m_jellyAmmo;

View File

@ -71,6 +71,8 @@ void CPlayerModeDead::think()
m_player->setAnimFrame(m_deadTime); m_player->setAnimFrame(m_deadTime);
} }
m_player->moveVertical(5);
if((m_deadTime>DEATH_DELAY&&m_player->getPadInputDown()&PI_ACTION)|| if((m_deadTime>DEATH_DELAY&&m_player->getPadInputDown()&PI_ACTION)||
m_deadTime>DEATH_TIMEOUT) m_deadTime>DEATH_TIMEOUT)
{ {
@ -104,16 +106,16 @@ void CPlayerModeDead::render(DVECTOR *_pos)
Params: Params:
Returns: Returns:
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
/*
void CPlayerModeDead::fall() void CPlayerModeDead::fall()
{ {
m_moveVelocity.vy+=getPlayerMetrics()->m_metric[DEFAULT_PLAYER_PLAYER_GRAVITY]; /*
if(m_moveVelocity.vy>=metrics->m_metric[DEFAULT_PLAYER_TERMINAL_VELOCITY]<<VELOCITY_SHIFT) m_yVelocity+=getPlayerMetrics()->m_metric[DEFAULT_PLAYER_PLAYER_GRAVITY];
if(m_yVelocity>=metrics->m_metric[DEFAULT_PLAYER_TERMINAL_VELOCITY]<<VELOCITY_SHIFT)
{ {
m_moveVelocity.vy=metrics->m_metric[DEFAULT_PLAYER_TERMINAL_VELOCITY]<<VELOCITY_SHIFT; m_yVelocity=metrics->m_metric[DEFAULT_PLAYER_TERMINAL_VELOCITY]<<VELOCITY_SHIFT;
} }
*/
} }
*/
/*=========================================================================== /*===========================================================================
end */ end */

View File

@ -50,8 +50,8 @@ private:
}; };
int m_deadTime; int m_deadTime;
void fall();
// void fall(); int m_yVelocity;
}; };

View File

@ -252,58 +252,22 @@ ATTACK_STATE CPlayerModeBase::getAttackState()
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
void CPlayerModeBase::thinkVerticalMovement() void CPlayerModeBase::thinkVerticalMovement()
{ {
CLayerCollision *collision; if(m_player->moveVertical(m_moveVelocity.vy>>VELOCITY_SHIFT))
DVECTOR pos;
int colHeight;
collision=m_player->getLayerCollision();
pos=m_player->getPlayerPos();
colHeight=m_player->getHeightFromGround(pos.vx,pos.vy,1);
if(colHeight>=0)
{ {
// Above or on the ground playerHasHitGround();
// Are we falling? }
if(m_moveVelocity.vy>0) else if(m_currentState!=STATE_FALL&&m_currentState!=STATE_FALLFAR&&
m_currentState!=STATE_BUTTFALL&&m_currentState!=STATE_BUTTBOUNCE&&
m_currentState!=STATE_JUMP)
{
DVECTOR pos;
pos=m_player->getPlayerPos();
if(m_player->getHeightFromGround(pos.vx,pos.vy,1)!=0)
{ {
// Yes.. Check to see if we're about to hit/go through the ground // Was floating in the air.. fall!
colHeight=m_player->getHeightFromGround(pos.vx,pos.vy+(m_moveVelocity.vy>>VELOCITY_SHIFT),getPlayerMetrics()->m_metric[PM__TERMINAL_VELOCITY]+1); setState(STATE_FALL);
if(colHeight<=0)
{
// Just hit the ground
// Stick at ground level
pos.vy+=(m_moveVelocity.vy>>VELOCITY_SHIFT)+colHeight;
playerHasHitGround();
}
}
else if(colHeight)
{
if(m_currentState!=STATE_FALL&&m_currentState!=STATE_FALLFAR&&
m_currentState!=STATE_BUTTFALL&&m_currentState!=STATE_BUTTBOUNCE&&
m_currentState!=STATE_JUMP)
{
// Was floating in the air.. fall!
setState(STATE_FALL);
}
} }
} }
else
{
if((m_player->getLayerCollision()->getCollisionBlock(pos.vx,pos.vy+(m_moveVelocity.vy>>VELOCITY_SHIFT))&COLLISION_TYPE_MASK)==(6<<COLLISION_TYPE_FLAG_SHIFT))
{
// Hit an impassable block
pos.vy=(pos.vy&0xfff0)+16;
m_moveVelocity.vy=0;
}
else if ( m_player->isOnPlatform() && m_moveVelocity.vy >= 0 )
{
pos.vy += colHeight;
playerHasHitGround();
}
}
pos.vy+=m_moveVelocity.vy>>VELOCITY_SHIFT;
m_player->setPlayerPos(&pos);
} }
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
@ -314,109 +278,14 @@ void CPlayerModeBase::thinkVerticalMovement()
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
void CPlayerModeBase::thinkHorizontalMovement() void CPlayerModeBase::thinkHorizontalMovement()
{ {
if(m_moveVelocity.vx) if(m_player->moveHorizontal(m_moveVelocity.vx>>VELOCITY_SHIFT))
{ {
CLayerCollision *collision; // If running then go to idle, otherwise leave in same state
DVECTOR pos; if(m_currentState==STATE_RUN)
int colHeight;
collision=m_player->getLayerCollision();
pos=m_player->getPlayerPos();
colHeight=m_player->getHeightFromGround(pos.vx,pos.vy,5);
if(colHeight==0)
{ {
// Ok.. we're on the ground. What happens if we move left/right setState(STATE_IDLE);
colHeight=m_player->getHeightFromGround(pos.vx+(m_moveVelocity.vx>>VELOCITY_SHIFT),pos.vy);
if(colHeight<-8)
{
// Big step up. Stop at the edge of the obstruction
int dir,vx,cx,i;
if(m_moveVelocity.vx<0)
{
dir=-1;
vx=-m_moveVelocity.vx>>VELOCITY_SHIFT;
}
else
{
dir=+1;
vx=m_moveVelocity.vx>>VELOCITY_SHIFT;
}
cx=pos.vx;
for(i=0;i<vx;i++)
{
if(m_player->getHeightFromGround(cx,pos.vy)<-8)
{
break;
}
cx+=dir;
}
if(i)
pos.vx=cx-dir;
// If running then go to idle, otherwise leave in same state
if(m_currentState==STATE_RUN)
{
setState(STATE_IDLE);
}
m_moveVelocity.vx=0;
// Get the height at this new position and then try the step-up code below.
// Without this, there are problems when you run up a slope and hit a wall at the same time
colHeight=m_player->getHeightFromGround(pos.vx,pos.vy);
}
if(colHeight&&colHeight>=-8&&colHeight<=8)
{
// Small step up/down. Follow the contour of the level
pos.vy+=colHeight;
}
} }
else m_moveVelocity.vx=0;
{
// In the air
if((m_player->getLayerCollision()->getCollisionBlock(pos.vx+(m_moveVelocity.vx>>VELOCITY_SHIFT),pos.vy)&COLLISION_TYPE_MASK)==(6<<COLLISION_TYPE_FLAG_SHIFT))
{
// Hit an impassable block
pos.vx&=0xfff0;
if(m_moveVelocity.vx>0)
{
pos.vx+=15;
}
m_moveVelocity.vx=0;
}
else if(colHeight>=0) // Lets you jump through platforms from below
{
colHeight=m_player->getHeightFromGround(pos.vx+(m_moveVelocity.vx>>VELOCITY_SHIFT),pos.vy,5);
if(colHeight<0)
{
// Stop at the edge of the obstruction
int dir,vx,cx,i;
if(m_moveVelocity.vx<0)
{
dir=-1;
vx=m_moveVelocity.vx>>VELOCITY_SHIFT;
}
else
{
dir=+1;
vx=m_moveVelocity.vx>>VELOCITY_SHIFT;
}
cx=pos.vx;
for(i=0;i<vx;i++)
{
if(m_player->getHeightFromGround(cx,pos.vy)<0)
{
break;
}
cx+=dir;
}
if(i)
pos.vx=cx-dir;
m_moveVelocity.vx=0;
}
}
}
pos.vx+=m_moveVelocity.vx>>VELOCITY_SHIFT;
m_player->setPlayerPos(&pos);
} }
} }