SBSPSS/source/thing/thing.h

324 lines
7.7 KiB
C
Raw Normal View History

2001-02-26 21:27:20 +01:00
/*=========================================================================
thing.h
Author: PKG
Created:
Project: Spongebob
Purpose:
Copyright (c) 2001 Climax Development Ltd
===========================================================================*/
#ifndef __THING_THING_H__
#define __THING_THING_H__
/*----------------------------------------------------------------------
Includes
-------- */
#ifndef _GLOBAL_HEADER_
#include "system\global.h"
#endif
#ifndef __GAME_EVENT_H__
#include "game\event.h"
#endif
2001-05-10 18:16:57 +02:00
#include <dstructs.h>
2001-02-26 21:27:20 +01:00
/* Std Lib
------- */
/*----------------------------------------------------------------------
Tyepdefs && Defines
------------------- */
/*----------------------------------------------------------------------
Structure defintions
-------------------- */
2001-04-06 23:25:18 +02:00
// Collision rectangle definition
2001-05-10 18:16:57 +02:00
struct CRECT
2001-04-06 23:25:18 +02:00
{
int x1,y1,x2,y2;
2001-05-10 18:16:57 +02:00
};
2001-04-06 23:25:18 +02:00
2001-05-10 18:16:57 +02:00
/*----------------------------------------------------------------------*/
2001-02-26 21:27:20 +01:00
// Thing manager class
2001-05-10 18:16:57 +02:00
class CThing;
class CThingManager
2001-02-26 21:27:20 +01:00
{
public:
2001-06-18 21:31:50 +02:00
static void init();
static void shutdown();
static void killAllThingsForRespawn();
2001-02-26 21:27:20 +01:00
2001-06-18 21:31:50 +02:00
static void initAllThings();
static void thinkAllThings(int _frames);
static void renderAllThings();
static void processEventAllThings(GAME_EVENT _event,CThing *_sourceThing);
2001-02-26 21:27:20 +01:00
2001-06-18 21:31:50 +02:00
static CThing *checkCollisionAreaAgainstThings(CRECT *_area,int _type,int _continue);
static void initCollision();
static void matchWheelsAndWeights();
static void matchPressureSwitches();
static void matchGaryTriggers();
2001-07-05 23:50:02 +02:00
static void shakePlatformLoose();
2001-05-10 18:16:57 +02:00
2001-06-18 21:31:50 +02:00
static sBBox &getRenderBBox() {return(m_RenderBBox);}
static sBBox &getThinkBBox() {return(m_ThinkBBox);}
2001-08-15 18:12:20 +02:00
static void setMapWH(DVECTOR const &WH);
2001-04-06 23:25:18 +02:00
2001-02-26 21:27:20 +01:00
protected:
2001-06-18 21:31:50 +02:00
static void initList(CThing **List);
static void addToThingList(CThing *_this);
static void removeFromThingList(CThing *_this);
2001-05-10 18:16:57 +02:00
2001-06-18 21:31:50 +02:00
static void addToCollisionList(CThing *_this);
friend class CThing;
2001-02-26 21:27:20 +01:00
private:
2001-06-18 21:31:50 +02:00
static CThing *s_thingLists[];
static int s_initialised;
2001-02-26 21:27:20 +01:00
2001-06-18 21:31:50 +02:00
static CThing *s_CollisionLists[];
static sBBox m_RenderBBox;
static sBBox m_ThinkBBox;
2001-05-25 20:43:47 +02:00
public:
// FreeList Stuff
2001-06-18 21:31:50 +02:00
static void initFreeList();
static void resetFreeList();
static void shutdownFreeList();
static CThing *GetThing(int Type,int SubType);
static void DeleteThing(CThing *Thing);
2001-05-21 17:19:18 +02:00
2001-05-25 20:43:47 +02:00
private:
2001-06-18 21:31:50 +02:00
static CThing **s_FreeList[];
2001-08-15 18:12:20 +02:00
static DVECTOR MapWH,MapWH16;
2001-02-26 21:27:20 +01:00
};
2001-05-25 20:43:47 +02:00
2001-05-10 18:16:57 +02:00
/*----------------------------------------------------------------------*/
2001-02-26 21:27:20 +01:00
// Base thing class
class CThing
{
public:
2001-05-10 18:16:57 +02:00
enum TYPE
2001-02-26 21:27:20 +01:00
{
TYPE_PICKUP,
2001-03-08 21:12:47 +01:00
TYPE_PLATFORM,
2001-02-26 21:27:20 +01:00
TYPE_PLAYER,
2001-02-27 17:59:50 +01:00
TYPE_PLAYERPROJECTILE,
TYPE_NPC,
2001-02-26 21:27:20 +01:00
TYPE_ENEMY,
2001-02-27 17:59:50 +01:00
TYPE_ENEMYPROJECTILE,
TYPE_TRIGGER,
2001-04-24 17:01:42 +02:00
TYPE_HAZARD,
2001-05-04 20:47:12 +02:00
TYPE_FX,
2001-02-26 21:27:20 +01:00
MAX_TYPE,
2001-05-10 18:16:57 +02:00
};
// TYPE;
2001-05-25 20:43:47 +02:00
CThing()
{
initDef();
2001-07-04 20:19:13 +02:00
m_SubType=255;
2001-05-25 20:43:47 +02:00
}
2001-05-10 18:16:57 +02:00
virtual ~CThing() {;}
2001-02-26 21:27:20 +01:00
2001-07-23 21:26:37 +02:00
void initDef()
2001-05-25 20:43:47 +02:00
{
2001-05-30 17:04:41 +02:00
Pos.vx=0; Pos.vy=0;
PosDelta=Pos;
PosLast=Pos;
2001-05-25 20:43:47 +02:00
m_isShuttingDown=false;
NextFreeThing=0;
}
2001-07-04 20:19:13 +02:00
virtual TYPE getThingType()=0;
2001-02-26 21:27:20 +01:00
2001-07-23 21:26:37 +02:00
void setThingSubType(int T) {m_SubType=T;}
int getThingSubType() {return(m_SubType);}
virtual void init();
virtual void shutdown();
2001-05-25 20:43:47 +02:00
2001-06-14 23:17:10 +02:00
2001-07-04 20:19:13 +02:00
virtual void think(int _frames);
virtual void render();
void setToShutdown(bool f=true) {m_isShuttingDown = f;}
u8 isSetToShutdown() {return( m_isShuttingDown);}
virtual int dontKillDuringLevelRespawn() {return false;}
void calcRenderPos(DVECTOR const &Pos,DVECTOR &renderPos);
2001-08-04 23:06:19 +02:00
bool isOnScreen(DVECTOR Pos);
2001-02-26 21:27:20 +01:00
// Linkage
2001-05-10 18:16:57 +02:00
void addChild(CThing *Child);
void removeChild(CThing *Child);
void removeAllChild();
void deleteAllChild();
2001-05-29 22:31:02 +02:00
int getNumChildren() {return( m_numChildren );}
2001-02-26 21:27:20 +01:00
2001-05-10 18:16:57 +02:00
DVECTOR const &getPos() {return Pos;}
2001-07-23 21:26:37 +02:00
void setPos(DVECTOR const &newPos) {Pos=newPos;}
DVECTOR const &getPosDelta() {return PosDelta;}
2001-05-21 17:19:18 +02:00
CThing *getParent() {return ParentThing;}
CThing *getNext() {return NextThing;}
2001-02-26 21:27:20 +01:00
2001-05-10 18:16:57 +02:00
virtual void processEvent(GAME_EVENT _event,CThing *_sourceThing);
2001-02-26 21:27:20 +01:00
protected:
2001-05-21 17:19:18 +02:00
// Pos
DVECTOR Pos, PosLast, PosDelta;
2001-02-26 21:27:20 +01:00
2001-05-10 18:16:57 +02:00
// Parent Child Linkage
2001-05-21 17:19:18 +02:00
CThing *ParentThing,*NextThing;
2001-07-04 20:19:13 +02:00
u8 m_numChildren;
2001-02-26 21:27:20 +01:00
public:
2001-05-21 17:19:18 +02:00
// Collision/List Link List
2001-05-10 18:16:57 +02:00
CThing *m_nextCollisionThing;
2001-05-21 17:19:18 +02:00
CThing *m_nextListThing;
public:
CThing *m_NextFreeThing;
2001-02-26 21:27:20 +01:00
2001-05-21 17:19:18 +02:00
// -- Collision --
2001-02-26 21:27:20 +01:00
public:
2001-05-14 18:33:39 +02:00
virtual CRECT const *getRenderBBox() {return &m_collisionArea;}
virtual CRECT const *getThinkBBox() {return &m_collisionArea;}
2001-05-15 00:12:09 +02:00
virtual bool alwaysThink() {return(false);}
2001-06-14 23:17:10 +02:00
virtual void leftThinkZone(int _frames) {}
2001-05-14 18:33:39 +02:00
2001-05-10 18:16:57 +02:00
void ShowBBox();
DVECTOR const &getCollisionCentre() {return m_collisionCentre;}
DVECTOR const &getCollisionCentreOffset() {return m_collisionCentreOffset;}
int getCollisionRadius() {return m_collisionRadius;}
2001-07-23 21:26:37 +02:00
CRECT const &getCollisionArea() {return m_collisionArea;}
2001-05-10 18:16:57 +02:00
DVECTOR const &getCollisionSize() {return m_collisionSize;}
2001-08-15 17:05:44 +02:00
virtual int canCollide() {return (true);}
virtual bool allowOffMap() {return (false);}
2001-05-10 18:16:57 +02:00
virtual int checkCollisionAgainst(CThing *_thisThing, int _frames);
int checkCollisionAgainstArea(CRECT *_rect);
void updateCollisionArea();
virtual void collidedWith(CThing *_thisThing) {;}
2001-05-21 17:19:18 +02:00
public:
// Thing states
2001-05-10 23:09:23 +02:00
void setRenderFlag(bool f) {m_renderFlag=f;}
void setThinkFlag(bool f) {m_thinkFlag=f;}
2001-05-29 18:38:09 +02:00
bool getThinkFlag() {return(m_thinkFlag);}
2001-05-10 18:16:57 +02:00
bool canRender() {return (m_renderFlag);}
DVECTOR &getRenderPos() {return(m_RenderPos);}
bool canThink() {return (m_thinkFlag);}
2001-06-14 23:17:10 +02:00
2001-05-21 17:19:18 +02:00
protected:
DVECTOR m_RenderPos;
2001-07-04 20:19:13 +02:00
u8 m_renderFlag,m_thinkFlag;
u8 m_isShuttingDown;
u8 m_SubType;
2001-04-06 23:25:18 +02:00
2001-02-26 21:27:20 +01:00
protected:
2001-07-23 21:26:37 +02:00
void setCollisionSize(int _w,int _h);
void setCollisionCentreOffset(int _x,int _y) {m_collisionCentreOffset.vx=_x;m_collisionCentreOffset.vy=_y;}
void setCollisionCentreOffset(DVECTOR const &xy) {m_collisionCentreOffset=xy;}
2001-05-29 18:38:09 +02:00
2001-02-26 21:27:20 +01:00
private:
2001-05-10 18:16:57 +02:00
DVECTOR m_collisionSize;
DVECTOR m_collisionCentreOffset;
2001-07-04 20:19:13 +02:00
s16 m_collisionRadius;
2001-05-10 18:16:57 +02:00
CRECT m_collisionArea;
DVECTOR m_collisionCentre;
2001-05-21 17:19:18 +02:00
// Free List Stuff
2001-05-25 20:43:47 +02:00
public:
CThing *NextFreeThing;
2001-02-26 21:27:20 +01:00
};
2001-05-10 18:16:57 +02:00
/*---------------------------------------------------------------------- */
2001-02-27 17:59:50 +01:00
/* These are the individual base classes for each of the seperate thing types */
class CPickupThing : public CThing
{
public:
2001-05-10 18:16:57 +02:00
virtual TYPE getThingType() {return TYPE_PICKUP;}
2001-02-27 17:59:50 +01:00
};
2001-05-10 18:16:57 +02:00
2001-02-27 17:59:50 +01:00
class CPlayerThing : public CThing
{
public:
2001-05-25 20:43:47 +02:00
enum
{ // For Dynamic ThingCache
MAX_SUBTYPE =1,
};
2001-05-10 18:16:57 +02:00
virtual TYPE getThingType() {return TYPE_PLAYER;}
2001-05-15 00:12:09 +02:00
virtual bool alwaysThink() {return(true);}
2001-08-15 17:05:44 +02:00
bool allowOffMap() {return(true);}
2001-05-15 00:12:09 +02:00
2001-02-27 17:59:50 +01:00
};
2001-05-10 18:16:57 +02:00
2001-02-27 17:59:50 +01:00
class CPlayerProjectileThing : public CThing
{
public:
2001-05-10 18:16:57 +02:00
virtual TYPE getThingType() {return TYPE_PLAYERPROJECTILE;}
2001-02-27 17:59:50 +01:00
};
2001-05-10 18:16:57 +02:00
2001-02-27 17:59:50 +01:00
class CNpcThing : public CThing
{
public:
2001-05-10 18:16:57 +02:00
virtual TYPE getThingType() {return TYPE_NPC;}
2001-02-27 17:59:50 +01:00
};
2001-05-10 18:16:57 +02:00
2001-02-27 17:59:50 +01:00
class CEnemyThing : public CThing
{
public:
2001-05-10 18:16:57 +02:00
virtual TYPE getThingType() {return TYPE_ENEMY;}
2001-02-27 17:59:50 +01:00
};
2001-05-10 18:16:57 +02:00
2001-02-27 17:59:50 +01:00
class CEnemyProjectileThing : public CThing
{
public:
2001-05-10 18:16:57 +02:00
virtual TYPE getThingType() {return TYPE_ENEMYPROJECTILE;}
2001-02-27 17:59:50 +01:00
};
2001-05-10 18:16:57 +02:00
2001-02-27 17:59:50 +01:00
class CPlatformThing : public CThing
{
public:
2001-05-10 18:16:57 +02:00
virtual TYPE getThingType() {return TYPE_PLATFORM;}
2001-02-27 17:59:50 +01:00
};
2001-05-10 18:16:57 +02:00
2001-02-27 17:59:50 +01:00
class CTriggerThing : public CThing
{
public:
2001-05-10 18:16:57 +02:00
virtual TYPE getThingType() {return TYPE_TRIGGER;}
2001-02-27 17:59:50 +01:00
};
2001-05-10 18:16:57 +02:00
2001-04-24 17:01:42 +02:00
class CHazardThing : public CThing
{
public:
2001-05-10 18:16:57 +02:00
virtual TYPE getThingType() {return TYPE_HAZARD;}
2001-04-24 17:01:42 +02:00
};
2001-05-10 18:16:57 +02:00
2001-05-04 20:47:12 +02:00
class CFXThing : public CThing
{
public:
2001-05-10 18:16:57 +02:00
virtual TYPE getThingType() {return TYPE_FX;}
2001-05-04 20:47:12 +02:00
};
2001-02-27 17:59:50 +01:00
2001-07-23 21:26:37 +02:00
inline bool CheckRect2Rect(CRECT const &Rect0,CRECT const &Rect1)
{
if (Rect0.x2<Rect1.x1 || Rect0.x1>Rect1.x2) return(false);
if (Rect0.y2<Rect1.y1 || Rect0.y1>Rect1.y2) return(false);
return(true);
}
2001-02-26 21:27:20 +01:00
#endif /* __THING_THING_H__ */
2001-07-23 21:26:37 +02:00
2001-02-26 21:27:20 +01:00
/*===========================================================================
2001-07-23 21:26:37 +02:00
2001-02-26 21:27:20 +01:00
end */