#ifndef CLASSES_H
#define CLASSES_H
#include "aura.h"

#define PC_BASE			0
#define PC_BUU			1
#define PC_GOKU			2
#define PC_GOHAN		3
#define PC_KRILLIN		4
#define PC_FRIEZA		5
#define PC_PICCOLO		6
#define PC_TRUNKS		7
#define	PC_VEGETA		8
#define PC_CELL			9
#define PC_GINYU		10
#define PC_A18			11
#define PC_LAST			12 //for use in loops etc.
#define NORMAL 0

/*DragonDude: these defines are for the scoreboard, and are separate from the above "base class" defintions.
			  they match the postions of the LocalisedScoreboardClassNames array on the client */
#define SB_NULL			0
#define SB_BUU			1
#define SB_BUU2			2
#define SB_BUU3			3
#define SB_BUU4			4
#define SB_GOKU			5
#define SB_GOKU2		6
#define SB_GOKU3		7
#define SB_GOKU4		8
#define SB_GOHAN		9
#define SB_GOHAN2		10
#define SB_GOHAN3		11
#define SB_KRILLIN		12
#define SB_KRILLIN2		13
#define SB_FRIEZA		14
#define SB_FRIEZA2		15
#define SB_FRIEZA3		16
#define SB_FRIEZA4		17
#define SB_PICCOLO		18
#define SB_PICCOLO2		19
#define SB_TRUNKS		20
#define SB_TRUNKS2		21
#define SB_TRUNKS3		22
#define	SB_VEGETA		23
#define	SB_VEGETA2		24
#define SB_VEGETA3		25
#define SB_CELL			26
#define SB_CELL2		27
#define SB_CELL3		28
#define SB_GINYU		29
#define SB_GINYU2		30
#define SB_A18			31
#define SB_A18_2		32

// PCJOE: TEMP, cvars for testers
extern cvar_t swoop_speed_start;
extern cvar_t swoop_speed_end;
extern cvar_t dash_speed_start;
extern cvar_t dash_speed_end;

typedef enum
{
	transNormal,
	transBuddy
} TransformType;

/**
* Player base class 
* @version 19-4-2001
* @author Herwin 'harSens' van Welbergen
*/
class CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CBaseClass ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 200;}

	/**
	 * Pcjoe: Get Swoop Speed Start
	 * @return int: the start speed
	 */
	virtual int GetSwoopSpeedStart( void ) { return swoop_speed_start.value; }

	/**
	 * Pcjoe: Get Swoop Speed End
	 * @return int: the end speed
	 */
	virtual int GetSwoopSpeedEnd( void ) { return swoop_speed_end.value; }

	/**
	 * Pcjoe: Get Dash Speed Start
	 * @return int: the start speed
	 */
	virtual int GetDashSpeedStart( void ) { return dash_speed_start.value; }

	/**
	 * Pcjoe: Get Dash Speed End
	 * @return int: the end speed
	 */
	virtual int GetDashSpeedEnd( void ) { return dash_speed_end.value; }


	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 100;}

	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 100000;}

	/**
	* gets the ki cost/sec required to maintain this form
	* @return int: the kicost
	*/	
	virtual int KiCost(void) {return 0;}

	/**
	 * get the next class to transform to
	 * @return CBaseClass *: the next class to transform to
	 */
	virtual CBaseClass *GetAscendedClass(void) {return NULL;}

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return false;}

	/**
	 * get the previous class to descend back to
	 * @return CBaseClass *: the next class to transform to
	 */
	virtual CBaseClass *GetDescendedClass(void) {return NULL;}

	/**
	* powerlevel to transform at
	* @return int: the powerlevel to transforms at
	*/
	virtual int GetTransFormPowerLevel(void) {return 0;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 1;};

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks( void ){}

	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify( void ) {return PC_BASE;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_NULL;}

	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/	
	virtual int GetAuraSkin(void ) {return AURA_WHITE_SKIN;}
	
	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "player";}

	/**
	* Sets the correct player model for this class
	*/
	void SetModel();
	 
	/**
	* get the name of the player class
	* @return const char *: the player class name
	*/
	static const char *GetName( int id );

	/**
	* gets the id of the class (e.g. normal, ssj, form1, etc.)
	* @return int: the id
	*/
	int GetClassID(){return NORMAL;}

	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 1;}

	/**
	 * Can this class teleport while charging?
	 */
	virtual BOOL CanTeleportWhileCharging(void){return false;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 0;}

	/**
	 * Has Sword
	 * @return BOOL: If player has sword
	 */
	virtual BOOL HasSword( void ) { return FALSE; }

	/**
	 * Start Ascend
	 * @return BOOL: If the character class has handled the transformation
	 */	
	virtual BOOL StartAscend( void ) { return FALSE; }

	/**
	 * Get Transform Type
	 * @return BOOL: Return the transformation type
	 */
	virtual int GetTransformType( void ) { return transNormal; }

	protected:
	CBasePlayer *m_pPlayer;	
};

