salmonella.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. class SalmonellaMdfr: ModifierBase
  2. {
  3. static const int AGENT_THRESHOLD_ACTIVATE = 60;
  4. static const int AGENT_THRESHOLD_DEACTIVATE = 20;
  5. static const int CHANCE_OF_VOMIT = 10; // base vomit chance
  6. static const int CHANCE_OF_VOMIT_AGENT = 20; // adjusted by the agent count
  7. static const int WATER_DRAIN_FROM_VOMIT = 450;
  8. static const int ENERGY_DRAIN_FROM_VOMIT = 310;
  9. static const float STOMACH_MIN_VOLUME = 200; // min volume of stomach for vomit symptom
  10. static const float EVENT_INTERVAL_MIN = 12;
  11. static const float EVENT_INTERVAL_MAX = 18;
  12. private float m_Time;
  13. private float m_NextEvent;
  14. private float m_ExhaustionTimer;
  15. private bool m_Exhaustion;
  16. override void Init()
  17. {
  18. m_TrackActivatedTime = false;
  19. m_AnalyticsStatsEnabled = true;
  20. m_ID = eModifiers.MDF_SALMONELLA;
  21. m_TickIntervalInactive = DEFAULT_TICK_TIME_INACTIVE;
  22. m_TickIntervalActive = DEFAULT_TICK_TIME_ACTIVE;
  23. }
  24. override string GetDebugText()
  25. {
  26. return ("Activate threshold: "+AGENT_THRESHOLD_ACTIVATE + "| " +"Deativate threshold: "+AGENT_THRESHOLD_DEACTIVATE);
  27. }
  28. override protected bool ActivateCondition(PlayerBase player)
  29. {
  30. return player.GetSingleAgentCount(eAgents.SALMONELLA) >= AGENT_THRESHOLD_ACTIVATE);
  31. }
  32. override protected bool DeactivateCondition(PlayerBase player)
  33. {
  34. return player.GetSingleAgentCount(eAgents.SALMONELLA) <= AGENT_THRESHOLD_DEACTIVATE);
  35. }
  36. override protected void OnActivate(PlayerBase player)
  37. {
  38. player.IncreaseDiseaseCount();
  39. SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom( SymptomIDs.SYMPTOM_VOMIT );
  40. if (symptom)
  41. {
  42. CachedObjectsParams.PARAM1_FLOAT.param1 = 50.0;
  43. symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
  44. symptom.SetDuration(5.0);
  45. }
  46. }
  47. override protected void OnDeactivate(PlayerBase player)
  48. {
  49. player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  50. player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  51. m_Exhaustion = false;
  52. m_ExhaustionTimer = 0;
  53. player.DecreaseDiseaseCount();
  54. }
  55. override protected void OnTick(PlayerBase player, float deltaT)
  56. {
  57. float stomach_volume = player.m_PlayerStomach.GetStomachVolume();
  58. if (stomach_volume >= STOMACH_MIN_VOLUME)
  59. {
  60. int roll = Math.RandomInt(0, 100);
  61. int chanceOfVomit = CHANCE_OF_VOMIT + (CHANCE_OF_VOMIT_AGENT * player.GetSingleAgentCountNormalized(eAgents.SALMONELLA));
  62. if (roll < chanceOfVomit)
  63. {
  64. SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_VOMIT);
  65. if (symptom)
  66. {
  67. CachedObjectsParams.PARAM1_FLOAT.param1 = 50.0;
  68. symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
  69. symptom.SetDuration(5);
  70. player.m_AgentPool.ReduceAgent(eAgents.SALMONELLA, 30.0);
  71. if (m_Player.GetStatWater().Get() > WATER_DRAIN_FROM_VOMIT)
  72. m_Player.GetStatWater().Add(-1 * WATER_DRAIN_FROM_VOMIT);
  73. if (m_Player.GetStatEnergy().Get() > ENERGY_DRAIN_FROM_VOMIT)
  74. m_Player.GetStatEnergy().Add(-1 * ENERGY_DRAIN_FROM_VOMIT);
  75. player.GetStaminaHandler().ActivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  76. player.GetStaminaHandler().ActivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  77. m_Exhaustion = true;
  78. m_ExhaustionTimer = 0;
  79. }
  80. }
  81. }
  82. m_Time += deltaT;
  83. if (m_Time >= m_NextEvent)
  84. {
  85. m_Time = 0;
  86. m_NextEvent = Math.RandomFloatInclusive(EVENT_INTERVAL_MIN, EVENT_INTERVAL_MAX);
  87. player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_PAIN_LIGHT);
  88. }
  89. if (m_Exhaustion)
  90. {
  91. m_ExhaustionTimer += deltaT;
  92. if (m_ExhaustionTimer >= 45)
  93. {
  94. player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.DISEASE_PNEUMONIA);
  95. player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.DISEASE_PNEUMONIA);
  96. m_Exhaustion = false;
  97. }
  98. }
  99. }
  100. }