class AgentBase : MessageReceiverBase
{
	float	m_Type = 0;
	float	m_Invasibility;					//! how fast the agent grows when potent enough to grow
	float 	m_TransferabilityIn;			//! to the player
	float	m_TransferabilityOut;			//! from the player
	float	m_Digestibility = 0.1;			//! multiplier for agents digested in the player stomach from an infected item(agents_transfered = digested_amount(in grams or mls) * m_Digestibility)
	int		m_MaxCount = 1;
	int		m_AutoinfectCount = 1;			//! number of agents injected during the autoinfection
	float 	m_AutoinfectProbability = CalculateAutoinfectProbability(0);	// [0..1], 0 = zero chance, 1 = 100% chance of getting this agent once per hour
	float 	m_TransferabilityAirOut; 		//! transferibility airborne out
	float 	m_AntibioticsResistance = 1;	//! [0..1], 0 means antibiotics have full effect, 1 means no effect
	
	EStatLevels m_Potency = EStatLevels.MEDIUM;		//! grow when player's immune system is at this level or lower
	float m_DieOffSpeed = 1;						//! how fast the agent dies off when not potent enough to grow(per sec)
	
	void AgentBase()
	{
		Init();
	}
	
	void Init();
	
	int GetAgentType()
	{
		return m_Type;
	}
	
	float GetDieOffSpeedEx(PlayerBase player)
	{
		return GetDieOffSpeed();
	}
	
	EStatLevels GetPotencyEx(PlayerBase player)
	{
		return GetPotency();
	}
	
	float GetInvasibilityEx(PlayerBase player)
	{
		return GetInvasibility();
	}
	
	float GetDigestibilityEx(PlayerBase player)
	{
		return GetDigestibility();
	}
	
	EStatLevels GetPotency()
	{
		return m_Potency;
	}	
	
	float GetDieOffSpeed()
	{
		return m_DieOffSpeed;
	}
	
	float GetAntiboticsResistance()
	{
		return m_AntibioticsResistance;
	}
	float GetAntibioticsResistanceEx(PlayerBase player)
	{
		return GetAntiboticsResistance();
	}
	
	float GetInvasibility()
	{
		return m_Invasibility;
	}

	//! should this agent grow based on invasibility even during usage of specific medical drugs attack
	bool GrowDuringMedicalDrugsAttack(EMedicalDrugsType drugType, PlayerBase player)
	{
		return true;
	}
	
	float GetDigestibility()
	{
		return m_Digestibility;
	}

	float CalculateAutoinfectProbability(float userprob)
	{
		return ( 1 - Math.Pow( 1 - userprob, ( 1 / 1200 ) ) );
	}

	bool AutoinfectCheck(float deltaT, PlayerBase player)
	{
		if (m_AutoinfectProbability == 0.0) 
			return false;
		
		float diceThrow = Math.RandomFloat01();
		
		if (diceThrow < m_AutoinfectProbability)
			return CanAutoinfectPlayer(player);

		return false;
	}

	bool CanAutoinfectPlayer(PlayerBase player)
	{
		return false;
	}
	
	float GetTransferabilityIn()
	{
		return m_TransferabilityIn;
	}

	float GetTransferabilityOut()
	{
		return m_TransferabilityOut;
	}	
	
	float GetTransferabilityAirOut()
	{
		return m_TransferabilityAirOut;
	}

	int GetMaxCount()
	{
		return m_MaxCount;
	}
	
	int GetAutoinfectCount()
	{
		return m_AutoinfectCount;
	}

	string GetName()
	{
		return ClassName();
	}

	
	//! DEPRECATED
	//!

	//! should this agent grow based on invasibility even during antibiotics attack
	bool GrowDuringAntibioticsAttack(PlayerBase player)
	{
		return true;
	}
}