/**
* player class Piccolo
* @author Herwin 'harSens' van Welbergen
* @version 27-4-2001
*/
class CPiccolo:public CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CPiccolo ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "piccolo";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 180;}
	
	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 650000;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 1650000;}

	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 120;}

	/**
	* Get the class to transform into
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);
	
	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify(){return PC_PICCOLO;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_PICCOLO;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "piccolo";}

	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/	
	virtual int GetAuraSkin(void ) {return AURA_WHITE_SKIN;}

	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 1;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 3;}
};

/**
* player class Piccolo2
* @author Herwin 'harSens' van Welbergen
* @version 17-11-2001
*/
class CPiccolo2:public CPiccolo
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CPiccolo2 ( CBasePlayer *player );

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_PICCOLO2;}

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return true;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 250;}
	
	/**
	* gets the class to ascend to, NULL is can't transform
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void){return NULL;};

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 3975000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 1.5;};
	
	/**
	* gets the class to descend to, NULL is can't transform
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 140;}
	
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .5;}	

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "piccolo2";}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 3;}
};

/**
* player class Piccolo3
* @author Herwin 'harSens' van Welbergen
* @version 19-3-2006
*/
//class CPiccolo3:public CPiccolo
//{
//public:
//	/**
//	* constructor
//	* @param CBasePlayer *player: the player to whom the class refers
//	*/
//	CPiccolo3( CBasePlayer *player );
//
//	/**
//	 * returns true if the player can descend in this class
//	 * @return BOOL: true if we can descend
//	 */
//	virtual BOOL CanDescend(){return true;}
//
//	/**
//	* add all magic this class has to the player
//	*/
//	virtual void AddAllAttacks(void);
//
//	/**
//	* gets the speed for this class
//	* @return int: the maximum speed
//	*/
//	virtual int	GetStartSpeed( void ) {return 300;}
//	
//	/**
//	* gets the class to ascend to, NULL is can't transform
//	* @return CBaseClass*: class to transform to
//	*/
//	virtual CBaseClass *GetAscendedClass(void){return NULL;}
//
//	/**
//	* gets the powerlevel to transform at
//	* @return int: the powerlevel to transform at
//	*/
//	virtual int GetTransFormPowerLevel(void) {return 7000000;}
//
//	/**
//	* get transformation powerlevel multiplier
//	* @return float: the transformation pl multiplier
//	*/
//	virtual float GetTransFromPLMultiplier(void) {return 2;};
//	
//	/**
//	* gets the class to descend to, NULL is can't transform
//	* @return CBaseClass*: class to transform to
//	*/
//	virtual CBaseClass *GetDescendedClass(void);
//
//	/** 
//	* gets the health for this class
//	* @return int: the maximum health
//	*/
//	virtual int GetStartHealth( void ) {return 160;}
//	
//	/**
//	* gets the ki efficiency for this class
//	* @return float: the ki efficiency
//	*/
//	virtual float GetKiEfficiency( void ) {return .5;}	
//
//	/**
//	* get the name of the model
//	* @return const char *: the name of the model
//	*/	
//	virtual const char *GetModelName(){return "piccolo3";}
//
//	/**
//	 * Number of body slices (unique gibs when hit by sword/disc)
//	 * @return number of body slices
//	 */
//	virtual int GetNumBodySlices(void){return 3;}
//};

