heavymetal.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. class HeavyMetalMdfr : ModifierBase
  2. {
  3. static const float WATER_LOSS_HEAVYMETAL_MIN = 0.3;
  4. static const float WATER_LOSS_HEAVYMETAL_MAX = 0.8;
  5. static const float HEALTH_LOSS_HEAVYMETAL_MIN = 0.03;
  6. static const float HEALTH_LOSS_HEAVYMETAL_MAX = 0.05;
  7. static const int SYMPTOMFALLOFF_THRESHOLD1 = 200;
  8. static const int SYMPTOMFALLOFF_THRESHOLD2 = 300;
  9. static const int SYMPTOMFALLOFF_THRESHOLD3 = 400;
  10. protected float m_NextEvent;
  11. protected float m_Time;
  12. protected float m_DeafnessTime;
  13. protected bool m_IsDeaf;
  14. override void Init()
  15. {
  16. m_ID = eModifiers.MDF_HEAVYMETAL1;
  17. m_TrackActivatedTime = false;
  18. m_AnalyticsStatsEnabled = true;
  19. m_TickIntervalInactive = DEFAULT_TICK_TIME_INACTIVE;
  20. m_TickIntervalActive = DEFAULT_TICK_TIME_ACTIVE;
  21. }
  22. override protected void OnActivate(PlayerBase player)
  23. {
  24. player.IncreaseDiseaseCount();
  25. }
  26. override protected void OnDeactivate(PlayerBase player)
  27. {
  28. player.DecreaseDiseaseCount();
  29. }
  30. }
  31. class HeavyMetalPhase1Mdfr : HeavyMetalMdfr
  32. {
  33. static const int AGENT_THRESHOLD_ACTIVATE = 1;
  34. static const int AGENT_THRESHOLD_DEACTIVATE = 200;
  35. static const int SHIVER_EVENT_INTERVAL_MIN = 20;
  36. static const int SHIVER_EVENT_INTERVAL_MAX = 40;
  37. override string GetDebugText()
  38. {
  39. return ("Activate threshold: "+AGENT_THRESHOLD_ACTIVATE + "| " +"Deativate threshold: "+AGENT_THRESHOLD_DEACTIVATE);
  40. }
  41. override protected bool ActivateCondition(PlayerBase player)
  42. {
  43. return (player.GetSingleAgentCount(eAgents.HEAVYMETAL) >= AGENT_THRESHOLD_ACTIVATE && player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_DEACTIVATE);
  44. }
  45. override protected bool DeactivateCondition(PlayerBase player)
  46. {
  47. return (player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_ACTIVATE || player.GetSingleAgentCount(eAgents.HEAVYMETAL) > AGENT_THRESHOLD_DEACTIVATE);
  48. }
  49. override protected void OnTick(PlayerBase player, float deltaT)
  50. {
  51. if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) <= SYMPTOMFALLOFF_THRESHOLD3)
  52. {
  53. float waterLoss = (deltaT * (WATER_LOSS_HEAVYMETAL_MAX * Math.Max(WATER_LOSS_HEAVYMETAL_MIN, player.GetSingleAgentCountNormalized(eAgents.HEAVYMETAL))));
  54. player.GetStatWater().Add(-waterLoss);
  55. }
  56. m_Time += deltaT;
  57. if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) <= SYMPTOMFALLOFF_THRESHOLD2)
  58. {
  59. player.m_AgentPool.AddAgent(eAgents.HEAVYMETAL, -0.5);
  60. }
  61. if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) <= SYMPTOMFALLOFF_THRESHOLD3)
  62. {
  63. if ( m_Time >= m_NextEvent )
  64. {
  65. player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_HAND_SHIVER);
  66. m_Time = 0;
  67. m_NextEvent = Math.RandomFloatInclusive(SHIVER_EVENT_INTERVAL_MIN, SHIVER_EVENT_INTERVAL_MAX);
  68. }
  69. }
  70. }
  71. }
  72. class HeavyMetalPhase2Mdfr : HeavyMetalMdfr
  73. {
  74. static const int AGENT_THRESHOLD_ACTIVATE = 200;
  75. static const int AGENT_THRESHOLD_DEACTIVATE = 400;
  76. static const int PAIN_EVENT_INTERVAL_MIN = 20;
  77. static const int PAIN_EVENT_INTERVAL_MAX = 40;
  78. static const int DEAFNESS_INTERVAL = 3;
  79. override void Init()
  80. {
  81. super.Init();
  82. m_ID = eModifiers.MDF_HEAVYMETAL2;
  83. }
  84. override string GetDebugText()
  85. {
  86. return ("Activate threshold: "+AGENT_THRESHOLD_ACTIVATE + "| " +"Deativate threshold: "+AGENT_THRESHOLD_DEACTIVATE);
  87. }
  88. override protected bool ActivateCondition(PlayerBase player)
  89. {
  90. return (player.GetSingleAgentCount(eAgents.HEAVYMETAL) >= AGENT_THRESHOLD_ACTIVATE && player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_DEACTIVATE);
  91. }
  92. override protected bool DeactivateCondition(PlayerBase player)
  93. {
  94. return (player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_ACTIVATE || player.GetSingleAgentCount(eAgents.HEAVYMETAL) > AGENT_THRESHOLD_DEACTIVATE);
  95. }
  96. override protected void OnTick(PlayerBase player, float deltaT)
  97. {
  98. m_Time += deltaT;
  99. if (m_IsDeaf)
  100. {
  101. m_DeafnessTime += deltaT;
  102. }
  103. if (m_Time >= m_NextEvent)
  104. {
  105. if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) >= SYMPTOMFALLOFF_THRESHOLD1)
  106. {
  107. player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_PAIN_LIGHT);
  108. m_Time = 0;
  109. m_NextEvent = Math.RandomFloatInclusive(PAIN_EVENT_INTERVAL_MIN, PAIN_EVENT_INTERVAL_MAX);
  110. }
  111. }
  112. float chanceOfDeafness = player.GetSingleAgentCountNormalized(eAgents.HEAVYMETAL);
  113. if (Math.RandomFloat01() < chanceOfDeafness / Math.RandomInt(5, 10))
  114. {
  115. player.GetSymptomManager().QueueUpSecondarySymptom(SymptomIDs.SYMPTOM_DEAFNESS_COMPLETE);
  116. m_Time = 0;
  117. m_DeafnessTime = 0;
  118. m_IsDeaf = true;
  119. m_NextEvent = Math.RandomFloatInclusive(PAIN_EVENT_INTERVAL_MIN, PAIN_EVENT_INTERVAL_MAX);
  120. }
  121. if (m_IsDeaf && m_DeafnessTime > DEAFNESS_INTERVAL + player.GetSingleAgentCountNormalized(eAgents.HEAVYMETAL)*0.6)
  122. {
  123. player.GetSymptomManager().RemoveSecondarySymptom(SymptomIDs.SYMPTOM_DEAFNESS_COMPLETE);
  124. m_IsDeaf = false;
  125. }
  126. if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) <= SYMPTOMFALLOFF_THRESHOLD3 && eAgents.HEAVYMETAL >= SYMPTOMFALLOFF_THRESHOLD1)
  127. {
  128. float waterLoss = (deltaT * (WATER_LOSS_HEAVYMETAL_MAX * Math.Max(WATER_LOSS_HEAVYMETAL_MIN, player.GetSingleAgentCountNormalized(eAgents.HEAVYMETAL))));
  129. player.GetStatWater().Add(-waterLoss);
  130. }
  131. if (player.GetSingleAgentCount(eAgents.HEAVYMETAL) <= SYMPTOMFALLOFF_THRESHOLD3)
  132. {
  133. player.m_AgentPool.AddAgent(eAgents.HEAVYMETAL, -0.5);
  134. }
  135. }
  136. }
  137. class HeavyMetalPhase3Mdfr : HeavyMetalMdfr
  138. {
  139. static const int AGENT_THRESHOLD_ACTIVATE = 400;
  140. static const int AGENT_THRESHOLD_DEACTIVATE = 600;
  141. static const int VOMIT_EVENT_INTERVAL_MIN = 180;
  142. static const int VOMIT_EVENT_INTERVAL_MAX = 360;
  143. override void Init()
  144. {
  145. super.Init();
  146. m_ID = eModifiers.MDF_HEAVYMETAL3;
  147. }
  148. override string GetDebugText()
  149. {
  150. return ("Activate threshold: "+AGENT_THRESHOLD_ACTIVATE + "| " +"Deativate threshold: "+AGENT_THRESHOLD_DEACTIVATE);
  151. }
  152. override protected bool ActivateCondition(PlayerBase player)
  153. {
  154. return (player.GetSingleAgentCount(eAgents.HEAVYMETAL) >= AGENT_THRESHOLD_ACTIVATE && player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_DEACTIVATE);
  155. }
  156. override protected bool DeactivateCondition(PlayerBase player)
  157. {
  158. return player.GetSingleAgentCount(eAgents.HEAVYMETAL) < AGENT_THRESHOLD_ACTIVATE;
  159. }
  160. override protected void OnActivate(PlayerBase player)
  161. {
  162. super.OnActivate(player);
  163. player.GetSymptomManager().QueueUpSecondarySymptom(SymptomIDs.SYMPTOM_DEAFNESS_COMPLETE);
  164. player.GetSymptomManager().QueueUpSecondarySymptom(SymptomIDs.SYMPTOM_HMP_SEVERE);
  165. }
  166. override protected void OnDeactivate(PlayerBase player)
  167. {
  168. super.OnDeactivate(player);
  169. player.GetSymptomManager().RemoveSecondarySymptom(SymptomIDs.SYMPTOM_DEAFNESS_COMPLETE);
  170. player.GetSymptomManager().RemoveSecondarySymptom(SymptomIDs.SYMPTOM_HMP_SEVERE);
  171. }
  172. override protected void OnTick(PlayerBase player, float deltaT)
  173. {
  174. float healthLoss = (deltaT * (HEALTH_LOSS_HEAVYMETAL_MAX * Math.Max(HEALTH_LOSS_HEAVYMETAL_MIN, player.GetSingleAgentCountNormalized(eAgents.HEAVYMETAL))));
  175. player.AddHealth(-healthLoss);
  176. m_Time += deltaT;
  177. if (m_Time >= m_NextEvent)
  178. {
  179. SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_VOMIT);
  180. if (symptom)
  181. {
  182. CachedObjectsParams.PARAM1_FLOAT.param1 = 30.0; //percentage of stomach
  183. symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
  184. }
  185. m_Time = 0;
  186. m_NextEvent = Math.RandomFloatInclusive( VOMIT_EVENT_INTERVAL_MIN, VOMIT_EVENT_INTERVAL_MAX );
  187. }
  188. }
  189. }