//======== (C) Copyright 2002 Charles G. Cleveland All rights reserved. =========
//
// The copyright to the contents herein is the property of Charles G. Cleveland.
// The contents may be used and/or copied only with the written permission of
// Charles G. Cleveland, or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// Purpose: 
//
// $Workfile: AvHAlienEquipment.h $
// $Date: 2002/10/16 00:46:51 $
//
//-------------------------------------------------------------------------------
// $Log: AvHAlienEquipment.h,v $
// Revision 1.13  2002/10/16 00:46:51  Flayra
// - Movement chambers not useable until 3 seconds after built
// - Moved and removed some building sounds, added one for chamber death
// - Don't allow using movement chamber while gestating
//
// Revision 1.12  2002/09/09 19:47:47  Flayra
// - Alien buildings now animate
// - Sensory chamber no longer hurts players when touched
//
// Revision 1.11  2002/08/31 18:01:00  Flayra
// - Work at VALVe
//
// Revision 1.10  2002/08/16 02:32:09  Flayra
// - Added damage types
// - Swapped umbra and bile bomb
//
// Revision 1.9  2002/07/25 16:57:59  flayra
// - Linux changes
//
// Revision 1.8  2002/07/23 16:55:36  Flayra
// - Alien buildings now have an iuser3 type (used for "resource tower is under attack")
//
// Revision 1.7  2002/07/01 21:13:03  Flayra
// - Added auto-build to all alien buildings, added new parasiting ability to sensory chambers
//
// Revision 1.6  2002/06/03 16:22:45  Flayra
// - Movement chamber needs to be used to teleport, get points for building resource tower, defense chambers heal buildables too, improved sensory chamber (still has problems though), removed duplicate hive classname
//
// Revision 1.5  2002/05/28 17:11:39  Flayra
// - Added new turret instead of old offensive upgrades chamber, added secondary functions
//
// Revision 1.4  2002/05/23 02:34:00  Flayra
// - Post-crash checkin.  Restored @Backup from around 4/16.  Contains changes for last four weeks of development.
//
//===============================================================================
#ifndef AVH_ALIEN_EQUIPMENT_H
#define AVH_ALIEN_EQUIPMENT_H

#include "util/nowarnings.h"
#include "dlls/weapons.h"
#include "mod/AvHBasePlayerWeapon.h"
#include "mod/AvHConstants.h"
#include "mod/AvHEntities.h"
#include "mod/AvHBuildable.h"
#include "mod/AvHEntities.h"
#include "mod/AvHTurret.h"

class AvHAlienResourceTower : public AvHResourceTower
{
public:
					AvHAlienResourceTower();

	virtual int		GetActiveAnimation() const;

	virtual char*	GetDeploySound() const;

	virtual bool	GetIsOrganic() const;
	
	virtual int		GetPointValue() const;

	virtual char*	GetModelName() const;

	virtual int		GetSequenceForBoundingBox() const;

	char*			GetActiveSoundList() const;

	void			Killed(entvars_t* pevAttacker, int iGib);

	virtual void	Materialize();

	void			Precache();

	virtual void	Spawn();

private:
	void EXPORT		AlienResourceThink();
	
};

class AvHAlienUpgradeBuilding : public AvHBaseBuildable
{
public:
					AvHAlienUpgradeBuilding(AvHMessageID inMessageID, AvHTechID inTechID, char* inClassName, AvHUser3 inUser3);

	virtual char*	GetDeploySound() const = 0;

	virtual bool	GetIsOrganic() const;

	virtual int		GetPointValue() const;
	
	virtual AvHAlienUpgradeCategory	GetUpgradeCategory() const = 0;

	virtual void	Killed(entvars_t* pevAttacker, int iGib);

	virtual void	Materialize();

	virtual void	Precache();

	virtual void	SetHasBeenBuilt();
	
	virtual void	Spawn();

private:
	void EXPORT		AlienBuildingThink();

};

//class AvHOffenseChamber : public AvHTurret
//{
//public:
//					AvHOffenseChamber();
//
//	virtual char*	GetActiveSound() const;
//	virtual char*	GetAlertSound() const;
//	virtual char*	GetPingSound() const;
//
//	virtual int		GetRange() const;
//
//	virtual void	Precache();
//
//	virtual void	Spawn();
//};

class AvHDefenseChamber : public AvHAlienUpgradeBuilding
{
public:
					AvHDefenseChamber();

	virtual char*	GetDeploySound() const;
	
	virtual char*	GetModelName() const;

	void EXPORT		RegenAliensThink();

	virtual void	SetHasBeenBuilt();

	virtual AvHAlienUpgradeCategory	GetUpgradeCategory() const;
};

class AvHSensoryChamber : public AvHAlienUpgradeBuilding
{
public:
					AvHSensoryChamber();

	virtual char*	GetDeploySound() const;
	
	bool			GetIsEntityInSight(CBaseEntity* inEntity);

	virtual char*	GetModelName() const;
	
	virtual AvHAlienUpgradeCategory	GetUpgradeCategory() const;

	virtual void	Precache();

	virtual void	SetHasBeenBuilt();

};

class AvHMovementChamber : public AvHAlienUpgradeBuilding
{
public:
					AvHMovementChamber();

	virtual char*	GetDeploySound() const;
	
	virtual char*	GetModelName() const;

	virtual void	Precache();

	virtual void	ResetEntity();

	virtual void	SetHasBeenBuilt();

	void EXPORT		EnergyAliensThink();

	void EXPORT		TeleportUse(CBaseEntity* inActivator, CBaseEntity* inCaller, USE_TYPE inUseType, float inValue);

	void EXPORT		TeleportUseThink();

	virtual AvHAlienUpgradeCategory	GetUpgradeCategory() const;

private:
	float			mLastTimeScannedHives;
	int				mTeleportHiveIndex;
};


#endif