/**
* player class Goku
* @author Herwin 'harSens' van Welbergen
* @version 27-4-2001
*/
class CGoku:public CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CGoku ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "goku";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 216;}
	
	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 750000;}

	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 110;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 1750000;}

	/**
	* Get the class to transform into
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);
	
	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify(){return PC_GOKU;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_GOKU;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "goku";}

	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/
	virtual int GetAuraSkin(void ) {return AURA_WHITE_SKIN;}
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 1;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 3;}
};

/**
* player class SSJGoku
* @author Herwin 'harSens' van Welbergen
* @version 15-12-2001
*/
class CSSJGoku:public CGoku
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CSSJGoku ( CBasePlayer *player );

	/**
	* Added by Pcjoe
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_GOKU2;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 280;}
	
	/**
	* gets the class to ascend to, NULL is can't transform
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 5000000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 2;};

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return true;}

	/**
	 * gets the class to descend to, NULL is can't transform
	 * @return CBaseClass*: class to transform to
	 */
	virtual CBaseClass *GetDescendedClass(void);

	/** 
	 * gets the health for this class
	 * @return int: the maximum health
	 */
	virtual int GetStartHealth( void ) {return 130;}

	/**
	 * gets the ki cost/sec required to maintain this form (in promille)
	 * @return int: the kicost
	 */	
	virtual int KiCost(void) {return 2;}

	/**
	 * get the name of the model
	 * @return const char *: the name of the model
	 */	
	virtual const char *GetModelName(){return "ssjgoku";}

	/**
	 * get the aura's skin color
	 * @return int: the skin color of the aura
	 */
	virtual int GetAuraSkin(void ) {return AURA_YELLOW_SKIN;}
	
	/**
	 * gets the ki efficiency for this class
	 * @return float: the ki efficiency
	 */
	virtual float GetKiEfficiency( void ) {return .5;}

	virtual BOOL CanTeleportWhileCharging(void){return true;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 2;}
};

/**
* player class SSJ2Goku
* @author Herwin 'harSens' van Welbergen
* @version 7-8-2005
*/
class CSSJ2Goku:public CGoku
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CSSJ2Goku ( CBasePlayer *player );

	/**
	* Added by Pcjoe
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_GOKU3;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 300;}
	
	/**
	* gets the class to ascend to, NULL is can't transform
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 20000000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 1.5;};

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return true;}

	/**
	 * gets the class to descend to, NULL is can't transform
	 * @return CBaseClass*: class to transform to
	 */
	virtual CBaseClass *GetDescendedClass(void);

	/** 
	 * gets the health for this class
	 * @return int: the maximum health
	 */
	virtual int GetStartHealth( void ) {return 150;}

	/**
	 * gets the ki cost/sec required to maintain this form (in promille)
	 * @return int: the kicost
	 */	
	virtual int KiCost(void) {return 4;}

	/**
	 * get the name of the model
	 * @return const char *: the name of the model
	 */	
	virtual const char *GetModelName(){return "ssj2goku";}

	/**
	 * get the aura's skin color
	 * @return int: the skin color of the aura
	 */
	virtual int GetAuraSkin(void ) {return AURA_YELLOW_SKIN;}
	
	/**
	 * gets the ki efficiency for this class
	 * @return float: the ki efficiency
	 */
	virtual float GetKiEfficiency( void ) {return .4;}

	virtual BOOL CanTeleportWhileCharging(void){return true;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 0;} //TODO body slices
};


