/*
File: gameworms.h
Uploaded by richprillinger on Fri Nov 16 02:51:48 PST 2001
*/



#ifndef GAMEWORMS
#define GAMEWORMS

#include "game.h"
#include "critterwall.h" /* Lee added 11-04-01 */
//#include "critterarmed.h" /* Lee added 11-11-01 */

//======================= cGameWorms ================


class cGameWorms : public cGame
{
DECLARE_SERIAL(cGameWorms);

//Name your statics here
static int PLAYERHEALTH;
static int WORMCOUNT;

private:
	int _rivalcount; //possible params, don't have to use these.
   int _playerseedcount;
public:
	cGameWorms();
    void initiatePlayer( int _playerseedcount );
	void initiateMap1();                            /* 11-12 Joe */
 
    //overloads
	virtual void Serialize(CArchive& ar);
	virtual void reset();
	virtual void adjustGameParameters();
	virtual CString statusMessage();
	virtual void initializeView(CPopView *pview);
	virtual void seedCritters();
	virtual BOOL collide(cCritter *pcriti, cCritter *pcritj); //Lets the cCritterBasket
};

//=== cGameWorms Critters ====================================

class cCritterWormsSnake;

class cCritterMazeWall : public cCritterWall
{
DECLARE_SERIAL(cCritterMazeWall);
public:
	cCritterMazeWall(){}
	cCritterMazeWall(const cVector &enda, const cVector &endb, 
						Real thickness = cCritterWall::THICKNESS);
};

class cCritterWormsBase : public cCritter
{
public:
   cCritterWormsBase()
      : _pPreviousSection( NULL ), _pSnake( NULL ) {}
   void setSnake( cCritterWormsSnake * snake )
   { _pSnake = snake; }
   void setPrevious( cCritterWormsBase * prev )
   { _pPreviousSection = prev; }
   cCritterWormsBase * getPrevious()
   { return _pPreviousSection; }
   cCritterWormsSnake * getSnake()
   { return _pSnake; }
protected:
   cCritterWormsBase * _pPreviousSection;
   cCritterWormsSnake * _pSnake;
};

class cCritterWormsSnake 
{
public:
   cCritterWormsSnake( cGameWorms * game, int size );
   cCritterWormsBase * getTail()
   { return _pTail; }
   cCritterWormsBase * getHead()
   { return _pHead; }
   void eatenHead();
   void eatenTail();
   void setHead( cCritterWormsBase * head )
   { _pHead = head; }
   void setTail( cCritterWormsBase * tail )
   { _pTail = tail; }
   int getSize()
   { return _size; }
   cGameWorms * getGame()
   { return _pGame; }
   void growSnake();
   void dropEgg( Real dt, bool & dropped );
protected:
   void deleteAll();
   int _size;
   cGameWorms * _pGame;
   cCritterWormsBase * _pHead;
   cCritterWormsBase * _pTail;
   Real _timeUntilEgg;
};

class cCritterWormsPlayer : public cCritterWormsBase	/* 11-5 Joe */
{
DECLARE_SERIAL(cCritterWormsPlayer);
public:
	cCritterWormsPlayer();
   void dropEgg();
   void seedRandomFood( Real dt );
	//overloads
	virtual void reset();
	virtual BOOL collide(cCritter *pcritter); 
	virtual void update(Real dt, CPopView *pview);
protected:
   Real _timeUntilFood;
   bool _eggDropped;
};

class cCritterWormsSeg : public cCritterWormsBase	/* Lee 11-11-01 */
{
DECLARE_SERIAL(cCritterWormsSeg);					/* Lee 11-11-01 */
public:
	cCritterWormsSeg(cCritterWormsBase * pcritter = NULL); 
	//overloads
	virtual BOOL collide(cCritter *pcritter); 
	virtual void update(Real dt, CPopView *pview);
};

class cCritterPlayerWormsSeg : public cCritterWormsBase		/* Lee 11-11-01 */
{
DECLARE_SERIAL(cCritterPlayerWormsSeg);						/* Lee 11-11-01 */
public:
	cCritterPlayerWormsSeg(cCritterWormsBase * pcritter = NULL); 
	//overloads
	virtual BOOL collide(cCritter *pcritter); 
	virtual void update(Real dt, CPopView *pview);
};


class cCritterWormsEnemyHead : public cCritterWormsBase		/* 11-12 Joe */
{
DECLARE_SERIAL( cCritterWormsEnemyHead );
public:
   virtual void update( Real dt, CPopView * pview );
   virtual BOOL collide(cCritter * pcritter);
   cCritterWormsEnemyHead( cCritter * pcritter = NULL );
protected:
   Real _timeUntilEgg;
};

class cCritterWormsPlayerEgg : public cCritterWormsBase
{
DECLARE_SERIAL( cCritterWormsPlayerEgg );
public:
};

class cCritterWormsEnemyEgg : public cCritterWormsBase
{
DECLARE_SERIAL( cCritterWormsEnemyEgg );
public:
};

class cCritterWormsFood : public cCritterWormsBase
{
DECLARE_SERIAL( cCritterWormsFood );
public:
   cCritterWormsFood();
};

#endif //GAMEWORMS