Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

230 rindas
6.4 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using SUISS.Storage;
  5. using UnityEngine;
  6. namespace SUISS.Scheduling
  7. {
  8. public class Timing : MonoBehaviour
  9. {
  10. //[DebuggerBrowsable(DebuggerBrowsableState.Never)]
  11. public event Timing.TimingChangeEndedHandler TimingChangeEnded;
  12. private void FireTimingChangeEnded()
  13. {
  14. if (this.TimingChangeEnded != null)
  15. {
  16. this.TimingChangeEnded();
  17. }
  18. }
  19. public static double scale
  20. {
  21. get
  22. {
  23. return Timing.Instance.GameScale;
  24. }
  25. set
  26. {
  27. Timing.Instance.GameScale = value;
  28. }
  29. }
  30. public static double time
  31. {
  32. get
  33. {
  34. return Timing.Instance.GameTime;
  35. }
  36. }
  37. public static DateTime ToUtc(double seconds)
  38. {
  39. return Timing.Instance.ToUtc_internal(seconds);
  40. }
  41. public static double UtcNow
  42. {
  43. get
  44. {
  45. return (double)DateTime.UtcNow.Ticks * 1E-07;
  46. }
  47. }
  48. public static long ConvertYMDhmsToUtc(string ymdhms)
  49. {
  50. long result;
  51. try
  52. {
  53. int year = int.Parse(ymdhms.Substring(0, 4));
  54. int month = int.Parse(ymdhms.Substring(4, 2));
  55. int day = int.Parse(ymdhms.Substring(6, 2));
  56. int hour = int.Parse(ymdhms.Substring(8, 2));
  57. int minute = int.Parse(ymdhms.Substring(10, 2));
  58. int second = int.Parse(ymdhms.Substring(12, 2));
  59. DateTime dateTime = new DateTime(year, month, day, hour, minute, second, DateTimeKind.Local);
  60. result = dateTime.ToUniversalTime().Ticks / 10000000L;
  61. }
  62. catch (Exception arg)
  63. {
  64. UnityEngine.Debug.LogWarning(string.Format("Unable to parse ymdhms format {0}: {1}.", ymdhms, arg));
  65. result = 0L;
  66. }
  67. return result;
  68. }
  69. public double GameScale
  70. {
  71. get
  72. {
  73. return this._scale;
  74. }
  75. set
  76. {
  77. this.SetBuildingScale(value);
  78. this.SetAnimationScale(value);
  79. }
  80. }
  81. public double GameTime
  82. {
  83. get
  84. {
  85. return (double)this._offset * 1E-07 + this.GameTimeWithoutOffset;
  86. }
  87. }
  88. public bool TimingChangeActive
  89. {
  90. get
  91. {
  92. return this._scale != 1.0;
  93. }
  94. }
  95. [Obsolete("Use Timing.GameTime")]
  96. public double t
  97. {
  98. get
  99. {
  100. return this.GameTime;
  101. }
  102. }
  103. [Obsolete("Use Timing.GameScale")]
  104. public double s
  105. {
  106. get
  107. {
  108. return this.GameScale;
  109. }
  110. set
  111. {
  112. this.GameScale = value;
  113. }
  114. }
  115. public void SetGameScale(double scale, double animationScaleMultiplier)
  116. {
  117. this.SetBuildingScale(scale);
  118. this.SetAnimationScale(scale * animationScaleMultiplier);
  119. }
  120. public void MakeTimeJump(TimeSpan jump)
  121. {
  122. this._offset += jump.Ticks;
  123. this._state["Offset"] = this._offset;
  124. this.FireTimingChangeEnded();
  125. }
  126. private double GameTimeWithoutOffset
  127. {
  128. get
  129. {
  130. return ((double)this._baseTime + (double)(DateTime.UtcNow.Ticks - this._startTicks) * this.GameScale) * 1E-07;
  131. }
  132. }
  133. private void SetBuildingScale(double scale)
  134. {
  135. this._baseTime = (long)(10000000.0 * this.GameTimeWithoutOffset);
  136. this._startTicks = DateTime.UtcNow.Ticks;
  137. this._state["StartTicks"] = this._startTicks;
  138. this._state["BaseTime"] = this._baseTime;
  139. this._scale = scale;
  140. if (scale == 1.0)
  141. {
  142. this.FireTimingChangeEnded();
  143. }
  144. }
  145. private void SetAnimationScale(double scale)
  146. {
  147. Time.timeScale = (float)Math.Max(1.0, Math.Min(this.maximumTimeScale, scale));
  148. }
  149. private DateTime ToUtc_internal(double seconds)
  150. {
  151. long ticks = (long)(seconds * 10000000.0 - (double)this._offset - (double)this._baseTime + (double)this._startTicks);
  152. return new DateTime(ticks);
  153. }
  154. private void Awake()
  155. {
  156. Timing.Instance = this;
  157. this._state = SUISS.Storage.Storage.Get(this.StorageLifecycle).GetDictionary(this.StorageKey);
  158. if (this._state.ContainsKey("StartTicks") && this._state.ContainsKey("BaseTime"))
  159. {
  160. this._startTicks = (long)this._state["StartTicks"];
  161. this._baseTime = (long)this._state["BaseTime"];
  162. }
  163. else
  164. {
  165. this._startTicks = DateTime.UtcNow.Ticks;
  166. this._baseTime = 0L;
  167. this._state["StartTicks"] = this._startTicks;
  168. this._state["BaseTime"] = this._baseTime;
  169. }
  170. object obj;
  171. if (this._state.TryGetValue("Offset", out obj) && obj is long)
  172. {
  173. this._offset = (long)obj;
  174. }
  175. }
  176. private void OnDestroy()
  177. {
  178. Time.timeScale = 1f;
  179. }
  180. [SerializeField]
  181. private StorageLifecycle StorageLifecycle = StorageLifecycle.Game;
  182. [SerializeField]
  183. private string StorageKey = "Timing";
  184. public double maximumTimeScale = 5.0;
  185. public const string BaseTimeKey = "BaseTime";
  186. public const string StartTicksKey = "StartTicks";
  187. public const string OffsetKey = "Offset";
  188. private long _baseTime;
  189. private long _startTicks = -1L;
  190. private long _offset;
  191. private Dictionary<string, object> _state;
  192. private double _scale = 1.0;
  193. public static Timing Instance;
  194. public delegate void TimingChangeEndedHandler();
  195. }
  196. }