This commit is contained in:
Paul 2001-02-06 21:09:45 +00:00
parent 854dd569d8
commit 89cd3b1fcc
8 changed files with 127 additions and 24 deletions

View file

@ -146,6 +146,7 @@ player_src := panimsfx \
pmodes \ pmodes \
psbutt \ psbutt \
pschop \ pschop \
psdead \
psduck \ psduck \
psfall \ psfall \
psidle \ psidle \

View file

@ -68,6 +68,8 @@
Vars Vars
---- */ ---- */
int s_health;
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
Function: Function:
Purpose: Purpose:
@ -113,6 +115,8 @@ m_animFrame=0;
m_cameraLookTimer=0; m_cameraLookTimer=0;
m_lastPadInput=m_padInput=0; m_lastPadInput=m_padInput=0;
s_health=5;
} }
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
@ -239,50 +243,39 @@ Pos.vy=((Pos.vy-16)&0xfffffff0)+colHeight;
// Was falling.. so we've just hit the ground // Was falling.. so we've just hit the ground
if(m_currentState==STATE_BUTTFALL) if(m_currentState==STATE_BUTTFALL)
{ {
// landed from a btt bounce
setState(STATE_BUTTLAND); setState(STATE_BUTTLAND);
} }
else if(m_currentState==STATE_FALLFAR) else if(m_currentState==STATE_FALLFAR)
{ {
// Landed from a painful long fall
setState(STATE_IDLE); setState(STATE_IDLE);
takeDamage(DAMAGE__FALL);
m_moveVel.vx=0; m_moveVel.vx=0;
CSoundMediator::playSfx(CSoundMediator::SFX_SPONGEBOB_LAND_AFTER_FALL);
} }
else if(m_moveVel.vx) else if(m_moveVel.vx)
{ {
// Landed from a jump with x movement
setState(STATE_RUN); setState(STATE_RUN);
// setAnimNo(ANIM_PLAYER_ANIM_RUNJUMPEND);
} }
else else
{ {
// Landed from a standing jump
setState(STATE_IDLE); setState(STATE_IDLE);
setAnimNo(ANIM_PLAYER_ANIM_JUMPEND); setAnimNo(ANIM_PLAYER_ANIM_JUMPEND);
} }
// m_moveVel.vy=0; m_moveVel.vy=0;
m_fallFrames=0; m_fallFrames=0;
} }
m_moveVel.vy=0;
} }
else else
{ {
if(m_currentState!=STATE_JUMP&&m_currentState!=STATE_BUTTBOUNCE) if(m_currentState!=STATE_FALL&&m_currentState!=STATE_BUTTFALL&&
{ m_currentState!=STATE_JUMP&&m_currentState!=STATE_BUTTBOUNCE)
// Fall
if(m_currentState!=STATE_FALL&&m_currentState!=STATE_BUTTFALL)
{ {
setState(STATE_FALL); setState(STATE_FALL);
} }
const PlayerMetrics *metrics;
metrics=getPlayerMetrics();
m_moveVel.vy+=PLAYER_GRAVITY;
if(m_moveVel.vy>=PLAYER_TERMINAL_VELOCITY<<VELOCITY_SHIFT)
{
m_moveVel.vy=PLAYER_TERMINAL_VELOCITY<<VELOCITY_SHIFT;
m_fallFrames++;
if(m_fallFrames>metrics->m_metric[PM__MAX_SAFE_FALL_FRAMES])
{
setState(STATE_FALLFAR);
}
}
}
} }
// Flashing.. // Flashing..
@ -297,6 +290,7 @@ if(getPadInputDown()&PAD_CIRCLE)
{ {
m_skel.blink(); m_skel.blink();
} }
/*
if(pad&CPadConfig::getButton(CPadConfig::PAD_CFG_UP)) if(pad&CPadConfig::getButton(CPadConfig::PAD_CFG_UP))
{ {
if(m_cameraLookTimer<=-LOOKAROUND_DELAY) if(m_cameraLookTimer<=-LOOKAROUND_DELAY)
@ -347,6 +341,7 @@ if(getPadInputDown()&PAD_CIRCLE)
} }
} }
} }
*/
} }
@ -722,6 +717,69 @@ void CPlayer::jump()
} }
void CPlayer::fall() void CPlayer::fall()
{ {
const PlayerMetrics *metrics;
metrics=getPlayerMetrics();
m_moveVel.vy+=PLAYER_GRAVITY;
if(m_moveVel.vy>=PLAYER_TERMINAL_VELOCITY<<VELOCITY_SHIFT)
{
m_moveVel.vy=PLAYER_TERMINAL_VELOCITY<<VELOCITY_SHIFT;
m_fallFrames++;
if(m_currentState!=STATE_BUTTFALL)
{
if(m_fallFrames>metrics->m_metric[PM__MAX_SAFE_FALL_FRAMES])
{
setState(STATE_FALLFAR);
}
}
}
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
#ifdef __VERSION_DEBUG__
int invincibleSponge=false; // NB: This is for debugging purposes only
#endif
void CPlayer::takeDamage(DAMAGE_TYPE _damage)
{
// Don't take damage if still recovering from the last hit
if(!m_invincibleFrameCount)
{
int ouchThatHurt=true;
// Check if we are currently immune to this damage type
switch(_damage)
{
case DAMAGE__FALL:
case DAMAGE__LAVA:
break;
case DAMAGE__ELECTROCUTION:
// if squeaky boots then ouchThatHurt=false;
break;
}
if(ouchThatHurt)
{
#ifdef __VERSION_DEBUG__
if(invincibleSponge){m_invincibleFrameCount=INVINCIBLE_FRAMES__HIT;return;}
#endif
if(s_health)
{
m_invincibleFrameCount=INVINCIBLE_FRAMES__HIT;
s_health--;
}
else
{
CSoundMediator::playSfx(CSoundMediator::SFX_SPONGEBOB_DEFEATED_JINGLE);
setState(STATE_DEAD);
}
}
}
} }

View file

@ -64,6 +64,8 @@ typedef enum
STATE_SOAKUP, STATE_SOAKUP,
STATE_GETUP, STATE_GETUP,
STATE_DEAD,
NUM_STATES, NUM_STATES,
}PLAYER_STATE; }PLAYER_STATE;
@ -95,6 +97,13 @@ typedef enum
NUM_PLAYER_METRICS NUM_PLAYER_METRICS
}PLAYER_METRIC; }PLAYER_METRIC;
typedef enum
{
DAMAGE__FALL,
DAMAGE__ELECTROCUTION,
DAMAGE__LAVA,
}DAMAGE_TYPE;
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
Structure defintions Structure defintions
@ -167,6 +176,8 @@ protected:
void jump(); void jump();
void fall(); void fall();
void takeDamage(DAMAGE_TYPE _damage);
friend class CPlayerState; friend class CPlayerState;
@ -203,7 +214,7 @@ private:
enum enum
{ {
INVIBCIBLE_FRAMES__START=120, // Invincible for this many frames at start of life INVIBCIBLE_FRAMES__START=120, // Invincible for this many frames at start of life
INVINCIBLE_FRAMES__HIT=25, // Invincible for this many frames after taking damage INVINCIBLE_FRAMES__HIT=50, // Invincible for this many frames after taking damage
LOOKAROUND_DELAY=90, // Frames before look around starts LOOKAROUND_DELAY=90, // Frames before look around starts
LOOKAROUND_SCROLLSPEED=2, // Speed to scroll at LOOKAROUND_SCROLLSPEED=2, // Speed to scroll at
@ -230,7 +241,7 @@ private:
int m_lastPadInput; // Last frames controls int m_lastPadInput; // Last frames controls
int m_padInputDown; // Controls that were pressed this frame int m_padInputDown; // Controls that were pressed this frame
// Pointer to the collision layer for the current layer // Pointer to the collision layer for the current map
class CLayerCollision *m_layerCollision; class CLayerCollision *m_layerCollision;
}; };

