HeavyMetal.c
class HeavyMetalMdfr : ModifierBase
{
static const float WATER_LOSS_HEAVYMETAL_MIN = 0.3;
static const float WATER_LOSS_HEAVYMETAL_MAX = 0.8;
static const float HEALTH_LOSS_HEAVYMETAL_MIN = 0.03;
static const float HEALTH_LOSS_HEAVYMETAL_MAX = 0.05;
static const int SYMPTOMFALLOFF_THRESHOLD1 = 200;
static const int SYMPTOMFALLOFF_THRESHOLD2 = 300;
static const int SYMPTOMFALLOFF_THRESHOLD3 = 400;
protected float m_NextEvent;
protected float m_Time;
protected float m_DeafnessTime;
protected bool m_IsDeaf;
override void Init()
{
m_ID = eModifiers.MDF_HEAVYMETAL1;
m_TrackActivatedTime = false;
m_AnalyticsStatsEnabled = true;
m_TickIntervalInactive = DEFAULT_TICK_TIME_INACTIVE;
m_TickIntervalActive = DEFAULT_TICK_TIME_ACTIVE;
}
override protected void OnActivate(PlayerBase player)
{
player.IncreaseDiseaseCount();
}
override protected void OnDeactivate(PlayerBase player)
{
player.DecreaseDiseaseCount();
}
}
class HeavyMetalPhase1Mdfr : HeavyMetalMdfr
{
static const int AGENT_THRESHOLD_ACTIVATE = 1;
static const int AGENT_THRESHOLD_DEACTIVATE = 200;
static const int SHIVER_EVENT_INTERVAL_MIN = 20;
static const int SHIVER_EVENT_INTERVAL_MAX = 40;
override string GetDebugText()
{
return ("Activate threshold: "+AGENT_THRESHOLD_ACTIVATE + "| " +"Deativate threshold: "+AGENT_THRESHOLD_DEACTIVATE);
}
override protected bool ActivateCondition(PlayerBase player)
{
return (player.GetSingleAgentCount(eAgents.HEAVYMETAL) >= AGENT_THRESHOLD_ACTIVATE && player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_DEACTIVATE);
}
override protected bool DeactivateCondition(PlayerBase player)
{
return (player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_ACTIVATE || player.GetSingleAgentCount(eAgents.HEAVYMETAL) > AGENT_THRESHOLD_DEACTIVATE);
}
override protected void OnTick(PlayerBase player, float deltaT)
{
if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) <= SYMPTOMFALLOFF_THRESHOLD3)
{
float waterLoss = (deltaT * (WATER_LOSS_HEAVYMETAL_MAX * Math.Max(WATER_LOSS_HEAVYMETAL_MIN, player.GetSingleAgentCountNormalized(eAgents.HEAVYMETAL))));
player.GetStatWater().Add(-waterLoss);
}
m_Time += deltaT;
if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) <= SYMPTOMFALLOFF_THRESHOLD2)
{
player.m_AgentPool.AddAgent(eAgents.HEAVYMETAL, -0.5);
}
if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) <= SYMPTOMFALLOFF_THRESHOLD3)
{
if ( m_Time >= m_NextEvent )
{
player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_HAND_SHIVER);
m_Time = 0;
m_NextEvent = Math.RandomFloatInclusive(SHIVER_EVENT_INTERVAL_MIN, SHIVER_EVENT_INTERVAL_MAX);
}
}
}
}
class HeavyMetalPhase2Mdfr : HeavyMetalMdfr
{
static const int AGENT_THRESHOLD_ACTIVATE = 200;
static const int AGENT_THRESHOLD_DEACTIVATE = 400;
static const int PAIN_EVENT_INTERVAL_MIN = 20;
static const int PAIN_EVENT_INTERVAL_MAX = 40;
static const int DEAFNESS_INTERVAL = 3;
override void Init()
{
super.Init();
m_ID = eModifiers.MDF_HEAVYMETAL2;
}
override string GetDebugText()
{
return ("Activate threshold: "+AGENT_THRESHOLD_ACTIVATE + "| " +"Deativate threshold: "+AGENT_THRESHOLD_DEACTIVATE);
}
override protected bool ActivateCondition(PlayerBase player)
{
return (player.GetSingleAgentCount(eAgents.HEAVYMETAL) >= AGENT_THRESHOLD_ACTIVATE && player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_DEACTIVATE);
}
override protected bool DeactivateCondition(PlayerBase player)
{
return (player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_ACTIVATE || player.GetSingleAgentCount(eAgents.HEAVYMETAL) > AGENT_THRESHOLD_DEACTIVATE);
}
override protected void OnTick(PlayerBase player, float deltaT)
{
m_Time += deltaT;
if (m_IsDeaf)
{
m_DeafnessTime += deltaT;
}
if (m_Time >= m_NextEvent)
{
if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) >= SYMPTOMFALLOFF_THRESHOLD1)
{
player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_PAIN_LIGHT);
m_Time = 0;
m_NextEvent = Math.RandomFloatInclusive(PAIN_EVENT_INTERVAL_MIN, PAIN_EVENT_INTERVAL_MAX);
}
}
float chanceOfDeafness = player.GetSingleAgentCountNormalized(eAgents.HEAVYMETAL);
if (Math.RandomFloat01() < chanceOfDeafness / Math.RandomInt(5, 10))
{
player.GetSymptomManager().QueueUpSecondarySymptom(SymptomIDs.SYMPTOM_DEAFNESS_COMPLETE);
m_Time = 0;
m_DeafnessTime = 0;
m_IsDeaf = true;
m_NextEvent = Math.RandomFloatInclusive(PAIN_EVENT_INTERVAL_MIN, PAIN_EVENT_INTERVAL_MAX);
}
if (m_IsDeaf && m_DeafnessTime > DEAFNESS_INTERVAL + player.GetSingleAgentCountNormalized(eAgents.HEAVYMETAL)*0.6)
{
player.GetSymptomManager().RemoveSecondarySymptom(SymptomIDs.SYMPTOM_DEAFNESS_COMPLETE);
m_IsDeaf = false;
}
if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) <= SYMPTOMFALLOFF_THRESHOLD3 && eAgents.HEAVYMETAL >= SYMPTOMFALLOFF_THRESHOLD1)
{
float waterLoss = (deltaT * (WATER_LOSS_HEAVYMETAL_MAX * Math.Max(WATER_LOSS_HEAVYMETAL_MIN, player.GetSingleAgentCountNormalized(eAgents.HEAVYMETAL))));
player.GetStatWater().Add(-waterLoss);
}
if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) <= SYMPTOMFALLOFF_THRESHOLD3)
{
player.m_AgentPool.AddAgent(eAgents.HEAVYMETAL, -0.5);
}
}
}
class HeavyMetalPhase3Mdfr : HeavyMetalMdfr
{
static const int AGENT_THRESHOLD_ACTIVATE = 400;
static const int AGENT_THRESHOLD_DEACTIVATE = 600;
static const int VOMIT_EVENT_INTERVAL_MIN = 180;
static const int VOMIT_EVENT_INTERVAL_MAX = 360;
override void Init()
{
super.Init();
m_ID = eModifiers.MDF_HEAVYMETAL3;
}
override string GetDebugText()
{
return ("Activate threshold: "+AGENT_THRESHOLD_ACTIVATE + "| " +"Deativate threshold: "+AGENT_THRESHOLD_DEACTIVATE);
}
override protected bool ActivateCondition(PlayerBase player)
{
return (player.GetSingleAgentCount(eAgents.HEAVYMETAL) >= AGENT_THRESHOLD_ACTIVATE && player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_DEACTIVATE);
}
override protected bool DeactivateCondition(PlayerBase player)
{
return player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_ACTIVATE;
}
override protected void OnActivate(PlayerBase player)
{
super.OnActivate(player);
player.GetSymptomManager().QueueUpSecondarySymptom(SymptomIDs.SYMPTOM_DEAFNESS_COMPLETE);
player.GetSymptomManager().QueueUpSecondarySymptom(SymptomIDs.SYMPTOM_HMP_SEVERE);
}
override protected void OnDeactivate(PlayerBase player)
{
super.OnDeactivate(player);
player.GetSymptomManager().RemoveSecondarySymptom(SymptomIDs.SYMPTOM_DEAFNESS_COMPLETE);
player.GetSymptomManager().RemoveSecondarySymptom(SymptomIDs.SYMPTOM_HMP_SEVERE);
}
override protected void OnTick(PlayerBase player, float deltaT)
{
float healthLoss = (deltaT * (HEALTH_LOSS_HEAVYMETAL_MAX * Math.Max(HEALTH_LOSS_HEAVYMETAL_MIN, player.GetSingleAgentCountNormalized(eAgents.HEAVYMETAL))));
player.AddHealth(-healthLoss);
m_Time += deltaT;
if (m_Time >= m_NextEvent)
{
SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_VOMIT);
if (symptom)
{
CachedObjectsParams.PARAM1_FLOAT.param1 = 30.0; //percentage of stomach
symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
}
m_Time = 0;
m_NextEvent = Math.RandomFloatInclusive( VOMIT_EVENT_INTERVAL_MIN, VOMIT_EVENT_INTERVAL_MAX );
}
}
}