@oidoid/void 0.1.7 → 0.1.8

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 (168) hide show
  1. package/dist/public/index.js +1 -1
  2. package/dist/public/index.js.map +1 -1
  3. package/dist/public/{void-v0.1.7+20260106.c6b562a.html → void-v0.1.8+20260106.f2ce523.html} +2 -2
  4. package/dist/src/demo/ents/clock.test.d.ts +2 -0
  5. package/dist/src/demo/ents/clock.test.d.ts.map +1 -0
  6. package/dist/src/demo/ents/clock.test.js +24 -0
  7. package/dist/src/demo/ents/clock.test.js.map +1 -0
  8. package/dist/src/demo/tsconfig.json +3 -3
  9. package/dist/src/ents/cursor.test.d.ts +2 -0
  10. package/dist/src/ents/cursor.test.d.ts.map +1 -0
  11. package/dist/src/ents/cursor.test.js +92 -0
  12. package/dist/src/ents/cursor.test.js.map +1 -0
  13. package/dist/src/ents/ent-query.test.d.ts +11 -0
  14. package/dist/src/ents/ent-query.test.d.ts.map +1 -0
  15. package/dist/src/ents/ent-query.test.js +63 -0
  16. package/dist/src/ents/ent-query.test.js.map +1 -0
  17. package/dist/src/graphics/atlas-parser.test.d.ts +2 -0
  18. package/dist/src/graphics/atlas-parser.test.d.ts.map +1 -0
  19. package/dist/src/graphics/atlas-parser.test.js +100 -0
  20. package/dist/src/graphics/atlas-parser.test.js.map +1 -0
  21. package/dist/src/graphics/cam.test.d.ts +2 -0
  22. package/dist/src/graphics/cam.test.d.ts.map +1 -0
  23. package/dist/src/graphics/cam.test.js +456 -0
  24. package/dist/src/graphics/cam.test.js.map +1 -0
  25. package/dist/src/graphics/layer.test.d.ts +2 -0
  26. package/dist/src/graphics/layer.test.d.ts.map +1 -0
  27. package/dist/src/graphics/layer.test.js +23 -0
  28. package/dist/src/graphics/layer.test.js.map +1 -0
  29. package/dist/src/graphics/renderer.test.d.ts +2 -0
  30. package/dist/src/graphics/renderer.test.d.ts.map +1 -0
  31. package/dist/src/graphics/renderer.test.js +92 -0
  32. package/dist/src/graphics/renderer.test.js.map +1 -0
  33. package/dist/src/graphics/sprite.test.d.ts +2 -0
  34. package/dist/src/graphics/sprite.test.d.ts.map +1 -0
  35. package/dist/src/graphics/sprite.test.js +582 -0
  36. package/dist/src/graphics/sprite.test.js.map +1 -0
  37. package/dist/src/index.d.ts.map +1 -1
  38. package/dist/src/index.js +0 -1
  39. package/dist/src/index.js.map +1 -1
  40. package/dist/src/input/context-menu.test.d.ts +2 -0
  41. package/dist/src/input/context-menu.test.d.ts.map +1 -0
  42. package/dist/src/input/context-menu.test.js +111 -0
  43. package/dist/src/input/context-menu.test.js.map +1 -0
  44. package/dist/src/input/gamepad.test.d.ts +2 -0
  45. package/dist/src/input/gamepad.test.d.ts.map +1 -0
  46. package/dist/src/input/gamepad.test.js +172 -0
  47. package/dist/src/input/gamepad.test.js.map +1 -0
  48. package/dist/src/input/input.test.d.ts +2 -0
  49. package/dist/src/input/input.test.d.ts.map +1 -0
  50. package/dist/src/input/input.test.js +1146 -0
  51. package/dist/src/input/input.test.js.map +1 -0
  52. package/dist/src/input/keyboard.test.d.ts +2 -0
  53. package/dist/src/input/keyboard.test.d.ts.map +1 -0
  54. package/dist/src/input/keyboard.test.js +159 -0
  55. package/dist/src/input/keyboard.test.js.map +1 -0
  56. package/dist/src/input/pointer.test.d.ts +2 -0
  57. package/dist/src/input/pointer.test.d.ts.map +1 -0
  58. package/dist/src/input/pointer.test.js +339 -0
  59. package/dist/src/input/pointer.test.js.map +1 -0
  60. package/dist/src/input/wheel.test.d.ts +2 -0
  61. package/dist/src/input/wheel.test.d.ts.map +1 -0
  62. package/dist/src/input/wheel.test.js +92 -0
  63. package/dist/src/input/wheel.test.js.map +1 -0
  64. package/dist/src/level/level-parser.test.d.ts +20 -0
  65. package/dist/src/level/level-parser.test.d.ts.map +1 -0
  66. package/dist/src/level/level-parser.test.js +340 -0
  67. package/dist/src/level/level-parser.test.js.map +1 -0
  68. package/dist/src/looper.test.d.ts +2 -0
  69. package/dist/src/looper.test.d.ts.map +1 -0
  70. package/dist/src/looper.test.js +128 -0
  71. package/dist/src/looper.test.js.map +1 -0
  72. package/dist/src/mem/pool.test.d.ts +2 -0
  73. package/dist/src/mem/pool.test.d.ts.map +1 -0
  74. package/dist/src/mem/pool.test.js +120 -0
  75. package/dist/src/mem/pool.test.js.map +1 -0
  76. package/dist/src/random/random.test.d.ts +2 -0
  77. package/dist/src/random/random.test.d.ts.map +1 -0
  78. package/dist/src/random/random.test.js +36 -0
  79. package/dist/src/random/random.test.js.map +1 -0
  80. package/dist/src/storage/local-storage.test.d.ts +2 -0
  81. package/dist/src/storage/local-storage.test.d.ts.map +1 -0
  82. package/dist/src/storage/local-storage.test.js +105 -0
  83. package/dist/src/storage/local-storage.test.js.map +1 -0
  84. package/dist/src/test/assert.d.ts +5 -0
  85. package/dist/src/test/assert.d.ts.map +1 -0
  86. package/dist/src/test/assert.js +6 -0
  87. package/dist/src/test/assert.js.map +1 -0
  88. package/dist/src/test/device-pixel-ratio-mock.d.ts +6 -0
  89. package/dist/src/test/device-pixel-ratio-mock.d.ts.map +1 -0
  90. package/dist/src/test/device-pixel-ratio-mock.js +10 -0
  91. package/dist/src/test/device-pixel-ratio-mock.js.map +1 -0
  92. package/dist/src/test/index.d.ts +5 -0
  93. package/dist/src/test/index.d.ts.map +1 -0
  94. package/dist/src/test/index.js +5 -0
  95. package/dist/src/test/index.js.map +1 -0
  96. package/dist/src/test/navigator-gamepads-mock.d.ts +7 -0
  97. package/dist/src/test/navigator-gamepads-mock.d.ts.map +1 -0
  98. package/dist/src/test/navigator-gamepads-mock.js +14 -0
  99. package/dist/src/test/navigator-gamepads-mock.js.map +1 -0
  100. package/dist/src/test/secure-context-mock.d.ts +6 -0
  101. package/dist/src/test/secure-context-mock.d.ts.map +1 -0
  102. package/dist/src/test/secure-context-mock.js +10 -0
  103. package/dist/src/test/secure-context-mock.js.map +1 -0
  104. package/dist/src/test/test-element.d.ts +2 -0
  105. package/dist/src/test/test-element.d.ts.map +1 -0
  106. package/dist/src/test/test-element.js +8 -0
  107. package/dist/src/test/test-element.js.map +1 -0
  108. package/dist/src/test/test-event.d.ts +17 -0
  109. package/dist/src/test/test-event.d.ts.map +1 -0
  110. package/dist/src/test/test-event.js +26 -0
  111. package/dist/src/test/test-event.js.map +1 -0
  112. package/dist/src/test/tsconfig.json +30 -0
  113. package/dist/src/text/text-layout.test.d.ts +2 -0
  114. package/dist/src/text/text-layout.test.d.ts.map +1 -0
  115. package/dist/src/text/text-layout.test.js +717 -0
  116. package/dist/src/text/text-layout.test.js.map +1 -0
  117. package/dist/src/tsconfig.json +3 -3
  118. package/dist/src/types/geo.test.d.ts +2 -0
  119. package/dist/src/types/geo.test.d.ts.map +1 -0
  120. package/dist/src/types/geo.test.js +657 -0
  121. package/dist/src/types/geo.test.js.map +1 -0
  122. package/dist/src/types/time.test.d.ts +2 -0
  123. package/dist/src/types/time.test.d.ts.map +1 -0
  124. package/dist/src/types/time.test.js +27 -0
  125. package/dist/src/types/time.test.js.map +1 -0
  126. package/dist/src/utils/async-util.test.d.ts +2 -0
  127. package/dist/src/utils/async-util.test.d.ts.map +1 -0
  128. package/dist/src/utils/async-util.test.js +55 -0
  129. package/dist/src/utils/async-util.test.js.map +1 -0
  130. package/dist/src/utils/color-util.test.d.ts +2 -0
  131. package/dist/src/utils/color-util.test.d.ts.map +1 -0
  132. package/dist/src/utils/color-util.test.js +20 -0
  133. package/dist/src/utils/color-util.test.js.map +1 -0
  134. package/dist/src/utils/debug.test.d.ts +2 -0
  135. package/dist/src/utils/debug.test.d.ts.map +1 -0
  136. package/dist/src/utils/debug.test.js +61 -0
  137. package/dist/src/utils/debug.test.js.map +1 -0
  138. package/dist/src/utils/delay-interval.test.d.ts +2 -0
  139. package/dist/src/utils/delay-interval.test.d.ts.map +1 -0
  140. package/dist/src/utils/delay-interval.test.js +91 -0
  141. package/dist/src/utils/delay-interval.test.js.map +1 -0
  142. package/dist/src/utils/math.test.d.ts +2 -0
  143. package/dist/src/utils/math.test.d.ts.map +1 -0
  144. package/dist/src/utils/math.test.js +10 -0
  145. package/dist/src/utils/math.test.js.map +1 -0
  146. package/dist/src/utils/str-util.test.d.ts +2 -0
  147. package/dist/src/utils/str-util.test.d.ts.map +1 -0
  148. package/dist/src/utils/str-util.test.js +13 -0
  149. package/dist/src/utils/str-util.test.js.map +1 -0
  150. package/dist/tools/atlas-pack/atlas-json-parser.test.d.ts +2 -0
  151. package/dist/tools/atlas-pack/atlas-json-parser.test.d.ts.map +1 -0
  152. package/dist/tools/atlas-pack/atlas-json-parser.test.js +2109 -0
  153. package/dist/tools/atlas-pack/atlas-json-parser.test.js.map +1 -0
  154. package/dist/tools/atlas-pack/atlas.test.aseprite.json +4499 -0
  155. package/dist/tools/bundle/bundle.js +1 -1
  156. package/dist/tools/types/config-file.test.d.ts +2 -0
  157. package/dist/tools/types/config-file.test.d.ts.map +1 -0
  158. package/dist/tools/types/config-file.test.js +68 -0
  159. package/dist/tools/types/config-file.test.js.map +1 -0
  160. package/dist/tools/types/config.test.d.ts +2 -0
  161. package/dist/tools/types/config.test.d.ts.map +1 -0
  162. package/dist/tools/types/config.test.js +125 -0
  163. package/dist/tools/types/config.test.js.map +1 -0
  164. package/dist/tools/utils/argv.test.d.ts +9 -0
  165. package/dist/tools/utils/argv.test.d.ts.map +1 -0
  166. package/dist/tools/utils/argv.test.js +42 -0
  167. package/dist/tools/utils/argv.test.js.map +1 -0
  168. package/package.json +7 -3
