universaltemperaturesource.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. class UniversalTemperatureSourceSettings
  2. {
  3. float m_UpdateInterval = 1.0; //! how often the Update is ticking
  4. float m_TemperatureItemCap = GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE; //! max temperature 'non-IsSelfAdjustingTemperature' entity in vicinity will get per update (cap);
  5. float m_TemperatureItemCoef = GameConstants.TEMP_COEF_UTS; //! used to determine speed of temperature change, and some temperature subsystems
  6. float m_TemperatureCap = float.MAX; //! temperature cap that will limit the return value from GetTemperature method
  7. float m_RangeFull = 1; //! range where the full temperature is given to receiver
  8. float m_RangeMax = 2; //! maximum range where the receiver can get some temperature
  9. bool m_EnableOnTemperatureControl = false; //! enable or disable activation/deactivation on set temperature
  10. float m_ActiveTemperatureThreshold = 0.0; //! UTS will be active on temperature >= to this value
  11. float m_InactiveTemperatureThreshold = 0.0; //! UTS will be inactive on temperature < to this value
  12. bool m_Updateable = false; //! if the Update is running periodically
  13. bool m_ManualUpdate = false; //! update is called manually (ex. own tick of parent entity)
  14. bool m_IsWorldOverriden = true; //! if the stats can be overriden by coefficient/variables from WorldData (currently TemperatureCap only)
  15. vector m_Position = vector.Zero;
  16. EntityAI m_Parent = null; //! parent Entity of the UTS
  17. //! DEPRECATED
  18. bool m_AffectStat = false;
  19. float m_TemperatureMin = 0;
  20. float m_TemperatureMax = 100;
  21. }
  22. class UniversalTemperatureSourceResult
  23. {
  24. float m_TemperatureItem = 0; //! Item target temperature
  25. float m_TemperatureHeatcomfort = 0; //! Player HC target(?) value
  26. //! DEPRECATED
  27. float m_Temperature = 0;
  28. }
  29. //! original Timer deletes m_params which is unwanted
  30. class UniversalTemperatureSourceTimer : Timer
  31. {
  32. override void OnTimer()
  33. {
  34. if (m_params)
  35. {
  36. GetGame().GameScript.CallFunctionParams(m_target, m_function, null, m_params);
  37. }
  38. else
  39. {
  40. GetGame().GameScript.CallFunction(m_target, m_function, null, 0);
  41. }
  42. }
  43. override void Stop()
  44. {
  45. SetRunning(false);
  46. m_time = 0;
  47. }
  48. void SetParams(Param params)
  49. {
  50. m_params = params;
  51. }
  52. }
  53. typedef UniversalTemperatureSource UTemperatureSource;
  54. class UniversalTemperatureSource
  55. {
  56. private float m_ParentTemperaturePrevious;
  57. protected bool m_Active
  58. protected ref UniversalTemperatureSourceTimer m_Timer;
  59. protected UniversalTemperatureSourceSettings m_Settings;
  60. protected ref UniversalTemperatureSourceResult m_ResultValues;
  61. protected ref UniversalTemperatureSourceLambdaBase m_Lambda;
  62. void UniversalTemperatureSource(EntityAI pParent, UniversalTemperatureSourceSettings pSettings, UniversalTemperatureSourceLambdaBase pLambda)
  63. {
  64. m_Active = false;
  65. m_Settings = pSettings;
  66. m_Lambda = pLambda;
  67. m_ResultValues = new UniversalTemperatureSourceResult();
  68. m_Timer = new UniversalTemperatureSourceTimer();
  69. Init(pParent);
  70. }
  71. void ~UniversalTemperatureSource() {};
  72. void Init(EntityAI pParent)
  73. {
  74. if (pParent)
  75. {
  76. pParent.SetUniversalTemperatureSource(this);
  77. m_Settings.m_Parent = pParent;
  78. m_Settings.m_Position = pParent.GetPosition();
  79. }
  80. if (!m_Settings.m_ManualUpdate)
  81. {
  82. auto params = new Param2<UniversalTemperatureSourceSettings, UniversalTemperatureSourceLambdaBase>(m_Settings, m_Lambda);
  83. m_Timer.Run(m_Settings.m_UpdateInterval, this, "Update", params, m_Settings.m_Updateable);
  84. SetActive(false);
  85. }
  86. if (m_Settings.m_IsWorldOverriden)
  87. m_Settings.m_TemperatureCap += g_Game.GetMission().GetWorldData().GetUniversalTemperatureSourceCapModifier();
  88. }
  89. vector GetPosition()
  90. {
  91. return m_Settings.m_Position;
  92. }
  93. float GetFullRange()
  94. {
  95. return m_Settings.m_RangeFull;
  96. }
  97. float GetMaxRange()
  98. {
  99. return m_Settings.m_RangeMax;
  100. }
  101. float GetTemperatureCap()
  102. {
  103. return m_Settings.m_TemperatureCap;
  104. }
  105. float GetTemperatureItemCap()
  106. {
  107. return m_Settings.m_TemperatureItemCap;
  108. }
  109. float GetTemperatureItemCoef()
  110. {
  111. return m_Settings.m_TemperatureItemCoef;
  112. }
  113. EntityAI GetParent()
  114. {
  115. return m_Settings.m_Parent;
  116. }
  117. UniversalTemperatureSourceLambdaBase GetLambda()
  118. {
  119. return m_Lambda;
  120. }
  121. bool IsActive()
  122. {
  123. if (m_Settings.m_ManualUpdate)
  124. {
  125. return m_Active;
  126. }
  127. return m_Timer && m_Timer.IsRunning();
  128. }
  129. void SetActive(bool pActive)
  130. {
  131. if (pActive)
  132. m_Lambda.OnUTSActivate();
  133. else
  134. m_Lambda.OnUTSDeactivate();
  135. if (m_Settings.m_ManualUpdate)
  136. {
  137. m_Active = pActive;
  138. return;
  139. }
  140. if (pActive && !m_Timer.IsRunning())
  141. {
  142. m_Timer.Continue();
  143. }
  144. else
  145. {
  146. m_Timer.Stop();
  147. }
  148. }
  149. void SetDefferedActive(bool pActive, float pSeconds)
  150. {
  151. GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLaterByName(this, "SetActive", pSeconds * 1000, false, new Param1<bool>(pActive));
  152. }
  153. void ChangeSettings(UniversalTemperatureSourceSettings pSettings)
  154. {
  155. m_Timer.SetParams(new Param2<UniversalTemperatureSourceSettings, UniversalTemperatureSourceLambdaBase>(m_Settings, m_Lambda));
  156. }
  157. void Update(UniversalTemperatureSourceSettings settings, UniversalTemperatureSourceLambdaBase lambda)
  158. {
  159. if (settings.m_EnableOnTemperatureControl)
  160. {
  161. float parentTemperature = GetParent().GetTemperature();
  162. float temperatureDifference = parentTemperature - m_ParentTemperaturePrevious;
  163. if (parentTemperature >= settings.m_ActiveTemperatureThreshold && temperatureDifference > 0)
  164. SetActive(true);
  165. if (parentTemperature < settings.m_InactiveTemperatureThreshold && temperatureDifference < 0)
  166. SetActive(false);
  167. m_ParentTemperaturePrevious = parentTemperature;
  168. }
  169. if (!IsActive())
  170. return;
  171. if (lambda)
  172. {
  173. settings.m_Position = settings.m_Parent.GetUniversalTemperatureSourcePosition();
  174. lambda.OnBeforeExecute();
  175. lambda.Execute(settings, m_ResultValues);
  176. lambda.OnAfterExecute();
  177. }
  178. }
  179. //!
  180. //!DEPRECATED
  181. //!
  182. float GetTemperatureMin()
  183. {
  184. return m_Settings.m_TemperatureMin;
  185. }
  186. float GetTemperatureMax()
  187. {
  188. return m_Settings.m_TemperatureMax;
  189. }
  190. float GetTemperature()
  191. {
  192. return GetTemperatureRaw();
  193. }
  194. float GetTemperatureRaw()
  195. {
  196. if (m_ResultValues)
  197. return m_ResultValues.m_Temperature;
  198. return 0;
  199. }
  200. }
  201. typedef UniversalTemperatureSourceDebug UTemperatureSourceDebug
  202. class UniversalTemperatureSourceDebug
  203. {
  204. const string DELIMITER_DATA = "|";
  205. const string DELIMITER_KEYPAIR = ":";
  206. string m_Header;
  207. string m_Data;
  208. ref array<string> m_Names; //! names parsed from m_Pairs
  209. ref array<string> m_Values; //! values parsed from m_Pairs
  210. ref array<string> m_Pairs; //! keeps first iteration of parsed data from the m_Data
  211. void UniversalTemperatureSourceDebug()
  212. {
  213. m_Header = "";
  214. m_Data = "";
  215. m_Pairs = new array<string>();
  216. m_Names = new array<string>();
  217. m_Values = new array<string>();
  218. }
  219. void AddHeader(string header)
  220. {
  221. m_Header = header;
  222. }
  223. void Add(string name, string value)
  224. {
  225. m_Data = string.Format("%1%2:%3%4", m_Data, name, value, DELIMITER_DATA);
  226. }
  227. void Commit()
  228. {
  229. m_Pairs = ParseData();
  230. ParseKeyPairs();
  231. }
  232. int PairsCount()
  233. {
  234. return m_Pairs.Count();
  235. }
  236. string GetHeader()
  237. {
  238. return m_Header;
  239. }
  240. string GetName(int pIndex)
  241. {
  242. if (m_Names.Count() - 1 < pIndex)
  243. {
  244. Debug.Log(string.Format("GetName index: %1 from data of length: %2", pIndex, m_Names.Count()), "UniversalTemperatureSourceDebug");
  245. return "";
  246. }
  247. return m_Names.Get(pIndex);
  248. }
  249. string GetValue(int pIndex)
  250. {
  251. if (m_Values.Count() - 1 < pIndex)
  252. {
  253. Debug.Log(string.Format("GetValue index: %1 from data of length: %2", pIndex, m_Values.Count()), "UniversalTemperatureSourceDebug");
  254. return "";
  255. }
  256. return m_Values.Get(pIndex);
  257. }
  258. protected array<string> ParseData()
  259. {
  260. array<string> parsed = new array<string>();
  261. if (m_Data)
  262. {
  263. m_Data.Split(DELIMITER_DATA, parsed);
  264. }
  265. return parsed;
  266. }
  267. protected void ParseKeyPairs()
  268. {
  269. m_Names.Clear();
  270. m_Values.Clear();
  271. if (m_Pairs)
  272. {
  273. for (int i = 0; i < m_Pairs.Count(); i++)
  274. {
  275. array<string> keypair = new array<string>();
  276. m_Pairs.Get(i).Split(DELIMITER_KEYPAIR, keypair);
  277. m_Names.Insert(keypair[0]);
  278. m_Values.Insert(keypair[1]);
  279. }
  280. }
  281. }
  282. void Debug()
  283. {
  284. for (int i = 0; i < m_Names.Count(); i++)
  285. {
  286. Debug.Log(string.Format("%1: %2", m_Names.Get(i), m_Values.Get(i)), "UniversalTemperatureSourceDebug");
  287. }
  288. }
  289. }