
///////////////////////////////////////////////////////////////////////////////
//
// File   : AVP_ServerActor_AlienQueen.h
// Author : Andy McCabe
// Date   : 07-Nov-2008
//
// Copyright (C) 2008 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
	#pragma once
#endif   // ifdef ASURA_USE_PRAGMA_ONCE

#ifndef __AVP_SERVERACTOR_ALIENQUEEN_H__
#define __AVP_SERVERACTOR_ALIENQUEEN_H__

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////

#include "Core/Asura_HashedList.h"

#include "Entity/PhysicalObject/Actor/Vertebrates/AVP_ServerActor_Vertebrate.h"

// axon
#include "Core/AxonAVP_Messages.h"

////////////////////////////////////////////////////////////////////////////////
// Forward class declarations...
////////////////////////////////////////////////////////////////////////////////

class Asura_Collision_Object;

////////////////////////////////////////////////////////////////////////////////
// Class declaration...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Class        : AVP_ServerActor_AlienQueen
// Author       : Andy McCabe
// Date         : 07-Nov-2008
//
// Description  : This class handles the operation of the AlienQueen actor.
////////////////////////////////////////////////////////////////////////////////

class AVP_ServerActor_AlienQueen : public AVP_ServerActor_Vertebrate
{
public:
	virtual	bool HandleMessage(const Asura_Message* pxMessage);
	virtual	void ReadFromChunkStream(Asura_Chunk_Stream& xStream);
	virtual	void WriteToChunkStream(Asura_Chunk_Stream& xStream) const;

	virtual void PostLoadInitialise();
	virtual void MakeAI();

	static void Create(Asura_Guid uGUID) { new AVP_ServerActor_AlienQueen(uGUID); }
	static AVP_ServerActor_AlienQueen* CreateAndReturn(Asura_Guid uGUID) { return new AVP_ServerActor_AlienQueen(uGUID); }

	static	AVP_ServerActor_AlienQueen*								FindEntity(const Asura_Guid uGuid)	{ return(s_xList.FindEntity(uGuid)); }
	static	const Asura_Hashed_List<AVP_ServerActor_AlienQueen>*	GetList(void)						{ return(&s_xList); }

	bool HasQueenHadEnoughDamageToBeStunned();

protected:

	AVP_ServerActor_AlienQueen(const Asura_Guid uGUID);
	virtual ~AVP_ServerActor_AlienQueen();

	virtual Axon_Brain* CreateBrain();

	virtual float GetHeadPositionYOffset() const { return -0.25f; }
	virtual float GetChestPositionYOffset() const { return -0.25f; }

	virtual const Asura_Blueprint* GetCurrentFlinchBlueprint() const;
	virtual Asura_Hash_ID GetMovesBlueprintType() const;

	virtual void	InitialiseFromBlueprint( const Asura_Blueprint& xBlueprint );

	virtual void	OnApplyDamage(const AVP_EntityDamage_ApplyToEntity& xDamage);
	virtual	void	TakeDamageExtended(const AVP_EntityDamage_RequestVictim& xDamage, const bool bForceFatal, const bool bSendMessageToClient=true );


private:
	typedef AVP_ServerActor_Vertebrate PARENT;

	void SendCreateAcidSpitProjectileMessage(const Asura_Guid uTargetGuid);

#if defined(ASURA_TOOLS)
	friend class ToolsAVP_Entity_AlienQueen;
#endif

	static Asura_Hashed_List<AVP_ServerActor_AlienQueen> s_xList;

	AVP_ServerActor_AlienQueen(void);
	AVP_ServerActor_AlienQueen(const AVP_ServerActor_AlienQueen& xOther);
	AVP_ServerActor_AlienQueen&	operator=(const AVP_ServerActor_AlienQueen& xOther);

	float m_fDamageTillStunned;
	float m_fDamageAccumulated;

	static const u_int uCURRENT_CHUNK_VERSION = 2;
};

#endif   // ifndef __AVP_SERVERACTOR_ALIENQUEEN_H__


/// End of file. ///