/**
* player class SSJ3Goku
* @author Herwin 'harSens' van Welbergen
* @version 7-8-2005
*/
class CSSJ3Goku:public CGoku
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CSSJ3Goku ( CBasePlayer *player );

	/**
	* Added by Pcjoe
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_GOKU4;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 320;}
	
	/**
	* gets the class to ascend to, NULL is can't transform
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void){return NULL;};

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 50000000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 1.5;};

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return true;}

	/**
	 * gets the class to descend to, NULL is can't transform
	 * @return CBaseClass*: class to transform to
	 */
	virtual CBaseClass *GetDescendedClass(void);

	/** 
	 * gets the health for this class
	 * @return int: the maximum health
	 */
	virtual int GetStartHealth( void ) {return 200;}

	/**
	 * gets the ki cost/sec required to maintain this form (in promille)
	 * @return int: the kicost
	 */	
	virtual int KiCost(void) {return 10;}

	/**
	 * get the name of the model
	 * @return const char *: the name of the model
	 */	
	virtual const char *GetModelName(){return "ssj3goku";}

	/**
	 * get the aura's skin color
	 * @return int: the skin color of the aura
	 */
	virtual int GetAuraSkin(void ) {return AURA_YELLOW_SKIN;}
	
	/**
	 * gets the ki efficiency for this class
	 * @return float: the ki efficiency
	 */
	virtual float GetKiEfficiency( void ) {return .4;}

	virtual BOOL CanTeleportWhileCharging(void){return true;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 0;} //TODO body slices
};

/**
* player class Vegeta
* @author Herwin 'harSens' van Welbergen
* @version 27-4-2001
*/
class CVegeta:public CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CVegeta ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "vegeta";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 216;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 110;}

	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 700000;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 2000000;}

	/**
	* Get the class to ascend into
	* @return CBaseClass*: class to transform to
	*/
	virtual	CBaseClass* GetAscendedClass(void);

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);
	
	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify(){return PC_VEGETA;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_VEGETA;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "vegeta";}

	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/
	virtual int GetAuraSkin(void ) {return AURA_WHITE_SKIN;}
	
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 1;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 4;}
};

/**
* player class SSJVegeta
* @author Herwin 'harSens' van Welbergen
* @version 2-12-2001
*/
class CSSJVegeta:public CVegeta
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CSSJVegeta ( CBasePlayer *player );

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_VEGETA2;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 280;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 120;}

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return true;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 5000000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 2;};

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	* gets the ki cost/sec required to maintain this form
	* @return int: the kicost
	*/	
	virtual int KiCost(void) {return 2;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "ssjvegeta";}
	
	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/
	virtual int GetAuraSkin(void ) {return AURA_YELLOW_SKIN;}
	
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .5;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 4;}
};

/**
* player class MajinVegeta
* @author Brandon 'DragonDude' Johnson
* @version 29-9-2006
*/
class CMajinVegeta : public CVegeta
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CMajinVegeta (CBasePlayer *player);

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_VEGETA3;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 300;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 150;}

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return true;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void){return NULL;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 17500000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 2;}

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	* gets the ki cost/sec required to maintain this form
	* @return int: the kicost
	*/	
	virtual int KiCost(void) {return 2;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "ssjvegeta";}
	
	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/
	virtual int GetAuraSkin(void ) {return AURA_YELLOW_SKIN;}
	
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .5;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 4;}
};

/**
* player class krillin
* @author Herwin 'harSens' van Welbergen
* @version 27-4-2001
*/
class CKrillin:public CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CKrillin ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "krillin";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 180;}
	
	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 600000;}

	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 100;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 3000000;}

	/**
	* Get the class to ascend into
	* @return CBaseClass*: class to transform to
	*/
	virtual	CBaseClass* GetAscendedClass(void);

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_KRILLIN;}
	
	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify(){return PC_KRILLIN;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "krillin";}

	virtual int GetAuraSkin(void ) {return AURA_WHITE_SKIN;}
	
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 1;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 4;}
};

