This commit is contained in:
Paul 2001-05-03 23:45:28 +00:00
parent e216c50350
commit 961ad4e212
9 changed files with 169 additions and 25 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -174,10 +174,12 @@ INGAMEFX_GFX_DIR := $(GRAF_DIR)/ingamefx
INGAMEFX_GFX_TRANS := +bubble_1 +bubble_2 +bubble_3 \
+health_full_1 +health_full_2 +health_full_3 +health_full_4 +health_full_5 \
+health_empty_1 +health_empty_2 +health_empty_3 +health_empty_4 +health_empty_5 \
+watermeter +netblob \
+watermeter +waterhilight +netblob \
+spike
INGAMEFX_GFX_TRANS_NONROT_NONCLIP := +water
INGAMEFX_GFX_TRANS_IN := $(foreach FILE,$(INGAMEFX_GFX_TRANS),$(INGAMEFX_GFX_DIR)/$(FILE).bmp)
INGAMEFX_GFX_TRANS_NONROT_NONCLIP_IN := $(foreach FILE,$(INGAMEFX_GFX_TRANS_NONROT_NONCLIP),$(INGAMEFX_GFX_DIR)/$(FILE).bmp)
####
@ -229,11 +231,12 @@ UI_GFX_TRANS_IN := $(foreach FILE,$(UI_GFX_TRANS),$(UI_GFX_DIR)/$(FILE))
####
INGAMEGFX_SPR_DEP := $(INGAMEFX_GFX_NONTRANS_IN) $(INGAMEFX_GFX_TRANS_IN) $(PICKUP_GFX_IN) \
$(UI_GFX_FONT_IN) $(UI_GFX_NONTRANS_IN) $(UI_GFX_TRANS_IN)
INGAMEGFX_SPR_DEP := $(INGAMEFX_GFX_NONTRANS_IN) $(INGAMEFX_GFX_TRANS_IN) $(INGAMEFX_GFX_TRANS_NONROT_NONCLIP_IN) \
$(PICKUP_GFX_IN) $(UI_GFX_FONT_IN) $(UI_GFX_NONTRANS_IN) $(UI_GFX_TRANS_IN)
INGAMEGFX_SPR_IN := -c+ -z+ $(INGAMEFX_GFX_TRANS_IN) $(PICKUP_GFX_IN) $(UI_GFX_FONT_IN) $(UI_GFX_TRANS_IN) \
-c- -z- $(INGAMEFX_GFX_NONTRANS_IN) $(UI_GFX_NONTRANS_IN)
-c- -z- $(INGAMEFX_GFX_NONTRANS_IN) $(UI_GFX_NONTRANS_IN) \
-c- -q- -z+ -r- $(INGAMEFX_GFX_TRANS_NONROT_NONCLIP_IN)
#----------------------------------------------------------------------------
# Front end graphics

View File

@ -309,6 +309,10 @@ void CGameScene::initLevel()
DVECTOR mapSize=Level.getMapSize();
CPlayer::CameraBox camBox={0,0,mapSize.vx,mapSize.vy};
m_player->setCameraBox(camBox);
if(s_globalLevelSelectThing==1)
{
m_player->setHealthType(CPlayer::HEALTH_TYPE__OUT_OF_WATER);
}
// Init actors (needs moving and tidying
int actorNum;

View File

