This commit is contained in:
Paul 2001-05-14 22:08:19 +00:00
parent b8d08e6ded
commit 56a8006029
10 changed files with 109 additions and 25 deletions

View File

@ -130,6 +130,35 @@ BubicleEmitterData CGameBubicleFactory::s_emitters[CGameBubicleFactory::NUM_TYPE
{0,0,0} // m_colour {0,0,0} // m_colour
} }
}, },
// TYPE_SPONGEBOBSOAKUP
{
0,0,0,0, // m_x,m_y,m_w,m_h
1,1, // m_birthRate,m_birthAmount
15, // m_life
true, // m_applyMapOffsets
{ // m_bubicleBase
10, // m_life
0,0,0, // m_vx,m_vdx,m_vxmax
-100,0,0, // m_vy,m_vdy,m_vymax
10,7, // m_w,m_h
0, // m_dvSizeChange
0,0, // m_theta,m_vtheta
0,0,0, // m_wobbleWidth,m_vwobbleWidth,m_vdwobbleWidth
0, // m_ot
{200,200,200} // m_colour
},
{ // m_bubicleRange
50, // m_life
0,0,0, // m_vx,m_vdx,m_vxmax
50,0,0, // m_vy,m_vdy,m_vymax
3,3, // m_w,m_h
0, // m_dvSizeChange
0,100, // m_theta,m_vtheta
10,0,0, // m_wobbleWidth,m_vwobbleWidth,m_vdwobbleWidth
0, // m_ot
{0,0,0} // m_colour
}
},
}; };

View File

@ -42,6 +42,7 @@ public:
TYPE_SMALL, TYPE_SMALL,
TYPE_MEDIUM, TYPE_MEDIUM,
TYPE_LARGE, TYPE_LARGE,
TYPE_SPONGEBOBSOAKUP,
NUM_TYPES NUM_TYPES
}GAMEBUBICLETYPE; }GAMEBUBICLETYPE;

View File

