poisoning.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. class PoisoningMdfr: ModifierBase
  2. {
  3. static const int AGENT_THRESHOLD_ACTIVATE = 150;
  4. static const int AGENT_THRESHOLD_DEACTIVATE = 0;
  5. static const int VOMIT_OCCURRENCES_PER_HOUR_MIN = 60;
  6. static const int VOMIT_OCCURRENCES_PER_HOUR_MAX = 120;
  7. static const int WATER_DRAIN_FROM_VOMIT = 70;
  8. static const int ENERGY_DRAIN_FROM_VOMIT = 55;
  9. private float m_ExhaustionTimer;
  10. private bool m_Exhaustion;
  11. override void Init()
  12. {
  13. m_TrackActivatedTime = true;
  14. m_AnalyticsStatsEnabled = true;
  15. m_IsPersistent = true;
  16. m_ID = eModifiers.MDF_POISONING;
  17. m_TickIntervalInactive = DEFAULT_TICK_TIME_INACTIVE;
  18. m_TickIntervalActive = DEFAULT_TICK_TIME_ACTIVE;
  19. }
  20. override string GetDebugText()
  21. {
  22. return ("Activate threshold: "+AGENT_THRESHOLD_ACTIVATE + "| " +"Deativate threshold: "+AGENT_THRESHOLD_DEACTIVATE);
  23. }
  24. override bool ActivateCondition(PlayerBase player)
  25. {
  26. return (player.GetSingleAgentCount(eAgents.FOOD_POISON) >= AGENT_THRESHOLD_ACTIVATE);
  27. }
  28. override bool DeactivateCondition(PlayerBase player)
  29. {
  30. return (player.GetSingleAgentCount(eAgents.FOOD_POISON) <= AGENT_THRESHOLD_DEACTIVATE);
  31. }
  32. override void OnActivate(PlayerBase player)
  33. {
  34. player.IncreaseDiseaseCount();
  35. SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom( SymptomIDs.SYMPTOM_VOMIT );
  36. if (symptom)
  37. {
  38. CachedObjectsParams.PARAM1_FLOAT.param1 = 30.0;
  39. symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
  40. symptom.SetDuration(5.0);
  41. }
  42. }
  43. override void OnReconnect(PlayerBase player)
  44. {
  45. this.OnActivate(player);
  46. }
  47. override 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 void OnTick(PlayerBase player, float deltaT)
  56. {
  57. int agent_max = PluginTransmissionAgents.GetAgentMaxCount(eAgents.FOOD_POISON);
  58. int agent_count = player.m_AgentPool.GetSingleAgentCount(eAgents.FOOD_POISON);
  59. float stomach_volume = player.m_PlayerStomach.GetStomachVolume();
  60. float norm_value = Math.InverseLerp(0, agent_max, agent_count );
  61. float eased_value = Easing.EaseInCirc(norm_value);
  62. float chance = Math.Lerp(VOMIT_OCCURRENCES_PER_HOUR_MIN, VOMIT_OCCURRENCES_PER_HOUR_MAX, eased_value );
  63. chance = (chance / 3000) * deltaT;
  64. if (Math.RandomFloat01() < chance)
  65. {
  66. SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_VOMIT);
  67. if (symptom)
  68. {
  69. CachedObjectsParams.PARAM1_FLOAT.param1 = 30.0;
  70. symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
  71. symptom.SetDuration(5);
  72. player.m_AgentPool.ReduceAgent(eAgents.FOOD_POISON, 80.0);
  73. if (m_Player.GetStatWater().Get() > (WATER_DRAIN_FROM_VOMIT))
  74. m_Player.GetStatWater().Add(-1 * WATER_DRAIN_FROM_VOMIT);
  75. if (m_Player.GetStatEnergy().Get() > (ENERGY_DRAIN_FROM_VOMIT))
  76. m_Player.GetStatEnergy().Add(-1 * ENERGY_DRAIN_FROM_VOMIT);
  77. player.GetStaminaHandler().ActivateRecoveryModifier(EStaminaMultiplierTypes.DISEASE_PNEUMONIA);
  78. player.GetStaminaHandler().ActivateDepletionModifier(EStaminaMultiplierTypes.DISEASE_PNEUMONIA);
  79. m_Exhaustion = true;
  80. m_ExhaustionTimer = 0;
  81. }
  82. }
  83. if (m_Exhaustion)
  84. {
  85. m_ExhaustionTimer += deltaT;
  86. if ( m_ExhaustionTimer >= 30)
  87. {
  88. player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.DISEASE_PNEUMONIA);
  89. player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.DISEASE_PNEUMONIA);
  90. m_Exhaustion = false;
  91. }
  92. }
  93. }
  94. }