DIFF

Poisoning.c

class PoisoningMdfr : ModifierBase
{
	static const int AGENT_THRESHOLD_ACTIVATE = 1;
	static const int AGENT_THRESHOLD_DEACTIVATE = 40;
	
	static const int VOMIT_OCCURRENCES_MIN = 2;
	static const int VOMIT_OCCURRENCES_MAX = 5;

	static const int WATER_DRAIN_FROM_VOMIT = 70;
	static const int ENERGY_DRAIN_FROM_VOMIT = 55;
	
	private float m_ExhaustionTimer;
	private bool m_Exhaustion;
	
	override void Init()
	{
		m_TrackActivatedTime	= true;
		m_AnalyticsStatsEnabled = true;
		m_IsPersistent			= true;
		m_ID 					= eModifiers.MDF_POISONING;
		m_TickIntervalInactive 	= DEFAULT_TICK_TIME_INACTIVE;
		m_TickIntervalActive 	= DEFAULT_TICK_TIME_ACTIVE;
	}
	
	override string GetDebugText()
	{
		return ("Activate threshold: "+AGENT_THRESHOLD_ACTIVATE + "| " +"Deativate threshold: "+AGENT_THRESHOLD_DEACTIVATE);
	}
	
	override bool ActivateCondition(PlayerBase player)
	{
		return (player.GetSingleAgentCount(eAgents.FOOD_POISON) >= AGENT_THRESHOLD_ACTIVATE);
	}
	
	override bool DeactivateCondition(PlayerBase player)
	{
		return !ActivateCondition(player);
	}

	override void OnActivate(PlayerBase player)
	{
		player.IncreaseDiseaseCount();
	}
	
	override void OnReconnect(PlayerBase player)
	{
		this.OnActivate(player);
	}
	
	override void OnDeactivate(PlayerBase player)
	{
		player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
		player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
		m_Exhaustion = false;
		m_ExhaustionTimer = 0;
		player.DecreaseDiseaseCount();
	}

	override void OnTick(PlayerBase player, float deltaT)
	{
		int agentCount = player.m_AgentPool.GetSingleAgentCount(eAgents.FOOD_POISON);
		if (agentCount <= AGENT_THRESHOLD_DEACTIVATE)
			return;

		int agentMax = PluginTransmissionAgents.GetAgentMaxCount(eAgents.FOOD_POISON);

		float invertedAgentCountValue = Math.InverseLerp(0, agentMax, agentCount);
		float chance = Math.Lerp(VOMIT_OCCURRENCES_MIN, VOMIT_OCCURRENCES_MAX, invertedAgentCountValue);
		chance = (chance / 300) * deltaT;
		
		if (Math.RandomFloat01() < chance)
		{
			SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_VOMIT);
			if (symptom)
			{
				CachedObjectsParams.PARAM1_FLOAT.param1 = 30.0 * invertedAgentCountValue;
				symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
				symptom.SetDuration(Math.Max(3.0, 10 * invertedAgentCountValue));
				//player.m_AgentPool.ReduceAgent(eAgents.FOOD_POISON, 100.0 * invertedAgentCountValue);
				player.m_AgentPool.ReduceAgent(eAgents.FOOD_POISON, 60);
				if (m_Player.GetStatWater().Get() > (WATER_DRAIN_FROM_VOMIT)) 
					m_Player.GetStatWater().Add(-1 * WATER_DRAIN_FROM_VOMIT);
				if (m_Player.GetStatEnergy().Get() > (ENERGY_DRAIN_FROM_VOMIT))
					m_Player.GetStatEnergy().Add(-1 * ENERGY_DRAIN_FROM_VOMIT);
				
				player.GetStaminaHandler().ActivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
				player.GetStaminaHandler().ActivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
					
				m_Exhaustion = true;
				m_ExhaustionTimer = 0;
			}
		}
		
		if (m_Exhaustion)
		{
			m_ExhaustionTimer += deltaT;
			if (m_ExhaustionTimer >= 30 * invertedAgentCountValue)
			{
				player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
				player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
				
				m_Exhaustion = false;
			}
		}
	}
	
	//! DEPRECATED
	static const int VOMIT_OCCURRENCES_PER_HOUR_MIN = 60;
	static const int VOMIT_OCCURRENCES_PER_HOUR_MAX = 120;
}