View file

@ -45,6 +45,10 @@
#include "player\psduck.h" #include "player\psduck.h"
#endif #endif
#ifndef __PLAYER__PSDEAD_H__
#include "player\psdead.h"
#endif
/* Std Lib /* Std Lib
------- */ ------- */
@ -84,6 +88,7 @@ CPlayerStateAirChop stateAirChop;
CPlayerStateDuck stateDuck; CPlayerStateDuck stateDuck;
CPlayerStateSoakUp stateSoackUp; CPlayerStateSoakUp stateSoackUp;
CPlayerStateGetUp stateGetup; CPlayerStateGetUp stateGetup;
CPlayerStateDead stateDead;
@ -124,6 +129,7 @@ CPlayer::PlayerMode CPlayer::s_modes[NUM_PLAYERMODES]=
&stateDuck, // STATE_DUCK &stateDuck, // STATE_DUCK
&stateSoackUp, // STATE_SOAKUP &stateSoackUp, // STATE_SOAKUP
&stateGetup, // STATE_GETUP &stateGetup, // STATE_GETUP
&stateDead, // STATE_DEAD
} }
}, },
@ -156,6 +162,7 @@ CPlayer::PlayerMode CPlayer::s_modes[NUM_PLAYERMODES]=
&stateDuck, // STATE_DUCK &stateDuck, // STATE_DUCK
&stateSoackUp, // STATE_SOAKUP &stateSoackUp, // STATE_SOAKUP
&stateGetup, // STATE_GETUP &stateGetup, // STATE_GETUP
&stateDead, // STATE_DEAD
} }
}, },
@ -188,6 +195,7 @@ CPlayer::PlayerMode CPlayer::s_modes[NUM_PLAYERMODES]=
NULL, // STATE_DUCK NULL, // STATE_DUCK
NULL, // STATE_SOAKUP NULL, // STATE_SOAKUP
NULL, // STATE_GETUP NULL, // STATE_GETUP
&stateDead, // STATE_DEAD
} }
}, },
}; };

View file

@ -98,6 +98,18 @@ void CPlayerStateButtBounceFall::enter(CPlayer *_player)
} }
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void CPlayerStateButtBounceFall::think(CPlayer *_player)
{
fall(_player);
}
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
Function: Function:
Purpose: Purpose:

View file

@ -44,6 +44,7 @@ class CPlayerStateButtBounceFall : public CPlayerState
{ {
public: public:
virtual void enter(class CPlayer *_player); virtual void enter(class CPlayer *_player);
virtual void think(class CPlayer *_player);
}; };

View file

@ -96,6 +96,8 @@ void CPlayerStateFall::think(CPlayer *_player)
slowdown(_player); slowdown(_player);
} }
fall(_player);
if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION)) if(controlHeld&CPadConfig::getButton(CPadConfig::PAD_CFG_ACTION))
{ {
setState(_player,STATE_AIRATTACK); setState(_player,STATE_AIRATTACK);
@ -148,6 +150,8 @@ void CPlayerStateFallFar::think(CPlayer *_player)
{ {
slowdown(_player); slowdown(_player);
} }
fall(_player);
} }

View file

@ -701,6 +701,14 @@ SOURCE=..\..\..\source\player\pschop.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\..\source\player\psdead.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\source\player\psdead.h
# End Source File
# Begin Source File
SOURCE=..\..\..\source\player\psduck.cpp SOURCE=..\..\..\source\player\psduck.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File