@@ -0,0 +1,2109 @@
1
+ import { describe, test } from 'node:test';
2
+ import { assert } from "../../src/test/assert.js";
3
+ import * as ase from "./aseprite.js";
4
+ import atlas from './atlas.test.aseprite.json' with { type: 'json' };
5
+ import { parseAnim, parseAnimFrames, parseAtlasJSON, parseCel, parseHitboxes } from "./atlas-json-parser.js";
6
+ describe('parseAtlasJSON()', () => {
7
+ test('parses file.', () => {
8
+ // to-do: *.aseprite.json isn't working but *.aseprite.json2 does.
9
+ assert(parseAtlasJSON(atlas), {
10
+ anim: {
11
+ 'background--OrangeCheckerboard': {
12
+ cels: 1,
13
+ h: 2,
14
+ id: 0,
15
+ w: 2,
16
+ hitbox: undefined,
17
+ hurtbox: undefined
18
+ },
19
+ 'background--GreyCheckerboard': {
20
+ cels: 1,
21
+ h: 2,
22
+ id: 1,
23
+ w: 2,
24
+ hitbox: undefined,
25
+ hurtbox: undefined
26
+ },
27
+ 'background--Kiwi': {
28
+ cels: 1,
29
+ h: 2,
30
+ id: 2,
31
+ w: 2,
32
+ hitbox: undefined,
33
+ hurtbox: undefined
34
+ },
35
+ 'background--Strawberry': {
36
+ cels: 1,
37
+ h: 2,
38
+ id: 3,
39
+ w: 2,
40
+ hitbox: undefined,
41
+ hurtbox: undefined
42
+ },
43
+ 'background--Grape': {
44
+ cels: 1,
45
+ h: 2,
46
+ id: 4,
47
+ w: 2,
48
+ hitbox: undefined,
49
+ hurtbox: undefined
50
+ },
51
+ 'background--Blueberry': {
52
+ cels: 1,
53
+ h: 2,
54
+ id: 5,
55
+ w: 2,
56
+ hitbox: undefined,
57
+ hurtbox: undefined
58
+ },
59
+ 'background--Bubblegum': {
60
+ cels: 1,
61
+ h: 2,
62
+ id: 6,
63
+ w: 2,
64
+ hitbox: undefined,
65
+ hurtbox: undefined
66
+ },
67
+ 'background--Transparent': {
68
+ cels: 1,
69
+ h: 2,
70
+ id: 7,
71
+ w: 2,
72
+ hitbox: undefined,
73
+ hurtbox: undefined
74
+ },
75
+ 'background--Black': {
76
+ cels: 1,
77
+ h: 2,
78
+ id: 8,
79
+ w: 2,
80
+ hitbox: undefined,
81
+ hurtbox: undefined
82
+ },
83
+ 'backpacker--WalkRight': {
84
+ cels: 16,
85
+ h: 13,
86
+ hitbox: { x: 2, y: 0, w: 4, h: 4 },
87
+ hurtbox: undefined,
88
+ id: 9,
89
+ w: 8
90
+ },
91
+ 'backpacker--WalkDown': {
92
+ cels: 16,
93
+ h: 13,
94
+ hitbox: { x: 2, y: 0, w: 4, h: 4 },
95
+ hurtbox: undefined,
96
+ id: 10,
97
+ w: 8
98
+ },
99
+ 'backpacker--WalkUp': {
100
+ cels: 16,
101
+ h: 13,
102
+ hitbox: { x: 2, y: 0, w: 4, h: 4 },
103
+ hurtbox: undefined,
104
+ id: 11,
105
+ w: 8
106
+ },
107
+ 'cursor--Pointer': {
108
+ cels: 1,
109
+ h: 14,
110
+ hitbox: { x: 0, y: 0, w: 2, h: 2 },
111
+ hurtbox: { x: 0, y: 0, w: 2, h: 2 },
112
+ id: 12,
113
+ w: 8
114
+ },
115
+ 'mem-prop-5x6--00': {
116
+ cels: 1,
117
+ h: 6,
118
+ id: 13,
119
+ w: 5,
120
+ hitbox: undefined,
121
+ hurtbox: undefined
122
+ },
123
+ 'mem-prop-5x6--01': {
124
+ cels: 1,
125
+ h: 6,
126
+ id: 14,
127
+ w: 5,
128
+ hitbox: undefined,
129
+ hurtbox: undefined
130
+ },
131
+ 'mem-prop-5x6--02': {
132
+ cels: 1,
133
+ h: 6,
134
+ id: 15,
135
+ w: 5,
136
+ hitbox: undefined,
137
+ hurtbox: undefined
138
+ },
139
+ 'mem-prop-5x6--03': {
140
+ cels: 1,
141
+ h: 6,
142
+ id: 16,
143
+ w: 5,
144
+ hitbox: undefined,
145
+ hurtbox: undefined
146
+ },
147
+ 'mem-prop-5x6--04': {
148
+ cels: 1,
149
+ h: 6,
150
+ id: 17,
151
+ w: 5,
152
+ hitbox: undefined,
153
+ hurtbox: undefined
154
+ },
155
+ 'mem-prop-5x6--05': {
156
+ cels: 1,
157
+ h: 6,
158
+ id: 18,
159
+ w: 5,
160
+ hitbox: undefined,
161
+ hurtbox: undefined
162
+ },
163
+ 'mem-prop-5x6--06': {
164
+ cels: 1,
165
+ h: 6,
166
+ id: 19,
167
+ w: 5,
168
+ hitbox: undefined,
169
+ hurtbox: undefined
170
+ },
171
+ 'mem-prop-5x6--07': {
172
+ cels: 1,
173
+ h: 6,
174
+ id: 20,
175
+ w: 5,
176
+ hitbox: undefined,
177
+ hurtbox: undefined
178
+ },
179
+ 'mem-prop-5x6--08': {
180
+ cels: 1,
181
+ h: 6,
182
+ id: 21,
183
+ w: 5,
184
+ hitbox: undefined,
185
+ hurtbox: undefined
186
+ },
187
+ 'mem-prop-5x6--09': {
188
+ cels: 1,
189
+ h: 6,
190
+ id: 22,
191
+ w: 5,
192
+ hitbox: undefined,
193
+ hurtbox: undefined
194
+ },
195
+ 'mem-prop-5x6--0a': {
196
+ cels: 1,
197
+ h: 6,
198
+ id: 23,
199
+ w: 5,
200
+ hitbox: undefined,
201
+ hurtbox: undefined
202
+ },
203
+ 'mem-prop-5x6--0b': {
204
+ cels: 1,
205
+ h: 6,
206
+ id: 24,
207
+ w: 5,
208
+ hitbox: undefined,
209
+ hurtbox: undefined
210
+ },
211
+ 'mem-prop-5x6--0c': {
212
+ cels: 1,
213
+ h: 6,
214
+ id: 25,
215
+ w: 5,
216
+ hitbox: undefined,
217
+ hurtbox: undefined
218
+ },
219
+ 'mem-prop-5x6--0d': {
220
+ cels: 1,
221
+ h: 6,
222
+ id: 26,
223
+ w: 5,
224
+ hitbox: undefined,
225
+ hurtbox: undefined
226
+ },
227
+ 'mem-prop-5x6--0e': {
228
+ cels: 1,
229
+ h: 6,
230
+ id: 27,
231
+ w: 5,
232
+ hitbox: undefined,
233
+ hurtbox: undefined
234
+ },
235
+ 'mem-prop-5x6--0f': {
236
+ cels: 1,
237
+ h: 6,
238
+ id: 28,
239
+ w: 5,
240
+ hitbox: undefined,
241
+ hurtbox: undefined
242
+ },
243
+ 'mem-prop-5x6--10': {
244
+ cels: 1,
245
+ h: 6,
246
+ id: 29,
247
+ w: 5,
248
+ hitbox: undefined,
249
+ hurtbox: undefined
250
+ },
251
+ 'mem-prop-5x6--11': {
252
+ cels: 1,
253
+ h: 6,
254
+ id: 30,
255
+ w: 5,
256
+ hitbox: undefined,
257
+ hurtbox: undefined
258
+ },
259
+ 'mem-prop-5x6--12': {
260
+ cels: 1,
261
+ h: 6,
262
+ id: 31,
263
+ w: 5,
264
+ hitbox: undefined,
265
+ hurtbox: undefined
266
+ },
267
+ 'mem-prop-5x6--13': {
268
+ cels: 1,
269
+ h: 6,
270
+ id: 32,
271
+ w: 5,
272
+ hitbox: undefined,
273
+ hurtbox: undefined
274
+ },
275
+ 'mem-prop-5x6--14': {
276
+ cels: 1,
277
+ h: 6,
278
+ id: 33,
279
+ w: 5,
280
+ hitbox: undefined,
281
+ hurtbox: undefined
282
+ },
283
+ 'mem-prop-5x6--15': {
284
+ cels: 1,
285
+ h: 6,
286
+ id: 34,
287
+ w: 5,
288
+ hitbox: undefined,
289
+ hurtbox: undefined
290
+ },
291
+ 'mem-prop-5x6--16': {
292
+ cels: 1,
293
+ h: 6,
294
+ id: 35,
295
+ w: 5,
296
+ hitbox: undefined,
297
+ hurtbox: undefined
298
+ },
299
+ 'mem-prop-5x6--17': {
300
+ cels: 1,
301
+ h: 6,
302
+ id: 36,
303
+ w: 5,
304
+ hitbox: undefined,
305
+ hurtbox: undefined
306
+ },
307
+ 'mem-prop-5x6--18': {
308
+ cels: 1,
309
+ h: 6,
310
+ id: 37,
311
+ w: 5,
312
+ hitbox: undefined,
313
+ hurtbox: undefined
314
+ },
315
+ 'mem-prop-5x6--19': {
316
+ cels: 1,
317
+ h: 6,
318
+ id: 38,
319
+ w: 5,
320
+ hitbox: undefined,
321
+ hurtbox: undefined
322
+ },
323
+ 'mem-prop-5x6--1a': {
324
+ cels: 1,
325
+ h: 6,
326
+ id: 39,
327
+ w: 5,
328
+ hitbox: undefined,
329
+ hurtbox: undefined
330
+ },
331
+ 'mem-prop-5x6--1b': {
332
+ cels: 1,
333
+ h: 6,
334
+ id: 40,
335
+ w: 5,
336
+ hitbox: undefined,
337
+ hurtbox: undefined
338
+ },
339
+ 'mem-prop-5x6--1c': {
340
+ cels: 1,
341
+ h: 6,
342
+ id: 41,
343
+ w: 5,
344
+ hitbox: undefined,
345
+ hurtbox: undefined
346
+ },
347
+ 'mem-prop-5x6--1d': {
348
+ cels: 1,
349
+ h: 6,
350
+ id: 42,
351
+ w: 5,
352
+ hitbox: undefined,
353
+ hurtbox: undefined
354
+ },
355
+ 'mem-prop-5x6--1e': {
356
+ cels: 1,
357
+ h: 6,
358
+ id: 43,
359
+ w: 5,
360
+ hitbox: undefined,
361
+ hurtbox: undefined
362
+ },
363
+ 'mem-prop-5x6--1f': {
364
+ cels: 1,
365
+ h: 6,
366
+ id: 44,
367
+ w: 5,
368
+ hitbox: undefined,
369
+ hurtbox: undefined
370
+ },
371
+ 'mem-prop-5x6--20': {
372
+ cels: 1,
373
+ h: 6,
374
+ id: 45,
375
+ w: 5,
376
+ hitbox: undefined,
377
+ hurtbox: undefined
378
+ },
379
+ 'mem-prop-5x6--21': {
380
+ cels: 1,
381
+ h: 6,
382
+ id: 46,
383
+ w: 5,
384
+ hitbox: undefined,
385
+ hurtbox: undefined
386
+ },
387
+ 'mem-prop-5x6--22': {
388
+ cels: 1,
389
+ h: 6,
390
+ id: 47,
391
+ w: 5,
392
+ hitbox: undefined,
393
+ hurtbox: undefined
394
+ },
395
+ 'mem-prop-5x6--23': {
396
+ cels: 1,
397
+ h: 6,
398
+ id: 48,
399
+ w: 5,
400
+ hitbox: undefined,
401
+ hurtbox: undefined
402
+ },
403
+ 'mem-prop-5x6--24': {
404
+ cels: 1,
405
+ h: 6,
406
+ id: 49,
407
+ w: 5,
408
+ hitbox: undefined,
409
+ hurtbox: undefined
410
+ },
411
+ 'mem-prop-5x6--25': {
412
+ cels: 1,
413
+ h: 6,
414
+ id: 50,
415
+ w: 5,
416
+ hitbox: undefined,
417
+ hurtbox: undefined
418
+ },
419
+ 'mem-prop-5x6--26': {
420
+ cels: 1,
421
+ h: 6,
422
+ id: 51,
423
+ w: 5,
424
+ hitbox: undefined,
425
+ hurtbox: undefined
426
+ },
427
+ 'mem-prop-5x6--27': {
428
+ cels: 1,
429
+ h: 6,
430
+ id: 52,
431
+ w: 5,
432
+ hitbox: undefined,
433
+ hurtbox: undefined
434
+ },
435
+ 'mem-prop-5x6--28': {
436
+ cels: 1,
437
+ h: 6,
438
+ id: 53,
439
+ w: 5,
440
+ hitbox: undefined,
441
+ hurtbox: undefined
442
+ },
443
+ 'mem-prop-5x6--29': {
444
+ cels: 1,
445
+ h: 6,
446
+ id: 54,
447
+ w: 5,
448
+ hitbox: undefined,
449
+ hurtbox: undefined
450
+ },
451
+ 'mem-prop-5x6--2a': {
452
+ cels: 1,
453
+ h: 6,
454
+ id: 55,
455
+ w: 5,
456
+ hitbox: undefined,
457
+ hurtbox: undefined
458
+ },
459
+ 'mem-prop-5x6--2b': {
460
+ cels: 1,
461
+ h: 6,
462
+ id: 56,
463
+ w: 5,
464
+ hitbox: undefined,
465
+ hurtbox: undefined
466
+ },
467
+ 'mem-prop-5x6--2c': {
468
+ cels: 1,
469
+ h: 6,
470
+ id: 57,
471
+ w: 5,
472
+ hitbox: undefined,
473
+ hurtbox: undefined
474
+ },
475
+ 'mem-prop-5x6--2d': {
476
+ cels: 1,
477
+ h: 6,
478
+ id: 58,
479
+ w: 5,
480
+ hitbox: undefined,
481
+ hurtbox: undefined
482
+ },
483
+ 'mem-prop-5x6--2e': {
484
+ cels: 1,
485
+ h: 6,
486
+ id: 59,
487
+ w: 5,
488
+ hitbox: undefined,
489
+ hurtbox: undefined
490
+ },
491
+ 'mem-prop-5x6--2f': {
492
+ cels: 1,
493
+ h: 6,
494
+ id: 60,
495
+ w: 5,
496
+ hitbox: undefined,
497
+ hurtbox: undefined
498
+ },
499
+ 'mem-prop-5x6--30': {
500
+ cels: 1,
501
+ h: 6,
502
+ id: 61,
503
+ w: 5,
504
+ hitbox: undefined,
505
+ hurtbox: undefined
506
+ },
507
+ 'mem-prop-5x6--31': {
508
+ cels: 1,
509
+ h: 6,
510
+ id: 62,
511
+ w: 5,
512
+ hitbox: undefined,
513
+ hurtbox: undefined
514
+ },
515
+ 'mem-prop-5x6--32': {
516
+ cels: 1,
517
+ h: 6,
518
+ id: 63,
519
+ w: 5,
520
+ hitbox: undefined,
521
+ hurtbox: undefined
522
+ },
523
+ 'mem-prop-5x6--33': {
524
+ cels: 1,
525
+ h: 6,
526
+ id: 64,
527
+ w: 5,
528
+ hitbox: undefined,
529
+ hurtbox: undefined
530
+ },
531
+ 'mem-prop-5x6--34': {
532
+ cels: 1,
533
+ h: 6,
534
+ id: 65,
535
+ w: 5,
536
+ hitbox: undefined,
537
+ hurtbox: undefined
538
+ },
539
+ 'mem-prop-5x6--35': {
540
+ cels: 1,
541
+ h: 6,
542
+ id: 66,
543
+ w: 5,
544
+ hitbox: undefined,
545
+ hurtbox: undefined
546
+ },
547
+ 'mem-prop-5x6--36': {
548
+ cels: 1,
549
+ h: 6,
550
+ id: 67,
551
+ w: 5,
552
+ hitbox: undefined,
553
+ hurtbox: undefined
554
+ },
555
+ 'mem-prop-5x6--37': {
556
+ cels: 1,
557
+ h: 6,
558
+ id: 68,
559
+ w: 5,
560
+ hitbox: undefined,
561
+ hurtbox: undefined
562
+ },
563
+ 'mem-prop-5x6--38': {
564
+ cels: 1,
565
+ h: 6,
566
+ id: 69,
567
+ w: 5,
568
+ hitbox: undefined,
569
+ hurtbox: undefined
570
+ },
571
+ 'mem-prop-5x6--39': {
572
+ cels: 1,
573
+ h: 6,
574
+ id: 70,
575
+ w: 5,
576
+ hitbox: undefined,
577
+ hurtbox: undefined
578
+ },
579
+ 'mem-prop-5x6--3a': {
580
+ cels: 1,
581
+ h: 6,
582
+ id: 71,
583
+ w: 5,
584
+ hitbox: undefined,
585
+ hurtbox: undefined
586
+ },
587
+ 'mem-prop-5x6--3b': {
588
+ cels: 1,
589
+ h: 6,
590
+ id: 72,
591
+ w: 5,
592
+ hitbox: undefined,
593
+ hurtbox: undefined
594
+ },
595
+ 'mem-prop-5x6--3c': {
596
+ cels: 1,
597
+ h: 6,
598
+ id: 73,
599
+ w: 5,
600
+ hitbox: undefined,
601
+ hurtbox: undefined
602
+ },
603
+ 'mem-prop-5x6--3d': {
604
+ cels: 1,
605
+ h: 6,
606
+ id: 74,
607
+ w: 5,
608
+ hitbox: undefined,
609
+ hurtbox: undefined
610
+ },
611
+ 'mem-prop-5x6--3e': {
612
+ cels: 1,
613
+ h: 6,
614
+ id: 75,
615
+ w: 5,
616
+ hitbox: undefined,
617
+ hurtbox: undefined
618
+ },
619
+ 'mem-prop-5x6--3f': {
620
+ cels: 1,
621
+ h: 6,
622
+ id: 76,
623
+ w: 5,
624
+ hitbox: undefined,
625
+ hurtbox: undefined
626
+ },
627
+ 'mem-prop-5x6--40': {
628
+ cels: 1,
629
+ h: 6,
630
+ id: 77,
631
+ w: 5,
632
+ hitbox: undefined,
633
+ hurtbox: undefined
634
+ },
635
+ 'mem-prop-5x6--41': {
636
+ cels: 1,
637
+ h: 6,
638
+ id: 78,
639
+ w: 5,
640
+ hitbox: undefined,
641
+ hurtbox: undefined
642
+ },
643
+ 'mem-prop-5x6--42': {
644
+ cels: 1,
645
+ h: 6,
646
+ id: 79,
647
+ w: 5,
648
+ hitbox: undefined,
649
+ hurtbox: undefined
650
+ },
651
+ 'mem-prop-5x6--43': {
652
+ cels: 1,
653
+ h: 6,
654
+ id: 80,
655
+ w: 5,
656
+ hitbox: undefined,
657
+ hurtbox: undefined
658
+ },
659
+ 'mem-prop-5x6--44': {
660
+ cels: 1,
661
+ h: 6,
662
+ id: 81,
663
+ w: 5,
664
+ hitbox: undefined,
665
+ hurtbox: undefined
666
+ },
667
+ 'mem-prop-5x6--45': {
668
+ cels: 1,
669
+ h: 6,
670
+ id: 82,
671
+ w: 5,
672
+ hitbox: undefined,
673
+ hurtbox: undefined
674
+ },
675
+ 'mem-prop-5x6--46': {
676
+ cels: 1,
677
+ h: 6,
678
+ id: 83,
679
+ w: 5,
680
+ hitbox: undefined,
681
+ hurtbox: undefined
682
+ },
683
+ 'mem-prop-5x6--47': {
684
+ cels: 1,
685
+ h: 6,
686
+ id: 84,
687
+ w: 5,
688
+ hitbox: undefined,
689
+ hurtbox: undefined
690
+ },
691
+ 'mem-prop-5x6--48': {
692
+ cels: 1,
693
+ h: 6,
694
+ id: 85,
695
+ w: 5,
696
+ hitbox: undefined,
697
+ hurtbox: undefined
698
+ },
699
+ 'mem-prop-5x6--49': {
700
+ cels: 1,
701
+ h: 6,
702
+ id: 86,
703
+ w: 5,
704
+ hitbox: undefined,
705
+ hurtbox: undefined
706
+ },
707
+ 'mem-prop-5x6--4a': {
708
+ cels: 1,
709
+ h: 6,
710
+ id: 87,
711
+ w: 5,
712
+ hitbox: undefined,
713
+ hurtbox: undefined
714
+ },
715
+ 'mem-prop-5x6--4b': {
716
+ cels: 1,
717
+ h: 6,
718
+ id: 88,
719
+ w: 5,
720
+ hitbox: undefined,
721
+ hurtbox: undefined
722
+ },
723
+ 'mem-prop-5x6--4c': {
724
+ cels: 1,
725
+ h: 6,
726
+ id: 89,
727
+ w: 5,
728
+ hitbox: undefined,
729
+ hurtbox: undefined
730
+ },
731
+ 'mem-prop-5x6--4d': {
732
+ cels: 1,
733
+ h: 6,
734
+ id: 90,
735
+ w: 5,
736
+ hitbox: undefined,
737
+ hurtbox: undefined
738
+ },
739
+ 'mem-prop-5x6--4e': {
740
+ cels: 1,
741
+ h: 6,
742
+ id: 91,
743
+ w: 5,
744
+ hitbox: undefined,
745
+ hurtbox: undefined
746
+ },
747
+ 'mem-prop-5x6--4f': {
748
+ cels: 1,
749
+ h: 6,
750
+ id: 92,
751
+ w: 5,
752
+ hitbox: undefined,
753
+ hurtbox: undefined
754
+ },
755
+ 'mem-prop-5x6--50': {
756
+ cels: 1,
757
+ h: 6,
758
+ id: 93,
759
+ w: 5,
760
+ hitbox: undefined,
761
+ hurtbox: undefined
762
+ },
763
+ 'mem-prop-5x6--51': {
764
+ cels: 1,
765
+ h: 6,
766
+ id: 94,
767
+ w: 5,
768
+ hitbox: undefined,
769
+ hurtbox: undefined
770
+ },
771
+ 'mem-prop-5x6--52': {
772
+ cels: 1,
773
+ h: 6,
774
+ id: 95,
775
+ w: 5,
776
+ hitbox: undefined,
777
+ hurtbox: undefined
778
+ },
779
+ 'mem-prop-5x6--53': {
780
+ cels: 1,
781
+ h: 6,
782
+ id: 96,
783
+ w: 5,
784
+ hitbox: undefined,
785
+ hurtbox: undefined
786
+ },
787
+ 'mem-prop-5x6--54': {
788
+ cels: 1,
789
+ h: 6,
790
+ id: 97,
791
+ w: 5,
792
+ hitbox: undefined,
793
+ hurtbox: undefined
794
+ },
795
+ 'mem-prop-5x6--55': {
796
+ cels: 1,
797
+ h: 6,
798
+ id: 98,
799
+ w: 5,
800
+ hitbox: undefined,
801
+ hurtbox: undefined
802
+ },
803
+ 'mem-prop-5x6--56': {
804
+ cels: 1,
805
+ h: 6,
806
+ id: 99,
807
+ w: 5,
808
+ hitbox: undefined,
809
+ hurtbox: undefined
810
+ },
811
+ 'mem-prop-5x6--57': {
812
+ cels: 1,
813
+ h: 6,
814
+ id: 100,
815
+ w: 5,
816
+ hitbox: undefined,
817
+ hurtbox: undefined
818
+ },
819
+ 'mem-prop-5x6--58': {
820
+ cels: 1,
821
+ h: 6,
822
+ id: 101,
823
+ w: 5,
824
+ hitbox: undefined,
825
+ hurtbox: undefined
826
+ },
827
+ 'mem-prop-5x6--59': {
828
+ cels: 1,
829
+ h: 6,
830
+ id: 102,
831
+ w: 5,
832
+ hitbox: undefined,
833
+ hurtbox: undefined
834
+ },
835
+ 'mem-prop-5x6--5a': {
836
+ cels: 1,
837
+ h: 6,
838
+ id: 103,
839
+ w: 5,
840
+ hitbox: undefined,
841
+ hurtbox: undefined
842
+ },
843
+ 'mem-prop-5x6--5b': {
844
+ cels: 1,
845
+ h: 6,
846
+ id: 104,
847
+ w: 5,
848
+ hitbox: undefined,
849
+ hurtbox: undefined
850
+ },
851
+ 'mem-prop-5x6--5c': {
852
+ cels: 1,
853
+ h: 6,
854
+ id: 105,
855
+ w: 5,
856
+ hitbox: undefined,
857
+ hurtbox: undefined
858
+ },
859
+ 'mem-prop-5x6--5d': {
860
+ cels: 1,
861
+ h: 6,
862
+ id: 106,
863
+ w: 5,
864
+ hitbox: undefined,
865
+ hurtbox: undefined
866
+ },
867
+ 'mem-prop-5x6--5e': {
868
+ cels: 1,
869
+ h: 6,
870
+ id: 107,
871
+ w: 5,
872
+ hitbox: undefined,
873
+ hurtbox: undefined
874
+ },
875
+ 'mem-prop-5x6--5f': {
876
+ cels: 1,
877
+ h: 6,
878
+ id: 108,
879
+ w: 5,
880
+ hitbox: undefined,
881
+ hurtbox: undefined
882
+ },
883
+ 'mem-prop-5x6--60': {
884
+ cels: 1,
885
+ h: 6,
886
+ id: 109,
887
+ w: 5,
888
+ hitbox: undefined,
889
+ hurtbox: undefined
890
+ },
891
+ 'mem-prop-5x6--61': {
892
+ cels: 1,
893
+ h: 6,
894
+ id: 110,
895
+ w: 5,
896
+ hitbox: undefined,
897
+ hurtbox: undefined
898
+ },
899
+ 'mem-prop-5x6--62': {
900
+ cels: 1,
901
+ h: 6,
902
+ id: 111,
903
+ w: 5,
904
+ hitbox: undefined,
905
+ hurtbox: undefined
906
+ },
907
+ 'mem-prop-5x6--63': {
908
+ cels: 1,
909
+ h: 6,
910
+ id: 112,
911
+ w: 5,
912
+ hitbox: undefined,
913
+ hurtbox: undefined
914
+ },
915
+ 'mem-prop-5x6--64': {
916
+ cels: 1,
917
+ h: 6,
918
+ id: 113,
919
+ w: 5,
920
+ hitbox: undefined,
921
+ hurtbox: undefined
922
+ },
923
+ 'mem-prop-5x6--65': {
924
+ cels: 1,
925
+ h: 6,
926
+ id: 114,
927
+ w: 5,
928
+ hitbox: undefined,
929
+ hurtbox: undefined
930
+ },
931
+ 'mem-prop-5x6--66': {
932
+ cels: 1,
933
+ h: 6,
934
+ id: 115,
935
+ w: 5,
936
+ hitbox: undefined,
937
+ hurtbox: undefined
938
+ },
939
+ 'mem-prop-5x6--67': {
940
+ cels: 1,
941
+ h: 6,
942
+ id: 116,
943
+ w: 5,
944
+ hitbox: undefined,
945
+ hurtbox: undefined
946
+ },
947
+ 'mem-prop-5x6--68': {
948
+ cels: 1,
949
+ h: 6,
950
+ id: 117,
951
+ w: 5,
952
+ hitbox: undefined,
953
+ hurtbox: undefined
954
+ },
955
+ 'mem-prop-5x6--69': {
956
+ cels: 1,
957
+ h: 6,
958
+ id: 118,
959
+ w: 5,
960
+ hitbox: undefined,
961
+ hurtbox: undefined
962
+ },
963
+ 'mem-prop-5x6--6a': {
964
+ cels: 1,
965
+ h: 6,
966
+ id: 119,
967
+ w: 5,
968
+ hitbox: undefined,
969
+ hurtbox: undefined
970
+ },
971
+ 'mem-prop-5x6--6b': {
972
+ cels: 1,
973
+ h: 6,
974
+ id: 120,
975
+ w: 5,
976
+ hitbox: undefined,
977
+ hurtbox: undefined
978
+ },
979
+ 'mem-prop-5x6--6c': {
980
+ cels: 1,
981
+ h: 6,
982
+ id: 121,
983
+ w: 5,
984
+ hitbox: undefined,
985
+ hurtbox: undefined
986
+ },
987
+ 'mem-prop-5x6--6d': {
988
+ cels: 1,
989
+ h: 6,
990
+ id: 122,
991
+ w: 5,
992
+ hitbox: undefined,
993
+ hurtbox: undefined
994
+ },
995
+ 'mem-prop-5x6--6e': {
996
+ cels: 1,
997
+ h: 6,
998
+ id: 123,
999
+ w: 5,
1000
+ hitbox: undefined,
1001
+ hurtbox: undefined
1002
+ },
1003
+ 'mem-prop-5x6--6f': {
1004
+ cels: 1,
1005
+ h: 6,
1006
+ id: 124,
1007
+ w: 5,
1008
+ hitbox: undefined,
1009
+ hurtbox: undefined
1010
+ },
1011
+ 'mem-prop-5x6--70': {
1012
+ cels: 1,
1013
+ h: 6,
1014
+ id: 125,
1015
+ w: 5,
1016
+ hitbox: undefined,
1017
+ hurtbox: undefined
1018
+ },
1019
+ 'mem-prop-5x6--71': {
1020
+ cels: 1,
1021
+ h: 6,
1022
+ id: 126,
1023
+ w: 5,
1024
+ hitbox: undefined,
1025
+ hurtbox: undefined
1026
+ },
1027
+ 'mem-prop-5x6--72': {
1028
+ cels: 1,
1029
+ h: 6,
1030
+ id: 127,
1031
+ w: 5,
1032
+ hitbox: undefined,
1033
+ hurtbox: undefined
1034
+ },
1035
+ 'mem-prop-5x6--73': {
1036
+ cels: 1,
1037
+ h: 6,
1038
+ id: 128,
1039
+ w: 5,
1040
+ hitbox: undefined,
1041
+ hurtbox: undefined
1042
+ },
1043
+ 'mem-prop-5x6--74': {
1044
+ cels: 1,
1045
+ h: 6,
1046
+ id: 129,
1047
+ w: 5,
1048
+ hitbox: undefined,
1049
+ hurtbox: undefined
1050
+ },
1051
+ 'mem-prop-5x6--75': {
1052
+ cels: 1,
1053
+ h: 6,
1054
+ id: 130,
1055
+ w: 5,
1056
+ hitbox: undefined,
1057
+ hurtbox: undefined
1058
+ },
1059
+ 'mem-prop-5x6--76': {
1060
+ cels: 1,
1061
+ h: 6,
1062
+ id: 131,
1063
+ w: 5,
1064
+ hitbox: undefined,
1065
+ hurtbox: undefined
1066
+ },
1067
+ 'mem-prop-5x6--77': {
1068
+ cels: 1,
1069
+ h: 6,
1070
+ id: 132,
1071
+ w: 5,
1072
+ hitbox: undefined,
1073
+ hurtbox: undefined
1074
+ },
1075
+ 'mem-prop-5x6--78': {
1076
+ cels: 1,
1077
+ h: 6,
1078
+ id: 133,
1079
+ w: 5,
1080
+ hitbox: undefined,
1081
+ hurtbox: undefined
1082
+ },
1083
+ 'mem-prop-5x6--79': {
1084
+ cels: 1,
1085
+ h: 6,
1086
+ id: 134,
1087
+ w: 5,
1088
+ hitbox: undefined,
1089
+ hurtbox: undefined
1090
+ },
1091
+ 'mem-prop-5x6--7a': {
1092
+ cels: 1,
1093
+ h: 6,
1094
+ id: 135,
1095
+ w: 5,
1096
+ hitbox: undefined,
1097
+ hurtbox: undefined
1098
+ },
1099
+ 'mem-prop-5x6--7b': {
1100
+ cels: 1,
1101
+ h: 6,
1102
+ id: 136,
1103
+ w: 5,
1104
+ hitbox: undefined,
1105
+ hurtbox: undefined
1106
+ },
1107
+ 'mem-prop-5x6--7c': {
1108
+ cels: 1,
1109
+ h: 6,
1110
+ id: 137,
1111
+ w: 5,
1112
+ hitbox: undefined,
1113
+ hurtbox: undefined
1114
+ },
1115
+ 'mem-prop-5x6--7d': {
1116
+ cels: 1,
1117
+ h: 6,
1118
+ id: 138,
1119
+ w: 5,
1120
+ hitbox: undefined,
1121
+ hurtbox: undefined
1122
+ },
1123
+ 'mem-prop-5x6--7e': {
1124
+ cels: 1,
1125
+ h: 6,
1126
+ id: 139,
1127
+ w: 5,
1128
+ hitbox: undefined,
1129
+ hurtbox: undefined
1130
+ },
1131
+ 'mem-prop-5x6--7f': {
1132
+ cels: 1,
1133
+ h: 6,
1134
+ id: 140,
1135
+ w: 5,
1136
+ hitbox: undefined,
1137
+ hurtbox: undefined
1138
+ },
1139
+ 'oidoid--Default': {
1140
+ cels: 1,
1141
+ h: 16,
1142
+ id: 141,
1143
+ w: 16,
1144
+ hitbox: undefined,
1145
+ hurtbox: undefined
1146
+ }
1147
+ },
1148
+ celXY: [
1149
+ 22, 37, 21, 27, 21, 29, 21, 31, 20, 33, 22, 33, 20, 35, 22, 35, 20, 37,
1150
+ 24, 26, 24, 26, 8, 16, 8, 16, 0, 16, 0, 16, 16, 14, 16, 14, 72, 13, 72,
1151
+ 13, 32, 26, 32, 26, 0, 16, 0, 16, 64, 13, 64, 13, 56, 13, 56, 13, 48,
1152
+ 13, 48, 13, 40, 13, 40, 13, 32, 13, 32, 13, 56, 13, 56, 13, 24, 13, 24,
1153
+ 13, 72, 0, 72, 0, 64, 0, 64, 0, 24, 0, 24, 0, 56, 0, 56, 0, 48, 0, 48,
1154
+ 0, 48, 0, 48, 0, 24, 0, 24, 0, 40, 0, 40, 0, 32, 0, 32, 0, 32, 0, 32, 0,
1155
+ 16, 0, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56,
1156
+ 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56,
1157
+ 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56,
1158
+ 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 40, 56, 10, 53,
1159
+ 5, 53, 0, 53, 35, 51, 30, 51, 25, 51, 20, 51, 15, 51, 35, 45, 70, 50,
1160
+ 65, 50, 60, 50, 55, 50, 50, 50, 45, 50, 40, 50, 10, 47, 5, 47, 0, 47,
1161
+ 70, 62, 50, 56, 65, 62, 60, 62, 55, 62, 50, 62, 45, 62, 40, 62, 10, 59,
1162
+ 5, 59, 0, 59, 35, 57, 70, 32, 30, 57, 25, 57, 20, 57, 15, 57, 75, 56,
1163
+ 70, 56, 65, 56, 60, 56, 75, 50, 55, 56, 10, 35, 75, 32, 15, 33, 0, 35,
1164
+ 5, 35, 40, 38, 45, 38, 65, 32, 60, 32, 55, 32, 50, 32, 45, 32, 40, 26,
1165
+ 50, 26, 55, 26, 60, 26, 65, 26, 70, 26, 75, 26, 16, 27, 0, 29, 5, 29,
1166
+ 10, 29, 40, 32, 45, 26, 10, 41, 30, 45, 25, 45, 20, 45, 15, 45, 75, 44,
1167
+ 70, 44, 65, 44, 60, 44, 55, 44, 50, 44, 45, 44, 40, 44, 50, 38, 5, 41,
1168
+ 0, 41, 35, 39, 30, 39, 25, 39, 20, 39, 15, 39, 75, 38, 70, 38, 65, 38,
1169
+ 60, 38, 55, 38, 45, 56, 0, 0
1170
+ ]
1171
+ });
1172
+ });
1173
+ test('parses empty.', () => {
1174
+ assert(parseAtlasJSON({
1175
+ meta: {
1176
+ app: 'http://www.aseprite.org/',
1177
+ frameTags: [],
1178
+ size: { w: 0, h: 0 },
1179
+ slices: [],
1180
+ version: '1.3.15.4-x64',
1181
+ image: 'atlas.png',
1182
+ format: 'RGBA8888',
1183
+ scale: '1'
1184
+ },
1185
+ frames: {}
1186
+ }), { anim: {}, celXY: [] });
1187
+ });
1188
+ test('parses nonempty.', () => {
1189
+ const frameTags = [
1190
+ {
1191
+ color: '#000000ff',
1192
+ name: 'scenery--Cloud',
1193
+ from: 0,
1194
+ to: 0,
1195
+ direction: 'forward'
1196
+ },
1197
+ {
1198
+ color: '#000000ff',
1199
+ name: 'palette--red',
1200
+ from: 1,
1201
+ to: 1,
1202
+ direction: 'forward'
1203
+ },
1204
+ {
1205
+ color: '#000000ff',
1206
+ name: 'scenery--Conifer',
1207
+ from: 2,
1208
+ to: 2,
1209
+ direction: 'forward'
1210
+ },
1211
+ {
1212
+ color: '#000000ff',
1213
+ name: 'scenery--ConiferShadow',
1214
+ from: 3,
1215
+ to: 3,
1216
+ direction: 'forward'
1217
+ },
1218
+ {
1219
+ color: '#000000ff',
1220
+ name: 'backpacker--WalkRight',
1221
+ from: 0,
1222
+ to: 7,
1223
+ direction: 'pingpong'
1224
+ }
1225
+ ];
1226
+ const frames = {
1227
+ 'scenery--Cloud--0': {
1228
+ frame: { x: 220, y: 18, w: 18, h: 18 },
1229
+ rotated: false,
1230
+ sourceSize: { w: 16, h: 16 },
1231
+ spriteSourceSize: { x: 0, y: 0, w: 16, h: 16 },
1232
+ trimmed: false,
1233
+ duration: 1
1234
+ },
1235
+ 'palette--red--1': {
1236
+ frame: { x: 90, y: 54, w: 18, h: 18 },
1237
+ rotated: false,
1238
+ sourceSize: { w: 16, h: 16 },
1239
+ spriteSourceSize: { x: 0, y: 0, w: 16, h: 16 },
1240
+ trimmed: false,
1241
+ duration: 65535
1242
+ },
1243
+ 'scenery--Conifer--2': {
1244
+ frame: { x: 72, y: 54, w: 18, h: 18 },
1245
+ rotated: false,
1246
+ sourceSize: { w: 16, h: 16 },
1247
+ spriteSourceSize: { x: 0, y: 0, w: 16, h: 16 },
1248
+ trimmed: false,
1249
+ duration: 65535
1250
+ },
1251
+ 'scenery--ConiferShadow--3': {
1252
+ frame: { x: 54, y: 54, w: 18, h: 18 },
1253
+ rotated: false,
1254
+ sourceSize: { w: 16, h: 16 },
1255
+ spriteSourceSize: { x: 0, y: 0, w: 16, h: 16 },
1256
+ trimmed: false,
1257
+ duration: 65535
1258
+ },
1259
+ 'backpacker--WalkRight--0': {
1260
+ frame: { x: 1408, y: 28, w: 8, h: 13 },
1261
+ rotated: false,
1262
+ sourceSize: { w: 8, h: 13 },
1263
+ spriteSourceSize: { x: 0, y: 0, w: 8, h: 13 },
1264
+ trimmed: false,
1265
+ duration: 62
1266
+ },
1267
+ 'backpacker--WalkRight--1': {
1268
+ frame: { x: 1400, y: 28, w: 8, h: 13 },
1269
+ rotated: false,
1270
+ sourceSize: { w: 8, h: 13 },
1271
+ spriteSourceSize: { x: 0, y: 0, w: 8, h: 13 },
1272
+ trimmed: false,
1273
+ duration: 62
1274
+ },
1275
+ 'backpacker--WalkRight--2': {
1276
+ frame: { x: 1392, y: 28, w: 8, h: 13 },
1277
+ rotated: false,
1278
+ sourceSize: { w: 8, h: 13 },
1279
+ spriteSourceSize: { x: 0, y: 0, w: 8, h: 13 },
1280
+ trimmed: false,
1281
+ duration: 62
1282
+ },
1283
+ 'backpacker--WalkRight--3': {
1284
+ frame: { x: 1384, y: 28, w: 8, h: 13 },
1285
+ rotated: false,
1286
+ sourceSize: { w: 8, h: 13 },
1287
+ spriteSourceSize: { x: 0, y: 0, w: 8, h: 13 },
1288
+ trimmed: false,
1289
+ duration: 62
1290
+ },
1291
+ 'backpacker--WalkRight--4': {
1292
+ frame: { x: 1376, y: 28, w: 8, h: 13 },
1293
+ rotated: false,
1294
+ sourceSize: { w: 8, h: 13 },
1295
+ spriteSourceSize: { x: 0, y: 0, w: 8, h: 13 },
1296
+ trimmed: false,
1297
+ duration: 62
1298
+ },
1299
+ 'backpacker--WalkRight--5': {
1300
+ frame: { x: 1416, y: 28, w: 8, h: 13 },
1301
+ rotated: false,
1302
+ sourceSize: { w: 8, h: 13 },
1303
+ spriteSourceSize: { x: 0, y: 0, w: 8, h: 13 },
1304
+ trimmed: false,
1305
+ duration: 62
1306
+ },
1307
+ 'backpacker--WalkRight--6': {
1308
+ frame: { x: 1392, y: 28, w: 8, h: 13 },
1309
+ rotated: false,
1310
+ sourceSize: { w: 8, h: 13 },
1311
+ spriteSourceSize: { x: 0, y: 0, w: 8, h: 13 },
1312
+ trimmed: false,
1313
+ duration: 62
1314
+ },
1315
+ 'backpacker--WalkRight--7': {
1316
+ frame: { x: 1368, y: 28, w: 8, h: 13 },
1317
+ rotated: false,
1318
+ sourceSize: { w: 8, h: 13 },
1319
+ spriteSourceSize: { x: 0, y: 0, w: 8, h: 13 },
1320
+ trimmed: false,
1321
+ duration: 62
1322
+ },
1323
+ 'backpacker--WalkDown--8': {
1324
+ frame: { x: 1360, y: 28, w: 8, h: 13 },
1325
+ rotated: false,
1326
+ sourceSize: { w: 8, h: 13 },
1327
+ spriteSourceSize: { x: 0, y: 0, w: 8, h: 13 },
1328
+ trimmed: false,
1329
+ duration: 62
1330
+ }
1331
+ };
1332
+ const slices = [
1333
+ {
1334
+ name: 'scenery--Cloud',
1335
+ color: '#ff0000ff',
1336
+ keys: [{ frame: 0, bounds: { x: 8, y: 12, w: 2, h: 3 } }]
1337
+ },
1338
+ {
1339
+ name: 'scenery--Cloud',
1340
+ color: '#00ff00ff',
1341
+ keys: [{ frame: 0, bounds: { x: 1, y: 2, w: 3, h: 4 } }]
1342
+ },
1343
+ {
1344
+ name: 'palette--red',
1345
+ color: '#ff0000ff',
1346
+ keys: [{ frame: 0, bounds: { x: 7, y: 11, w: 3, h: 4 } }]
1347
+ },
1348
+ {
1349
+ name: 'scenery--Conifer',
1350
+ color: '#ff0000ff',
1351
+ keys: [{ frame: 0, bounds: { x: 7, y: 10, w: 3, h: 5 } }]
1352
+ },
1353
+ {
1354
+ name: 'scenery--ConiferShadow',
1355
+ color: '#ff0000ff',
1356
+ keys: [{ frame: 0, bounds: { x: 7, y: 9, w: 3, h: 6 } }]
1357
+ },
1358
+ {
1359
+ name: 'backpacker--WalkRight',
1360
+ color: '#ff0000ff',
1361
+ keys: [{ frame: 0, bounds: { x: 2, y: 0, w: 4, h: 4 } }]
1362
+ }
1363
+ ];
1364
+ assert(parseAtlasJSON({
1365
+ meta: {
1366
+ app: 'http://www.aseprite.org/',
1367
+ frameTags,
1368
+ size: { w: 0, h: 0 },
1369
+ slices,
1370
+ version: '1.3.15.4-x64',
1371
+ image: 'atlas.png',
1372
+ format: 'RGBA8888',
1373
+ scale: '1'
1374
+ },
1375
+ frames
1376
+ }), {
1377
+ anim: {
1378
+ 'scenery--Cloud': {
1379
+ cels: 1,
1380
+ id: 0,
1381
+ w: 16,
1382
+ h: 16,
1383
+ hitbox: { x: 8, y: 12, w: 2, h: 3 },
1384
+ hurtbox: { x: 1, y: 2, w: 3, h: 4 }
1385
+ },
1386
+ 'palette--red': {
1387
+ cels: 1,
1388
+ id: 1,
1389
+ w: 16,
1390
+ h: 16,
1391
+ hitbox: { x: 7, y: 11, w: 3, h: 4 },
1392
+ hurtbox: undefined
1393
+ },
1394
+ 'scenery--Conifer': {
1395
+ cels: 1,
1396
+ id: 2,
1397
+ w: 16,
1398
+ h: 16,
1399
+ hitbox: { x: 7, y: 10, w: 3, h: 5 },
1400
+ hurtbox: undefined
1401
+ },
1402
+ 'scenery--ConiferShadow': {
1403
+ cels: 1,
1404
+ id: 3,
1405
+ w: 16,
1406
+ h: 16,
1407
+ hitbox: { x: 7, y: 9, w: 3, h: 6 },
1408
+ hurtbox: undefined
1409
+ },
1410
+ 'backpacker--WalkRight': {
1411
+ cels: 14,
1412
+ id: 4,
1413
+ w: 8,
1414
+ h: 13,
1415
+ hitbox: { x: 2, y: 0, w: 4, h: 4 },
1416
+ hurtbox: undefined
1417
+ }
1418
+ },
1419
+ celXY: [
1420
+ 221, 19, 91, 55, 73, 55, 55, 55, 1408, 28, 1400, 28, 1392, 28, 1384,
1421
+ 28, 1376, 28, 1416, 28, 1392, 28, 1368, 28, 1392, 28, 1416, 28, 1376,
1422
+ 28, 1384, 28, 1392, 28, 1400, 28
1423
+ ]
1424
+ });
1425
+ });
1426
+ test('throws Error on duplicate FrameTag.', () => {
1427
+ const frameTags = [
1428
+ {
1429
+ color: '#000000ff',
1430
+ name: 'scenery--Cloud',
1431
+ from: 0,
1432
+ to: 0,
1433
+ direction: 'forward'
1434
+ },
1435
+ {
1436
+ color: '#000000ff',
1437
+ name: 'palette--red',
1438
+ from: 1,
1439
+ to: 1,
1440
+ direction: 'forward'
1441
+ },
1442
+ {
1443
+ color: '#000000ff',
1444
+ name: 'scenery--Cloud',
1445
+ from: 0,
1446
+ to: 0,
1447
+ direction: 'forward'
1448
+ }
1449
+ ];
1450
+ const frames = {
1451
+ 'scenery--Cloud--0': {
1452
+ frame: { x: 220, y: 18, w: 18, h: 18 },
1453
+ rotated: false,
1454
+ sourceSize: { w: 16, h: 16 },
1455
+ spriteSourceSize: { x: 0, y: 0, w: 16, h: 16 },
1456
+ trimmed: false,
1457
+ duration: 1
1458
+ },
1459
+ 'palette--red--1': {
1460
+ frame: { x: 90, y: 54, w: 18, h: 18 },
1461
+ rotated: false,
1462
+ sourceSize: { w: 16, h: 16 },
1463
+ spriteSourceSize: { x: 0, y: 0, w: 16, h: 16 },
1464
+ trimmed: false,
1465
+ duration: 65535
1466
+ }
1467
+ };
1468
+ assert.throws(() => parseAtlasJSON({
1469
+ meta: {
1470
+ app: 'http://www.aseprite.org/',
1471
+ frameTags,
1472
+ size: { w: 0, h: 0 },
1473
+ slices: [],
1474
+ version: '1.3.15.4-x64',
1475
+ image: 'atlas.png',
1476
+ format: 'RGBA8888',
1477
+ scale: '1'
1478
+ },
1479
+ frames
1480
+ }), /atlas tag "scenery--Cloud" duplicate/);
1481
+ });
1482
+ });
1483
+ describe('parseAnim()', () => {
1484
+ test('parses FrameTag, Frame from Frame[], and Slice.', () => {
1485
+ const frameTag = {
1486
+ color: '#000000ff',
1487
+ direction: 'pingpong',
1488
+ name: 'cloud--s',
1489
+ from: 1,
1490
+ to: 1
1491
+ };
1492
+ const frames = {
1493
+ 'cloud--xs--0': {
1494
+ frame: { x: 202, y: 36, w: 18, h: 18 },
1495
+ rotated: false,
1496
+ trimmed: false,
1497
+ spriteSourceSize: { x: 0, y: 0, w: 16, h: 16 },
1498
+ sourceSize: { w: 16, h: 16 },
1499
+ duration: 65535
1500
+ },
1501
+ 'cloud--s--1': {
1502
+ frame: { x: 184, y: 36, w: 18, h: 18 },
1503
+ rotated: false,
1504
+ trimmed: false,
1505
+ spriteSourceSize: { x: 0, y: 0, w: 16, h: 16 },
1506
+ sourceSize: { w: 16, h: 16 },
1507
+ duration: 65535
1508
+ },
1509
+ 'cloud--m--2': {
1510
+ frame: { x: 166, y: 36, w: 18, h: 18 },
1511
+ rotated: false,
1512
+ trimmed: false,
1513
+ spriteSourceSize: { x: 0, y: 0, w: 16, h: 16 },
1514
+ sourceSize: { w: 16, h: 16 },
1515
+ duration: 65535
1516
+ }
1517
+ };
1518
+ const slices = [
1519
+ {
1520
+ name: 'cloud--xs',
1521
+ color: '#ff0000ff',
1522
+ keys: [{ frame: 0, bounds: { x: 4, y: 12, w: 7, h: 3 } }]
1523
+ },
1524
+ {
1525
+ name: 'cloud--s',
1526
+ color: '#ff0000ff',
1527
+ keys: [{ frame: 0, bounds: { x: 4, y: 11, w: 9, h: 4 } }]
1528
+ },
1529
+ {
1530
+ name: 'cloud--m',
1531
+ color: '#ff0000ff',
1532
+ keys: [{ frame: 0, bounds: { x: 3, y: 11, w: 10, h: 4 } }]
1533
+ }
1534
+ ];
1535
+ assert(parseAnim(16, frameTag, frames, slices), {
1536
+ cels: 1,
1537
+ id: 16,
1538
+ w: 16,
1539
+ h: 16,
1540
+ hitbox: { x: 4, y: 11, w: 9, h: 4 },
1541
+ hurtbox: undefined
1542
+ });
1543
+ });
1544
+ test('throws error when no frame is associated with tag.', () => {
1545
+ const frameTag = {
1546
+ color: '#000000ff',
1547
+ direction: 'pingpong',
1548
+ name: 'frog--walk',
1549
+ from: 0,
1550
+ to: 0
1551
+ };
1552
+ assert.throws(() => parseAnim(16, frameTag, {}, []), /no atlas frame "frog--walk--0"/);
1553
+ });
1554
+ });
1555
+ describe('parseAnimFrames()', () => {
1556
+ test('single cell', () => {
1557
+ for (const direction of Object.values(ase.Direction)) {
1558
+ const span = {
1559
+ color: '#000000ff',
1560
+ direction,
1561
+ name: 'stem--foo',
1562
+ from: 0,
1563
+ to: 0
1564
+ };
1565
+ const map = {
1566
+ 'stem--foo--0': {
1567
+ duration: 1,
1568
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1569
+ rotated: false,
1570
+ trimmed: false,
1571
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1572
+ sourceSize: { w: 0, h: 0 }
1573
+ }
1574
+ };
1575
+ assertAnimFrames(span, map, [0], direction);
1576
+ }
1577
+ });
1578
+ test('full anim', () => {
1579
+ const expected = {
1580
+ forward: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
1581
+ pingpong: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
1582
+ pingpong_reverse: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
1583
+ reverse: [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
1584
+ };
1585
+ for (const direction of Object.values(ase.Direction)) {
1586
+ const span = {
1587
+ color: '#000000ff',
1588
+ direction,
1589
+ name: 'stem--foo',
1590
+ from: 0,
1591
+ to: 15
1592
+ };
1593
+ const map = {
1594
+ 'stem--foo--0': {
1595
+ duration: 1,
1596
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1597
+ rotated: false,
1598
+ trimmed: false,
1599
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1600
+ sourceSize: { w: 0, h: 0 }
1601
+ },
1602
+ 'stem--foo--1': {
1603
+ duration: 1,
1604
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1605
+ rotated: false,
1606
+ trimmed: false,
1607
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1608
+ sourceSize: { w: 0, h: 0 }
1609
+ },
1610
+ 'stem--foo--2': {
1611
+ duration: 1,
1612
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1613
+ rotated: false,
1614
+ trimmed: false,
1615
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1616
+ sourceSize: { w: 0, h: 0 }
1617
+ },
1618
+ 'stem--foo--3': {
1619
+ duration: 1,
1620
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1621
+ rotated: false,
1622
+ trimmed: false,
1623
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1624
+ sourceSize: { w: 0, h: 0 }
1625
+ },
1626
+ 'stem--foo--4': {
1627
+ duration: 1,
1628
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1629
+ rotated: false,
1630
+ trimmed: false,
1631
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1632
+ sourceSize: { w: 0, h: 0 }
1633
+ },
1634
+ 'stem--foo--5': {
1635
+ duration: 1,
1636
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1637
+ rotated: false,
1638
+ trimmed: false,
1639
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1640
+ sourceSize: { w: 0, h: 0 }
1641
+ },
1642
+ 'stem--foo--6': {
1643
+ duration: 1,
1644
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1645
+ rotated: false,
1646
+ trimmed: false,
1647
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1648
+ sourceSize: { w: 0, h: 0 }
1649
+ },
1650
+ 'stem--foo--7': {
1651
+ duration: 1,
1652
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1653
+ rotated: false,
1654
+ trimmed: false,
1655
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1656
+ sourceSize: { w: 0, h: 0 }
1657
+ },
1658
+ 'stem--foo--8': {
1659
+ duration: 1,
1660
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1661
+ rotated: false,
1662
+ trimmed: false,
1663
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1664
+ sourceSize: { w: 0, h: 0 }
1665
+ },
1666
+ 'stem--foo--9': {
1667
+ duration: 1,
1668
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1669
+ rotated: false,
1670
+ trimmed: false,
1671
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1672
+ sourceSize: { w: 0, h: 0 }
1673
+ },
1674
+ 'stem--foo--10': {
1675
+ duration: 1,
1676
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1677
+ rotated: false,
1678
+ trimmed: false,
1679
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1680
+ sourceSize: { w: 0, h: 0 }
1681
+ },
1682
+ 'stem--foo--11': {
1683
+ duration: 1,
1684
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1685
+ rotated: false,
1686
+ trimmed: false,
1687
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1688
+ sourceSize: { w: 0, h: 0 }
1689
+ },
1690
+ 'stem--foo--12': {
1691
+ duration: 1,
1692
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1693
+ rotated: false,
1694
+ trimmed: false,
1695
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1696
+ sourceSize: { w: 0, h: 0 }
1697
+ },
1698
+ 'stem--foo--13': {
1699
+ duration: 1,
1700
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1701
+ rotated: false,
1702
+ trimmed: false,
1703
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1704
+ sourceSize: { w: 0, h: 0 }
1705
+ },
1706
+ 'stem--foo--14': {
1707
+ duration: 1,
1708
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1709
+ rotated: false,
1710
+ trimmed: false,
1711
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1712
+ sourceSize: { w: 0, h: 0 }
1713
+ },
1714
+ 'stem--foo--15': {
1715
+ duration: 1,
1716
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1717
+ rotated: false,
1718
+ trimmed: false,
1719
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1720
+ sourceSize: { w: 0, h: 0 }
1721
+ }
1722
+ };
1723
+ assertAnimFrames(span, map, expected[direction], direction);
1724
+ }
1725
+ });
1726
+ test('short anim', () => {
1727
+ const expected = {
1728
+ forward: [0, 1, 2],
1729
+ pingpong: [0, 1, 2, 1],
1730
+ pingpong_reverse: [2, 1, 0, 1],
1731
+ reverse: [2, 1, 0]
1732
+ };
1733
+ for (const direction of Object.values(ase.Direction)) {
1734
+ const span = {
1735
+ color: '#000000ff',
1736
+ direction,
1737
+ name: 'stem--foo',
1738
+ from: 0,
1739
+ to: 2
1740
+ };
1741
+ const map = {
1742
+ 'stem--foo--0': {
1743
+ duration: 1,
1744
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1745
+ rotated: false,
1746
+ trimmed: false,
1747
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1748
+ sourceSize: { w: 0, h: 0 }
1749
+ },
1750
+ 'stem--foo--1': {
1751
+ duration: 1,
1752
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1753
+ rotated: false,
1754
+ trimmed: false,
1755
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1756
+ sourceSize: { w: 0, h: 0 }
1757
+ },
1758
+ 'stem--foo--2': {
1759
+ duration: 1,
1760
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1761
+ rotated: false,
1762
+ trimmed: false,
1763
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1764
+ sourceSize: { w: 0, h: 0 }
1765
+ }
1766
+ };
1767
+ assertAnimFrames(span, map, expected[direction], direction);
1768
+ }
1769
+ });
1770
+ test('short anim with another anim', () => {
1771
+ const expected = {
1772
+ forward: [1, 2, 3],
1773
+ pingpong: [1, 2, 3, 2],
1774
+ pingpong_reverse: [3, 2, 1, 2],
1775
+ reverse: [3, 2, 1]
1776
+ };
1777
+ for (const direction of Object.values(ase.Direction)) {
1778
+ const span = {
1779
+ color: '#000000ff',
1780
+ direction,
1781
+ name: 'stem--bar',
1782
+ from: 1,
1783
+ to: 3
1784
+ };
1785
+ const map = {
1786
+ 'stem--foo--0': {
1787
+ duration: 1,
1788
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1789
+ rotated: false,
1790
+ trimmed: false,
1791
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1792
+ sourceSize: { w: 0, h: 0 }
1793
+ },
1794
+ 'stem--bar--1': {
1795
+ duration: 1,
1796
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1797
+ rotated: false,
1798
+ trimmed: false,
1799
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1800
+ sourceSize: { w: 0, h: 0 }
1801
+ },
1802
+ 'stem--bar--2': {
1803
+ duration: 1,
1804
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1805
+ rotated: false,
1806
+ trimmed: false,
1807
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1808
+ sourceSize: { w: 0, h: 0 }
1809
+ },
1810
+ 'stem--bar--3': {
1811
+ duration: 1,
1812
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1813
+ rotated: false,
1814
+ trimmed: false,
1815
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1816
+ sourceSize: { w: 0, h: 0 }
1817
+ }
1818
+ };
1819
+ assertAnimFrames(span, map, expected[direction], direction);
1820
+ }
1821
+ });
1822
+ test('short anim with multi-cel durations', () => {
1823
+ const expected = {
1824
+ forward: [0, 1, 1, 2],
1825
+ pingpong: [0, 1, 1, 2, 1, 1],
1826
+ pingpong_reverse: [2, 1, 1, 0, 1, 1],
1827
+ reverse: [2, 1, 1, 0]
1828
+ };
1829
+ for (const direction of Object.values(ase.Direction)) {
1830
+ const span = {
1831
+ color: '#000000ff',
1832
+ direction,
1833
+ name: 'stem--foo',
1834
+ from: 0,
1835
+ to: 2
1836
+ };
1837
+ const map = {
1838
+ 'stem--foo--0': {
1839
+ duration: 1,
1840
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1841
+ rotated: false,
1842
+ trimmed: false,
1843
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1844
+ sourceSize: { w: 0, h: 0 }
1845
+ },
1846
+ 'stem--foo--1': {
1847
+ duration: 63,
1848
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1849
+ rotated: false,
1850
+ trimmed: false,
1851
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1852
+ sourceSize: { w: 0, h: 0 }
1853
+ },
1854
+ 'stem--foo--2': {
1855
+ duration: 1,
1856
+ frame: { x: 0, y: 0, w: 0, h: 0 },
1857
+ rotated: false,
1858
+ trimmed: false,
1859
+ spriteSourceSize: { x: 0, y: 0, w: 0, h: 0 },
1860
+ sourceSize: { w: 0, h: 0 }
1861
+ }
1862
+ };
1863
+ assertAnimFrames(span, map, expected[direction], direction);
1864
+ }
1865
+ });
1866
+ });
1867
+ describe('parseCel()', () => {
1868
+ test('parses 1:1 texture mapping/', () => {
1869
+ const frame = {
1870
+ frame: { x: 1, y: 2, w: 3, h: 4 },
1871
+ rotated: false,
1872
+ trimmed: false,
1873
+ spriteSourceSize: { x: 0, y: 0, w: 3, h: 4 },
1874
+ sourceSize: { w: 3, h: 4 },
1875
+ duration: 1
1876
+ };
1877
+ assert(parseCel(frame), { x: 1, y: 2 });
1878
+ });
1879
+ test('parses texture mapping with padding', () => {
1880
+ const frame = {
1881
+ frame: { x: 1, y: 2, w: 5, h: 6 },
1882
+ rotated: false,
1883
+ trimmed: false,
1884
+ spriteSourceSize: { x: 0, y: 0, w: 3, h: 4 },
1885
+ sourceSize: { w: 3, h: 4 },
1886
+ duration: 1
1887
+ };
1888
+ assert(parseCel(frame), { x: 2, y: 3 });
1889
+ });
1890
+ });
1891
+ describe('parseHitboxes()', () => {
1892
+ test('parses hitbox.', () => {
1893
+ const span = {
1894
+ color: '#000000ff',
1895
+ direction: 'pingpong',
1896
+ name: 'stem--foo',
1897
+ from: 0,
1898
+ to: 0
1899
+ };
1900
+ const slices = [
1901
+ {
1902
+ name: 'stem--foo',
1903
+ color: '#ff0000ff',
1904
+ keys: [{ frame: 0, bounds: { x: 0, y: 1, w: 2, h: 3 } }]
1905
+ }
1906
+ ];
1907
+ assert(parseHitboxes(span, slices), {
1908
+ hitbox: { x: 0, y: 1, w: 2, h: 3 },
1909
+ hurtbox: undefined
1910
+ });
1911
+ });
1912
+ test('parses hurtbox.', () => {
1913
+ const span = {
1914
+ color: '#000000ff',
1915
+ direction: 'pingpong',
1916
+ name: 'stem--foo',
1917
+ from: 0,
1918
+ to: 0
1919
+ };
1920
+ const slices = [
1921
+ {
1922
+ name: 'stem--foo',
1923
+ color: '#00ff00ff',
1924
+ keys: [{ frame: 0, bounds: { x: 0, y: 1, w: 2, h: 3 } }]
1925
+ }
1926
+ ];
1927
+ assert(parseHitboxes(span, slices), {
1928
+ hitbox: undefined,
1929
+ hurtbox: { x: 0, y: 1, w: 2, h: 3 }
1930
+ });
1931
+ });
1932
+ test('parses hitbox and hurtbox (blue).', () => {
1933
+ const span = {
1934
+ color: '#000000ff',
1935
+ direction: 'pingpong',
1936
+ name: 'stem--foo',
1937
+ from: 0,
1938
+ to: 0
1939
+ };
1940
+ const slices = [
1941
+ {
1942
+ name: 'stem--foo',
1943
+ color: '#0000ffff',
1944
+ keys: [{ frame: 0, bounds: { x: 0, y: 1, w: 2, h: 3 } }]
1945
+ }
1946
+ ];
1947
+ assert(parseHitboxes(span, slices), {
1948
+ hitbox: { x: 0, y: 1, w: 2, h: 3 },
1949
+ hurtbox: { x: 0, y: 1, w: 2, h: 3 }
1950
+ });
1951
+ });
1952
+ test('parses hitbox and hurtbox.', () => {
1953
+ const span = {
1954
+ color: '#000000ff',
1955
+ direction: 'pingpong',
1956
+ name: 'stem--foo',
1957
+ from: 0,
1958
+ to: 0
1959
+ };
1960
+ const slices = [
1961
+ {
1962
+ name: 'stem--foo',
1963
+ color: '#ff0000ff',
1964
+ keys: [{ frame: 0, bounds: { x: 0, y: 1, w: 2, h: 3 } }]
1965
+ },
1966
+ {
1967
+ name: 'stem--foo',
1968
+ color: '#00ff00ff',
1969
+ keys: [{ frame: 0, bounds: { x: 4, y: 5, w: 6, h: 7 } }]
1970
+ }
1971
+ ];
1972
+ assert(parseHitboxes(span, slices), {
1973
+ hitbox: { x: 0, y: 1, w: 2, h: 3 },
1974
+ hurtbox: { x: 4, y: 5, w: 6, h: 7 }
1975
+ });
1976
+ });
1977
+ test('filters out unrelated tags.', () => {
1978
+ const span = {
1979
+ color: '#000000ff',
1980
+ direction: 'pingpong',
1981
+ name: 'stem--foo',
1982
+ from: 0,
1983
+ to: 0
1984
+ };
1985
+ const slices = [
1986
+ {
1987
+ name: 'unrelated--bar',
1988
+ color: '#ff0000ff',
1989
+ keys: [{ frame: 0, bounds: { x: 0, y: 1, w: 2, h: 3 } }]
1990
+ },
1991
+ {
1992
+ name: 'stem--foo',
1993
+ color: '#ff0000ff',
1994
+ keys: [{ frame: 0, bounds: { x: 4, y: 5, w: 6, h: 7 } }]
1995
+ }
1996
+ ];
1997
+ assert(parseHitboxes(span, slices), {
1998
+ hitbox: { x: 4, y: 5, w: 6, h: 7 },
1999
+ hurtbox: undefined
2000
+ });
2001
+ });
2002
+ test('throws on frame with multiple keys.', () => {
2003
+ const span = {
2004
+ color: '#000000ff',
2005
+ direction: 'pingpong',
2006
+ name: 'stem--foo',
2007
+ from: 0,
2008
+ to: 2
2009
+ };
2010
+ const slices = [
2011
+ {
2012
+ name: 'stem--foo',
2013
+ color: '#0000ffff',
2014
+ keys: [
2015
+ { frame: 0, bounds: { x: 0, y: 1, w: 2, h: 3 } },
2016
+ { frame: 1, bounds: { x: 4, y: 5, w: 6, h: 7 } },
2017
+ { frame: 2, bounds: { x: 8, y: 9, w: 10, h: 11 } }
2018
+ ]
2019
+ }
2020
+ ];
2021
+ assert.throws(() => parseHitboxes(span, slices), /atlas tag "stem--foo" hitbox bounds varies across frames/);
2022
+ });
2023
+ test('defaults to undefined hitbox.', () => {
2024
+ const span = {
2025
+ color: '#000000ff',
2026
+ direction: 'pingpong',
2027
+ name: 'stem--foo',
2028
+ from: 0,
2029
+ to: 0
2030
+ };
2031
+ assert(parseHitboxes(span, []), {
2032
+ hitbox: undefined,
2033
+ hurtbox: undefined
2034
+ });
2035
+ });
2036
+ test('throws on unsupported color.', () => {
2037
+ const span = {
2038
+ color: '#000000ff',
2039
+ direction: 'pingpong',
2040
+ name: 'stem--foo',
2041
+ from: 0,
2042
+ to: 0
2043
+ };
2044
+ const slices = [
2045
+ {
2046
+ name: 'stem--foo',
2047
+ color: '#ff00ffff',
2048
+ keys: [{ frame: 0, bounds: { x: 0, y: 1, w: 2, h: 3 } }]
2049
+ }
2050
+ ];
2051
+ assert.throws(() => parseHitboxes(span, slices), /atlas tag "stem--foo" hitbox color #ff00ffff unsupported/);
2052
+ });
2053
+ test('throws on multiple hitboxes.', () => {
2054
+ const span = {
2055
+ color: '#000000ff',
2056
+ direction: 'pingpong',
2057
+ name: 'stem--foo',
2058
+ from: 0,
2059
+ to: 1
2060
+ };
2061
+ const slices = [
2062
+ {
2063
+ name: 'stem--foo',
2064
+ color: '#ff0000ff',
2065
+ keys: [
2066
+ { frame: 0, bounds: { x: 0, y: 1, w: 2, h: 3 } },
2067
+ { frame: 1, bounds: { x: 4, y: 5, w: 6, h: 7 } },
2068
+ { frame: 2, bounds: { x: 12, y: 13, w: 14, h: 15 } }
2069
+ ]
2070
+ },
2071
+ {
2072
+ name: 'stem--foo',
2073
+ color: '#ff0000ff',
2074
+ keys: [{ frame: 0, bounds: { x: 0, y: 1, w: 2, h: 3 } }]
2075
+ }
2076
+ ];
2077
+ assert.throws(() => parseHitboxes(span, slices), /atlas tag "stem--foo" hitbox bounds varies across frames/);
2078
+ });
2079
+ test('throws on multiple hurtboxes.', () => {
2080
+ const span = {
2081
+ color: '#000000ff',
2082
+ direction: 'pingpong',
2083
+ name: 'stem--foo',
2084
+ from: 0,
2085
+ to: 1
2086
+ };
2087
+ const slices = [
2088
+ {
2089
+ name: 'stem--foo',
2090
+ color: '#00ff00ff',
2091
+ keys: [
2092
+ { frame: 0, bounds: { x: 0, y: 1, w: 2, h: 3 } },
2093
+ { frame: 1, bounds: { x: 4, y: 5, w: 6, h: 7 } },
2094
+ { frame: 2, bounds: { x: 12, y: 13, w: 14, h: 15 } }
2095
+ ]
2096
+ },
2097
+ {
2098
+ name: 'stem--foo',
2099
+ color: '#00ff00ff',
2100
+ keys: [{ frame: 0, bounds: { x: 0, y: 1, w: 2, h: 3 } }]
2101
+ }
2102
+ ];
2103
+ assert.throws(() => parseHitboxes(span, slices), /atlas tag "stem--foo" hitbox bounds varies across frames/);
2104
+ });
2105
+ });
2106
+ function assertAnimFrames(span, map, expected, msg) {
2107
+ assert([...parseAnimFrames(span, map)].map(frame => Object.values(map).indexOf(frame)), expected, msg);
2108
+ }
2109
+ //# sourceMappingURL=atlas-json-parser.test.js.map