This commit is contained in:
parent
a59bdb7bb3
commit
18e1f665af
18 changed files with 245 additions and 271 deletions
|
@ -89,6 +89,10 @@
|
|||
#include "pickups\pickup.h"
|
||||
#endif
|
||||
|
||||
#ifndef __MATHTABLE_HEADER__
|
||||
#include "utils\mathtab.h"
|
||||
#endif
|
||||
|
||||
|
||||
/* Std Lib
|
||||
------- */
|
||||
|
@ -702,15 +706,6 @@ if(newmode!=-1)
|
|||
|
||||
m_allowConversation=false;
|
||||
|
||||
if(m_healthReactFrames)
|
||||
{
|
||||
m_healthReactFrames-=_frames;
|
||||
if(m_healthReactFrames<0)
|
||||
{
|
||||
m_healthReactFrames=0;
|
||||
}
|
||||
}
|
||||
|
||||
m_tryingToManuallyPickupWeapon=false;
|
||||
m_tryingToAutomaticallyPickupWeapon=false;
|
||||
|
||||
|
@ -720,6 +715,30 @@ if(newmode!=-1)
|
|||
#ifdef __USER_paul__
|
||||
if(PadGetDown(0)&PAD_TRIANGLE)
|
||||
{
|
||||
DVECTOR spawnBasePos;
|
||||
int angle,angleInc;
|
||||
int i;
|
||||
|
||||
spawnBasePos=Pos;
|
||||
spawnBasePos.vy-=50;
|
||||
angle=-1024;
|
||||
angleInc=512;
|
||||
|
||||
for(i=0;i<5;i++)
|
||||
{
|
||||
DVECTOR offset,spawnPos;
|
||||
CBaseBouncingPickup *pickup;
|
||||
|
||||
angle&=4095;
|
||||
offset.vx=((msin(angle)*25)>>12);
|
||||
offset.vy=-((mcos(angle)*25)>>12);
|
||||
spawnPos.vx=spawnBasePos.vx+offset.vx;
|
||||
spawnPos.vy=spawnBasePos.vy+offset.vy;
|
||||
|
||||
pickup=(CBaseBouncingPickup*)createPickup(PICKUP__BOUNCING_SPATULA,&spawnPos);
|
||||
|
||||
angle+=angleInc;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
///
|
||||
|
@ -1226,7 +1245,10 @@ if(drawlastpos)
|
|||
}
|
||||
#endif
|
||||
|
||||
// Render
|
||||
SpriteBank *sb=CGameScene::getSpriteBank();
|
||||
|
||||
|
||||
// Render player
|
||||
DVECTOR sbPos=
|
||||
{
|
||||
Pos.vx-m_cameraPos.vx,
|
||||
|
@ -1236,91 +1258,58 @@ if(drawlastpos)
|
|||
m_currentPlayerModeClass->render(&sbPos);
|
||||
|
||||
|
||||
// Health
|
||||
if(!isWearingDivingHelmet())
|
||||
{
|
||||
// In water - Use normal SB face for health
|
||||
static int s_fullHealthFrames[]=
|
||||
{
|
||||
FRM__HEALTH_FULL_1,
|
||||
FRM__HEALTH_FULL_2,
|
||||
FRM__HEALTH_FULL_3,
|
||||
FRM__HEALTH_FULL_4,
|
||||
FRM__HEALTH_FULL_5,
|
||||
};
|
||||
static int s_emptyHealthFrames[]=
|
||||
{
|
||||
FRM__HEALTH_EMPTY_1,
|
||||
FRM__HEALTH_EMPTY_2,
|
||||
FRM__HEALTH_EMPTY_3,
|
||||
FRM__HEALTH_EMPTY_4,
|
||||
FRM__HEALTH_EMPTY_5,
|
||||
};
|
||||
int i,x,y;
|
||||
POLY_FT4 *ft4;
|
||||
int *frames;
|
||||
// UI
|
||||
char spatCount[20];
|
||||
int x,y;
|
||||
sFrameHdr *fh;
|
||||
|
||||
x=HEALTH_ICONX;
|
||||
y=HEALTH_ICONY;
|
||||
if(m_health==0||m_healthReactFrames)
|
||||
{
|
||||
frames=s_emptyHealthFrames;
|
||||
}
|
||||
else
|
||||
{
|
||||
frames=s_fullHealthFrames;
|
||||
}
|
||||
// Spat count
|
||||
sprintf(spatCount,"x%d",m_numSpatulasHeld);
|
||||
x=SB_UI_XBASE;
|
||||
y=SB_UI_YBASE;
|
||||
fh=sb->getFrameHeader(FRM__SPATULA);
|
||||
sb->printFT4(fh,x,y,0,0,0);
|
||||
x+=fh->W;
|
||||
m_fontBank->print(x,y,spatCount);
|
||||
x+=SB_UI_GAP_FROM_SPAT_COUNT_TO_PICKUPS;
|
||||
|
||||
int ygap;
|
||||
ygap=CGameScene::getSpriteBank()->getFrameHeader(*frames)->H;
|
||||
for(i=5;i>0;i--)
|
||||
{
|
||||
ft4=CGameScene::getSpriteBank()->printFT4(*frames++,x,y,0,0,0);
|
||||
setSemiTrans(ft4,i>m_health);
|
||||
y+=ygap;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(isWearingDivingHelmet())
|
||||
{
|
||||
// Out of water - Use bowl of water
|
||||
// Helmet
|
||||
POLY_FT4 *ft4;
|
||||
sFrameHdr *fh;
|
||||
int V,W,H,partH;
|
||||
|
||||
ft4=CGameScene::getSpriteBank()->printFT4(FRM__WATERHILIGHT,HEALTH_ICONX,HEALTH_ICONY,0,0,0);
|
||||
ft4=sb->printFT4(FRM__WATERHILIGHT,x,y,0,0,0);
|
||||
setSemiTrans(ft4,true);
|
||||
|
||||
fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__WATER);
|
||||
ft4=CGameScene::getSpriteBank()->printFT4(fh,0,0,0,0,0);
|
||||
fh=sb->getFrameHeader(FRM__WATER);
|
||||
ft4=sb->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);
|
||||
setXYWH(ft4,x,y+(partH),W,H-partH);
|
||||
ft4->v0=V+(partH);
|
||||
ft4->v1=V+(partH);
|
||||
|
||||
CGameScene::getSpriteBank()->printFT4(FRM__WATERMETER,HEALTH_ICONX,HEALTH_ICONY,0,0,0);
|
||||
sb->printFT4(FRM__WATERMETER,x,y,0,0,0);
|
||||
|
||||
x+=fh->W+SB_UI_GAP_BETWEEN_ITEMS;
|
||||
}
|
||||
|
||||
|
||||
// Mode specific ui
|
||||
int itemX=COLLECTEDITEM_BASEX;
|
||||
|
||||
// Pickups
|
||||
m_currentPlayerModeClass->renderModeUi();
|
||||
if(isWearingBoots())
|
||||
{
|
||||
int x,y;
|
||||
sFrameHdr *fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__SHOE);
|
||||
x=itemX-(fh->W/2);
|
||||
y=COLLECTEDITEM_BASEY-(fh->H/2);
|
||||
CGameScene::getSpriteBank()->printFT4(fh,x+2,y+2,0,0,0);
|
||||
CGameScene::getSpriteBank()->printFT4(fh,x-2,y-2,0,0,0);
|
||||
itemX+=COLLECTEDITEM_GAP;
|
||||
// Boots
|
||||
int pickupX,pickupY;
|
||||
sFrameHdr *fh=sb->getFrameHeader(FRM__SHOE);
|
||||
sb->printFT4(fh,x,y,0,0,0);
|
||||
sb->printFT4(fh,x+4,y+4,0,0,0);
|
||||
x+=fh->W+SB_UI_GAP_BETWEEN_ITEMS+4;
|
||||
}
|
||||
|
||||
// Mode specific ui
|
||||
m_currentPlayerModeClass->renderModeUi();
|
||||
}
|
||||
|
||||
|
||||
|
@ -1427,32 +1416,6 @@ int CPlayer::getHeightFromGroundNoPlatform(int _x,int _y,int _maxHeight=32)
|
|||
return( CGameScene::getCollision()->getHeightFromGround(_x,_y,_maxHeight) );
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
Params:
|
||||
Returns:
|
||||
---------------------------------------------------------------------- */
|
||||
void CPlayer::addHealth(int _health)
|
||||
{
|
||||
if(!isWearingDivingHelmet())
|
||||
{
|
||||
m_health+=_health;
|
||||
if(m_health>MAX_HEALTH)
|
||||
{
|
||||
m_health=MAX_HEALTH;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_healthWaterLevel+=WATERHEALTHPART*_health;
|
||||
if(m_healthWaterLevel>WATERMAXHEALTH)
|
||||
{
|
||||
m_healthWaterLevel=WATERMAXHEALTH;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
Function:
|
||||
Purpose:
|
||||
|
@ -1709,9 +1672,8 @@ void CPlayer::respawn()
|
|||
|
||||
m_allowConversation=false;
|
||||
|
||||
m_health=MAX_HEALTH;
|
||||
m_numSpatulasHeld=0;
|
||||
m_healthWaterLevel=WATERMAXHEALTH;
|
||||
m_healthReactFrames=0;
|
||||
m_invincibleFrameCount=INVINCIBLE_FRAMES__START;
|
||||
m_helmetSoundTimer=0;
|
||||
Pos=m_respawnPos;
|
||||
|
@ -1949,34 +1911,21 @@ void CPlayer::takeDamage(DAMAGE_TYPE _damage,REACT_DIRECTION _reactDirection,CTh
|
|||
}
|
||||
else
|
||||
{
|
||||
if(!isWearingDivingHelmet())
|
||||
if(ouchThatHurtSoMuchThatImJustGoingToDieNow||(getSpatulasHeld()==0&&m_currentMode!=PLAYER_MODE_NET))
|
||||
{
|
||||
if(!ouchThatHurtSoMuchThatImJustGoingToDieNow)
|
||||
{
|
||||
m_health--;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_health=-1;
|
||||
}
|
||||
if(m_health<0)
|
||||
{
|
||||
died=true;
|
||||
}
|
||||
died=true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!ouchThatHurtSoMuchThatImJustGoingToDieNow)
|
||||
if(m_currentMode==PLAYER_MODE_NET)
|
||||
{
|
||||
m_healthWaterLevel-=WATERHEALTHPART;
|
||||
// Launch net pickup
|
||||
m_currentMode=PLAYER_MODE_FULLUNARMED;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_health=-1;
|
||||
}
|
||||
if(m_healthWaterLevel<0)
|
||||
{
|
||||
died=true;
|
||||
// Launch all spatulas!
|
||||
m_numSpatulasHeld=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2005,8 +1954,6 @@ void CPlayer::takeDamage(DAMAGE_TYPE _damage,REACT_DIRECTION _reactDirection,CTh
|
|||
if ( ( (CNpcPlatform *) platform )->isCart() )
|
||||
{
|
||||
m_invincibleFrameCount=INVINCIBLE_FRAMES__HIT;
|
||||
m_healthReactFrames=25;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -2043,7 +1990,6 @@ void CPlayer::takeDamage(DAMAGE_TYPE _damage,REACT_DIRECTION _reactDirection,CTh
|
|||
m_currentPlayerModeClass->setState(STATE_JUMPBACK);
|
||||
}
|
||||
m_invincibleFrameCount=INVINCIBLE_FRAMES__HIT;
|
||||
m_healthReactFrames=25;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -182,13 +182,11 @@ class CPlayer : public CPlayerThing
|
|||
public:
|
||||
enum
|
||||
{
|
||||
MAX_HEALTH=5,
|
||||
MAX_LIVES=99,
|
||||
|
||||
WATERLEVELSHIFT=5,
|
||||
WATERMAXHEALTH=(255<<WATERLEVELSHIFT),
|
||||
WATERHEALTHPART=WATERMAXHEALTH/(MAX_HEALTH+1),
|
||||
WATERMINSOACKUPLEVEL=(245<<WATERLEVELSHIFT), // SB won't auto soak unless water is lower than this
|
||||
WATERMINSOAKUPLEVEL=(245<<WATERLEVELSHIFT), // SB won't auto soak unless water is lower than this
|
||||
};
|
||||
|
||||
typedef struct
|
||||
|
@ -228,8 +226,9 @@ public:
|
|||
|
||||
void setLedgeLookAhead(int _lookAhead) {m_ledgeLookAhead=_lookAhead;}
|
||||
|
||||
void addHealth(int _health);
|
||||
void addLife();
|
||||
void addSpatula() {m_numSpatulasHeld++;}
|
||||
int getSpatulasHeld() {return m_numSpatulasHeld;}
|
||||
ATTACK_STATE getAttackState();
|
||||
int isRecoveringFromHit() {return m_invincibleFrameCount!=0||m_currentMode==PLAYER_MODE_DEAD;}
|
||||
|
||||
|
@ -331,9 +330,8 @@ public:
|
|||
|
||||
private:
|
||||
int m_lives;
|
||||
int m_health;
|
||||
int m_numSpatulasHeld;
|
||||
int m_healthWaterLevel;
|
||||
int m_healthReactFrames;
|
||||
int m_helmetSoundTimer; // Timer for breathing sound when using the helmet
|
||||
|
||||
|
||||
|
@ -393,8 +391,8 @@ public:
|
|||
|
||||
void setIsInWater(int _in) {m_isInWater=_in;m_helmetSoundTimer=0;}
|
||||
int getIsInWater() {return m_isInWater;}
|
||||
int getIsHealthFullSoICanStopSoakingUp() {return m_healthWaterLevel==WATERMAXHEALTH;}
|
||||
int getIsHealthSoFullThatIDontNeedToSoakUp(){return m_healthWaterLevel>=WATERMINSOACKUPLEVEL;}
|
||||
int getIsHelmetFullSoICanStopSoakingUp() {return m_healthWaterLevel==WATERMAXHEALTH;}
|
||||
int getIsHelmetSoFullThatIDontNeedToSoakUp(){return m_healthWaterLevel>=WATERMINSOAKUPLEVEL;}
|
||||
|
||||
int isHoldingNet() {return m_currentMode==PLAYER_MODE_NET;}
|
||||
|
||||
|
@ -444,16 +442,10 @@ public:
|
|||
|
||||
enum
|
||||
{
|
||||
HEALTH_ICONX=40,
|
||||
HEALTH_ICONY=40,
|
||||
POWERUPUI_ICONX=400,
|
||||
POWERUPUI_ICONY=40,
|
||||
POWERUPUI_TEXTX=440,
|
||||
POWERUPUI_TEXTY=37,
|
||||
POWERUPUI_OT=0,
|
||||
COLLECTEDITEM_BASEX=110,
|
||||
COLLECTEDITEM_BASEY=60,
|
||||
COLLECTEDITEM_GAP=40,
|
||||
SB_UI_XBASE=40,
|
||||
SB_UI_YBASE=40,
|
||||
SB_UI_GAP_FROM_SPAT_COUNT_TO_PICKUPS=50,
|
||||
SB_UI_GAP_BETWEEN_ITEMS=5,
|
||||
};
|
||||
|
||||
private:
|
||||
|
|
|
@ -307,7 +307,7 @@ void CPlayerModeBase::thinkVerticalMovement()
|
|||
pos=m_player->getPlayerPos();
|
||||
if(m_player->getHeightFromGround(pos.vx,pos.vy,5)==0&&
|
||||
(CGameScene::getCollision()->getCollisionBlock(pos.vx,pos.vy)&COLLISION_TYPE_MASK)==COLLISION_TYPE_FLAG_SOAKUP&&
|
||||
!m_player->getIsHealthSoFullThatIDontNeedToSoakUp())
|
||||
!m_player->getIsHelmetSoFullThatIDontNeedToSoakUp())
|
||||
{
|
||||
// Hit water - Go into soakup mode
|
||||
setState(STATE_SOAKUP);
|
||||
|
|
|
@ -161,8 +161,8 @@ public:
|
|||
CPlayer *getPlayer() { return( m_player ); }
|
||||
|
||||
int getIsInWater() {return m_player->getIsInWater();}
|
||||
int getIsHealthFullSoICanStopSoakingUp() {return m_player->getIsHealthFullSoICanStopSoakingUp();}
|
||||
int getIsHealthSoFullThatIDontNeedToSoakUp(){return m_player->getIsHealthSoFullThatIDontNeedToSoakUp();}
|
||||
int getIsHelmetFullSoICanStopSoakingUp() {return m_player->getIsHelmetFullSoICanStopSoakingUp();}
|
||||
int getIsHelmetSoFullThatIDontNeedToSoakUp(){return m_player->getIsHelmetSoFullThatIDontNeedToSoakUp();}
|
||||
|
||||
void moveLeft();
|
||||
void moveRight();
|
||||
|
|
|
@ -115,7 +115,7 @@ void CPlayerStateSoakUp::enter(CPlayerModeBase *_playerMode)
|
|||
---------------------------------------------------------------------- */
|
||||
void CPlayerStateSoakUp::think(CPlayerModeBase *_playerMode)
|
||||
{
|
||||
if(!_playerMode->getIsHealthFullSoICanStopSoakingUp())
|
||||
if(!_playerMode->getIsHelmetFullSoICanStopSoakingUp())
|
||||
{
|
||||
if(m_breatheDelayFrames==0)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue