#ifndef __POWERUPS_H__
#define __POWERUPS_H__

#include "g_local.h"
#include "inventoryitem.h"

class EXPORT_FROM_DLL ScubaGear : public InventoryItem
{
public:
	CLASS_PROTOTYPE( ScubaGear );
	ScubaGear();
};

class EXPORT_FROM_DLL Adrenaline : public InventoryItem
{
private:
	float health_delta;
public:
	CLASS_PROTOTYPE( Adrenaline );

	Adrenaline();
	virtual void      Use( Event *ev );
	void              Powerdown( Event *ev );
	virtual void      Archive( Archiver &arc );
	virtual void      Unarchive( Archiver &arc );
};

inline EXPORT_FROM_DLL void Adrenaline::Archive( Archiver &arc )
{
	InventoryItem::Archive( arc );

	arc.WriteFloat( health_delta );
}

inline EXPORT_FROM_DLL void Adrenaline::Unarchive( Archiver &arc )
{
	InventoryItem::Unarchive( arc );

	arc.ReadFloat( &health_delta );
}

class EXPORT_FROM_DLL Cloak : public InventoryItem
{
public:
	CLASS_PROTOTYPE( Cloak );

	Cloak();
	virtual void      Use( Event *ev );
	void              Powerdown( Event *ev );
};

class EXPORT_FROM_DLL Medkit : public Entity
{
public:
	CLASS_PROTOTYPE( Medkit );

	Medkit();
	virtual void      Use( Event *ev );
};


class EXPORT_FROM_DLL Mutagen : public InventoryItem
{
public:
	CLASS_PROTOTYPE( Mutagen );

	Mutagen();
	virtual void      Use( Event *ev );
	void              Powerdown( Event *ev );
	virtual qboolean  Pickupable( Entity *other );   //###
};

class EXPORT_FROM_DLL Oxygen : public InventoryItem
{
public:
	CLASS_PROTOTYPE( Oxygen );

	Oxygen();
	virtual void      Use( Event *ev );
	virtual void      Pickup( Event *ev );
	void              Powerdown( Event *ev );
};

//###
class EXPORT_FROM_DLL Goggles : public InventoryItem
{
private:
	EntityPtr glowent;
public:
	CLASS_PROTOTYPE( Goggles );

	qboolean goggleson;

	Goggles();
	~Goggles();
	virtual void Postthink( void );
	virtual void Use( Event *ev );
	virtual void CheckTurnoff( Event *ev );
	virtual qboolean Pickupable( Entity *other );
	virtual Item *ItemPickup( Entity *other );
	virtual void Pickup( Event *ev );

	virtual void Archive( Archiver &arc );
	virtual void Unarchive( Archiver &arc );
};

inline EXPORT_FROM_DLL void Goggles::Archive( Archiver &arc )
{
	InventoryItem::Archive( arc );

	arc.WriteBoolean( goggleson );
	arc.WriteSafePointer( glowent );
}

inline EXPORT_FROM_DLL void Goggles::Unarchive( Archiver &arc )
{
	InventoryItem::Unarchive( arc );

	arc.ReadBoolean( &goggleson );
	arc.ReadSafePointer( &glowent );
}

class EXPORT_FROM_DLL EasterCandy : public InventoryItem
{
public:
	CLASS_PROTOTYPE( EasterCandy );

	EasterCandy();
	virtual void      Use( Event *ev );
};

class EXPORT_FROM_DLL EasterCoke : public InventoryItem
{
public:
	CLASS_PROTOTYPE( EasterCoke );

	EasterCoke();
	virtual void      Use( Event *ev );
};
//###

#endif /* powerups.h */