@ -126,8 +126,6 @@
#define _STATE_DEBUG_
#define SLIPSPEED 10 // Speed that player slips on icy surfaces
/*----------------------------------------------------------------------
Structure defintions
-------------------- */
@ -261,6 +259,9 @@ pint ledgeShift=1;
pint cammove=2;
pint waterDrainSpeed=4;
pint waterSoakUpSpeed=20;
// --------------------------------- Addon stuff ---------------------------------
@ -493,6 +494,9 @@ registerAddon(PLAYER_ADDON_JELLYLAUNCHER);
registerAddon(PLAYER_ADDON_GLASSES);
registerAddon(PLAYER_ADDON_BUBBLEWAND);
//#endif
setHealthType(HEALTH_TYPE__NORMAL);
}
/*----------------------------------------------------------------------
@ -542,6 +546,14 @@ void CPlayer::think(int _frames)
{
int i;
if(m_healthType==HEALTH_TYPE__OUT_OF_WATER&&m_currentMode!=PLAYER_MODE_DEAD)
{
m_healthWaterLevel-=waterDrainSpeed*_frames;
if(m_healthWaterLevel<=0)
{
dieYouPorousFreak();
}
}
if(PadGetDown(0)&PAD_L1)
{
@ -808,11 +820,6 @@ static int lastposnum=0;
int mouth=-1,eyes=-1;
#endif
int itembaseX=110;
int itembaseY=60;
int itemgap=40;
#include "gui\gui.h"
void CPlayer::render()
{
@ -861,7 +868,9 @@ for(int i=0;i<NUM_LASTPOS;i++)
// Health
if(m_healthType==HEALTH_TYPE__NORMAL)
{
// In water - Use normal SB face for health
static int s_fullHealthFrames[]=
{
FRM__HEALTH_FULL_1,
@ -902,9 +911,34 @@ for(int i=0;i<NUM_LASTPOS;i++)
y+=ygap;
}
}
else
{
// Out of water - Use bowl of water
POLY_FT4 *ft4;
sFrameHdr *fh;
int V,W,H,partH;
ft4=m_spriteBank->printFT4(FRM__WATERHILIGHT,HEALTH_ICONX,HEALTH_ICONY,0,0,0);
setSemiTrans(ft4,true);
m_spriteBank->printFT4(FRM__WATERMETER,HEALTH_ICONX,HEALTH_ICONY,0,0,0);
fh=m_spriteBank->getFrameHeader(FRM__WATER);
ft4=m_spriteBank->printFT4(fh,0,0,0,0,0);
setSemiTrans(ft4,true);
V=fh->V;
W=fh->W;
H=fh->H;
partH=(H*(255-(m_healthWaterLevel>>WATERLEVELSHIFT)))>>8;
if(partH>H)partH=H;
setXYWH(ft4,HEALTH_ICONX,HEALTH_ICONY+(partH),W,H-partH);
ft4->v0=V+(partH);
ft4->v1=V+(partH);
}
// Mode specific ui
int itemX=itembaseX;
int itemX=COLLECTEDITEM_BASEX;
// Pickups
m_currentPlayerModeClass->renderModeUi();
@ -913,16 +947,16 @@ for(int i=0;i<NUM_LASTPOS;i++)
int x,y;
sFrameHdr *fh=m_spriteBank->getFrameHeader(FRM__SHOE);
x=itemX-(fh->W/2);
y=itembaseY-(fh->H/2);
y=COLLECTEDITEM_BASEY-(fh->H/2);
m_spriteBank->printFT4(fh,x+2,y+2,0,0,0);
m_spriteBank->printFT4(fh,x-2,y-2,0,0,0);
itemX+=itemgap;
itemX+=COLLECTEDITEM_GAP;
}
if(isWearingHelmet())
{
sFrameHdr *fh=m_spriteBank->getFrameHeader(FRM__HELMET);
m_spriteBank->printFT4(fh,itemX-(fh->W/2),itembaseY-(fh->H/2),0,0,0);
itemX+=itemgap;
m_spriteBank->printFT4(fh,itemX-(fh->W/2),COLLECTEDITEM_BASEY-(fh->H/2),0,0,0);
itemX+=COLLECTEDITEM_GAP;
}
}
@ -1001,10 +1035,21 @@ int CPlayer::getHeightFromGroundNoPlatform(int _x,int _y,int _maxHeight=32)
---------------------------------------------------------------------- */
void CPlayer::addHealth(int _health)
{
m_health+=_health;
if(m_health>MAX_HEALTH)
if(m_healthType==HEALTH_TYPE__NORMAL)
{
m_health=MAX_HEALTH;
m_health+=_health;
if(m_health>MAX_HEALTH)
{
m_health=MAX_HEALTH;
}
}
else
{
m_healthWaterLevel+=WATERHEALTHPART*_health;
if(m_healthWaterLevel>WATERMAXHEALTH)
{
m_healthWaterLevel=WATERMAXHEALTH;
}
}
}
@ -1240,6 +1285,7 @@ void CPlayer::respawn()
m_allowConversation=false;
m_health=MAX_HEALTH;
m_healthWaterLevel=WATERMAXHEALTH;
m_healthReactFrames=0;
m_invincibleFrameCount=INVINCIBLE_FRAMES__START;
Pos=m_respawnPos;
@ -1333,6 +1379,26 @@ int CPlayer::canDoLookAround()
return m_currentPlayerModeClass->canDoLookAround();
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void CPlayer::inSoakUpState()
{
if(m_healthType==HEALTH_TYPE__OUT_OF_WATER&&
(m_layerCollision->getCollisionBlock(Pos.vx,Pos.vy)&COLLISION_TYPE_MASK)==COLLISION_TYPE_FLAG_WATER)
{
m_healthWaterLevel+=waterSoakUpSpeed;
if(m_healthWaterLevel>WATERMAXHEALTH)
{
m_healthWaterLevel=WATERMAXHEALTH;
}
}
}
/*----------------------------------------------------------------------
Function:
Purpose:
@ -1377,22 +1443,52 @@ void CPlayer::takeDamage(DAMAGE_TYPE _damage)
if(ouchThatHurt)
{
int died=false;
if(invincibleSponge){m_invincibleFrameCount=INVINCIBLE_FRAMES__HIT;return;}
if(m_health)
if(m_healthType==HEALTH_TYPE__NORMAL)
{
m_invincibleFrameCount=INVINCIBLE_FRAMES__HIT;
m_healthReactFrames=25;
m_health--;
if(m_health<0)
{
died=true;
}
}
else
{
CSoundMediator::playSfx(CSoundMediator::SFX_SPONGEBOB_DEFEATED_JINGLE);
setMode(PLAYER_MODE_DEAD);
m_healthWaterLevel-=WATERHEALTHPART;
if(m_healthWaterLevel<0)
{
died=true;
}
}
if(died)
{
dieYouPorousFreak();
}
else
{
m_invincibleFrameCount=INVINCIBLE_FRAMES__HIT;
m_healthReactFrames=25;
}
}
}
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void CPlayer::dieYouPorousFreak()
{
ASSERT(m_currentMode!=PLAYER_MODE_DEAD);
CSoundMediator::playSfx(CSoundMediator::SFX_SPONGEBOB_DEFEATED_JINGLE);
setMode(PLAYER_MODE_DEAD);
}
/*----------------------------------------------------------------------
Function:

View File

@ -155,6 +155,10 @@ public:
{
MAX_HEALTH=5,
MAX_LIVES=99,
WATERLEVELSHIFT=4,
WATERMAXHEALTH=(255<<WATERLEVELSHIFT),
WATERHEALTHPART=WATERMAXHEALTH/(MAX_HEALTH+1),
};
typedef struct
@ -224,7 +228,8 @@ public:
PLAYERINPUT getPadInputHeld() {return m_padInput;}
PLAYERINPUT getPadInputDown() {return m_padInputDown;}
class CLayerCollision *getLayerCollision() {return m_layerCollision;}
void inSoakUpState();
void takeDamage(DAMAGE_TYPE _damage);
void respawn();
@ -241,6 +246,8 @@ public:
int canDoLookAround();
private:
typedef struct
{
@ -276,10 +283,26 @@ private:
class CPlayerMode *m_currentPlayerModeClass;
int m_currentMode;
public:
typedef enum
{
HEALTH_TYPE__NORMAL,
HEALTH_TYPE__OUT_OF_WATER,
} HEALTH_TYPE;
void setHealthType(HEALTH_TYPE _healthType) {m_healthType=_healthType;}
private:
int m_lives;
HEALTH_TYPE m_healthType;
int m_health;
int m_healthWaterLevel;
int m_healthReactFrames;
void dieYouPorousFreak();
void updatePadInput();
protected:
virtual PLAYERINPUT readPadInput();
@ -370,6 +393,9 @@ public:
POWERUPUI_TEXTX=440,
POWERUPUI_TEXTY=37,
POWERUPUI_OT=0,
COLLECTEDITEM_BASEX=110,
COLLECTEDITEM_BASEY=60,
COLLECTEDITEM_GAP=40,
};
private:

View File

@ -132,6 +132,16 @@ static PlayerMetrics s_playerMetrics=
int CPlayerMode::getPadInputHeld() {return m_player->getPadInputHeld();}
int CPlayerMode::getPadInputDown() {return m_player->getPadInputDown();}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void CPlayerMode::inSoakUpState() {m_player->inSoakUpState();}
/*----------------------------------------------------------------------
Function:
Purpose:

View File

@ -86,6 +86,7 @@ public:
virtual void renderModeUi() {;} // Ui specific to this mode (eg: ammo)
virtual int canDoLookAround() {return false;}
virtual void springPlayerUp() {;}
void inSoakUpState();
int getPadInputHeld();

View File

@ -118,6 +118,10 @@ void CPlayerStateSoakUp::think(CPlayerModeBase *_playerMode)
{
_playerMode->setState(STATE_GETUP);
}
else
{
_playerMode->inSoakUpState();
}
}