DIFF

Salmonella.c

class SalmonellaMdfr: ModifierBase
{
	static const int AGENT_THRESHOLD_ACTIVATE = 60;
	static const int AGENT_THRESHOLD_DEACTIVATE = 20;

	static const int CHANCE_OF_VOMIT = 10;			// base vomit chance
	static const int CHANCE_OF_VOMIT_AGENT = 20;	// adjusted by the agent count
	static const int WATER_DRAIN_FROM_VOMIT = 450;
	static const int ENERGY_DRAIN_FROM_VOMIT = 310;
	static const float STOMACH_MIN_VOLUME = 200;	// min volume of stomach for vomit symptom
	
	static const float EVENT_INTERVAL_MIN = 12;
	static const float EVENT_INTERVAL_MAX = 18;

	private float m_Time;
	private float m_NextEvent;
	private float m_ExhaustionTimer;
	
	private bool m_Exhaustion;
	
	override void Init()
	{
		m_TrackActivatedTime	= false;
		m_AnalyticsStatsEnabled = true;
		m_ID 					= eModifiers.MDF_SALMONELLA;
		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 protected bool ActivateCondition(PlayerBase player)
	{
		return player.GetSingleAgentCount(eAgents.SALMONELLA) >= AGENT_THRESHOLD_ACTIVATE;
	}
	
	override protected bool DeactivateCondition(PlayerBase player)
	{
		return player.GetSingleAgentCount(eAgents.SALMONELLA) <= AGENT_THRESHOLD_DEACTIVATE;
	}

	override protected void OnActivate(PlayerBase player)
	{
		player.IncreaseDiseaseCount();
		
		SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom( SymptomIDs.SYMPTOM_VOMIT );
		if (symptom)
		{
			CachedObjectsParams.PARAM1_FLOAT.param1 = 50.0;
			symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
			symptom.SetDuration(5.0);
		}
	}

	override protected 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 protected void OnTick(PlayerBase player, float deltaT)
	{
		float stomach_volume = player.m_PlayerStomach.GetStomachVolume();
		if (stomach_volume >= STOMACH_MIN_VOLUME)
		{
			int roll = Math.RandomInt(0, 100);
			int chanceOfVomit = CHANCE_OF_VOMIT + (CHANCE_OF_VOMIT_AGENT * player.GetSingleAgentCountNormalized(eAgents.SALMONELLA));
			if (roll < chanceOfVomit)
			{
				SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_VOMIT);
				
				if (symptom)
				{
					CachedObjectsParams.PARAM1_FLOAT.param1 = 50.0;
					symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
					symptom.SetDuration(5);
					player.m_AgentPool.ReduceAgent(eAgents.SALMONELLA, 30.0);

					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;
				}
			}
		}
		
		m_Time += deltaT;
	
		if (m_Time >= m_NextEvent)
		{
			m_Time = 0;
			m_NextEvent = Math.RandomFloatInclusive(EVENT_INTERVAL_MIN, EVENT_INTERVAL_MAX);
			player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_PAIN_LIGHT);
		}
		
		if (m_Exhaustion)
		{
			m_ExhaustionTimer += deltaT;
			if (m_ExhaustionTimer >= 45)
			{
				player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.DISEASE_PNEUMONIA);
				player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.DISEASE_PNEUMONIA);
				
				m_Exhaustion = false;
			}
		}
		
		
	}
}