#ifndef GAMESTUB_3D
#define GAMESTUB_3D

/*
	The gamestub.* files are meant to be a possible starting point for your games.  Alter the
	gamestub.* files freely.  "Backup" original versions of them are in the files
	gamestuboriginal.*, you can open these and save as gamestub.* whenever you want a fresh
	start.
	In the code below, we put the word virtual in front of all the methods that we have
	inherited from the base classes and which we plan to overload.  (These methods were
	already declared as virtual in the base classes, so that our overloads can take effect.
	Declaring them virtual in this child class only means that they could be further overloaded 
	in the children of the child.)
*/

#include "game.h"
#include "critterarmed.h"

//=== cGameStub3D Critters ====================================

class cCritterStub3DPlayer : public cCritterArmedPlayer //Our player.
{
DECLARE_SERIAL(cCritterStub3DPlayer);
public:
	cCritterStub3DPlayer();
//overloads
	virtual void reset();
	virtual int damage(int hitstrength);
	virtual BOOL collide(cCritter *pcritter); 
	virtual void update(CPopView *pactiveview, Real dt);
};

class cCritterStub3DPlayerBullet : public cCritterBullet
{
DECLARE_SERIAL(cCritterStub3DPlayerBullet);
public:
	cCritterStub3DPlayerBullet();
};

class cCritterStub3DRival : public cCritterArmedRobot //Or just a cCritter if not shooting
{
DECLARE_SERIAL(cCritterStub3DRival);
public:
	cCritterStub3DRival(cGame *pownergame = NULL);
//overloads
	virtual int damage(int hitstrength);
	virtual BOOL collide(cCritter *pcritter); 
	virtual void update(CPopView *pactiveview, Real dt);
};

	/* The cCritterBulletSilver only can damage the ptarget of the
	shooter.   */
class cCritterStub3DRivalBullet : public cCritterBulletSilver
{
DECLARE_SERIAL(cCritterStub3DRivalBullet);
public:
	cCritterStub3DRivalBullet();
	virtual void initialize(cCritterArmed *pshooter);
};

class cCritterStub3DProp : public cCritter
{
DECLARE_SERIAL(cCritterStub3DProp);
public:
	cCritterStub3DProp(cGame *pownergame = NULL); 
//overloads
	virtual int damage(int hitstrength);
	virtual BOOL collide(cCritter *pcritter); 
	virtual void update(CPopView *pactiveview, Real dt);
};

//======================= cGameStub3D ================


class cGameStub3D : public cGame
{
DECLARE_SERIAL(cGameStub3D);
//Name your statics here
static int PLAYERHEALTH;
static Real CRITTERMINRADIUS;
static Real CRITTERMAXRADIUS;
static Real CRITTERMAXSPEED;
private:
	int _rivalcount; //possible params, don't have to use these.
public:
	cGameStub3D();
//Special method for OpenGL features demo
	virtual void drawStaticObjects(cGraphics *pgraphics); /* Draws some
		shapes, if you don't want this, give this method an emtpy body. */
 //overloads
	virtual	void drawForeground(cGraphics *pgraphics, int drawflags); /* This method
		gets called in the CPopView::OnDraw; we overload it to call renderScene. */
	virtual void Serialize(CArchive& ar); //Overload for _lastinvasionscore
	virtual void reset();
	virtual void adjustGameParameters();
	virtual CString statusMessage();
	virtual void initializeView(CPopView *pview);
	virtual void initializeViewpoint(cCritterViewer *pviewer);
	virtual void seedCritters();
};

#endif //GAMESTUB_3D