@ -121,7 +121,7 @@ void CSpatulaPickup::collect(class CPlayer *_player)
int spat_maxglint=50; int spat_maxglint=50;
int spat_glintgrowspeed=3; int spat_glintgrowspeed=3;
int spat_glintrotspeed=90; int spat_glintrotspeed=90;
DVECTOR spat_gxy={19,1}; DVECTOR spat_gxy={20,0};
static const int spat_glintFrames[]={FRM__GLINT1,FRM__GLINT2,FRM__GLINT3,FRM__GLINT4,FRM__GLINT4,FRM__GLINT3,FRM__GLINT2,FRM__GLINT1}; static const int spat_glintFrames[]={FRM__GLINT1,FRM__GLINT2,FRM__GLINT3,FRM__GLINT4,FRM__GLINT4,FRM__GLINT3,FRM__GLINT2,FRM__GLINT1};
void CSpatulaPickup::thinkPickup(int _frames) void CSpatulaPickup::thinkPickup(int _frames)
{ {

View File

@ -1627,9 +1627,10 @@ int invincibleSponge=false; // NB: This is for debugging purposes only so don't
#endif #endif
void CPlayer::takeDamage(DAMAGE_TYPE _damage,REACT_DIRECTION _reactDirection,CThing *_thing) void CPlayer::takeDamage(DAMAGE_TYPE _damage,REACT_DIRECTION _reactDirection,CThing *_thing)
{ {
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_invincibilityRingTimer==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_currentPlayerModeClass->getState()!=STATE_SOAKUP&& // Or soaking up
m_currentMode!=PLAYER_MODE_DEAD) // Or already dead! :)
{ {
int ouchThatHurt=true; int ouchThatHurt=true;
int ouchThatHurtSoMuchThatImJustGoingToDieNow=false; int ouchThatHurtSoMuchThatImJustGoingToDieNow=false;
@ -2079,12 +2080,14 @@ int CPlayer::moveVertical(int _moveDistance)
else else
{ {
// Stood on any important types of collision? // Stood on any important types of collision?
int colType; switch(m_layerCollision->getCollisionBlock(pos.vx,pos.vy+_moveDistance)&COLLISION_TYPE_MASK)
colType=m_layerCollision->getCollisionBlock(pos.vx,pos.vy+_moveDistance)&COLLISION_TYPE_MASK;
if(colType==COLLISION_TYPE_FLAG_DAMAGE)
{ {
takeDamage(DAMAGE__COLLISION_DAMAGE); case COLLISION_TYPE_FLAG_DAMAGE:
takeDamage(DAMAGE__COLLISION_DAMAGE);
break;
default:
break;
} }
} }
pos.vy+=_moveDistance; pos.vy+=_moveDistance;

View File

@ -177,6 +177,7 @@ public:
WATERLEVELSHIFT=5, WATERLEVELSHIFT=5,
WATERMAXHEALTH=(255<<WATERLEVELSHIFT), WATERMAXHEALTH=(255<<WATERLEVELSHIFT),
WATERHEALTHPART=WATERMAXHEALTH/(MAX_HEALTH+1), WATERHEALTHPART=WATERMAXHEALTH/(MAX_HEALTH+1),
WATERMINSOACKUPLEVEL=(245<<WATERLEVELSHIFT), // SB won't auto soak unless water is lower than this
}; };
typedef struct typedef struct
@ -357,8 +358,10 @@ public:
void useOneJelly() {m_jellyAmmo--;} void useOneJelly() {m_jellyAmmo--;}
int getJellyAmmo() {return m_jellyAmmo;} int getJellyAmmo() {return m_jellyAmmo;}
void setIsInWater(int _in) {m_isInWater=_in;} void setIsInWater(int _in) {m_isInWater=_in;}
int getIsInWater() {return m_isInWater;} int getIsInWater() {return m_isInWater;}
int getIsHealthFullSoICanStopSoakingUp() {return m_healthWaterLevel==WATERMAXHEALTH;}
int getIsHealthSoFullThatIDontNeedToSoakUp(){return m_healthWaterLevel>=WATERMINSOACKUPLEVEL;}
int isHoldingNet() {return m_currentMode==PLAYER_MODE_NET;} int isHoldingNet() {return m_currentMode==PLAYER_MODE_NET;}

View File

@ -294,7 +294,17 @@ void CPlayerModeBase::thinkVerticalMovement()
{ {
if(m_player->moveVertical(m_player->getMoveVelocity()->vy>>VELOCITY_SHIFT)) if(m_player->moveVertical(m_player->getMoveVelocity()->vy>>VELOCITY_SHIFT))
{ {
DVECTOR pos;
playerHasHitGround(); playerHasHitGround();
pos=m_player->getPlayerPos();
if(m_player->getHeightFromGround(pos.vx,pos.vy,5)==0&&
(m_player->getLayerCollision()->getCollisionBlock(pos.vx,pos.vy)&COLLISION_TYPE_MASK)==COLLISION_TYPE_FLAG_WATER&&
!m_player->getIsHealthSoFullThatIDontNeedToSoakUp())
{
// Hit water - Go into soakup mode
setState(STATE_SOAKUP);
}
} }
else if(m_currentState!=STATE_FALL&&m_currentState!=STATE_FALLFAR&& // Hmm.. (pkg) else if(m_currentState!=STATE_FALL&&m_currentState!=STATE_FALLFAR&& // Hmm.. (pkg)
m_currentState!=STATE_BUTTFALL&&m_currentState!=STATE_BUTTBOUNCE&& m_currentState!=STATE_BUTTFALL&&m_currentState!=STATE_BUTTBOUNCE&&

View File

@ -96,6 +96,7 @@ public:
virtual int isJellyfishNetFull() {ASSERT(0);return false;} // Fugly.. virtual int isJellyfishNetFull() {ASSERT(0);return false;} // Fugly..
virtual int setState(int _state) {return 0;} virtual int setState(int _state) {return 0;}
virtual int getState() {return STATE_IDLE;} // ARSE.. states need to go back in CPlayer! (pkg)
int getPadInputHeld(); int getPadInputHeld();
int getPadInputDown(); int getPadInputDown();
@ -103,9 +104,10 @@ public:
virtual ATTACK_STATE getAttackState() {return ATTACK_STATE__NONE;} virtual ATTACK_STATE getAttackState() {return ATTACK_STATE__NONE;}
public:
DVECTOR getPlayerPos(); // Public so that the states can get the position for bubicle spawners
protected: protected:
DVECTOR getPlayerPos(); void setPlayerPos(DVECTOR *_pos); // Private so that they cannot directly alter it
void setPlayerPos(DVECTOR *_pos);
void respawn(); void respawn();
@ -140,7 +142,7 @@ public:
virtual const struct PlayerMetrics *getPlayerMetrics(); virtual const struct PlayerMetrics *getPlayerMetrics();
virtual int setState(int _state); virtual int setState(int _state);
int getState() {return m_currentState;} virtual int getState() {return m_currentState;}
int getFacing(); int getFacing();
void setFacing(int _facing); void setFacing(int _facing);
virtual int getAnimNo(); virtual int getAnimNo();
@ -158,6 +160,10 @@ public:
virtual void setPlayerCollisionSize(int _x,int _y,int _w,int _h); virtual void setPlayerCollisionSize(int _x,int _y,int _w,int _h);
virtual void getPlayerCollisionSize(int *_x,int *_y,int *_w,int *_h); virtual void getPlayerCollisionSize(int *_x,int *_y,int *_w,int *_h);
int getIsInWater() {return m_player->getIsInWater();}
int getIsHealthFullSoICanStopSoakingUp() {return m_player->getIsHealthFullSoICanStopSoakingUp();}
int getIsHealthSoFullThatIDontNeedToSoakUp(){return m_player->getIsHealthSoFullThatIDontNeedToSoakUp();}
void moveLeft(); void moveLeft();
void moveRight(); void moveRight();
int slowdown(); int slowdown();

View File

@ -125,10 +125,12 @@ void CPlayerStateButtBounceFall::think(CPlayerModeBase *_playerMode)
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
void CPlayerStateButtBounceLand::enter(CPlayerModeBase *_playerMode) void CPlayerStateButtBounceLand::enter(CPlayerModeBase *_playerMode)
{ {
// DVECTOR pos; if(_playerMode->getIsInWater())
// {
// pos=_playerMode->getPlayerPos(); DVECTOR pos;
// CGameBubicleFactory::spawnBubicles(pos.vx,pos.vy,40,10,CGameBubicleFactory::TYPE_MEDIUM); pos=_playerMode->getPlayerPos();
CGameBubicleFactory::spawnBubicles(pos.vx-20,pos.vy,40,10,CGameBubicleFactory::TYPE_MEDIUM);
}
} }
@ -155,6 +157,13 @@ void CPlayerStateButtBounceLand::think(CPlayerModeBase *_playerMode)
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
void CPlayerStateButtBounceUp::enter(CPlayerModeBase *_playerMode) void CPlayerStateButtBounceUp::enter(CPlayerModeBase *_playerMode)
{ {
if(_playerMode->getIsInWater())
{
DVECTOR pos;
pos=_playerMode->getPlayerPos();
CGameBubicleFactory::spawnBubicles(pos.vx-20,pos.vy,40,10,CGameBubicleFactory::TYPE_MEDIUM);
}
_playerMode->setAnimNo(ANIM_SPONGEBOB_BUTTBOUNCEEND); _playerMode->setAnimNo(ANIM_SPONGEBOB_BUTTBOUNCEEND);
m_bounceFrames=0; m_bounceFrames=0;
} }

View File

@ -27,6 +27,10 @@
#include "player\pmodes.h" #include "player\pmodes.h"
#endif #endif
#ifndef __GAME_GAMEBUBS_H__
#include "game\gamebubs.h"
#endif
/* Std Lib /* Std Lib
------- */ ------- */
@ -99,7 +103,7 @@ void CPlayerStateSoakUp::enter(CPlayerModeBase *_playerMode)
_playerMode->zeroMoveVelocity(); _playerMode->zeroMoveVelocity();
_playerMode->setAnimNo(ANIM_SPONGEBOB_SOAKUP); _playerMode->setAnimNo(ANIM_SPONGEBOB_SOAKUP);
_playerMode->setAnimFrame(_playerMode->getAnimFrameCount()-1); _playerMode->setAnimFrame(_playerMode->getAnimFrameCount()-1);
_playerMode->setPlayerCollisionSize(0,-10,60,20); m_breatheDelayFrames=0;
} }
@ -111,16 +115,24 @@ void CPlayerStateSoakUp::enter(CPlayerModeBase *_playerMode)
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
void CPlayerStateSoakUp::think(CPlayerModeBase *_playerMode) void CPlayerStateSoakUp::think(CPlayerModeBase *_playerMode)
{ {
int controlHeld; if(!_playerMode->getIsHealthFullSoICanStopSoakingUp())
controlHeld=_playerMode->getPadInputHeld();
if(!(controlHeld&PI_DOWN))
{ {
_playerMode->setState(STATE_GETUP); if(m_breatheDelayFrames==0)
{
DVECTOR pos;
pos=_playerMode->getPlayerPos();
CGameBubicleFactory::spawnBubicles(pos.vx+BUBBLE_XOFF,pos.vy+BUBBLE_YOFF,BUBBLE_W,BUBBLE_H,CGameBubicleFactory::TYPE_SPONGEBOBSOAKUP);
m_breatheDelayFrames=0;
}
if(++m_breatheDelayFrames>BUBBLE_SPAWNDELAY)
{
m_breatheDelayFrames=0;
}
_playerMode->inSoakUpState();
} }
else else
{ {
_playerMode->inSoakUpState(); _playerMode->setState(STATE_GETUP);
} }
} }

View File

@ -47,6 +47,17 @@ public:
void enter(class CPlayerModeBase *_playerMode); void enter(class CPlayerModeBase *_playerMode);
void think(class CPlayerModeBase *_playerMode); void think(class CPlayerModeBase *_playerMode);
private:
enum
{
BUBBLE_SPAWNDELAY=20,
BUBBLE_XOFF=-10,
BUBBLE_YOFF=-35,
BUBBLE_W=20,
BUBBLE_H=10,
};
int m_breatheDelayFrames;
}; };