cholera.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. class CholeraMdfr: ModifierBase
  2. {
  3. static const int AGENT_THRESHOLD_ACTIVATE = 250;
  4. static const int AGENT_THRESHOLD_DEACTIVATE = 50;
  5. static const int CHANCE_OF_VOMIT = 10;
  6. static const int CHANCE_OF_VOMIT_AGENT = 30;
  7. static const int WATER_DRAIN_FROM_VOMIT = 450;
  8. static const int ENERGY_DRAIN_FROM_VOMIT = 310;
  9. static const float WATER_LOSS_CHOLERA = 0.5;
  10. static const float WATER_LOSS_CHOLERA_MIN = 0.1; // min multiplier of WATER_LOSS_CHOLERA
  11. static const float STOMACH_MIN_VOLUME = 200; // for vomit symptom
  12. private float m_ExhaustionTimer;
  13. private bool m_Exhaustion;
  14. override void Init()
  15. {
  16. m_TrackActivatedTime = false;
  17. m_AnalyticsStatsEnabled = true;
  18. m_ID = eModifiers.MDF_CHOLERA;
  19. m_TickIntervalInactive = DEFAULT_TICK_TIME_INACTIVE;
  20. m_TickIntervalActive = DEFAULT_TICK_TIME_ACTIVE;
  21. }
  22. override string GetDebugText()
  23. {
  24. return ("Activate threshold: "+AGENT_THRESHOLD_ACTIVATE + "| " +"Deativate threshold: "+AGENT_THRESHOLD_DEACTIVATE);
  25. }
  26. override protected bool ActivateCondition(PlayerBase player)
  27. {
  28. return (player.GetSingleAgentCount(eAgents.CHOLERA) >= AGENT_THRESHOLD_ACTIVATE);
  29. }
  30. override protected void OnActivate(PlayerBase player)
  31. {
  32. player.IncreaseDiseaseCount();
  33. SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom( SymptomIDs.SYMPTOM_VOMIT );
  34. if (symptom)
  35. {
  36. CachedObjectsParams.PARAM1_FLOAT.param1 = 65.0;
  37. symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
  38. symptom.SetDuration(Math.RandomIntInclusive(4.0, 8.0));
  39. }
  40. }
  41. override protected void OnDeactivate(PlayerBase player)
  42. {
  43. player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  44. player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  45. m_Exhaustion = false;
  46. m_ExhaustionTimer = 0;
  47. player.DecreaseDiseaseCount();
  48. }
  49. override protected bool DeactivateCondition(PlayerBase player)
  50. {
  51. return (player.GetSingleAgentCount(eAgents.CHOLERA) <= AGENT_THRESHOLD_DEACTIVATE);
  52. }
  53. override protected void OnTick(PlayerBase player, float deltaT)
  54. {
  55. float waterLoss = ( deltaT * ( WATER_LOSS_CHOLERA * Math.Max( WATER_LOSS_CHOLERA_MIN, player.GetSingleAgentCountNormalized( eAgents.CHOLERA ) ) ) );
  56. player.GetStatWater().Add(-waterLoss);
  57. float stomachVolume = player.m_PlayerStomach.GetStomachVolume();
  58. if (stomachVolume >= STOMACH_MIN_VOLUME)
  59. {
  60. int roll = Math.RandomInt( 0, 100 );
  61. if( roll < ( CHANCE_OF_VOMIT + ( CHANCE_OF_VOMIT_AGENT * player.GetSingleAgentCountNormalized( eAgents.CHOLERA ) ) ) )
  62. {
  63. SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom( SymptomIDs.SYMPTOM_VOMIT );
  64. if (symptom)
  65. {
  66. CachedObjectsParams.PARAM1_FLOAT.param1 = 65.0;
  67. symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
  68. symptom.SetDuration(Math.RandomIntInclusive(4.0, 8.0));
  69. if (m_Player.GetStatWater().Get() > (WATER_DRAIN_FROM_VOMIT))
  70. m_Player.GetStatWater().Add(-1 * WATER_DRAIN_FROM_VOMIT);
  71. if (m_Player.GetStatEnergy().Get() > (ENERGY_DRAIN_FROM_VOMIT))
  72. m_Player.GetStatEnergy().Add(-1 * ENERGY_DRAIN_FROM_VOMIT);
  73. player.GetStaminaHandler().ActivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  74. player.GetStaminaHandler().ActivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  75. m_Exhaustion = true;
  76. m_ExhaustionTimer = 0;
  77. }
  78. }
  79. }
  80. if (m_Exhaustion)
  81. {
  82. m_ExhaustionTimer += deltaT;
  83. if (m_ExhaustionTimer >= 30)
  84. {
  85. player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  86. player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  87. m_Exhaustion = false;
  88. }
  89. }
  90. }
  91. }