//======== (C) Copyright 2001 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: AvHBaseBuildable.h$
// $Date: 2002/11/15 04:47:11 $
//
//-------------------------------------------------------------------------------
// $Log: AvHBaseBuildable.h,v $
// Revision 1.11  2002/11/15 04:47:11  Flayra
// - Regenerate now returns bool if healed or not, for def chamber tweak
//
// Revision 1.10  2002/11/06 01:38:24  Flayra
// - Added ability for buildings to be enabled and disabled, for turrets to be shut down
// - Damage refactoring (TakeDamage assumes caller has already adjusted for friendly fire, etc.)
//
// Revision 1.9  2002/10/03 18:38:56  Flayra
// - Fixed problem where regenerating builders via healing spray wasn't updating health ring
// - Allow buildings to play custom damage alerts (for towers)
//
// Revision 1.8  2002/09/23 22:10:14  Flayra
// - Removed progress bar when building
// - Removed vestiges of fading building as building
// - Changed point costs
//
// Revision 1.7  2002/09/09 19:49:09  Flayra
// - Buildables now play animations better, without interrupting previous anims
//
// Revision 1.6  2002/08/31 18:01:01  Flayra
// - Work at VALVe
//
// Revision 1.5  2002/08/16 02:32:45  Flayra
// - Added damage types
// - Added visual health for commander and marines
//
// Revision 1.4  2002/07/01 21:15:46  Flayra
// - Added auto-build capability
//
// Revision 1.3  2002/06/03 16:27:59  Flayra
// - Allow alien buildings to regenerate, renamed weapons factory and armory
//
// Revision 1.2  2002/05/28 17:37:27  Flayra
// - Added building recycling, mark mapper placed buildables so they aren't destroyed at the end of the round
//
// Revision 1.1  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_BASE_BUILDABLE_H
#define AVH_BASE_BUILDABLE_H

#include "util/nowarnings.h"
#include "extdll.h"
#include "util.h"
#include "mod/AvHConstants.h"
#include "mod/AvHBuildable.h"
#include "dlls/cbase.h"
#include "mod/AvHMessage.h"
#include "mod/AvHSpecials.h"
#include "mod/AvHPlayer.h"
#include "mod/AvHCloakable.h"

class AvHBaseBuildable : public CBaseAnimating, public AvHBuildable, public AvHCloakable
{
public:
					AvHBaseBuildable(AvHTechID inTechID, AvHMessageID inMessageID, char* inClassName, int inUser3 = AVH_USER3_NONE);

	void EXPORT		AnimateThink();

	virtual int		BloodColor(void);

    void EXPORT		BuildableTouch(CBaseEntity* inEntity);

	virtual void	CheckEnabledState();
					
	void EXPORT		ConstructUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );

	virtual bool	Energize(float inEnergyAmount);

	void EXPORT		FallThink(void);

	virtual void	FireDeathTarget() const;

	virtual void	FireSpawnTarget() const;

	virtual int		GetBaseHealth() const;

	virtual int		GetIdleAnimation() const;

	virtual bool	GetIsRecycling() const;
	
	virtual CBaseEntity* GetAttacker();

	virtual char*	GetClassName() const;

	virtual char*	GetDeploySound() const;

	virtual bool	GetIsBuilt(void) const;

	virtual bool	GetIsOrganic() const;

	virtual bool	GetIsTechActive() const;

	virtual char*	GetKilledSound() const;

	virtual int		GetActiveAnimation() const;

	virtual int		GetDeployAnimation() const;

	virtual int		GetIdle1Animation() const;

	virtual int		GetIdle2Animation() const;

    virtual bool	GetIsTechnologyAvailable(AvHMessageID inMessageID) const;

	virtual int		GetKilledAnimation() const;

	virtual AvHMessageID	GetMessageID() const;

	virtual int		GetMoveType() const;

	virtual int		GetSequenceForBoundingBox() const;

	virtual bool	GetTriggerAlertOnDamage() const;

	virtual float	GetTimeAnimationDone() const;

	virtual int		GetRecycleAnimation() const;

	virtual int		GetResearchAnimation() const;

	virtual int		GetSpawnAnimation() const;

	virtual int		GetTakeDamageAnimation() const;
		
	virtual char*	GetModelName() const;
	
	virtual float	GetNormalizedBuildPercentage() const;

	virtual float	GetTimeForAnimation(int inIndex) const;
	
	virtual void	SetResearching(bool inState);

	virtual bool	GetIsPersistent() const;
	
	virtual AvHTeamNumber	GetTeamNumber() const;

	virtual void	HealthChanged();
		
	virtual void	KeyValue(KeyValueData* pkvd);

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

	virtual int		ObjectCaps(void);

    // Pass -1 to play an animation backwards
	virtual void	PlayAnimationAtIndex(int inIndex, bool inForce = false, float inFrameRate = 1.0f);
				
	virtual void	Precache(void);

	virtual bool	Regenerate(float inRegenerationAmount, bool inPlaySound = true);
	
	virtual void	ResetEntity();

	virtual void	SetConstructionComplete(bool inForce = false);

	virtual void	SetAverageUseSoundLength(float inLength);

	virtual void	StartRecycle();
				
	virtual void	Spawn();

	virtual int		TakeDamage(entvars_t* inInflictor, entvars_t* inAttacker, float inDamage, int inBitsDamageType);

	virtual void	TechnologyBuilt(AvHMessageID inMessageID);

	virtual void	WorldUpdate();

	virtual void	UpdateOnRecycle();

protected:
	virtual bool	GetHasBeenKilled() const;

	int				GetStartAlpha() const;

	void			Init();

	void			InternalInitializeBuildable();

	void			InternalSetConstructionComplete(bool inForce = false);

	virtual void	Materialize();

	void EXPORT		RecycleComplete();
    
    // Called when a persistent buildable is killed
    virtual void	SetActive();
    virtual void    SetInactive();

	virtual void	SetNormalizedBuildPercentage(float inPercentage, bool inForceIfComplete = false);

	void			SetPersistent();

	void			SetSelectID(int inSelectID);

	virtual void	TriggerDeathAudioVisuals();

	void			UpdateAutoBuild(float inTimePassed);

	void			UpdateAutoHeal();

	void			UpdateDamageEffects();

	virtual void	UpdateTechSlots();

	int				mBaseHealth;
	AvHMessageID	mMessageID;
	
private:
	
	char*			mClassName;
	char*			mModelName;
	int				mSelectID;
	
	//float			mPercentageBuilt;
	float			mLastTimePlayedSound;
	float			mTimeToConstruct;
	const int		kStartAlpha;

	float			mAverageUseSoundLength;

	int				mLastAnimationPlayed;
	float			mTimeAnimationDone;

	// Marks entity to not be removed on level reset
	bool			mPersistent;
	int				mElectricalSprite;
	bool			mIsResearching;

	string			mTargetOnSpawn;
	string			mTargetOnDeath;

	float			mTimeOfLastAutoHeal;
	bool			mInternalSetConstructionComplete;

	float			mTimeOfLastDamageEffect;
	float			mTimeOfLastDamageUpdate;

	float			mTimeRecycleStarted;
	float			mTimeRecycleDone;

	bool			mKilled;
};

#endif