/**
* player class Krillin2
* @author Herwin 'harSens' van Welbergen
* @version 17-11-2001
*/
class CKrillin2:public CKrillin
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CKrillin2 ( CBasePlayer *player );

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 350;}
	
	/**
	* gets the class to ascend to, NULL is can't transform
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void){return NULL;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at/the pl to master the transform
	*/
	virtual int GetTransFormPowerLevel(void) {return 8000000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 2;};

	/**
	* gets the class to descend to, NULL is can't transform
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 150;}
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .5;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "krillin2";}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 4;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_KRILLIN2;}
};

/**
* player class trunks
* @author Herwin 'harSens' van Welbergen
* @version 1-5-2001
*/
class CTrunks:public CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CTrunks ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "trunks";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 180;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 110;}

	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 700000;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 1000000;}

	/**
	* Get the class to ascend into
	* @return CBaseClass*: class to transform to
	*/
	virtual	CBaseClass* GetAscendedClass(void);


	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);
	
	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify(){return PC_TRUNKS;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_TRUNKS;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "trunks";}

	/**
	* get the aura skin color
	* @return int: the skin color index
	*/
	virtual int GetAuraSkin(void ) {return AURA_WHITE_SKIN;}

	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 1;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 3;}
	
	/**
	 * Has Sword
	 * @return BOOL: If player has sword
	 */
	virtual BOOL HasSword( void ) { return TRUE; }
};

/**
* player class SSJTrunks
* @author Herwin 'harSens' van Welbergen
* @version 15-12-2001
*/
class CSSJTrunks:public CTrunks
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CSSJTrunks( CBasePlayer *player );

	/**
	* Added by Pcjoe
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_TRUNKS2;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 250;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 130;}

	/**
	* gets the ki cost/sec required to maintain this form
	* @return int: the kicost
	*/	
	virtual int KiCost(void) {return 2;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	
	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at/the pl to master the transform
	*/
	virtual int GetTransFormPowerLevel(void) {return 3000000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 2;};

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return true;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "ssjtrunks";}
	
	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/
	virtual int GetAuraSkin(void ) {return AURA_YELLOW_SKIN;}
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .5;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 4;}
};


/**
* player class USSJTrunks
* @author Herwin 'harSens' van Welbergen
* @version 30-8-2005
*/
class CUSSJTrunks:public CTrunks
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CUSSJTrunks( CBasePlayer *player );

	/**
	* Added by Pcjoe
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_TRUNKS3;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 240;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 150;}

	/**
	* gets the ki cost/sec required to maintain this form
	* @return int: the kicost
	*/	
	virtual int KiCost(void) {return 2;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void){return NULL;}

	
	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at/the pl to master the transform
	*/
	virtual int GetTransFormPowerLevel(void) {return 12000000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 2;};

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return true;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "ussjtrunks";}
	
	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/
	virtual int GetAuraSkin(void ) {return AURA_YELLOW_SKIN;}
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .4;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 0;}
};

/**
* player class frieza
* @author Herwin 'harSens' van Welbergen
* @version 12-5-2001
*/
class CFrieza:public CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CFrieza ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "frieza";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 180;}
	
	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 800000;}

	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 150;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetTransFormPowerLevel( void ) {return 1800000;}

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);
	
	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify(){return PC_FRIEZA;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_FRIEZA;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "frieza";}

	/**
	* get the aura skin color
	* @return int: the skin color index
	*/
	virtual int GetAuraSkin(void ) {return AURA_PURPLE_SKIN;}
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 1;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 7;}
};

/**
* player class Frieza2
* @author Herwin 'harSens' van Welbergen
* @version 19-12-2001
*/
class CFrieza2:public CFrieza
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CFrieza2 ( CBasePlayer *player );

	/**
	* Added by Pcjoe
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_FRIEZA2;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 275;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 170;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void){return NULL;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at/the pl to master the transform
	*/
	virtual int GetTransFormPowerLevel(void) {return 2500000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 1.5;};

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return true;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "frieza2";}
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .5;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 6;}
};


/**
* player class cell
* @author Herwin 'harSens' van Welbergen
* @version 12-5-2001
*/
class CCell:public CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CCell ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "cell";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 216;}
	
	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 900000;}

	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 120;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 1900000;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks();
	
	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify(){return PC_CELL;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_CELL;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "cell";}

	/**
	* get the aura skin color
	* @return int: the skin color index
	*/
	virtual int GetAuraSkin(void ) {return AURA_GREEN_SKIN;}
	
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 1;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 5;}
};

