@vpmedia/phaser 1.112.0 → 1.114.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/dist/index.js +1261 -1314
  2. package/dist/index.js.map +1 -1
  3. package/dist/phaser/core/animation.d.ts +14 -10
  4. package/dist/phaser/core/animation.d.ts.map +1 -1
  5. package/dist/phaser/core/animation_manager.d.ts +10 -8
  6. package/dist/phaser/core/animation_manager.d.ts.map +1 -1
  7. package/dist/phaser/core/animation_parser.d.ts +5 -4
  8. package/dist/phaser/core/animation_parser.d.ts.map +1 -1
  9. package/dist/phaser/core/array_set.d.ts.map +1 -1
  10. package/dist/phaser/core/cache.d.ts +4 -3
  11. package/dist/phaser/core/cache.d.ts.map +1 -1
  12. package/dist/phaser/core/const.d.ts.map +1 -1
  13. package/dist/phaser/core/device.d.ts.map +1 -1
  14. package/dist/phaser/core/device_util.d.ts.map +1 -1
  15. package/dist/phaser/core/dom.d.ts +3 -2
  16. package/dist/phaser/core/dom.d.ts.map +1 -1
  17. package/dist/phaser/core/event_manager.d.ts.map +1 -1
  18. package/dist/phaser/core/factory.d.ts +1 -1
  19. package/dist/phaser/core/factory.d.ts.map +1 -1
  20. package/dist/phaser/core/frame.d.ts.map +1 -1
  21. package/dist/phaser/core/frame_data.d.ts.map +1 -1
  22. package/dist/phaser/core/game.d.ts.map +1 -1
  23. package/dist/phaser/core/input.d.ts +8 -6
  24. package/dist/phaser/core/input.d.ts.map +1 -1
  25. package/dist/phaser/core/input_handler.d.ts +40 -30
  26. package/dist/phaser/core/input_handler.d.ts.map +1 -1
  27. package/dist/phaser/core/input_mouse.d.ts +3 -2
  28. package/dist/phaser/core/input_mouse.d.ts.map +1 -1
  29. package/dist/phaser/core/input_mspointer.d.ts +3 -2
  30. package/dist/phaser/core/input_mspointer.d.ts.map +1 -1
  31. package/dist/phaser/core/input_pointer.d.ts +6 -4
  32. package/dist/phaser/core/input_pointer.d.ts.map +1 -1
  33. package/dist/phaser/core/input_touch.d.ts +3 -2
  34. package/dist/phaser/core/input_touch.d.ts.map +1 -1
  35. package/dist/phaser/core/loader.d.ts +4 -3
  36. package/dist/phaser/core/loader.d.ts.map +1 -1
  37. package/dist/phaser/core/loader_parser.d.ts +9 -8
  38. package/dist/phaser/core/loader_parser.d.ts.map +1 -1
  39. package/dist/phaser/core/raf.d.ts +3 -2
  40. package/dist/phaser/core/raf.d.ts.map +1 -1
  41. package/dist/phaser/core/registry.d.ts +7 -0
  42. package/dist/phaser/core/registry.d.ts.map +1 -0
  43. package/dist/phaser/core/scale_manager.d.ts +1 -1
  44. package/dist/phaser/core/scale_manager.d.ts.map +1 -1
  45. package/dist/phaser/core/scene.d.ts +0 -1
  46. package/dist/phaser/core/scene.d.ts.map +1 -1
  47. package/dist/phaser/core/scene_manager.d.ts +1 -1
  48. package/dist/phaser/core/scene_manager.d.ts.map +1 -1
  49. package/dist/phaser/core/signal.d.ts +0 -1
  50. package/dist/phaser/core/signal.d.ts.map +1 -1
  51. package/dist/phaser/core/signal_binding.d.ts +4 -3
  52. package/dist/phaser/core/signal_binding.d.ts.map +1 -1
  53. package/dist/phaser/core/sound.d.ts +6 -4
  54. package/dist/phaser/core/sound.d.ts.map +1 -1
  55. package/dist/phaser/core/sound_manager.d.ts +3 -2
  56. package/dist/phaser/core/sound_manager.d.ts.map +1 -1
  57. package/dist/phaser/core/sound_sprite.d.ts +5 -4
  58. package/dist/phaser/core/sound_sprite.d.ts.map +1 -1
  59. package/dist/phaser/core/stage.d.ts +3 -2
  60. package/dist/phaser/core/stage.d.ts.map +1 -1
  61. package/dist/phaser/core/time.d.ts +1 -1
  62. package/dist/phaser/core/time.d.ts.map +1 -1
  63. package/dist/phaser/core/timer.d.ts +1 -1
  64. package/dist/phaser/core/timer.d.ts.map +1 -1
  65. package/dist/phaser/core/timer_event.d.ts.map +1 -1
  66. package/dist/phaser/core/tween.d.ts +10 -7
  67. package/dist/phaser/core/tween.d.ts.map +1 -1
  68. package/dist/phaser/core/tween_data.d.ts +3 -2
  69. package/dist/phaser/core/tween_data.d.ts.map +1 -1
  70. package/dist/phaser/core/tween_easing.d.ts.map +1 -1
  71. package/dist/phaser/core/tween_manager.d.ts +3 -2
  72. package/dist/phaser/core/tween_manager.d.ts.map +1 -1
  73. package/dist/phaser/core/world.d.ts +3 -2
  74. package/dist/phaser/core/world.d.ts.map +1 -1
  75. package/dist/phaser/display/bitmap_text.d.ts +3 -2
  76. package/dist/phaser/display/bitmap_text.d.ts.map +1 -1
  77. package/dist/phaser/display/button.d.ts +3 -2
  78. package/dist/phaser/display/button.d.ts.map +1 -1
  79. package/dist/phaser/display/canvas/buffer.d.ts.map +1 -1
  80. package/dist/phaser/display/canvas/graphics.d.ts +7 -6
  81. package/dist/phaser/display/canvas/graphics.d.ts.map +1 -1
  82. package/dist/phaser/display/canvas/pool.d.ts +2 -2
  83. package/dist/phaser/display/canvas/pool.d.ts.map +1 -1
  84. package/dist/phaser/display/canvas/renderer.d.ts +10 -8
  85. package/dist/phaser/display/canvas/renderer.d.ts.map +1 -1
  86. package/dist/phaser/display/canvas/tinter.d.ts +3 -2
  87. package/dist/phaser/display/canvas/tinter.d.ts.map +1 -1
  88. package/dist/phaser/display/canvas/util.d.ts +2 -2
  89. package/dist/phaser/display/canvas/util.d.ts.map +1 -1
  90. package/dist/phaser/display/display_object.d.ts +14 -12
  91. package/dist/phaser/display/display_object.d.ts.map +1 -1
  92. package/dist/phaser/display/graphics.d.ts +8 -5
  93. package/dist/phaser/display/graphics.d.ts.map +1 -1
  94. package/dist/phaser/display/graphics_data.d.ts.map +1 -1
  95. package/dist/phaser/display/graphics_data_util.d.ts.map +1 -1
  96. package/dist/phaser/display/group.d.ts +4 -3
  97. package/dist/phaser/display/group.d.ts.map +1 -1
  98. package/dist/phaser/display/image.d.ts +13 -10
  99. package/dist/phaser/display/image.d.ts.map +1 -1
  100. package/dist/phaser/display/sprite_batch.d.ts +3 -2
  101. package/dist/phaser/display/sprite_batch.d.ts.map +1 -1
  102. package/dist/phaser/display/sprite_util.d.ts +18 -15
  103. package/dist/phaser/display/sprite_util.d.ts.map +1 -1
  104. package/dist/phaser/display/text.d.ts +12 -10
  105. package/dist/phaser/display/text.d.ts.map +1 -1
  106. package/dist/phaser/display/webgl/abstract_filter.d.ts.map +1 -1
  107. package/dist/phaser/display/webgl/base_texture.d.ts.map +1 -1
  108. package/dist/phaser/display/webgl/blend_manager.d.ts +0 -1
  109. package/dist/phaser/display/webgl/blend_manager.d.ts.map +1 -1
  110. package/dist/phaser/display/webgl/earcut.d.ts +1 -1
  111. package/dist/phaser/display/webgl/earcut.d.ts.map +1 -1
  112. package/dist/phaser/display/webgl/earcut_node.d.ts.map +1 -1
  113. package/dist/phaser/display/webgl/fast_sprite_batch.d.ts +4 -3
  114. package/dist/phaser/display/webgl/fast_sprite_batch.d.ts.map +1 -1
  115. package/dist/phaser/display/webgl/filter_manager.d.ts +2 -1
  116. package/dist/phaser/display/webgl/filter_manager.d.ts.map +1 -1
  117. package/dist/phaser/display/webgl/filter_texture.d.ts +2 -1
  118. package/dist/phaser/display/webgl/filter_texture.d.ts.map +1 -1
  119. package/dist/phaser/display/webgl/graphics.d.ts +7 -6
  120. package/dist/phaser/display/webgl/graphics.d.ts.map +1 -1
  121. package/dist/phaser/display/webgl/graphics_data.d.ts +2 -1
  122. package/dist/phaser/display/webgl/graphics_data.d.ts.map +1 -1
  123. package/dist/phaser/display/webgl/render_texture.d.ts +4 -2
  124. package/dist/phaser/display/webgl/render_texture.d.ts.map +1 -1
  125. package/dist/phaser/display/webgl/renderer.d.ts +16 -11
  126. package/dist/phaser/display/webgl/renderer.d.ts.map +1 -1
  127. package/dist/phaser/display/webgl/shader/complex.d.ts +16 -6
  128. package/dist/phaser/display/webgl/shader/complex.d.ts.map +1 -1
  129. package/dist/phaser/display/webgl/shader/fast.d.ts +19 -7
  130. package/dist/phaser/display/webgl/shader/fast.d.ts.map +1 -1
  131. package/dist/phaser/display/webgl/shader/normal.d.ts +33 -12
  132. package/dist/phaser/display/webgl/shader/normal.d.ts.map +1 -1
  133. package/dist/phaser/display/webgl/shader/primitive.d.ts +15 -6
  134. package/dist/phaser/display/webgl/shader/primitive.d.ts.map +1 -1
  135. package/dist/phaser/display/webgl/shader/strip.d.ts +15 -6
  136. package/dist/phaser/display/webgl/shader/strip.d.ts.map +1 -1
  137. package/dist/phaser/display/webgl/shader_manager.d.ts +16 -11
  138. package/dist/phaser/display/webgl/shader_manager.d.ts.map +1 -1
  139. package/dist/phaser/display/webgl/sprite_batch.d.ts +29 -20
  140. package/dist/phaser/display/webgl/sprite_batch.d.ts.map +1 -1
  141. package/dist/phaser/display/webgl/stencil_manager.d.ts +12 -10
  142. package/dist/phaser/display/webgl/stencil_manager.d.ts.map +1 -1
  143. package/dist/phaser/display/webgl/texture.d.ts +3 -2
  144. package/dist/phaser/display/webgl/texture.d.ts.map +1 -1
  145. package/dist/phaser/display/webgl/texture_util.d.ts.map +1 -1
  146. package/dist/phaser/display/webgl/util.d.ts.map +1 -1
  147. package/dist/phaser/geom/circle.d.ts +4 -1
  148. package/dist/phaser/geom/circle.d.ts.map +1 -1
  149. package/dist/phaser/geom/ellipse.d.ts.map +1 -1
  150. package/dist/phaser/geom/line.d.ts +1 -1
  151. package/dist/phaser/geom/line.d.ts.map +1 -1
  152. package/dist/phaser/geom/matrix.d.ts.map +1 -1
  153. package/dist/phaser/geom/point.d.ts.map +1 -1
  154. package/dist/phaser/geom/polygon.d.ts.map +1 -1
  155. package/dist/phaser/geom/rectangle.d.ts.map +1 -1
  156. package/dist/phaser/geom/rounded_rectangle.d.ts.map +1 -1
  157. package/dist/phaser/geom/util/circle.d.ts.map +1 -1
  158. package/dist/phaser/geom/util/ellipse.d.ts +3 -2
  159. package/dist/phaser/geom/util/ellipse.d.ts.map +1 -1
  160. package/dist/phaser/geom/util/line.d.ts.map +1 -1
  161. package/dist/phaser/geom/util/matrix.d.ts +2 -2
  162. package/dist/phaser/geom/util/matrix.d.ts.map +1 -1
  163. package/dist/phaser/geom/util/point.d.ts.map +1 -1
  164. package/dist/phaser/geom/util/rectangle.d.ts +1 -1
  165. package/dist/phaser/geom/util/rectangle.d.ts.map +1 -1
  166. package/dist/phaser/util/math.d.ts.map +1 -1
  167. package/package.json +5 -5
  168. package/src/phaser/core/animation.ts +64 -60
  169. package/src/phaser/core/animation_manager.ts +50 -53
  170. package/src/phaser/core/animation_parser.ts +9 -9
  171. package/src/phaser/core/array_set.ts +16 -17
  172. package/src/phaser/core/cache.ts +92 -93
  173. package/src/phaser/core/const.ts +1 -1
  174. package/src/phaser/core/device.ts +24 -29
  175. package/src/phaser/core/device_util.ts +22 -26
  176. package/src/phaser/core/dom.ts +54 -65
  177. package/src/phaser/core/event_manager.ts +64 -94
  178. package/src/phaser/core/factory.ts +14 -14
  179. package/src/phaser/core/frame.ts +28 -28
  180. package/src/phaser/core/frame_data.test.ts +100 -0
  181. package/src/phaser/core/frame_data.ts +24 -24
  182. package/src/phaser/core/frame_util.ts +2 -2
  183. package/src/phaser/core/game.ts +47 -48
  184. package/src/phaser/core/input.ts +104 -110
  185. package/src/phaser/core/input_handler.test.ts +113 -0
  186. package/src/phaser/core/input_handler.ts +199 -218
  187. package/src/phaser/core/input_mouse.ts +71 -54
  188. package/src/phaser/core/input_mspointer.ts +52 -39
  189. package/src/phaser/core/input_pointer.ts +81 -80
  190. package/src/phaser/core/input_touch.ts +49 -36
  191. package/src/phaser/core/loader.ts +173 -152
  192. package/src/phaser/core/loader_parser.ts +39 -57
  193. package/src/phaser/core/raf.ts +8 -7
  194. package/src/phaser/core/registry.test.ts +31 -0
  195. package/src/phaser/core/registry.ts +9 -0
  196. package/src/phaser/core/scale_manager.ts +156 -152
  197. package/src/phaser/core/scene.ts +9 -13
  198. package/src/phaser/core/scene_manager.ts +47 -47
  199. package/src/phaser/core/signal.test.ts +4 -4
  200. package/src/phaser/core/signal.ts +41 -52
  201. package/src/phaser/core/signal_binding.ts +26 -25
  202. package/src/phaser/core/signal_dispatch.test.ts +180 -0
  203. package/src/phaser/core/sound.ts +75 -83
  204. package/src/phaser/core/sound_manager.ts +52 -51
  205. package/src/phaser/core/sound_sprite.ts +17 -16
  206. package/src/phaser/core/stage.ts +25 -24
  207. package/src/phaser/core/time.ts +52 -52
  208. package/src/phaser/core/timer.test.ts +187 -0
  209. package/src/phaser/core/timer.ts +82 -69
  210. package/src/phaser/core/timer_event.ts +10 -10
  211. package/src/phaser/core/tween.ts +90 -93
  212. package/src/phaser/core/tween_data.ts +45 -51
  213. package/src/phaser/core/tween_easing.test.ts +106 -0
  214. package/src/phaser/core/tween_easing.ts +151 -123
  215. package/src/phaser/core/tween_manager.ts +19 -18
  216. package/src/phaser/core/world.ts +4 -3
  217. package/src/phaser/display/bitmap_text.ts +56 -64
  218. package/src/phaser/display/button.ts +33 -32
  219. package/src/phaser/display/canvas/buffer.ts +8 -8
  220. package/src/phaser/display/canvas/graphics.ts +36 -37
  221. package/src/phaser/display/canvas/masker.ts +2 -2
  222. package/src/phaser/display/canvas/pool.test.ts +106 -0
  223. package/src/phaser/display/canvas/pool.ts +25 -27
  224. package/src/phaser/display/canvas/renderer.ts +32 -31
  225. package/src/phaser/display/canvas/tinter.ts +25 -25
  226. package/src/phaser/display/canvas/util.ts +7 -10
  227. package/src/phaser/display/display_object.ts +114 -118
  228. package/src/phaser/display/graphics.ts +121 -119
  229. package/src/phaser/display/graphics_data.ts +12 -12
  230. package/src/phaser/display/graphics_data_util.ts +2 -3
  231. package/src/phaser/display/group.ts +50 -57
  232. package/src/phaser/display/image.ts +55 -52
  233. package/src/phaser/display/sprite_batch.ts +3 -2
  234. package/src/phaser/display/sprite_util.ts +48 -54
  235. package/src/phaser/display/text.test.ts +110 -0
  236. package/src/phaser/display/text.ts +199 -204
  237. package/src/phaser/display/webgl/abstract_filter.ts +9 -9
  238. package/src/phaser/display/webgl/base_texture.ts +21 -24
  239. package/src/phaser/display/webgl/blend_manager.ts +6 -10
  240. package/src/phaser/display/webgl/earcut.ts +73 -37
  241. package/src/phaser/display/webgl/earcut_node.ts +10 -10
  242. package/src/phaser/display/webgl/fast_sprite_batch.ts +34 -34
  243. package/src/phaser/display/webgl/filter_manager.ts +13 -12
  244. package/src/phaser/display/webgl/filter_texture.ts +14 -13
  245. package/src/phaser/display/webgl/graphics.ts +51 -57
  246. package/src/phaser/display/webgl/graphics_data.ts +15 -14
  247. package/src/phaser/display/webgl/mask_manager.ts +2 -2
  248. package/src/phaser/display/webgl/render_texture.ts +26 -25
  249. package/src/phaser/display/webgl/renderer.ts +57 -62
  250. package/src/phaser/display/webgl/shader/complex.ts +28 -12
  251. package/src/phaser/display/webgl/shader/fast.ts +30 -12
  252. package/src/phaser/display/webgl/shader/normal.ts +70 -57
  253. package/src/phaser/display/webgl/shader/primitive.ts +26 -11
  254. package/src/phaser/display/webgl/shader/shader.test.ts +148 -0
  255. package/src/phaser/display/webgl/shader/strip.ts +27 -12
  256. package/src/phaser/display/webgl/shader_manager.test.ts +124 -0
  257. package/src/phaser/display/webgl/shader_manager.ts +26 -34
  258. package/src/phaser/display/webgl/sprite_batch.ts +67 -61
  259. package/src/phaser/display/webgl/stencil_manager.ts +23 -34
  260. package/src/phaser/display/webgl/texture.ts +43 -50
  261. package/src/phaser/display/webgl/texture_util.ts +2 -3
  262. package/src/phaser/display/webgl/util.ts +26 -25
  263. package/src/phaser/geom/circle.test.ts +2 -3
  264. package/src/phaser/geom/circle.ts +36 -36
  265. package/src/phaser/geom/ellipse.test.ts +73 -71
  266. package/src/phaser/geom/ellipse.ts +14 -14
  267. package/src/phaser/geom/line.test.ts +5 -5
  268. package/src/phaser/geom/line.ts +35 -35
  269. package/src/phaser/geom/matrix.test.ts +1 -1
  270. package/src/phaser/geom/matrix.ts +27 -27
  271. package/src/phaser/geom/point.test.ts +1 -2
  272. package/src/phaser/geom/point.ts +35 -35
  273. package/src/phaser/geom/polygon.test.ts +82 -0
  274. package/src/phaser/geom/polygon.ts +16 -16
  275. package/src/phaser/geom/rectangle.test.ts +14 -14
  276. package/src/phaser/geom/rectangle.ts +83 -75
  277. package/src/phaser/geom/rounded_rectangle.test.ts +1 -7
  278. package/src/phaser/geom/rounded_rectangle.ts +9 -9
  279. package/src/phaser/geom/util/circle.test.ts +25 -23
  280. package/src/phaser/geom/util/circle.ts +9 -18
  281. package/src/phaser/geom/util/ellipse.test.ts +7 -5
  282. package/src/phaser/geom/util/ellipse.ts +3 -2
  283. package/src/phaser/geom/util/line.test.ts +10 -8
  284. package/src/phaser/geom/util/line.ts +6 -16
  285. package/src/phaser/geom/util/matrix.test.ts +20 -18
  286. package/src/phaser/geom/util/matrix.ts +8 -15
  287. package/src/phaser/geom/util/point.test.ts +8 -6
  288. package/src/phaser/geom/util/point.ts +24 -28
  289. package/src/phaser/geom/util/polygon.test.ts +12 -10
  290. package/src/phaser/geom/util/polygon.ts +2 -2
  291. package/src/phaser/geom/util/rectangle.test.ts +10 -8
  292. package/src/phaser/geom/util/rectangle.ts +18 -37
  293. package/src/phaser/geom/util/rounded_rectangle.test.ts +11 -9
  294. package/src/phaser/geom/util/rounded_rectangle.ts +1 -1
  295. package/src/phaser/util/math.test.ts +11 -11
  296. package/src/phaser/util/math.ts +29 -46
