playeragentpool.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. class PlayerAgentPool
  2. {
  3. const int STORAGE_VERSION = 137;
  4. int m_AgentMask;
  5. float m_LastTicked;
  6. float m_TotalAgentCount;
  7. PlayerBase m_Player;
  8. ref map<int,float> m_VirusPool;
  9. protected ref map<int, float> m_AgentTemporaryResistance;
  10. PluginTransmissionAgents m_PluginTransmissionAgents = PluginTransmissionAgents.Cast(GetPlugin(PluginTransmissionAgents));
  11. void PlayerAgentPool(PlayerBase player)
  12. {
  13. m_Player = player;
  14. m_LastTicked = 0;
  15. m_VirusPool = new map<int,float>();
  16. m_AgentTemporaryResistance = new map<int,float>();
  17. //! DEPRECATED
  18. m_VirusPoolArray = new array<int>();
  19. }
  20. int GetStorageVersion()
  21. {
  22. return STORAGE_VERSION;
  23. }
  24. void PrintAgents()
  25. {
  26. if (m_VirusPool)
  27. {
  28. for (int i = 0; i < m_VirusPool.Count(); ++i)
  29. {
  30. Debug.Log("Agent: "+ m_VirusPool.GetKey(i).ToString(), "Agents");
  31. Debug.Log("Count: "+ m_VirusPool.GetElement(i).ToString(), "Agents");
  32. }
  33. }
  34. }
  35. void ImmuneSystemTick(float value, float deltaT)//this is a regular tick induced in the the player's immune system
  36. {
  37. ProcessTemporaryResistance(deltaT);
  38. SpawnAgents(deltaT);
  39. GrowAgents(deltaT);
  40. }
  41. void GrowAgents(float deltaT)
  42. {
  43. if (!IsPluginManagerExists())
  44. return;
  45. EStatLevels immunityLevel = m_Player.GetImmunityLevel();
  46. m_TotalAgentCount = 0;
  47. for (int i = 0; i < m_VirusPool.Count(); i++)
  48. {
  49. int agentId = m_VirusPool.GetKey(i);
  50. int maxCount = m_PluginTransmissionAgents.GetAgentMaxCount(agentId);
  51. EStatLevels agentPotency = m_PluginTransmissionAgents.GetAgentPotencyEx(agentId, m_Player);
  52. float growDelta;
  53. if (agentPotency <= immunityLevel)
  54. {
  55. float temporaryResistance = GetTemporaryResistance(agentId);
  56. if (temporaryResistance > 1.0)
  57. continue;
  58. if (m_Player.IsAntibioticsActive() && !m_PluginTransmissionAgents.GrowDuringMedicalDrugsAttack(agentId, EMedicalDrugsType.CHELATION, m_Player))
  59. continue;
  60. if (m_Player.IsChelationActive() && !m_PluginTransmissionAgents.GrowDuringMedicalDrugsAttack(agentId, EMedicalDrugsType.CHELATION, m_Player))
  61. continue
  62. float invasibility = m_PluginTransmissionAgents.GetAgentInvasibilityEx(agentId, m_Player);
  63. growDelta = invasibility * deltaT;
  64. }
  65. else
  66. {
  67. float dieOffSpeed = m_PluginTransmissionAgents.GetAgentDieOffSpeedEx(agentId, m_Player);
  68. growDelta = -dieOffSpeed * deltaT;
  69. }
  70. float oldCount = m_VirusPool.Get(agentId);
  71. float newCount = oldCount + growDelta;
  72. newCount = Math.Clamp(newCount, 0, maxCount);
  73. m_TotalAgentCount += newCount;
  74. SetAgentCount(agentId, newCount);
  75. }
  76. }
  77. protected void ProcessTemporaryResistance(float deltaTime)
  78. {
  79. foreach (int agentId, float timeResistance : m_AgentTemporaryResistance)
  80. {
  81. float temporaryResistance = GetTemporaryResistance(agentId);
  82. if (temporaryResistance > 1.0)
  83. {
  84. float newResistanceValue = temporaryResistance - deltaTime;
  85. SetTemporaryResistance(agentId, newResistanceValue);
  86. }
  87. else
  88. SetTemporaryResistance(agentId, 0.0);
  89. }
  90. }
  91. void OnStoreSave(ParamsWriteContext ctx)
  92. {
  93. int count = m_PluginTransmissionAgents.GetAgentList().Count();
  94. array<int> agentList = m_PluginTransmissionAgents.GetAgentList().GetKeyArray();
  95. foreach (int agentId : agentList)
  96. {
  97. ctx.Write(agentId);
  98. ctx.Write(GetSingleAgentCount(agentId));
  99. ctx.Write(GetTemporaryResistance(agentId));
  100. }
  101. }
  102. bool OnStoreLoad(ParamsReadContext ctx, int version)
  103. {
  104. int count;
  105. if (version >= 137)
  106. {
  107. count = m_PluginTransmissionAgents.GetAgentList().Count();
  108. }
  109. else
  110. {
  111. if (!ctx.Read(count))
  112. return false;
  113. }
  114. for (int i = 0; i < count; ++i)
  115. {
  116. int agentId;
  117. if (!ctx.Read(agentId))
  118. return false;
  119. int agentCount;
  120. if (!ctx.Read(agentCount))
  121. return false;
  122. if (version >= 137)
  123. {
  124. float agentTemporaryResistanceTime;
  125. if (!ctx.Read(agentTemporaryResistanceTime))
  126. return false;
  127. SetTemporaryResistance(agentId, agentTemporaryResistanceTime);
  128. }
  129. SetAgentCount(agentId, agentCount);
  130. }
  131. return true;
  132. }
  133. void DigestAgent(int agent_id, float count)
  134. {
  135. AddAgent(agent_id, m_PluginTransmissionAgents.GetAgentDigestibilityEx(agent_id, m_Player) * count);
  136. }
  137. void AddAgent(int agent_id, float count)
  138. {
  139. if (GetTemporaryResistance(agent_id) > 0)
  140. return;
  141. int max_count = m_PluginTransmissionAgents.GetAgentMaxCount(agent_id);
  142. if (!m_VirusPool.Contains(agent_id) && count > 0)//if it contains, maybe add count only ?
  143. {
  144. SetAgentCount(agent_id,count);
  145. }
  146. else
  147. {
  148. float newValue = m_VirusPool.Get(agent_id) + count;
  149. SetAgentCount(agent_id, newValue);
  150. }
  151. }
  152. void RemoveAgent(int agent_id)
  153. {
  154. SetAgentCount(agent_id, 0);
  155. }
  156. void RemoveAllAgents()
  157. {
  158. m_AgentMask = 0;
  159. m_VirusPool.Clear();
  160. ResetTemporaryResistance();
  161. }
  162. void ReduceAgent(int id, float percent)
  163. {
  164. percent = Math.Clamp(percent, 0, 100);
  165. float reduction = percent * 0.01;
  166. int agentCount = GetSingleAgentCount(id);
  167. agentCount -= agentCount * reduction;
  168. SetAgentCount(id, agentCount);
  169. }
  170. int GetAgents()
  171. {
  172. return m_AgentMask;
  173. }
  174. int GetSingleAgentCount(int agent_id)
  175. {
  176. if (m_VirusPool.Contains(agent_id))
  177. return m_VirusPool.Get(agent_id);
  178. return 0;
  179. }
  180. float GetTotalAgentCount()
  181. {
  182. float agentCount;
  183. for (int i = 0; i < m_VirusPool.Count(); i++)
  184. agentCount += m_VirusPool.GetElement(i);
  185. return agentCount;
  186. }
  187. void SpawnAgents(float deltaT)
  188. {
  189. int count = m_PluginTransmissionAgents.GetAgentList().Count();
  190. for (int i = 0; i < count; ++i)
  191. {
  192. AgentBase agent = m_PluginTransmissionAgents.GetAgentList().GetElement(i);
  193. int agentId = agent.GetAgentType();
  194. if (GetSingleAgentCount(agentId) == 0 && agent.AutoinfectCheck(deltaT, m_Player))
  195. AddAgent(agentId, agent.GetAutoinfectCount());
  196. }
  197. }
  198. void SetAgentCount(int agent_id, float count)
  199. {
  200. if (count > 0)
  201. {
  202. //Debug.Log("+ growing agent"+ agent_id.ToString() +"to count: "+count.ToString(), "Agents");
  203. m_VirusPool.Set(agent_id, count);
  204. m_AgentMask = m_AgentMask | agent_id;
  205. }
  206. else
  207. {
  208. //Debug.Log("- REMOVING agent"+ agent_id.ToString(), "Agents");
  209. m_VirusPool.Remove(agent_id);
  210. m_AgentMask = m_AgentMask & ~agent_id;
  211. }
  212. if (m_Player.m_Agents != m_AgentMask)
  213. {
  214. m_Player.m_Agents = m_AgentMask;
  215. m_Player.SetSynchDirty();
  216. }
  217. }
  218. void AntibioticsAttack(float attack_value)
  219. {
  220. for (int i = 0; i < m_VirusPool.Count(); ++i)
  221. {
  222. int agentId = m_VirusPool.GetKey(i);
  223. float resistance = 1 - m_PluginTransmissionAgents.GetAgentAntiboticsResistanceEx(agentId, m_Player);
  224. float delta = attack_value * resistance;
  225. float actualAgentCount = m_VirusPool.Get(agentId);
  226. float newAgentCount = actualAgentCount - delta;
  227. SetAgentCount(agentId, newAgentCount);
  228. }
  229. }
  230. void DrugsAttack(EMedicalDrugsType drugType, float attackValue)
  231. {
  232. switch (drugType)
  233. {
  234. case EMedicalDrugsType.ANTIBIOTICS:
  235. AntibioticsAttack(attackValue);
  236. break;
  237. default:
  238. for (int i = 0; i < m_VirusPool.Count(); ++i)
  239. {
  240. int agentId = m_VirusPool.GetKey(i);
  241. float actualAgentCount = m_VirusPool.Get(agentId);
  242. float newAgentCount = actualAgentCount - attackValue;
  243. SetAgentCount(agentId, newAgentCount);
  244. }
  245. }
  246. }
  247. void SetTemporaryResistance(int agentId, float time)
  248. {
  249. m_AgentTemporaryResistance[agentId] = Math.Clamp(time, 0.0, int.MAX);
  250. }
  251. float GetTemporaryResistance(int agentId)
  252. {
  253. if (m_AgentTemporaryResistance.Contains(agentId))
  254. return m_AgentTemporaryResistance[agentId];
  255. return 0.0;
  256. }
  257. private void ResetTemporaryResistance()
  258. {
  259. foreach (int agentId, float value : m_AgentTemporaryResistance)
  260. SetTemporaryResistance(agentId, 0.0);
  261. }
  262. void RemoteGrowRequestDebug(ParamsReadContext ctx)
  263. {
  264. ctx.Read(CachedObjectsParams.PARAM1_INT);
  265. int id = CachedObjectsParams.PARAM1_INT.param1;
  266. int max = m_PluginTransmissionAgents.GetAgentMaxCount(Math.AbsInt(id));
  267. int grow = max / 10;
  268. if (id > 0)
  269. AddAgent(id, grow);
  270. else if (id < 0)
  271. AddAgent(-id, -grow);
  272. }
  273. void GetDebugObject(array<ref Param> object_out)
  274. {
  275. int count = m_PluginTransmissionAgents.GetAgentList().Count();
  276. for (int i = 0; i < count; i++)
  277. {
  278. AgentBase agent = m_PluginTransmissionAgents.GetAgentList().GetElement(i);
  279. string agentName = agent.GetName();
  280. int agentId = agent.GetAgentType();
  281. int maxAgents = m_PluginTransmissionAgents.GetAgentMaxCount(agentId);
  282. string amount = GetSingleAgentCount(agentId).ToString() + "/" + maxAgents.ToString();
  283. float tempResistance = GetTemporaryResistance(agentId);
  284. object_out.Insert(new Param4<string,string, int, float>(agentName, amount, agentId, tempResistance));
  285. }
  286. object_out.InsertAt(new Param1<int>(count) ,0);
  287. }
  288. //! DEPRECATED
  289. ref array<int> m_VirusPoolArray;
  290. }