/**
* player class Cell2
* @author Herwin 'harSens' van Welbergen
* @version 2-12-2001
*/
class CCell2:public CCell
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CCell2 ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "cell2";}

	virtual void AddAllAttacks();

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_CELL2;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 290;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 140;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at/the pl to master the transform
	*/
	
	virtual int GetTransFormPowerLevel(void) {return 2850000;}
	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/

	virtual float GetTransFromPLMultiplier(void) {return 1.5;};

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "cell2";}

	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .5;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 3;}
};

/**
* player class perfect cell
* @author Herwin 'harSens' van Welbergen
* @version 7-8-2005
*/
class CPCell:public CCell
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CPCell( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "pcell";}

	virtual void AddAllAttacks();

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_CELL3;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 350;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 180;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void){return NULL;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at/the pl to master the transform
	*/
	
	virtual int GetTransFormPowerLevel(void) {return 10000000;}
	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/

	virtual float GetTransFromPLMultiplier(void) {return 1.5;};

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "pcell";}

	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .4;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 0;}  //TODO: add body slices
};

/**
* player class buu
* @author Herwin 'harSens' van Welbergen
* @version 12-5-2001
*/
class CBuu:public CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CBuu ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "fatbuu";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 220;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 160;}

	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 1250000;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 3000000;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);
	
	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify(){return PC_BUU;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_BUU;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "fatbuu";}

	virtual int GetAuraSkin(void ) {return AURA_PURPLE_SKIN;}
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 1;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 4;}
};

/**
* player class Buu2
* @author Herwin 'harSens' van Welbergen
* @version 2-12-2001
*/
class CBuu2:public CBuu
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CBuu2 ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "buu";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 320;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 180;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at/the pl to master the transform
	*/
	virtual int GetTransFormPowerLevel(void) {return 4500000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 1.2;};

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "evilbuu";}
	
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .5;}

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_BUU2;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 4;}
};




/**
* player class Buu2
* @author Herwin 'harSens' van Welbergen
* @version 30-9-2005
*/
class CBuu3:public CBuu
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CBuu3 ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "buu";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 340;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 190;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at/the pl to master the transform
	*/
	virtual int GetTransFormPowerLevel(void) {return 7000000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 1.2;};

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "superbuu";}
	
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .4;}

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_BUU3;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 4;}
};

/**
* player class Buu2
* @author Herwin 'harSens' van Welbergen
* @version 30-9-2005
*/
class CBuu4:public CBuu
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CBuu4 ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "buu";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 350;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 200;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void){return NULL;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at/the pl to master the transform
	*/
	virtual int GetTransFormPowerLevel(void) {return 12000000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 1.2;};

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "kidbuu";}
	
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .4;}

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_BUU4;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 4;}
};

/**
* player class gohan
* @author Herwin 'harSens' van Welbergen
* @version 1-5-2001
*/
class CGohan:public CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CGohan ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "gohan";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 180;}

	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 100;}
	
	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 600000;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 1000000;}

	/**
	* Get the class to ascend into
	* @return CBaseClass*: class to transform to
	*/
	virtual	CBaseClass* GetAscendedClass(void);

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);
	
	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify(){return PC_GOHAN;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_GOHAN;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "gohan";}

	virtual int GetAuraSkin(void ) {return AURA_WHITE_SKIN;}
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 1;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 2;}
};

/**
* player class SSJGohan
* @author Herwin 'harSens' van Welbergen
* @version 15-12-2001
*/
class CSSJGohan:public CGohan
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CSSJGohan( CBasePlayer *player );

	/**
	* Added by Pcjoe
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_GOHAN2;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 280;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 120;}

	/**
	* gets the ki cost/sec required to maintain this form
	* @return int: the kicost
	*/	
	virtual int KiCost(void) {return 2;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at/the pl to master the transform
	*/
	virtual int GetTransFormPowerLevel(void) {return 3500000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 1.5;};

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return true;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "ssjgohan";}
	
	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/
	virtual int GetAuraSkin(void ) {return AURA_YELLOW_SKIN;}
	
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .5;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 1;}
};

