@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
@@ -1,29 +1,30 @@
1
+ import type { Signal } from './signal.js';
1
2
  export class SignalBinding {
2
- _signal: any;
3
- _listener: any;
4
- _args: any;
5
- _priority: number;
6
- _isOnce: boolean;
7
- context: any;
8
- callCount: number;
9
- active: boolean;
10
- params: any;
3
+ public _signal: any;
4
+ public _listener: any;
5
+ public _args: any;
6
+ public _priority: number;
7
+ public _isOnce: boolean;
8
+ public context: any;
9
+ public callCount: number;
10
+ public active: boolean;
11
+ public params: any;
11
12
 
12
13
  /**
13
14
  * TBD.
14
- * @param {import('./signal.js').Signal} signal - TBD.
15
+ * @param {Signal} signal - TBD.
15
16
  * @param {Function} listener - TBD.
16
17
  * @param {boolean} isOnce - TBD.
17
18
  * @param {object} listenerContext - TBD.
18
19
  * @param {number} priority - TBD.
19
20
  * @param {...any} args - TBD.
20
21
  */
21
- constructor(
22
- signal: import('./signal.js').Signal,
22
+ public constructor(
23
+ signal: Signal,
23
24
  listener: Function,
24
- isOnce: boolean = false,
25
+ isOnce = false,
25
26
  listenerContext: any | null = null,
26
- priority: number = 0,
27
+ priority = 0,
27
28
  args: any = null
28
29
  ) {
29
30
  this._signal = signal;
@@ -42,10 +43,10 @@ export class SignalBinding {
42
43
  * @param {any[]} paramsArr - TBD.
43
44
  * @returns {Function} TBD.
44
45
  */
45
- execute(paramsArr: any[]) {
46
+ public execute(paramsArr: any[]) {
46
47
  let handlerReturn;
47
48
  let params;
48
- if (this.active && !!this._listener) {
49
+ if (this.active && Boolean(this._listener)) {
49
50
  params = this.params ? this.params.concat(paramsArr) : paramsArr;
50
51
  if (this._args) {
51
52
  params = params.concat(this._args);
@@ -63,7 +64,7 @@ export class SignalBinding {
63
64
  * TBD.
64
65
  * @returns {Function} TBD.
65
66
  */
66
- detach() {
67
+ public detach() {
67
68
  return this.isBound() ? this._signal.remove(this._listener, this.context) : null;
68
69
  }
69
70
 
@@ -71,15 +72,15 @@ export class SignalBinding {
71
72
  * TBD.
72
73
  * @returns {boolean} TBD.
73
74
  */
74
- isBound() {
75
- return !!this._signal && !!this._listener;
75
+ public isBound() {
76
+ return Boolean(this._signal) && Boolean(this._listener);
76
77
  }
77
78
 
78
79
  /**
79
80
  * TBD.
80
81
  * @returns {boolean} TBD.
81
82
  */
82
- isOnce() {
83
+ public isOnce() {
83
84
  return this._isOnce;
84
85
  }
85
86
 
@@ -87,22 +88,22 @@ export class SignalBinding {
87
88
  * TBD.
88
89
  * @returns {Function} TBD.
89
90
  */
90
- getListener() {
91
+ public getListener() {
91
92
  return this._listener;
92
93
  }
93
94
 
94
95
  /**
95
96
  * TBD.
96
- * @returns {import('./signal.js').Signal} TBD.
97
+ * @returns {Signal} TBD.
97
98
  */
98
- getSignal() {
99
+ public getSignal() {
99
100
  return this._signal;
100
101
  }
101
102
 
102
103
  /**
103
104
  * TBD.
104
105
  */
105
- _destroy() {
106
+ public _destroy() {
106
107
  delete this._signal;
107
108
  delete this._listener;
108
109
  delete this.context;
@@ -112,7 +113,7 @@ export class SignalBinding {
112
113
  * TBD.
113
114
  * @returns {string} TBD.
114
115
  */
115
- toString() {
116
+ public toString() {
116
117
  return `[SignalBinding isOnce:${this._isOnce}, isBound:${this.isBound()}, active:${this.active}]`;
117
118
  }
118
119
  }
@@ -0,0 +1,180 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { Signal } from './signal.js';
3
+
4
+ describe('Signal binding management', () => {
5
+ describe('add', () => {
6
+ it('registers a listener and reports it', () => {
7
+ const signal = new Signal();
8
+ const listener = vi.fn();
9
+ signal.add(listener);
10
+ expect(signal.getNumListeners()).toBe(1);
11
+ expect(signal.has(listener)).toBe(true);
12
+ });
13
+
14
+ it('returns the existing binding when the same listener is added twice', () => {
15
+ const signal = new Signal();
16
+ const listener = vi.fn();
17
+ const first = signal.add(listener);
18
+ const second = signal.add(listener);
19
+ expect(second).toBe(first);
20
+ expect(signal.getNumListeners()).toBe(1);
21
+ });
22
+
23
+ it('treats the same listener under a different context as a separate binding', () => {
24
+ const signal = new Signal();
25
+ const listener = vi.fn();
26
+ signal.add(listener, { id: 1 });
27
+ signal.add(listener, { id: 2 });
28
+ expect(signal.getNumListeners()).toBe(2);
29
+ });
30
+
31
+ it('refuses to switch a listener between add and addOnce', () => {
32
+ const signal = new Signal();
33
+ const listener = vi.fn();
34
+ signal.add(listener);
35
+ expect(() => signal.addOnce(listener)).toThrow(/without removing the relationship first/);
36
+ });
37
+ });
38
+
39
+ describe('dispatch', () => {
40
+ it('calls listeners in priority order, highest first', () => {
41
+ const signal = new Signal();
42
+ const order: string[] = [];
43
+ signal.add(() => order.push('low'), null, 0);
44
+ signal.add(() => order.push('high'), null, 10);
45
+ signal.add(() => order.push('mid'), null, 5);
46
+ signal.dispatch();
47
+ expect(order).toStrictEqual(['high', 'mid', 'low']);
48
+ });
49
+
50
+ it('forwards its arguments', () => {
51
+ const signal = new Signal();
52
+ const listener = vi.fn();
53
+ signal.add(listener);
54
+ signal.dispatch(1, 'two');
55
+ expect(listener).toHaveBeenCalledWith(1, 'two');
56
+ });
57
+
58
+ it('removes an addOnce listener after it fires', () => {
59
+ const signal = new Signal();
60
+ const listener = vi.fn();
61
+ signal.addOnce(listener);
62
+ signal.dispatch();
63
+ signal.dispatch();
64
+ expect(listener).toHaveBeenCalledTimes(1);
65
+ expect(signal.getNumListeners()).toBe(0);
66
+ });
67
+
68
+ it('stops propagating once a listener returns false', () => {
69
+ const signal = new Signal();
70
+ const later = vi.fn();
71
+ signal.add(() => false, null, 10);
72
+ signal.add(later, null, 0);
73
+ signal.dispatch();
74
+ expect(later).not.toHaveBeenCalled();
75
+ });
76
+
77
+ it('stops propagating once halt is called', () => {
78
+ const signal = new Signal();
79
+ const later = vi.fn();
80
+ signal.add(
81
+ () => {
82
+ signal.halt();
83
+ },
84
+ null,
85
+ 10
86
+ );
87
+ signal.add(later, null, 0);
88
+ signal.dispatch();
89
+ expect(later).not.toHaveBeenCalled();
90
+ });
91
+
92
+ it('survives a listener that removes every listener mid-dispatch', () => {
93
+ const signal = new Signal();
94
+ const later = vi.fn();
95
+ signal.add(
96
+ () => {
97
+ signal.removeAll();
98
+ },
99
+ null,
100
+ 10
101
+ );
102
+ signal.add(later, null, 0);
103
+ expect(() => {
104
+ signal.dispatch();
105
+ }).not.toThrow();
106
+ });
107
+ });
108
+
109
+ describe('remove', () => {
110
+ it('drops the matching binding', () => {
111
+ const signal = new Signal();
112
+ const listener = vi.fn();
113
+ const other = vi.fn();
114
+ signal.add(listener);
115
+ signal.add(other);
116
+ signal.remove(listener);
117
+ expect(signal.getNumListeners()).toBe(1);
118
+ expect(signal.has(listener)).toBe(false);
119
+ expect(signal.has(other)).toBe(true);
120
+ });
121
+
122
+ it('leaves the list alone for an unregistered listener', () => {
123
+ const signal = new Signal();
124
+ signal.add(vi.fn());
125
+ signal.remove(vi.fn());
126
+ expect(signal.getNumListeners()).toBe(1);
127
+ });
128
+ });
129
+
130
+ describe('removeAll', () => {
131
+ it('clears every listener when given no context', () => {
132
+ const signal = new Signal();
133
+ signal.add(vi.fn(), { id: 1 });
134
+ signal.add(vi.fn(), { id: 2 });
135
+ signal.removeAll();
136
+ expect(signal.getNumListeners()).toBe(0);
137
+ });
138
+
139
+ it('clears only the listeners bound to the given context', () => {
140
+ const signal = new Signal();
141
+ const context = { id: 1 };
142
+ signal.add(vi.fn(), context);
143
+ signal.add(vi.fn(), { id: 2 });
144
+ signal.removeAll(context);
145
+ expect(signal.getNumListeners()).toBe(1);
146
+ });
147
+ });
148
+
149
+ describe('memorize', () => {
150
+ it('replays the last dispatch to a listener added afterwards', () => {
151
+ const signal = new Signal();
152
+ signal.memorize = true;
153
+ signal.add(vi.fn());
154
+ signal.dispatch('remembered');
155
+ const listener = vi.fn();
156
+ signal.add(listener);
157
+ expect(listener).toHaveBeenCalledWith('remembered');
158
+ });
159
+
160
+ it('records nothing while the signal has never had a binding', () => {
161
+ const signal = new Signal();
162
+ signal.memorize = true;
163
+ signal.dispatch('dropped');
164
+ const listener = vi.fn();
165
+ signal.add(listener);
166
+ expect(listener).not.toHaveBeenCalled();
167
+ });
168
+
169
+ it('stops replaying once forgotten', () => {
170
+ const signal = new Signal();
171
+ signal.memorize = true;
172
+ signal.add(vi.fn());
173
+ signal.dispatch('remembered');
174
+ signal.forget();
175
+ const listener = vi.fn();
176
+ signal.add(listener);
177
+ expect(listener).not.toHaveBeenCalled();
178
+ });
179
+ });
180
+ });
@@ -1,73 +1,67 @@
1
1
  import { Signal } from './signal.js';
2
+ import type { Game } from './game.js';
3
+ import type { Tween } from './tween.js';
2
4
 
3
5
  export class Sound {
4
- _paused!: any;
5
- game!: import('./game.js').Game;
6
- name!: string;
7
- key!: string;
8
- loop!: boolean;
9
- markers!: any;
10
- context!: AudioContext;
11
- autoplay!: boolean;
12
- totalDuration!: number;
13
- startTime!: number;
14
- currentTime!: number;
15
- duration!: number;
16
- durationMS!: number;
17
- position!: number;
18
- stopTime!: number;
19
- paused!: boolean;
20
- pausedPosition!: number;
21
- pausedTime!: number;
22
- isPlaying!: boolean;
23
- currentMarker!: string;
24
- fadeTween!: import('./tween.js').Tween | null;
25
- pendingPlayback!: boolean;
26
- override!: boolean;
27
- allowMultiple!: boolean;
28
- externalNode!: AudioNode | null;
29
- masterGainNode!: GainNode | null;
30
- gainNode!: GainNode;
31
- _sound!: AudioBufferSourceNode;
32
- _markedToDelete!: boolean;
33
- _removeFromSoundManager!: boolean;
34
- onPlay!: Signal;
35
- onPause!: Signal;
36
- onResume!: Signal;
37
- onLoop!: Signal;
38
- onStop!: Signal;
39
- onMute!: Signal;
40
- onMarkerComplete!: Signal;
41
- onFadeComplete!: Signal;
42
- _volume!: number;
43
- _buffer!: AudioBuffer | null;
44
- _muted!: boolean;
45
- _tempMarker!: string;
46
- _tempPosition!: number;
47
- _tempVolume!: number;
48
- _tempPause!: number;
49
- _muteVolume!: number;
50
- _tempLoop!: boolean;
6
+ public _paused!: any;
7
+ public game!: Game;
8
+ public name!: string;
9
+ public key!: string;
10
+ public loop!: boolean;
11
+ public markers!: any;
12
+ public context!: AudioContext;
13
+ public autoplay!: boolean;
14
+ public totalDuration!: number;
15
+ public startTime!: number;
16
+ public currentTime!: number;
17
+ public duration!: number;
18
+ public durationMS!: number;
19
+ public position!: number;
20
+ public stopTime!: number;
21
+ public paused!: boolean;
22
+ public pausedPosition!: number;
23
+ public pausedTime!: number;
24
+ public isPlaying!: boolean;
25
+ public currentMarker!: string;
26
+ public fadeTween!: Tween | null;
27
+ public pendingPlayback!: boolean;
28
+ public override!: boolean;
29
+ public allowMultiple!: boolean;
30
+ public externalNode!: AudioNode | null;
31
+ public masterGainNode!: GainNode | null;
32
+ public gainNode!: GainNode;
33
+ public _sound!: AudioBufferSourceNode;
34
+ public _markedToDelete!: boolean;
35
+ public _removeFromSoundManager!: boolean;
36
+ public onPlay!: Signal;
37
+ public onPause!: Signal;
38
+ public onResume!: Signal;
39
+ public onLoop!: Signal;
40
+ public onStop!: Signal;
41
+ public onMute!: Signal;
42
+ public onMarkerComplete!: Signal;
43
+ public onFadeComplete!: Signal;
44
+ public _volume!: number;
45
+ public _buffer!: AudioBuffer | null;
46
+ public _muted!: boolean;
47
+ public _tempMarker!: string;
48
+ public _tempPosition!: number;
49
+ public _tempVolume!: number;
50
+ public _tempPause!: number;
51
+ public _muteVolume!: number;
52
+ public _tempLoop!: boolean;
51
53
  /**
52
54
  * Creates a new Sound instance.
53
- * @param {import('./game.js').Game} game - Reference to the Phaser Game instance.
55
+ * @param {Game} game - Reference to the Phaser Game instance.
54
56
  * @param {string} key - The key of the sound to play.
55
57
  * @param {number} volume - The initial volume level (0.0 to 1.0).
56
58
  * @param {boolean} loop - Whether the sound should loop.
57
59
  * @param {boolean} connect - Whether to connect to the master gain node.
58
60
  */
59
- constructor(
60
- game: import('./game.js').Game,
61
- key: string,
62
- volume: number = 1,
63
- loop: boolean = false,
64
- connect: boolean | null = null
65
- ) {
61
+ public constructor(game: Game, key: string, volume = 1, loop = false, connect: boolean | null = null) {
66
62
  // TODO
67
63
  // https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Migrating_from_webkitAudioContext
68
- if (!connect) {
69
- connect = game.sound.connectToMaster;
70
- }
64
+ connect ??= game.sound.connectToMaster;
71
65
  this.game = game;
72
66
  this.name = key;
73
67
  this.key = key;
@@ -128,7 +122,7 @@ export class Sound {
128
122
  * Callback when a sound has been unlocked.
129
123
  * @param {string} key - The key of the sound that was unlocked.
130
124
  */
131
- soundHasUnlocked(key: string) {
125
+ public soundHasUnlocked(key: string) {
132
126
  if (key === this.key) {
133
127
  this._sound = this.game.cache.getSoundData(this.key);
134
128
  this.totalDuration = (this._sound as any).duration;
@@ -143,7 +137,7 @@ export class Sound {
143
137
  * @param {number} volume - The volume level (0.0 to 1.0) of the marker.
144
138
  * @param {boolean} loop - Whether the marker should loop.
145
139
  */
146
- addMarker(name: string, start: number, duration: number = 1, volume: number = 1, loop: boolean = false) {
140
+ public addMarker(name: string, start: number, duration = 1, volume = 1, loop = false) {
147
141
  this.markers[name] = {
148
142
  name,
149
143
  start,
@@ -159,14 +153,14 @@ export class Sound {
159
153
  * Removes a marker from the sound.
160
154
  * @param {string} name - The name of the marker to remove.
161
155
  */
162
- removeMarker(name: string) {
156
+ public removeMarker(name: string) {
163
157
  delete this.markers[name];
164
158
  }
165
159
 
166
160
  /**
167
161
  * Handler for when the sound ends.
168
162
  */
169
- onEndedHandler() {
163
+ public onEndedHandler() {
170
164
  this._sound.onended = null;
171
165
  this.isPlaying = false;
172
166
  this.currentTime = this.durationMS;
@@ -200,7 +194,7 @@ export class Sound {
200
194
  /**
201
195
  * Updates the sound state.
202
196
  */
203
- update() {
197
+ public update() {
204
198
  if (!this.game.cache.checkSoundKey(this.key)) {
205
199
  this.destroy();
206
200
  return;
@@ -239,7 +233,7 @@ export class Sound {
239
233
  * @param {number} volume - The volume level (0.0 to 1.0) to play at.
240
234
  * @returns {Sound} This Sound instance for chaining.
241
235
  */
242
- loopFull(volume: number) {
236
+ public loopFull(volume: number) {
243
237
  return this.play(null, 0, volume, true);
244
238
  }
245
239
 
@@ -252,13 +246,11 @@ export class Sound {
252
246
  * @param {boolean} forceRestart - Whether to force restarting the sound even if it's already playing.
253
247
  * @returns {Sound} This Sound instance for chaining.
254
248
  */
255
- play(marker: any = '', position: any = 0, volume: any = 1, loop: any = false, forceRestart: boolean = true) {
249
+ public play(marker: any = '', position: any = 0, volume: any = 1, loop: any = false, forceRestart = true) {
256
250
  if (marker === undefined || marker === false || marker === null) {
257
251
  marker = '';
258
252
  }
259
- if (forceRestart === undefined) {
260
- forceRestart = true;
261
- }
253
+ forceRestart ??= true;
262
254
 
263
255
  if (this.isPlaying && !this.allowMultiple && !forceRestart && !this.override) {
264
256
  // Use Restart instead
@@ -306,7 +298,7 @@ export class Sound {
306
298
  return this;
307
299
  }
308
300
  } else {
309
- position = position || 0;
301
+ position = position ?? 0;
310
302
  if (volume === undefined) {
311
303
  volume = this._volume;
312
304
  }
@@ -373,14 +365,14 @@ export class Sound {
373
365
  * @param {number} volume - The volume level (0.0 to 1.0) to play at.
374
366
  * @param {boolean} loop - Whether the sound should loop.
375
367
  */
376
- restart(marker: string = '', position: number = 0, volume: number = 1, loop: boolean = false) {
368
+ public restart(marker = '', position = 0, volume = 1, loop = false) {
377
369
  this.play(marker, position, volume, loop, true);
378
370
  }
379
371
 
380
372
  /**
381
373
  * Pauses the sound.
382
374
  */
383
- pause() {
375
+ public pause() {
384
376
  if (this.isPlaying && this._sound) {
385
377
  this.paused = true;
386
378
  this.pausedPosition = this.currentTime;
@@ -394,7 +386,7 @@ export class Sound {
394
386
  /**
395
387
  * Resumes the sound.
396
388
  */
397
- resume() {
389
+ public resume() {
398
390
  if (this.paused && this._sound) {
399
391
  const p = Math.max(0, this.position + this.pausedPosition / 1000);
400
392
  this._sound = this.context.createBufferSource();
@@ -426,7 +418,7 @@ export class Sound {
426
418
  /**
427
419
  * Stops the sound.
428
420
  */
429
- stop() {
421
+ public stop() {
430
422
  if (this.isPlaying && this._sound) {
431
423
  if (this._sound.stop === undefined) {
432
424
  (this._sound as any).noteOff(0);
@@ -460,7 +452,7 @@ export class Sound {
460
452
  * @param {boolean} loop - Whether the sound should loop.
461
453
  * @param {string} marker - The name of the marker to fade in, or empty string to use current marker.
462
454
  */
463
- fadeIn(duration: number, loop: boolean = false, marker: string = this.currentMarker) {
455
+ public fadeIn(duration: number, loop = false, marker: string = this.currentMarker) {
464
456
  if (this.paused) {
465
457
  return;
466
458
  }
@@ -472,7 +464,7 @@ export class Sound {
472
464
  * Fades out the sound to silence.
473
465
  * @param {number} duration - The fade-out duration (in milliseconds).
474
466
  */
475
- fadeOut(duration: number) {
467
+ public fadeOut(duration: number) {
476
468
  this.fadeTo(duration, 0);
477
469
  }
478
470
 
@@ -481,7 +473,7 @@ export class Sound {
481
473
  * @param {number} duration - The fade duration (in milliseconds).
482
474
  * @param {number} volume - The target volume level (0.0 to 1.0).
483
475
  */
484
- fadeTo(duration: number = 100, volume: number = 0) {
476
+ public fadeTo(duration = 100, volume = 0) {
485
477
  if (!this.isPlaying || this.paused || volume === this.volume) {
486
478
  return;
487
479
  }
@@ -492,7 +484,7 @@ export class Sound {
492
484
  /**
493
485
  * Callback when fade completes.
494
486
  */
495
- fadeComplete() {
487
+ public fadeComplete() {
496
488
  this.onFadeComplete.dispatch(this, this.volume);
497
489
  if (this.volume === 0) {
498
490
  this.stop();
@@ -503,7 +495,7 @@ export class Sound {
503
495
  * Destroys the sound and cleans up resources.
504
496
  * @param {boolean} remove - Whether to remove the sound from the SoundManager.
505
497
  */
506
- destroy(remove: boolean = true) {
498
+ public destroy(remove = true) {
507
499
  this._markedToDelete = true;
508
500
  this._removeFromSoundManager = remove;
509
501
  this.stop();
@@ -529,15 +521,15 @@ export class Sound {
529
521
  * Gets the muted state of the sound.
530
522
  * @returns {boolean} True if the sound is muted, false otherwise.
531
523
  */
532
- get mute() {
524
+ public get mute() {
533
525
  return this._muted || this.game.sound.mute;
534
526
  }
535
527
 
536
528
  /**
537
529
  * Sets the muted state of the sound.
538
530
  */
539
- set mute(value) {
540
- value = value || false;
531
+ public set mute(value) {
532
+ value = value ?? false;
541
533
  if (value === this._muted) {
542
534
  return;
543
535
  }
@@ -556,14 +548,14 @@ export class Sound {
556
548
  * Gets the volume of the sound.
557
549
  * @returns {number} The volume level (0.0 to 1.0).
558
550
  */
559
- get volume() {
551
+ public get volume() {
560
552
  return this._volume;
561
553
  }
562
554
 
563
555
  /**
564
556
  * Sets the volume of the sound.
565
557
  */
566
- set volume(value) {
558
+ public set volume(value) {
567
559
  if (this._muted) {
568
560
  this._muteVolume = value;
569
561
  return;