diff --git a/makefile.gaz b/makefile.gaz index 87460e8ce..6d98aecee 100644 --- a/makefile.gaz +++ b/makefile.gaz @@ -200,7 +200,8 @@ game_src := convo \ game \ gamebubs \ gameslot \ - pause + pause \ + healthman gfx_src := prim \ tpage \ diff --git a/source/game/game.cpp b/source/game/game.cpp index 37f2cb11d..9bb7facce 100644 --- a/source/game/game.cpp +++ b/source/game/game.cpp @@ -91,6 +91,10 @@ #include "game\gameslot.h" #endif +#ifndef __GAME_HEALTH_MANAGER_H__ +#include "game\healthman.h" +#endif + #include "gfx\actor.h" @@ -101,6 +105,8 @@ int RenderZ=378;//256; Increased to make depth less, and SB more visible FontBank *CGameScene::s_genericFont; SpriteBank *CGameScene::s_GlobalSpritebank; CLayerCollision *CGameScene::s_GlobalCollision; +CHealthManager *CGameScene::m_HealthManager; + MATRIX CGameScene::CamMtx; /*****************************************************************************/ @@ -197,6 +203,9 @@ void CGameScene::init() m_pauseMenu=new ("Pause Menu") CPauseMenu(); m_pauseMenu->init(); + m_HealthManager= new ("Health Manager") CHealthManager(); + m_HealthManager->init(); + s_readyToExit=false; s_restartLevel=false; @@ -230,6 +239,8 @@ void CGameScene::shutdown() m_pauseMenu->shutdown(); delete m_pauseMenu; m_scalableFont->dump(); delete m_scalableFont; s_genericFont->dump(); delete s_genericFont; + m_HealthManager->shutdown();delete m_HealthManager; + } /*****************************************************************************/ @@ -258,6 +269,8 @@ void CGameScene::render() SetTransMatrix(&CamMtx); Level.render(); + m_HealthManager->render(); + CActorPool::CleanUpCache(); } @@ -383,6 +396,8 @@ void CGameScene::think(int _frames) CBubicleFactory::setMapOffset(&camPos); Level.setCameraCentre(camPos); Level.think(_frames); + m_HealthManager->think(_frames); + m_HealthManager->checkPlayerCol(getPlayer()); #ifdef __VERSION_DEBUG__ if(PadGetDown(0)&PAD_R2) @@ -483,6 +498,14 @@ void CGameScene::initLevel() } +/*****************************************************************************/ +int DropAmount=69; +int DropVel=1; +void CGameScene::dropHealth(DVECTOR &Pos,int Amount,int Vel) +{ + m_HealthManager->drop(Pos,DropAmount,DropVel); +} + /*****************************************************************************/ void CGameScene::shutdownLevel() { diff --git a/source/game/game.h b/source/game/game.h index 02cc51efc..8095e3c01 100644 --- a/source/game/game.h +++ b/source/game/game.h @@ -17,6 +17,7 @@ class FontBank; class SpriteBank; class CPlayer; class CLayerCollision; +class CHealthManager; class CGameScene : public CScene { public: @@ -59,6 +60,7 @@ static ACTOR_TYPE getActorType( int actorNum ) {return actorType[actorNum];} static void setBossHasBeenKilled() {s_bossHasBeenKilled=true;} static int getBossHasBeenKilled() {return s_bossHasBeenKilled;} +static void dropHealth(DVECTOR &Pos,int Amount,int Vel); protected: void initLevel(); @@ -69,6 +71,7 @@ protected: CLevel Level; class CPauseMenu *m_pauseMenu; class CPlayer *m_player; +static CHealthManager *m_HealthManager; static FontBank *s_genericFont; class ScalableFontBank *m_scalableFont; static MATRIX CamMtx; diff --git a/source/game/healthman.cpp b/source/game/healthman.cpp index 830ddcbfb..3a1239fce 100644 --- a/source/game/healthman.cpp +++ b/source/game/healthman.cpp @@ -1,187 +1,204 @@ -/*========================================================================= +/******************************/ +/*** Health throw out stuff ***/ +/******************************/ - gamebubs.cpp +#include "system\global.h" +#include "mem\memory.h" +#include "gfx\sprbank.h" +#include "utils\utils.h" +#include "gfx\prim.h" +//#include "gfx\actor.h" +#include "game\game.h" +#include "player\player.h" +#include "gfx\otpos.h" +#include "game\healthman.h" - Author: PKG - Created: - Project: Spongebob - Purpose: +#include - Copyright (c) 2001 Climax Development Ltd - -===========================================================================*/ - - -/*---------------------------------------------------------------------- - Includes - -------- */ - -#include "game\gamebubs.h" - - -/* Std Lib - ------- */ - -/* Data - ---- */ - -/*---------------------------------------------------------------------- - Tyepdefs && Defines - ------------------- */ - -/*---------------------------------------------------------------------- - Structure defintions - -------------------- */ - -/*---------------------------------------------------------------------- - Function Prototypes - ------------------- */ - -/*---------------------------------------------------------------------- - Vars - ---- */ - -BubicleEmitterData CGameBubicleFactory::s_emitters[CGameBubicleFactory::NUM_TYPES]= +CHealthManager::sItemTable CHealthManager::ItemTable[]= { - // TYPE_SMALL - { - 0,0,0,0, // m_x,m_y,m_w,m_h - 2,3, // m_birthRate,m_birthAmount - 5, // 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 - 5,3, // 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 - } - }, - // TYPE_MEDIUM - { - 0,0,0,0, // m_x,m_y,m_w,m_h - 2,10, // m_birthRate,m_birthAmount - 5, // 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 - 5,3, // 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 - } - }, - // TYPE_LARGE - { - 0,0,0,0, // m_x,m_y,m_w,m_h - 1,10, // 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 - 5,3, // 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 - } - }, - // 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 - } - }, + {5,256, 255,255,0}, + {1,256, 127,127,127}, }; +const int CHealthManager::ItemTableSize=sizeof(CHealthManager::ItemTable)/sizeof(CHealthManager::sItemTable); -/*---------------------------------------------------------------------- - Function: - Purpose: - Params: - Returns: - ---------------------------------------------------------------------- */ -void CGameBubicleFactory::spawnBubicles(int _x,int _y,int _w,int _h,GAMEBUBICLETYPE _type) +int HealthManGrav=128; +int HealthManShift=9; +int HealthManPickUpDelay=16; + +/*****************************************************************************/ +void CHealthManager::init() { - BubicleEmitterData *emt; + FrameHdr=CGameScene::getSpriteBank()->getFrameHeader(FRM__SPATULA); + for (int i=0; iTPage); + ItemList[i].Sprite.clut=FrameHdr->Clut; + ItemList[i].Sprite.u0=FrameHdr->U; + ItemList[i].Sprite.v0=FrameHdr->V; + ItemList[i].Sprite.w=FrameHdr->W; + ItemList[i].Sprite.h=FrameHdr->H; + } - emt=&s_emitters[_type]; - - emt->m_x=_x; - emt->m_y=_y; - emt->m_w=_w; - emt->m_h=_h; - - CBubicleFactory::spawnEmitter(emt); } +/*****************************************************************************/ +void CHealthManager::shutdown() +{ +} -/*=========================================================================== - end */ +/*****************************************************************************/ +const int AngleS=2048+1024+512; +void CHealthManager::drop(DVECTOR &Pos,int Amount,int Vel) +{ +int Count=0; +int Am=Amount; +// Count em for Arc + for (int i=0; i=T.Count) + { + Amount-=T.Count; + Count++; + } + } +int Angle=AngleS; +int AngleInc=1024/Count; +// Split Em + Amount=Am; + for (int i=0; i=T.Count) + { + Amount-=T.Count; + addItem(Pos,i,Angle,Vel); + Angle+=AngleInc; + Angle&=4095; + } + } +} + +/*****************************************************************************/ +void CHealthManager::addItem(DVECTOR &Pos,int TableIdx,int Angle,int Vel) +{ +int Idx=0; + + while (ItemList[Idx].Life) Idx++; + ASSERT(Idx>1; + ItemList[Idx].Vel.vy=-(mcos(Angle)*Vel); + ItemList[Idx].Count=ItemTable[TableIdx].Count; +} + +/*****************************************************************************/ +void CHealthManager::checkPlayerCol(CPlayer *Player) +{ +CRECT const &PRect=Player->getCollisionArea(); + + for (int i=0; iItemList[i].ScrPos.vx+16 || + PRect.y2ItemList[i].ScrPos.vy+32) + { + } + else + { + ItemList[i].Life=0; + Player->addSpatula(ItemList[i].Count); + } + + } + + } +} + +/*****************************************************************************/ +/*** think *******************************************************************/ +/*****************************************************************************/ +void CHealthManager::think(int frames) +{ + CLayerCollision *ColLayer=CGameScene::getCollision(); + + for (int i=0; i>HealthManShift; + ItemList[i].ScrPos.vy=ItemList[i].Pos.vy>>HealthManShift; + ItemList[i].Vel.vy+=HealthManGrav; + + if (ItemList[i].Vel.vy>0) + { // Check ground collision + int DistY = ColLayer->getHeightFromGround( ItemList[i].ScrPos.vx, ItemList[i].ScrPos.vy, 16 ); + if (DistY<=0) + { + ItemList[i].Vel.vy=-ItemList[i].Vel.vy>>1; + ItemList[i].Vel.vx>>=1; + // ItemList[i].Pos.vy-=DistY<<(HealthManShift-1); + } + } + + int XOfs; + if (ItemList[i].Vel.vx>0) + { + XOfs=+16; + } + else + { + XOfs=-16; + } + // Check X collision + int DistX = ColLayer->getHeightFromGround( ItemList[i].ScrPos.vx+XOfs, ItemList[i].ScrPos.vy, 32 ); + if (DistX<=0) + { + ItemList[i].Vel.vx=-ItemList[i].Vel.vx>>1; + // ItemList[i].Pos.vy-=DistY<<(HealthManShift-1); + } + + } + } + } + +} + +/*****************************************************************************/ +/*** render ******************************************************************/ +/*****************************************************************************/ +void CHealthManager::render() +{ +sOT *ThisOT=OtPtr;//+OTPOS__PICKUP_POS; +DVECTOR const &CamPos=CLevel::getCameraPos(); + + for (int i=0; i