/*=========================================================================

	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


/*	Std Lib
	------- */

/*----------------------------------------------------------------------
	Tyepdefs && Defines
	------------------- */

/*----------------------------------------------------------------------
	Structure defintions
	-------------------- */

// Thing manager class
class CThingManager
{
public:
	static void		init();
	static void		shutdown();

	static void		thinkAllThings(int _frames);
	static void		renderAllThings();
	static void		processEventAllThings(GAME_EVENT _event,class CThing *_sourceThing);

protected:
	static void					addToThingList(class CThing *_this);
	static void					removeFromThingList(CThing *_this);
	friend class CThing;

private:
	static class CThing			*s_thingLists[];
	static int					s_initialised;

};


// Base thing class
class CThing
{
public:
	typedef enum
	{
		TYPE_PICKUP,
		TYPE_PLATFORM,
		TYPE_PLAYER,
		TYPE_PLAYERPROJECTILE,
		TYPE_NPC,
		TYPE_ENEMY,
		TYPE_ENEMYPROJECTILE,
		TYPE_TRIGGER,

		MAX_TYPE,
	}
	TYPE;

					CThing()	{;}
	virtual			~CThing()	{;}

	virtual TYPE	getThingType()=0;


	virtual	void	init();
	virtual	void	shutdown();
	virtual	void	think(int _frames);
	virtual	void	render();

// Linkage
	void			addChild(CThing *Child);
	void			removeChild(CThing *Child);
	void			removeAllChild();
	bool			hasChild(CThing *Child);


	DVECTOR			getPos()						{return Pos;}
	virtual void	shove(DVECTOR move);
	CThing			*getNext()						{return Next;}


	virtual void	processEvent(GAME_EVENT _event,CThing *_sourceThing);


protected:

	
// Linkage
		CThing		*Parent,*Next;

// Pos
		DVECTOR		Pos, PosDelta;

public:
		class CThing			*m_nextThing;


		
		

	// -- Collision --
public:
	virtual int		canCollide()								{return true;}
	virtual int		checkCollisionAgainst(CThing *_thisThing);
	void			updateCollisionArea();
	virtual void	collidedWith(CThing *_thisThing)			{;}
	s32				getNewYPos( CThing *_thisThing );
	void			setNewCollidedPos(DVECTOR newPos)			{m_newCollidedPos = newPos;}
protected:
	typedef struct
	{
		int	x1,y1,x2,y2;
	}
	CRECT;

	void			setCollisionSize(int _w,int _h);
	void			setCollisionCentreOffset(int _x,int _y)		{m_collisionCentreOffset.vx=_x;m_collisionCentreOffset.vy=_y;}
	void			setCollisionCentreOffset(DVECTOR xy)		{m_collisionCentreOffset=xy;}
	void			setCentreCollision(bool newCentreCollision)	{m_centreCollision = newCentreCollision;}
	void			setCollisionAngle(int newAngle)				{m_collisionAngle = newAngle;}
	int				getCollisionRadius()						{return m_collisionRadius;}
	CRECT			getCollisionArea()							{return m_collisionArea;}
	DVECTOR			getCollisionCentre()						{return m_collisionCentre;}
	s16				getCollisionAngle()							{return m_collisionAngle;}
	bool			getCentreCollision()						{return m_centreCollision;}
	DVECTOR			getNewCollidedPos()							{return m_newCollidedPos;}
private:
	DVECTOR			m_collisionSize;
	DVECTOR			m_collisionCentreOffset;
	int				m_collisionRadius;
	CRECT			m_collisionArea;
	DVECTOR			m_collisionCentre;
	s16				m_collisionAngle;
	bool			m_centreCollision;
	DVECTOR			m_newCollidedPos;

};

/* These are the individual base classes for each of the seperate thing types */
class CPickupThing : public CThing
{
public:
	virtual TYPE	getThingType()					{return TYPE_PICKUP;}
};
class CPlayerThing : public CThing
{
public:
	virtual TYPE	getThingType()					{return TYPE_PLAYER;}
};
class CPlayerProjectileThing : public CThing
{
public:
	virtual TYPE	getThingType()					{return TYPE_PLAYERPROJECTILE;}
};
class CNpcThing : public CThing
{
public:
	virtual TYPE	getThingType()					{return TYPE_NPC;}
};
class CEnemyThing : public CThing
{
public:
	virtual TYPE	getThingType()					{return TYPE_ENEMY;}
};
class CEnemyProjectileThing : public CThing
{
public:
	virtual TYPE	getThingType()					{return TYPE_ENEMYPROJECTILE;}
};
class CPlatformThing : public CThing
{
public:
	virtual TYPE	getThingType()					{return TYPE_PLATFORM;}
};
class CTriggerThing : public CThing
{
public:
	virtual TYPE	getThingType()					{return TYPE_TRIGGER;}
};


/*----------------------------------------------------------------------
	Globals
	------- */

/*----------------------------------------------------------------------
	Functions
	--------- */

/*---------------------------------------------------------------------- */

#endif	/* __THING_THING_H__ */

/*===========================================================================
 end */