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;
}