/**
* player class SSJ2Gohan
* @author Herwin 'harSens' van Welbergen
* @version 30-8-2005
*/
class CSSJ2Gohan:public CGohan
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CSSJ2Gohan( CBasePlayer *player );

	/**
	* Added by Pcjoe
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_GOHAN3;}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 300;}
	
	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 150;}

	/**
	* gets the ki cost/sec required to maintain this form
	* @return int: the kicost
	*/	
	virtual int KiCost(void) {return 3;}

	/**
	* gets the class to ascend into, NULL is can't ascend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void){return NULL;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at/the pl to master the transform
	*/
	virtual int GetTransFormPowerLevel(void) {return 10000000;}

	/**
	* get transformation powerlevel multiplier
	* @return float: the transformation pl multiplier
	*/
	virtual float GetTransFromPLMultiplier(void) {return 1.5;};

	/**
	* gets the class to descend into, NULL is can't descend
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetDescendedClass(void);

	/**
	 * returns true if the player can descend in this class
	 * @return BOOL: true if we can descend
	 */
	virtual BOOL CanDescend(){return true;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "ssj2gohan";}
	
	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/
	virtual int GetAuraSkin(void ) {return AURA_YELLOW_SKIN;}
	
	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return .4;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 0;}
};

/**
 * player class Ginyu
 * @author Herwin 'harSens' van Welbergen
 * @version 11-9-2004
 */
class CGinyu:public CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CGinyu ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "ginyu";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 180;}
	
	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 1000000;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 1750000;}

	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 120;}

	/**
	* Get the class to transform into
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);
	
	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify(){return PC_GINYU;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_GINYU;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "ginyu";}

	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/	
	virtual int GetAuraSkin(void ) {return AURA_PURPLE_SKIN;}

	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 1;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 0;}

	virtual int GetTransformType( void ) { return transBuddy; }

	virtual BOOL StartAscend(void);
};

/**
* player class Android 18
* @author Herwin 'harSens' van Welbergen
* @version 16-4-2005
*/
class CAndroid18:public CBaseClass
{
public:
	/**
	* constructor
	* @param CBasePlayer *player: the player to whom the class refers
	*/
	CAndroid18 ( CBasePlayer *player );

	/**
	* get the name of the sound dir
	* @return const char *: the name of the model
	*/	
	virtual const char *GetSoundDir(){return "a18";}

	/**
	* gets the speed for this class
	* @return int: the maximum speed
	*/
	virtual int	GetStartSpeed( void ) {return 180;}
	
	/**
	* gets the maximum powerlevel for this class
	* @return int: the maximum powerlevel
	*/
	virtual int GetStartPowerLevel( void ) {return 800000;}

	/**
	* gets the powerlevel to transform at
	* @return int: the powerlevel to transform at
	*/
	virtual int GetTransFormPowerLevel(void) {return 1750000;}

	/** 
	* gets the health for this class
	* @return int: the maximum health
	*/
	virtual int GetStartHealth( void ) {return 100;}

	/**
	* Get the class to transform into
	* @return CBaseClass*: class to transform to
	*/
	virtual CBaseClass *GetAscendedClass(void);

	/**
	* add all magic this class has to the player
	*/
	virtual void AddAllAttacks(void);
	
	/**
	* get the player class identifier
	* @return int: the player class identifier
	*/
	virtual int Classify(){return PC_A18;}

	/**
	* DragonDude: return the name of the class to display on the scoreboard
	* @return int: the index of an array of strings from which to display
	*/
	virtual int ScoreboardName() {return SB_A18;}

	/**
	* get the name of the model
	* @return const char *: the name of the model
	*/	
	virtual const char *GetModelName(){return "a18";}

	/**
	* get the aura's skin color
	* @return int: the skin color of the aura
	*/	
	virtual int GetAuraSkin(void ) {return AURA_WHITE_SKIN;}

	/**
	* gets the ki efficiency for this class
	* @return float: the ki efficiency
	*/
	virtual float GetKiEfficiency( void ) {return 0.5;}

	/**
	 * Number of body slices (unique gibs when hit by sword/disc)
	 * @return number of body slices
	 */
	virtual int GetNumBodySlices(void){return 0;}
};
#endif