@@ -2,38 +2,38 @@ import type { Game } from './game.js';
2
2
  import { Timer } from './timer.js';
3
3
 
4
4
  export class Time {
5
- game!: Game;
6
- time!: number;
7
- prevTime!: number;
8
- now!: number;
9
- elapsed!: number;
10
- elapsedMS!: number;
11
- desiredFpsMult!: number;
12
- _desiredFps!: number;
13
- suggestedFps!: number;
14
- advancedTiming!: boolean;
15
- frames!: number;
16
- fps!: number;
17
- fpsMin!: number;
18
- fpsMax!: number;
19
- msMin!: number;
20
- msMax!: number;
21
- pauseDuration!: number;
22
- timeToCall!: number;
23
- timeExpected!: number;
24
- events!: Timer;
25
- _frameCount!: number;
26
- _elapsedAccumulator!: number;
27
- _started!: number;
28
- _timeLastSecond!: number;
29
- _pauseStarted!: number;
30
- _justResumed!: boolean;
31
- _timers!: Timer[];
5
+ public game!: Game;
6
+ public time!: number;
7
+ public prevTime!: number;
8
+ public now!: number;
9
+ public elapsed!: number;
10
+ public elapsedMS!: number;
11
+ public desiredFpsMult!: number;
12
+ public _desiredFps!: number;
13
+ public suggestedFps!: number;
14
+ public advancedTiming!: boolean;
15
+ public frames!: number;
16
+ public fps!: number;
17
+ public fpsMin!: number;
18
+ public fpsMax!: number;
19
+ public msMin!: number;
20
+ public msMax!: number;
21
+ public pauseDuration!: number;
22
+ public timeToCall!: number;
23
+ public timeExpected!: number;
24
+ public events!: Timer;
25
+ public _frameCount!: number;
26
+ public _elapsedAccumulator!: number;
27
+ public _started!: number;
28
+ public _timeLastSecond!: number;
29
+ public _pauseStarted!: number;
30
+ public _justResumed!: boolean;
31
+ public _timers!: Timer[];
32
32
  /**
33
33
  * Creates a new Time instance.
34
- * @param {import('./game.js').Game} game - Reference to the Phaser Game instance.
34
+ * @param {Game} game - Reference to the Phaser Game instance.
35
35
  */
36
- constructor(game: Game) {
36
+ public constructor(game: Game) {
37
37
  this.game = game;
38
38
  this.time = 0;
39
39
  this.prevTime = 0;
@@ -66,7 +66,7 @@ export class Time {
66
66
  /**
67
67
  * Initializes the time manager and starts tracking time.
68
68
  */
69
- boot() {
69
+ public boot() {
70
70
  this._started = Date.now();
71
71
  this.time = Date.now();
72
72
  this.events.start();
@@ -78,7 +78,7 @@ export class Time {
78
78
  * @param {Timer} timer - The Timer to add.
79
79
  * @returns {Timer} The added Timer object.
80
80
  */
81
- add(timer: Timer) {
81
+ public add(timer: Timer) {
82
82
  this._timers.push(timer);
83
83
  return timer;
84
84
  }
@@ -88,7 +88,7 @@ export class Time {
88
88
  * @param {boolean} autoDestroy - Whether the timer should be automatically destroyed when it completes.
89
89
  * @returns {Timer} The created Timer object.
90
90
  */
91
- create(autoDestroy: boolean = true) {
91
+ public create(autoDestroy = true) {
92
92
  const timer = new Timer(this.game, autoDestroy);
93
93
  this._timers.push(timer);
94
94
  return timer;
@@ -97,9 +97,9 @@ export class Time {
97
97
  /**
98
98
  * Removes all timers from the Time manager.
99
99
  */
100
- removeAll() {
101
- for (let i = 0; i < this._timers.length; i += 1) {
102
- this._timers[i].destroy();
100
+ public removeAll() {
101
+ for (const timer of this._timers) {
102
+ timer.destroy();
103
103
  }
104
104
  this._timers = [];
105
105
  this.events.removeAll();
@@ -108,7 +108,7 @@ export class Time {
108
108
  /**
109
109
  * Refreshes the time tracking values.
110
110
  */
111
- refresh() {
111
+ public refresh() {
112
112
  const previousDateNow = this.time;
113
113
  // this.time always holds a Date.now value
114
114
  this.time = Date.now();
@@ -120,7 +120,7 @@ export class Time {
120
120
  * Updates the Time manager with a new timestamp.
121
121
  * @param {number} time - The new timestamp to use for updating.
122
122
  */
123
- update(time: number) {
123
+ public update(time: number) {
124
124
  const previousDateNow = this.time;
125
125
  // this.time always holds a Date.now value
126
126
  this.time = Date.now();
@@ -140,7 +140,7 @@ export class Time {
140
140
  if (!this.game.paused) {
141
141
  // Our internal Phaser.Timer
142
142
  this.events.update(this.time);
143
- if (this._timers.length) {
143
+ if (this._timers.length > 0) {
144
144
  this.updateTimers();
145
145
  }
146
146
  }
@@ -149,11 +149,11 @@ export class Time {
149
149
  /**
150
150
  * Updates all timers managed by the Time manager.
151
151
  */
152
- updateTimers() {
152
+ public updateTimers() {
153
153
  let i = 0;
154
154
  let len = this._timers.length;
155
155
  while (i < len) {
156
- if (this._timers[i].update(this.time)) {
156
+ if (this._timers[i]!.update(this.time)) {
157
157
  i += 1;
158
158
  } else {
159
159
  // Timer requests to be removed
@@ -166,7 +166,7 @@ export class Time {
166
166
  /**
167
167
  * Updates the advanced timing values.
168
168
  */
169
- updateAdvancedTiming() {
169
+ public updateAdvancedTiming() {
170
170
  // count the number of time.update calls
171
171
  this._frameCount += 1;
172
172
  this._elapsedAccumulator += this.elapsed;
@@ -192,27 +192,27 @@ export class Time {
192
192
  /**
193
193
  * Handles game pause event.
194
194
  */
195
- gamePaused() {
195
+ public gamePaused() {
196
196
  this._pauseStarted = Date.now();
197
197
  this.events.pause();
198
198
  let i = this._timers.length;
199
199
  while (i) {
200
200
  i -= 1;
201
- this._timers[i]._pause();
201
+ this._timers[i]!._pause();
202
202
  }
203
203
  }
204
204
 
205
205
  /**
206
206
  * Handles game resume event.
207
207
  */
208
- gameResumed() {
208
+ public gameResumed() {
209
209
  this.time = Date.now();
210
210
  this.pauseDuration = this.time - this._pauseStarted;
211
211
  this.events.resume();
212
212
  let i = this._timers.length;
213
213
  while (i) {
214
214
  i -= 1;
215
- this._timers[i]._resume();
215
+ this._timers[i]!._resume();
216
216
  }
217
217
  }
218
218
 
@@ -220,7 +220,7 @@ export class Time {
220
220
  * Gets the total elapsed time in seconds since the game started.
221
221
  * @returns {number} The total elapsed time in seconds.
222
222
  */
223
- totalElapsedSeconds() {
223
+ public totalElapsedSeconds() {
224
224
  return (this.time - this._started) * 0.001;
225
225
  }
226
226
 
@@ -229,7 +229,7 @@ export class Time {
229
229
  * @param {number} since - The timestamp to calculate elapsed time from.
230
230
  * @returns {number} The elapsed time in milliseconds.
231
231
  */
232
- elapsedSince(since: number) {
232
+ public elapsedSince(since: number) {
233
233
  return this.time - since;
234
234
  }
235
235
 
@@ -238,14 +238,14 @@ export class Time {
238
238
  * @param {number} since - The timestamp to calculate elapsed time from.
239
239
  * @returns {number} The elapsed time in seconds.
240
240
  */
241
- elapsedSecondsSince(since: number) {
241
+ public elapsedSecondsSince(since: number) {
242
242
  return (this.time - since) * 0.001;
243
243
  }
244
244
 
245
245
  /**
246
246
  * Resets the time tracking values.
247
247
  */
248
- reset() {
248
+ public reset() {
249
249
  this._started = this.time;
250
250
  this.removeAll();
251
251
  }
@@ -253,7 +253,7 @@ export class Time {
253
253
  /**
254
254
  * Destroys the Time manager and cleans up resources.
255
255
  */
256
- destroy() {
256
+ public destroy() {
257
257
  this.reset();
258
258
  }
259
259
 
@@ -261,14 +261,14 @@ export class Time {
261
261
  * Gets the desired frames per second.
262
262
  * @returns {number} The desired frames per second.
263
263
  */
264
- get desiredFps() {
264
+ public get desiredFps() {
265
265
  return this._desiredFps;
266
266
  }
267
267
 
268
268
  /**
269
269
  * Sets the desired frames per second.
270
270
  */
271
- set desiredFps(value) {
271
+ public set desiredFps(value) {
272
272
  this._desiredFps = value;
273
273
  this.desiredFpsMult = 1 / value;
274
274
  }
@@ -0,0 +1,187 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import type { Game } from './game.js';
3
+ import { Timer } from './timer.js';
4
+
5
+ const createGame = (time = 0): Game => ({ time: { time } }) as unknown as Game;
6
+
7
+ const createTimer = (startTime = 0): Timer => {
8
+ const timer = new Timer(createGame(startTime));
9
+ timer._now = startTime;
10
+ return timer;
11
+ };
12
+
13
+ describe('Timer', () => {
14
+ describe('start', () => {
15
+ it('rebases every queued event onto the start time', () => {
16
+ const timer = createTimer(1000);
17
+ timer.add(100, () => undefined);
18
+ timer.add(300, () => undefined);
19
+ timer.start();
20
+ expect(timer.events.map((event) => event.tick)).toStrictEqual([1100, 1300]);
21
+ });
22
+
23
+ it('is a no-op once already running', () => {
24
+ const timer = createTimer(1000);
25
+ timer.add(100, () => undefined);
26
+ timer.start();
27
+ const ticks = timer.events.map((event) => event.tick);
28
+ timer.start(500);
29
+ expect(timer.events.map((event) => event.tick)).toStrictEqual(ticks);
30
+ });
31
+ });
32
+
33
+ describe('order', () => {
34
+ it('sorts events by tick and exposes the earliest as nextTick', () => {
35
+ const timer = createTimer(0);
36
+ timer.add(500, () => undefined);
37
+ timer.add(100, () => undefined);
38
+ timer.add(300, () => undefined);
39
+ expect(timer.events.map((event) => event.delay)).toStrictEqual([100, 300, 500]);
40
+ expect(timer.nextTick).toBe(100);
41
+ });
42
+
43
+ it('leaves nextTick untouched when there are no events', () => {
44
+ const timer = createTimer(0);
45
+ timer.nextTick = 42;
46
+ timer.order();
47
+ expect(timer.nextTick).toBe(42);
48
+ });
49
+ });
50
+
51
+ describe('remove', () => {
52
+ it('marks a matching event for deletion and reports success', () => {
53
+ const timer = createTimer(0);
54
+ const event = timer.add(100, () => undefined);
55
+ expect(timer.remove(event)).toBe(true);
56
+ expect(event.pendingDelete).toBe(true);
57
+ });
58
+
59
+ it('reports failure for an event it does not hold', () => {
60
+ const timer = createTimer(0);
61
+ timer.add(100, () => undefined);
62
+ const other = createTimer(0).add(100, () => undefined);
63
+ expect(timer.remove(other)).toBe(false);
64
+ });
65
+
66
+ it('reports failure for null without throwing', () => {
67
+ const timer = createTimer(0);
68
+ timer.add(100, () => undefined);
69
+ expect(timer.remove(null)).toBe(false);
70
+ });
71
+ });
72
+
73
+ describe('clearPendingEvents', () => {
74
+ it('drops only the events marked for deletion', () => {
75
+ const timer = createTimer(0);
76
+ const first = timer.add(100, () => undefined);
77
+ const second = timer.add(200, () => undefined);
78
+ timer.remove(first);
79
+ timer.clearPendingEvents();
80
+ expect(timer.events).toStrictEqual([second]);
81
+ expect(timer._len).toBe(1);
82
+ });
83
+ });
84
+
85
+ describe('update', () => {
86
+ it('fires a one-shot event once its tick is reached and marks it spent', () => {
87
+ const timer = createTimer(0);
88
+ const callback = vi.fn();
89
+ timer.add(100, callback);
90
+ timer.start();
91
+ timer.update(50);
92
+ expect(callback).not.toHaveBeenCalled();
93
+ timer.update(100);
94
+ expect(callback).toHaveBeenCalledTimes(1);
95
+ expect(timer.events[0]?.pendingDelete).toBe(true);
96
+ });
97
+
98
+ it('keeps firing a looping event and reschedules its tick', () => {
99
+ const timer = createTimer(0);
100
+ const callback = vi.fn();
101
+ timer.loop(100, callback);
102
+ timer.start();
103
+ timer.update(100);
104
+ timer.update(200);
105
+ timer.update(300);
106
+ expect(callback).toHaveBeenCalledTimes(3);
107
+ expect(timer.events[0]?.pendingDelete).toBe(false);
108
+ });
109
+
110
+ it('fires a repeating event exactly repeatCount times', () => {
111
+ const timer = createTimer(0);
112
+ const callback = vi.fn();
113
+ timer.repeat(100, 2, callback);
114
+ timer.start();
115
+ timer.update(100);
116
+ timer.update(200);
117
+ timer.update(300);
118
+ timer.update(400);
119
+ expect(callback).toHaveBeenCalledTimes(2);
120
+ expect(timer.expired).toBe(true);
121
+ });
122
+
123
+ it('passes the configured context and arguments to the callback', () => {
124
+ const timer = createTimer(0);
125
+ const context = { seen: null as unknown };
126
+ const callback = vi.fn(function callbackImpl(this: typeof context, value: string) {
127
+ this.seen = value;
128
+ });
129
+ timer.add(100, callback, context, 'payload');
130
+ timer.start();
131
+ timer.update(100);
132
+ expect(callback).toHaveBeenCalledWith('payload');
133
+ expect(context.seen).toBe('payload');
134
+ });
135
+
136
+ it('completes and dispatches onComplete once every event is spent', () => {
137
+ const timer = createTimer(0);
138
+ const onComplete = vi.fn();
139
+ timer.onComplete.add(onComplete);
140
+ timer.add(100, () => undefined);
141
+ timer.start();
142
+ timer.update(100);
143
+ expect(timer.expired).toBe(true);
144
+ expect(onComplete).toHaveBeenCalledTimes(1);
145
+ });
146
+
147
+ it('survives a callback that removes every event mid-tick', () => {
148
+ const timer = createTimer(0);
149
+ timer.add(100, () => {
150
+ timer.events.length = 0;
151
+ });
152
+ timer.start();
153
+ expect(() => timer.update(100)).not.toThrow();
154
+ });
155
+ });
156
+
157
+ describe('adjustEvents', () => {
158
+ it('shifts pending events forward by the time they missed', () => {
159
+ const timer = createTimer(0);
160
+ const event = timer.add(100, () => undefined);
161
+ timer.start();
162
+ timer._now = 5000;
163
+ timer.adjustEvents(0);
164
+ expect(event.tick).toBe(5100);
165
+ });
166
+
167
+ it('clamps events whose tick already passed to the current time', () => {
168
+ const timer = createTimer(0);
169
+ const event = timer.add(100, () => undefined);
170
+ timer.start();
171
+ timer._now = 5000;
172
+ timer.adjustEvents(500);
173
+ expect(event.tick).toBe(5000);
174
+ });
175
+
176
+ it('leaves events marked for deletion alone', () => {
177
+ const timer = createTimer(0);
178
+ const event = timer.add(100, () => undefined);
179
+ timer.start();
180
+ timer.remove(event);
181
+ const { tick } = event;
182
+ timer._now = 5000;
183
+ timer.adjustEvents(0);
184
+ expect(event.tick).toBe(tick);
185
+ });
186
+ });
187
+ });