class CholeraMdfr: ModifierBase { static const int AGENT_THRESHOLD_ACTIVATE = 250; static const int AGENT_THRESHOLD_DEACTIVATE = 50; static const int CHANCE_OF_VOMIT = 10; static const int CHANCE_OF_VOMIT_AGENT = 30; static const int WATER_DRAIN_FROM_VOMIT = 450; static const int ENERGY_DRAIN_FROM_VOMIT = 310; static const float WATER_LOSS_CHOLERA = 0.5; static const float WATER_LOSS_CHOLERA_MIN = 0.1; // min multiplier of WATER_LOSS_CHOLERA static const float STOMACH_MIN_VOLUME = 200; // for vomit symptom private float m_ExhaustionTimer; private bool m_Exhaustion; override void Init() { m_TrackActivatedTime = false; m_AnalyticsStatsEnabled = true; m_ID = eModifiers.MDF_CHOLERA; 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.CHOLERA) >= AGENT_THRESHOLD_ACTIVATE); } override protected void OnActivate(PlayerBase player) { player.IncreaseDiseaseCount(); SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom( SymptomIDs.SYMPTOM_VOMIT ); if (symptom) { CachedObjectsParams.PARAM1_FLOAT.param1 = 65.0; symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT); symptom.SetDuration(Math.RandomIntInclusive(4.0, 8.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 bool DeactivateCondition(PlayerBase player) { return (player.GetSingleAgentCount(eAgents.CHOLERA) <= AGENT_THRESHOLD_DEACTIVATE); } override protected void OnTick(PlayerBase player, float deltaT) { float waterLoss = ( deltaT * ( WATER_LOSS_CHOLERA * Math.Max( WATER_LOSS_CHOLERA_MIN, player.GetSingleAgentCountNormalized( eAgents.CHOLERA ) ) ) ); player.GetStatWater().Add(-waterLoss); float stomachVolume = player.m_PlayerStomach.GetStomachVolume(); if (stomachVolume >= STOMACH_MIN_VOLUME) { int roll = Math.RandomInt( 0, 100 ); if( roll < ( CHANCE_OF_VOMIT + ( CHANCE_OF_VOMIT_AGENT * player.GetSingleAgentCountNormalized( eAgents.CHOLERA ) ) ) ) { SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom( SymptomIDs.SYMPTOM_VOMIT ); if (symptom) { CachedObjectsParams.PARAM1_FLOAT.param1 = 65.0; symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT); symptom.SetDuration(Math.RandomIntInclusive(4.0, 8.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; } } } if (m_Exhaustion) { m_ExhaustionTimer += deltaT; if (m_ExhaustionTimer >= 30) { player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION); player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION); m_Exhaustion = false; } } } }