@bscotch/yy 0.6.1 → 0.6.2

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 (42) hide show
  1. package/LICENSE.md +23 -0
  2. package/dist/Yy.d.ts +6859 -6829
  3. package/dist/Yy.d.ts.map +1 -1
  4. package/dist/Yy.js +247 -246
  5. package/dist/Yy.js.map +1 -1
  6. package/dist/Yy.parse.d.ts +5 -5
  7. package/dist/Yy.parse.js +240 -240
  8. package/dist/Yy.stringify.d.ts +6 -6
  9. package/dist/Yy.stringify.js +129 -129
  10. package/dist/cli.d.ts +1 -1
  11. package/dist/cli.js +16 -16
  12. package/dist/index.d.ts +8 -8
  13. package/dist/index.js +8 -8
  14. package/dist/types/YyBase.d.ts +46 -46
  15. package/dist/types/YyBase.js +37 -37
  16. package/dist/types/YyObject.d.ts +454 -462
  17. package/dist/types/YyObject.d.ts.map +1 -1
  18. package/dist/types/YyObject.js +108 -108
  19. package/dist/types/YyRoom.d.ts +1474 -1507
  20. package/dist/types/YyRoom.d.ts.map +1 -1
  21. package/dist/types/YyRoom.js +155 -155
  22. package/dist/types/YyScript.d.ts +45 -47
  23. package/dist/types/YyScript.d.ts.map +1 -1
  24. package/dist/types/YyScript.js +8 -8
  25. package/dist/types/YySound.d.ts +107 -115
  26. package/dist/types/YySound.d.ts.map +1 -1
  27. package/dist/types/YySound.js +61 -61
  28. package/dist/types/YySprite.d.ts +5438 -5446
  29. package/dist/types/YySprite.d.ts.map +1 -1
  30. package/dist/types/YySprite.js +417 -417
  31. package/dist/types/YySprite.lib.d.ts +221 -215
  32. package/dist/types/YySprite.lib.d.ts.map +1 -1
  33. package/dist/types/YySprite.lib.js +35 -35
  34. package/dist/types/Yyp.d.ts +604 -604
  35. package/dist/types/Yyp.js +101 -101
  36. package/dist/types/utility.d.ts +64 -64
  37. package/dist/types/utility.js +104 -104
  38. package/package.json +16 -11
  39. package/dist/Schema.d.ts +0 -1
  40. package/dist/Schema.d.ts.map +0 -1
  41. package/dist/Schema.js +0 -2
  42. package/dist/Schema.js.map +0 -1
@@ -1,418 +1,418 @@
1
- // Generated by ts-to-zod
2
- import { v4 as uuidV4 } from 'uuid';
3
- import { z } from 'zod';
4
- import { yyBaseSchema } from './YyBase.js';
5
- import { ensureTrackKeyFrames } from './YySprite.lib.js';
6
- import { FixedNumber, ensureObject, ensureObjects, fixedNumber, unstable, yyResourceIdSchemaGenerator, } from './utility.js';
7
- export var SpriteType;
8
- (function (SpriteType) {
9
- SpriteType[SpriteType["Default"] = 0] = "Default";
10
- SpriteType[SpriteType["Spine"] = 2] = "Spine";
11
- })(SpriteType || (SpriteType = {}));
12
- export var SpriteLayerBlendMode;
13
- (function (SpriteLayerBlendMode) {
14
- SpriteLayerBlendMode[SpriteLayerBlendMode["Normal"] = 0] = "Normal";
15
- SpriteLayerBlendMode[SpriteLayerBlendMode["Add"] = 1] = "Add";
16
- SpriteLayerBlendMode[SpriteLayerBlendMode["Subtract"] = 2] = "Subtract";
17
- SpriteLayerBlendMode[SpriteLayerBlendMode["Multiply"] = 3] = "Multiply";
18
- })(SpriteLayerBlendMode || (SpriteLayerBlendMode = {}));
19
- export var SpriteCollisionKind;
20
- (function (SpriteCollisionKind) {
21
- SpriteCollisionKind[SpriteCollisionKind["Precise"] = 0] = "Precise";
22
- SpriteCollisionKind[SpriteCollisionKind["Rectangle"] = 1] = "Rectangle";
23
- SpriteCollisionKind[SpriteCollisionKind["Ellipse"] = 2] = "Ellipse";
24
- SpriteCollisionKind[SpriteCollisionKind["Diamond"] = 3] = "Diamond";
25
- SpriteCollisionKind[SpriteCollisionKind["PrecisePerFrame"] = 4] = "PrecisePerFrame";
26
- SpriteCollisionKind[SpriteCollisionKind["RectangleWithRotation"] = 5] = "RectangleWithRotation";
27
- })(SpriteCollisionKind || (SpriteCollisionKind = {}));
28
- export var SpriteBoundingBoxMode;
29
- (function (SpriteBoundingBoxMode) {
30
- /** what does this imply about bboxes? */
31
- SpriteBoundingBoxMode[SpriteBoundingBoxMode["Automatic"] = 0] = "Automatic";
32
- SpriteBoundingBoxMode[SpriteBoundingBoxMode["FullImage"] = 1] = "FullImage";
33
- SpriteBoundingBoxMode[SpriteBoundingBoxMode["Manual"] = 2] = "Manual";
34
- })(SpriteBoundingBoxMode || (SpriteBoundingBoxMode = {}));
35
- export var SpriteOrigin;
36
- (function (SpriteOrigin) {
37
- SpriteOrigin[SpriteOrigin["TopLeft"] = 0] = "TopLeft";
38
- SpriteOrigin[SpriteOrigin["TopCenter"] = 1] = "TopCenter";
39
- SpriteOrigin[SpriteOrigin["TopRight"] = 2] = "TopRight";
40
- SpriteOrigin[SpriteOrigin["MiddleLeft"] = 3] = "MiddleLeft";
41
- SpriteOrigin[SpriteOrigin["MiddleCenter"] = 4] = "MiddleCenter";
42
- SpriteOrigin[SpriteOrigin["MiddleRight"] = 5] = "MiddleRight";
43
- SpriteOrigin[SpriteOrigin["BottomLeft"] = 6] = "BottomLeft";
44
- SpriteOrigin[SpriteOrigin["BottomCenter"] = 7] = "BottomCenter";
45
- SpriteOrigin[SpriteOrigin["BottomRight"] = 8] = "BottomRight";
46
- SpriteOrigin[SpriteOrigin["Custom"] = 9] = "Custom";
47
- })(SpriteOrigin || (SpriteOrigin = {}));
48
- export var SpritePlaybackSpeedType;
49
- (function (SpritePlaybackSpeedType) {
50
- SpritePlaybackSpeedType[SpritePlaybackSpeedType["FramesPerSecond"] = 0] = "FramesPerSecond";
51
- SpritePlaybackSpeedType[SpritePlaybackSpeedType["FramesPerGameFrame"] = 1] = "FramesPerGameFrame";
52
- })(SpritePlaybackSpeedType || (SpritePlaybackSpeedType = {}));
53
- const spriteCollisionKindSchema = z.nativeEnum(SpriteCollisionKind);
54
- const spriteBoundingBoxModeSchema = z.nativeEnum(SpriteBoundingBoxMode);
55
- const spriteOriginSchema = z.nativeEnum(SpriteOrigin);
56
- const spritePlaybackSpeedTypeSchema = z.nativeEnum(SpritePlaybackSpeedType);
57
- const spriteImageBaseSchema = unstable({
58
- FrameId: z.object({
59
- name: z.string(),
60
- /** Path to the sprite's .yy file */
61
- path: z.string(),
62
- }),
63
- resourceVersion: z.literal('1.0').default('1.0'),
64
- name: z.string().default("''"),
65
- /** Seems to always be empty */
66
- tags: z.array(z.string()).optional(),
67
- resourceType: z.literal('GMSpriteBitmap').default('GMSpriteBitmap'),
68
- });
69
- const spriteImageSchema = spriteImageBaseSchema.extend({
70
- LayerId: z.object({
71
- /**
72
- * Name of the layer. Corresponds to an image in each layer folder,
73
- * and should be found in once in *each frame*. Must be found in the
74
- * sprite's root "layers" list.
75
- */
76
- name: z.string(),
77
- /** Path to the sprite's .yy file */
78
- path: z.string(),
79
- }),
80
- });
81
- const spriteCompositeImageSchema = spriteImageBaseSchema.extend({
82
- LayerId: z.null(),
83
- });
84
- const spriteFrameSchema = unstable({
85
- /**
86
- * Unique GUID. Matches the name of an image file (+'.png')
87
- * that sits alongside the .yy file. Also matches a corresponding
88
- * folder name inside the "layers" folder. The Composite image
89
- * and each one listed in 'images' all have the same value here
90
- * for their "FrameId.name" field.
91
- */
92
- name: z.string().default(uuidV4),
93
- tags: z.array(z.string()).optional(),
94
- resourceType: z.literal('GMSpriteFrame').default('GMSpriteFrame'),
95
- /**
96
- * Image created by flattening layers.
97
- *
98
- * Automatically generated by the IDE for resourceVersion 1.0,
99
- * removed in 1.1.
100
- */
101
- compositeImage: spriteCompositeImageSchema.optional(),
102
- /**
103
- * One image per layer.
104
- *
105
- * Automatically generated by the IDE for resourceVersion 1.0,
106
- * removed in 1.1.
107
- */
108
- images: z.array(spriteImageSchema).optional(),
109
- /**
110
- * The parent sprite, same as the sprite's ID from the YYP.
111
- *
112
- * Automatically generated by the IDE for resourceVersion 1.0,
113
- * removed in 1.1.
114
- */
115
- parent: z
116
- .object({
117
- name: z.string(),
118
- path: z.string(),
119
- })
120
- .optional(),
121
- resourceVersion: z.enum(['1.0', '1.1']).default('1.1'),
122
- });
123
- const spriteLayerBlendModeSchema = z.nativeEnum(SpriteLayerBlendMode);
124
- const spriteLayerSchema = unstable({
125
- visible: z.boolean().default(true),
126
- isLocked: z.boolean().default(false),
127
- blendMode: spriteLayerBlendModeSchema.default(0),
128
- opacity: fixedNumber(z.number().min(0).max(100)).default(100),
129
- displayName: z.string().default('default'),
130
- resourceVersion: z.string().default('1.0'),
131
- /**
132
- * The unique GUID for this layer, used by Frames in their LayerId field.
133
- */
134
- name: z.string().default(uuidV4),
135
- /** Seems to be unused -- always an empty array. */
136
- tags: z.array(z.string()).optional(),
137
- resourceType: z.literal('GMImageLayer').default('GMImageLayer'),
138
- });
139
- const spriteSequenceTrackKeyframeBaseSchema = z.object({
140
- /**
141
- * Unique GUID for the keyframe.
142
- */
143
- id: z.string().default(uuidV4),
144
- /**
145
- * Appears to be the index position within the keyframes array
146
- */
147
- Key: fixedNumber(z.number().min(0)).default(0),
148
- /** Seems to always be 1? */
149
- Length: fixedNumber().default(1),
150
- Stretch: z.boolean().default(false),
151
- Disabled: z.boolean().default(false),
152
- IsCreationKey: z.boolean().default(false),
153
- Channels: ensureObject(z.record(z.object({
154
- Id: z
155
- .object({
156
- /** Frame/subimage GUID */
157
- name: z.string(),
158
- /** Sprite .yy file (e.g. sprites/sprites/thisSprite.yy) */
159
- path: z.string(),
160
- })
161
- .default({ name: '', path: '' }),
162
- resourceVersion: z.literal('1.0').default('1.0'),
163
- resourceType: z
164
- .literal('SpriteFrameKeyframe')
165
- .default('SpriteFrameKeyframe'),
166
- }))).default({ '0': {} }),
167
- resourceVersion: z.literal('1.0').default('1.0'),
168
- });
169
- const spriteSequenceTrackKeyframeTypeSchema = z.discriminatedUnion('resourceType', [
170
- z.object({
171
- resourceType: z.literal('Keyframe`1'),
172
- elementType: z.literal('SpriteFrameKeyframe'),
173
- }),
174
- z.object({
175
- resourceType: z.literal('Keyframe<SpriteFrameKeyframe>'),
176
- }),
177
- ]);
178
- const spriteSequenceTrackKeyframeSchema = spriteSequenceTrackKeyframeBaseSchema.and(spriteSequenceTrackKeyframeTypeSchema);
179
- const spriteSequenceTrackKeyframesTypeSchema = z
180
- .discriminatedUnion('resourceType', [
181
- z.object({
182
- resourceType: z.literal('KeyframeStore<SpriteFrameKeyframe>'),
183
- }),
184
- z.object({
185
- resourceType: z.literal('KeyframeStore`1'),
186
- elementType: z.literal('SpriteFrameKeyframe'),
187
- }),
188
- ])
189
- .default({ resourceType: 'KeyframeStore<SpriteFrameKeyframe>' });
190
- const spriteSequenceMomentTypeSchema = z.discriminatedUnion('resourceType', [
191
- z.object({
192
- resourceType: z.literal('KeyframeStore<MomentsEventKeyframe>'),
193
- }),
194
- z.object({
195
- resourceType: z.literal('KeyframeStore`1'),
196
- elementType: z.literal('MomentsEventKeyframe'),
197
- }),
198
- ]);
199
- const spriteSequenceEventTypeSchema = z.discriminatedUnion('resourceType', [
200
- z.object({
201
- resourceType: z.literal('KeyframeStore<MessageEventKeyframe>'),
202
- }),
203
- z.object({
204
- resourceType: z.literal('KeyframeStore`1'),
205
- elementType: z.literal('MessageEventKeyframe'),
206
- }),
207
- ]);
208
- const spriteKeyframesSchema = z.preprocess((input) => {
209
- const baseDefault = {
210
- resourceType: 'KeyframeStore<SpriteFrameKeyframe>',
211
- };
212
- if (input === undefined) {
213
- return baseDefault;
214
- }
215
- else if (typeof input === 'object' && input !== null) {
216
- return {
217
- ...baseDefault,
218
- ...input,
219
- };
220
- }
221
- return input;
222
- }, z
223
- .object({
224
- Keyframes: z.preprocess((frames) => {
225
- if (frames === undefined) {
226
- return [];
227
- }
228
- if (Array.isArray(frames)) {
229
- return frames.map((f) => ({
230
- resourceType: 'Keyframe<SpriteFrameKeyframe>',
231
- ...f,
232
- }));
233
- }
234
- return frames;
235
- }, z.array(spriteSequenceTrackKeyframeSchema).default([])),
236
- resourceVersion: z.literal('1.0').default('1.0'),
237
- })
238
- .and(spriteSequenceTrackKeyframesTypeSchema)
239
- .transform((arg) => {
240
- arg.Keyframes.forEach((k, i) => {
241
- k.Key = new FixedNumber(i);
242
- });
243
- return arg;
244
- }));
245
- const spriteTypeSchema = z.nativeEnum(SpriteType);
246
- const spriteSequenceTrackSchema = unstable({
247
- name: z.string().default('frames'),
248
- spriteId: z.unknown().nullable().default(null),
249
- trackColour: z.number().default(0),
250
- inheritsTrackColour: z.boolean().default(true),
251
- builtinName: z.number().default(0),
252
- traits: z.number().default(0),
253
- interpolation: z.number().default(1),
254
- tracks: z.array(z.unknown()).default([]),
255
- events: z.array(z.unknown()).default([]),
256
- modifiers: z.array(z.unknown()).default([]),
257
- isCreationTrack: z.boolean().default(false),
258
- resourceVersion: z.literal('1.0').default('1.0'),
259
- tags: z.array(z.string()).optional(),
260
- resourceType: z.literal('GMSpriteFramesTrack').default('GMSpriteFramesTrack'),
261
- keyframes: spriteKeyframesSchema,
262
- });
263
- const spriteSequenceSchema = unstable({
264
- timeUnits: z.number().default(1),
265
- playback: z.number().default(1),
266
- /**
267
- * FPS (probably 30, 45, or 60), set via the editor
268
- */
269
- playbackSpeed: fixedNumber(z.number().min(0)).default(60),
270
- /**
271
- * FPS type, set via the editor
272
- */
273
- playbackSpeedType: spritePlaybackSpeedTypeSchema.default(0),
274
- autoRecord: z.boolean().default(true),
275
- volume: fixedNumber().default(1),
276
- /**
277
- * Number of frames
278
- */
279
- length: fixedNumber().default(0),
280
- visibleRange: z
281
- .object({
282
- x: fixedNumber(),
283
- y: fixedNumber(),
284
- })
285
- .nullable()
286
- .default(null),
287
- lockOrigin: z.boolean().default(false),
288
- showBackdrop: z.boolean().default(true),
289
- showBackdropImage: z.boolean().default(false),
290
- backdropImagePath: z.string().default(''),
291
- backdropImageOpacity: fixedNumber().default(0),
292
- backdropWidth: z.number().default(1366),
293
- backdropHeight: z.number().default(768),
294
- backdropXOffset: fixedNumber().default(0),
295
- backdropYOffset: fixedNumber().default(0),
296
- xorigin: z.number().default(0),
297
- yorigin: z.number().default(0),
298
- eventToFunction: z.unknown().default({}),
299
- eventStubScript: z.unknown().default(null),
300
- name: z.string().optional(),
301
- tags: z.array(z.string()).optional(),
302
- resourceType: z.literal('GMSequence').default('GMSequence'),
303
- resourceVersion: z.string().default('1.4'),
304
- events: ensureObject(z
305
- .object({
306
- Keyframes: z.array(z.unknown()).default([]),
307
- resourceVersion: z.literal('1.0').default('1.0'),
308
- })
309
- .and(spriteSequenceEventTypeSchema)).default({ resourceType: 'KeyframeStore<MessageEventKeyframe>' }),
310
- moments: ensureObject(z
311
- .object({
312
- Keyframes: z.array(z.unknown()).default([]),
313
- resourceVersion: z.literal('1.0').default('1.0'),
314
- })
315
- .and(spriteSequenceMomentTypeSchema)).default({ resourceType: 'KeyframeStore<MomentsEventKeyframe>' }),
316
- tracks: ensureObjects(spriteSequenceTrackSchema),
317
- /**
318
- * Matches the YYP resource's 'id' value.
319
- */
320
- spriteId: yyResourceIdSchemaGenerator('sprites').optional(),
321
- parent: yyResourceIdSchemaGenerator('sprites').optional(),
322
- });
323
- const yySpriteSchemaStrict = yyBaseSchema
324
- .extend({
325
- bboxMode: spriteBoundingBoxModeSchema.default(2),
326
- collisionKind: spriteCollisionKindSchema.default(1),
327
- /**
328
- * The sprite type (Spine or Regular)
329
- */
330
- type: spriteTypeSchema.default(0),
331
- /**
332
- * The method used for specifying the origin
333
- */
334
- origin: spriteOriginSchema.default(4),
335
- preMultiplyAlpha: z.boolean().default(false),
336
- edgeFiltering: z.boolean().default(false),
337
- /**
338
- * Only meaningful if collision type is "Precise".
339
- */
340
- collisionTolerance: z.number().min(0).max(255).default(0),
341
- /**
342
- * (What is this?)
343
- */
344
- swfPrecision: z.number().default(2.525),
345
- bbox_left: z.number().default(0),
346
- bbox_right: z.number().default(0),
347
- bbox_top: z.number().default(0),
348
- bbox_bottom: z.number().default(0),
349
- /**
350
- * Horizontally tiled
351
- */
352
- HTile: z.boolean().default(false),
353
- /**
354
- * Vertically tiled
355
- */
356
- VTile: z.boolean().default(false),
357
- /**
358
- * Used for 3d (not sure how set...)
359
- */
360
- For3D: z.boolean().default(false),
361
- DynamicTexturePage: z.boolean().default(false),
362
- width: z.number().default(64),
363
- height: z.number().default(64),
364
- /**
365
- * Matches the texture's id from the YYP file
366
- */
367
- textureGroupId: z
368
- .object({
369
- /** the name of the Texture Group */
370
- name: z.string(),
371
- /** seems to just be `texturegroups/${name}` */
372
- path: z.string(),
373
- })
374
- .default({ name: 'Default', path: 'texturegroups/Default' }),
375
- swatchColours: z.unknown().default(null),
376
- gridX: z.number().default(0),
377
- gridY: z.number().default(0),
378
- frames: z.array(spriteFrameSchema).default([]),
379
- sequence: ensureObject(spriteSequenceSchema),
380
- layers: ensureObjects(spriteLayerSchema),
381
- resourceType: z.literal('GMSprite').default('GMSprite'),
382
- nineSlice: z.unknown().optional().default(null),
383
- })
384
- .transform((sprite) => {
385
- // Remove any excess keyframes
386
- const frameCount = sprite.frames.length;
387
- sprite.sequence.tracks[0].keyframes.Keyframes =
388
- sprite.sequence.tracks[0].keyframes.Keyframes.slice(0, frameCount);
389
- // Ensure that sequence length is a tally of the frames
390
- sprite.sequence.length = new FixedNumber(frameCount);
391
- // Ensure keyframes map onto frames
392
- for (const [i, keyframe,] of sprite.sequence.tracks[0].keyframes.Keyframes.entries()) {
393
- keyframe.Channels['0'].Id.name = sprite.frames[i].name;
394
- }
395
- // Ensure starting size
396
- sprite.width ||= 64;
397
- sprite.height ||= 64;
398
- sprite.bbox_right ||= sprite.width;
399
- sprite.bbox_bottom ||= sprite.height;
400
- // Ensure that the sequence has a name
401
- sprite.sequence.name = sprite.name;
402
- return sprite;
403
- });
404
- /**
405
- * Schema for creating/updating a YySprite, with very
406
- * forgiving preprocessing to allow for sparse inputs.
407
- */
408
- export const yySpriteSchema = z.preprocess((input) => {
409
- if (!input || typeof input !== 'object' || !('name' in input)) {
410
- return input;
411
- }
412
- // Cast stuff that can't be handled by local defaults
413
- // (can use the final transform to override with more
414
- // context after defaults are applied)
415
- const sprite = ensureTrackKeyFrames(input);
416
- return sprite;
417
- }, yySpriteSchemaStrict);
1
+ // Generated by ts-to-zod
2
+ import { v4 as uuidV4 } from 'uuid';
3
+ import { z } from 'zod';
4
+ import { yyBaseSchema } from './YyBase.js';
5
+ import { ensureTrackKeyFrames } from './YySprite.lib.js';
6
+ import { FixedNumber, ensureObject, ensureObjects, fixedNumber, unstable, yyResourceIdSchemaGenerator, } from './utility.js';
7
+ export var SpriteType;
8
+ (function (SpriteType) {
9
+ SpriteType[SpriteType["Default"] = 0] = "Default";
10
+ SpriteType[SpriteType["Spine"] = 2] = "Spine";
11
+ })(SpriteType || (SpriteType = {}));
12
+ export var SpriteLayerBlendMode;
13
+ (function (SpriteLayerBlendMode) {
14
+ SpriteLayerBlendMode[SpriteLayerBlendMode["Normal"] = 0] = "Normal";
15
+ SpriteLayerBlendMode[SpriteLayerBlendMode["Add"] = 1] = "Add";
16
+ SpriteLayerBlendMode[SpriteLayerBlendMode["Subtract"] = 2] = "Subtract";
17
+ SpriteLayerBlendMode[SpriteLayerBlendMode["Multiply"] = 3] = "Multiply";
18
+ })(SpriteLayerBlendMode || (SpriteLayerBlendMode = {}));
19
+ export var SpriteCollisionKind;
20
+ (function (SpriteCollisionKind) {
21
+ SpriteCollisionKind[SpriteCollisionKind["Precise"] = 0] = "Precise";
22
+ SpriteCollisionKind[SpriteCollisionKind["Rectangle"] = 1] = "Rectangle";
23
+ SpriteCollisionKind[SpriteCollisionKind["Ellipse"] = 2] = "Ellipse";
24
+ SpriteCollisionKind[SpriteCollisionKind["Diamond"] = 3] = "Diamond";
25
+ SpriteCollisionKind[SpriteCollisionKind["PrecisePerFrame"] = 4] = "PrecisePerFrame";
26
+ SpriteCollisionKind[SpriteCollisionKind["RectangleWithRotation"] = 5] = "RectangleWithRotation";
27
+ })(SpriteCollisionKind || (SpriteCollisionKind = {}));
28
+ export var SpriteBoundingBoxMode;
29
+ (function (SpriteBoundingBoxMode) {
30
+ /** what does this imply about bboxes? */
31
+ SpriteBoundingBoxMode[SpriteBoundingBoxMode["Automatic"] = 0] = "Automatic";
32
+ SpriteBoundingBoxMode[SpriteBoundingBoxMode["FullImage"] = 1] = "FullImage";
33
+ SpriteBoundingBoxMode[SpriteBoundingBoxMode["Manual"] = 2] = "Manual";
34
+ })(SpriteBoundingBoxMode || (SpriteBoundingBoxMode = {}));
35
+ export var SpriteOrigin;
36
+ (function (SpriteOrigin) {
37
+ SpriteOrigin[SpriteOrigin["TopLeft"] = 0] = "TopLeft";
38
+ SpriteOrigin[SpriteOrigin["TopCenter"] = 1] = "TopCenter";
39
+ SpriteOrigin[SpriteOrigin["TopRight"] = 2] = "TopRight";
40
+ SpriteOrigin[SpriteOrigin["MiddleLeft"] = 3] = "MiddleLeft";
41
+ SpriteOrigin[SpriteOrigin["MiddleCenter"] = 4] = "MiddleCenter";
42
+ SpriteOrigin[SpriteOrigin["MiddleRight"] = 5] = "MiddleRight";
43
+ SpriteOrigin[SpriteOrigin["BottomLeft"] = 6] = "BottomLeft";
44
+ SpriteOrigin[SpriteOrigin["BottomCenter"] = 7] = "BottomCenter";
45
+ SpriteOrigin[SpriteOrigin["BottomRight"] = 8] = "BottomRight";
46
+ SpriteOrigin[SpriteOrigin["Custom"] = 9] = "Custom";
47
+ })(SpriteOrigin || (SpriteOrigin = {}));
48
+ export var SpritePlaybackSpeedType;
49
+ (function (SpritePlaybackSpeedType) {
50
+ SpritePlaybackSpeedType[SpritePlaybackSpeedType["FramesPerSecond"] = 0] = "FramesPerSecond";
51
+ SpritePlaybackSpeedType[SpritePlaybackSpeedType["FramesPerGameFrame"] = 1] = "FramesPerGameFrame";
52
+ })(SpritePlaybackSpeedType || (SpritePlaybackSpeedType = {}));
53
+ const spriteCollisionKindSchema = z.nativeEnum(SpriteCollisionKind);
54
+ const spriteBoundingBoxModeSchema = z.nativeEnum(SpriteBoundingBoxMode);
55
+ const spriteOriginSchema = z.nativeEnum(SpriteOrigin);
56
+ const spritePlaybackSpeedTypeSchema = z.nativeEnum(SpritePlaybackSpeedType);
57
+ const spriteImageBaseSchema = unstable({
58
+ FrameId: z.object({
59
+ name: z.string(),
60
+ /** Path to the sprite's .yy file */
61
+ path: z.string(),
62
+ }),
63
+ resourceVersion: z.literal('1.0').default('1.0'),
64
+ name: z.string().default("''"),
65
+ /** Seems to always be empty */
66
+ tags: z.array(z.string()).optional(),
67
+ resourceType: z.literal('GMSpriteBitmap').default('GMSpriteBitmap'),
68
+ });
69
+ const spriteImageSchema = spriteImageBaseSchema.extend({
70
+ LayerId: z.object({
71
+ /**
72
+ * Name of the layer. Corresponds to an image in each layer folder,
73
+ * and should be found in once in *each frame*. Must be found in the
74
+ * sprite's root "layers" list.
75
+ */
76
+ name: z.string(),
77
+ /** Path to the sprite's .yy file */
78
+ path: z.string(),
79
+ }),
80
+ });
81
+ const spriteCompositeImageSchema = spriteImageBaseSchema.extend({
82
+ LayerId: z.null(),
83
+ });
84
+ const spriteFrameSchema = unstable({
85
+ /**
86
+ * Unique GUID. Matches the name of an image file (+'.png')
87
+ * that sits alongside the .yy file. Also matches a corresponding
88
+ * folder name inside the "layers" folder. The Composite image
89
+ * and each one listed in 'images' all have the same value here
90
+ * for their "FrameId.name" field.
91
+ */
92
+ name: z.string().default(uuidV4),
93
+ tags: z.array(z.string()).optional(),
94
+ resourceType: z.literal('GMSpriteFrame').default('GMSpriteFrame'),
95
+ /**
96
+ * Image created by flattening layers.
97
+ *
98
+ * Automatically generated by the IDE for resourceVersion 1.0,
99
+ * removed in 1.1.
100
+ */
101
+ compositeImage: spriteCompositeImageSchema.optional(),
102
+ /**
103
+ * One image per layer.
104
+ *
105
+ * Automatically generated by the IDE for resourceVersion 1.0,
106
+ * removed in 1.1.
107
+ */
108
+ images: z.array(spriteImageSchema).optional(),
109
+ /**
110
+ * The parent sprite, same as the sprite's ID from the YYP.
111
+ *
112
+ * Automatically generated by the IDE for resourceVersion 1.0,
113
+ * removed in 1.1.
114
+ */
115
+ parent: z
116
+ .object({
117
+ name: z.string(),
118
+ path: z.string(),
119
+ })
120
+ .optional(),
121
+ resourceVersion: z.enum(['1.0', '1.1']).default('1.1'),
122
+ });
123
+ const spriteLayerBlendModeSchema = z.nativeEnum(SpriteLayerBlendMode);
124
+ const spriteLayerSchema = unstable({
125
+ visible: z.boolean().default(true),
126
+ isLocked: z.boolean().default(false),
127
+ blendMode: spriteLayerBlendModeSchema.default(0),
128
+ opacity: fixedNumber(z.number().min(0).max(100)).default(100),
129
+ displayName: z.string().default('default'),
130
+ resourceVersion: z.string().default('1.0'),
131
+ /**
132
+ * The unique GUID for this layer, used by Frames in their LayerId field.
133
+ */
134
+ name: z.string().default(uuidV4),
135
+ /** Seems to be unused -- always an empty array. */
136
+ tags: z.array(z.string()).optional(),
137
+ resourceType: z.literal('GMImageLayer').default('GMImageLayer'),
138
+ });
139
+ const spriteSequenceTrackKeyframeBaseSchema = z.object({
140
+ /**
141
+ * Unique GUID for the keyframe.
142
+ */
143
+ id: z.string().default(uuidV4),
144
+ /**
145
+ * Appears to be the index position within the keyframes array
146
+ */
147
+ Key: fixedNumber(z.number().min(0)).default(0),
148
+ /** Seems to always be 1? */
149
+ Length: fixedNumber().default(1),
150
+ Stretch: z.boolean().default(false),
151
+ Disabled: z.boolean().default(false),
152
+ IsCreationKey: z.boolean().default(false),
153
+ Channels: ensureObject(z.record(z.object({
154
+ Id: z
155
+ .object({
156
+ /** Frame/subimage GUID */
157
+ name: z.string(),
158
+ /** Sprite .yy file (e.g. sprites/sprites/thisSprite.yy) */
159
+ path: z.string(),
160
+ })
161
+ .default({ name: '', path: '' }),
162
+ resourceVersion: z.literal('1.0').default('1.0'),
163
+ resourceType: z
164
+ .literal('SpriteFrameKeyframe')
165
+ .default('SpriteFrameKeyframe'),
166
+ }))).default({ '0': {} }),
167
+ resourceVersion: z.literal('1.0').default('1.0'),
168
+ });
169
+ const spriteSequenceTrackKeyframeTypeSchema = z.discriminatedUnion('resourceType', [
170
+ z.object({
171
+ resourceType: z.literal('Keyframe`1'),
172
+ elementType: z.literal('SpriteFrameKeyframe'),
173
+ }),
174
+ z.object({
175
+ resourceType: z.literal('Keyframe<SpriteFrameKeyframe>'),
176
+ }),
177
+ ]);
178
+ const spriteSequenceTrackKeyframeSchema = spriteSequenceTrackKeyframeBaseSchema.and(spriteSequenceTrackKeyframeTypeSchema);
179
+ const spriteSequenceTrackKeyframesTypeSchema = z
180
+ .discriminatedUnion('resourceType', [
181
+ z.object({
182
+ resourceType: z.literal('KeyframeStore<SpriteFrameKeyframe>'),
183
+ }),
184
+ z.object({
185
+ resourceType: z.literal('KeyframeStore`1'),
186
+ elementType: z.literal('SpriteFrameKeyframe'),
187
+ }),
188
+ ])
189
+ .default({ resourceType: 'KeyframeStore<SpriteFrameKeyframe>' });
190
+ const spriteSequenceMomentTypeSchema = z.discriminatedUnion('resourceType', [
191
+ z.object({
192
+ resourceType: z.literal('KeyframeStore<MomentsEventKeyframe>'),
193
+ }),
194
+ z.object({
195
+ resourceType: z.literal('KeyframeStore`1'),
196
+ elementType: z.literal('MomentsEventKeyframe'),
197
+ }),
198
+ ]);
199
+ const spriteSequenceEventTypeSchema = z.discriminatedUnion('resourceType', [
200
+ z.object({
201
+ resourceType: z.literal('KeyframeStore<MessageEventKeyframe>'),
202
+ }),
203
+ z.object({
204
+ resourceType: z.literal('KeyframeStore`1'),
205
+ elementType: z.literal('MessageEventKeyframe'),
206
+ }),
207
+ ]);
208
+ const spriteKeyframesSchema = z.preprocess((input) => {
209
+ const baseDefault = {
210
+ resourceType: 'KeyframeStore<SpriteFrameKeyframe>',
211
+ };
212
+ if (input === undefined) {
213
+ return baseDefault;
214
+ }
215
+ else if (typeof input === 'object' && input !== null) {
216
+ return {
217
+ ...baseDefault,
218
+ ...input,
219
+ };
220
+ }
221
+ return input;
222
+ }, z
223
+ .object({
224
+ Keyframes: z.preprocess((frames) => {
225
+ if (frames === undefined) {
226
+ return [];
227
+ }
228
+ if (Array.isArray(frames)) {
229
+ return frames.map((f) => ({
230
+ resourceType: 'Keyframe<SpriteFrameKeyframe>',
231
+ ...f,
232
+ }));
233
+ }
234
+ return frames;
235
+ }, z.array(spriteSequenceTrackKeyframeSchema).default([])),
236
+ resourceVersion: z.literal('1.0').default('1.0'),
237
+ })
238
+ .and(spriteSequenceTrackKeyframesTypeSchema)
239
+ .transform((arg) => {
240
+ arg.Keyframes.forEach((k, i) => {
241
+ k.Key = new FixedNumber(i);
242
+ });
243
+ return arg;
244
+ }));
245
+ const spriteTypeSchema = z.nativeEnum(SpriteType);
246
+ const spriteSequenceTrackSchema = unstable({
247
+ name: z.string().default('frames'),
248
+ spriteId: z.unknown().nullable().default(null),
249
+ trackColour: z.number().default(0),
250
+ inheritsTrackColour: z.boolean().default(true),
251
+ builtinName: z.number().default(0),
252
+ traits: z.number().default(0),
253
+ interpolation: z.number().default(1),
254
+ tracks: z.array(z.unknown()).default([]),
255
+ events: z.array(z.unknown()).default([]),
256
+ modifiers: z.array(z.unknown()).default([]),
257
+ isCreationTrack: z.boolean().default(false),
258
+ resourceVersion: z.literal('1.0').default('1.0'),
259
+ tags: z.array(z.string()).optional(),
260
+ resourceType: z.literal('GMSpriteFramesTrack').default('GMSpriteFramesTrack'),
261
+ keyframes: spriteKeyframesSchema,
262
+ });
263
+ const spriteSequenceSchema = unstable({
264
+ timeUnits: z.number().default(1),
265
+ playback: z.number().default(1),
266
+ /**
267
+ * FPS (probably 30, 45, or 60), set via the editor
268
+ */
269
+ playbackSpeed: fixedNumber(z.number().min(0)).default(60),
270
+ /**
271
+ * FPS type, set via the editor
272
+ */
273
+ playbackSpeedType: spritePlaybackSpeedTypeSchema.default(0),
274
+ autoRecord: z.boolean().default(true),
275
+ volume: fixedNumber().default(1),
276
+ /**
277
+ * Number of frames
278
+ */
279
+ length: fixedNumber().default(0),
280
+ visibleRange: z
281
+ .object({
282
+ x: fixedNumber(),
283
+ y: fixedNumber(),
284
+ })
285
+ .nullable()
286
+ .default(null),
287
+ lockOrigin: z.boolean().default(false),
288
+ showBackdrop: z.boolean().default(true),
289
+ showBackdropImage: z.boolean().default(false),
290
+ backdropImagePath: z.string().default(''),
291
+ backdropImageOpacity: fixedNumber().default(0),
292
+ backdropWidth: z.number().default(1366),
293
+ backdropHeight: z.number().default(768),
294
+ backdropXOffset: fixedNumber().default(0),
295
+ backdropYOffset: fixedNumber().default(0),
296
+ xorigin: z.number().default(0),
297
+ yorigin: z.number().default(0),
298
+ eventToFunction: z.unknown().default({}),
299
+ eventStubScript: z.unknown().default(null),
300
+ name: z.string().optional(),
301
+ tags: z.array(z.string()).optional(),
302
+ resourceType: z.literal('GMSequence').default('GMSequence'),
303
+ resourceVersion: z.string().default('1.4'),
304
+ events: ensureObject(z
305
+ .object({
306
+ Keyframes: z.array(z.unknown()).default([]),
307
+ resourceVersion: z.literal('1.0').default('1.0'),
308
+ })
309
+ .and(spriteSequenceEventTypeSchema)).default({ resourceType: 'KeyframeStore<MessageEventKeyframe>' }),
310
+ moments: ensureObject(z
311
+ .object({
312
+ Keyframes: z.array(z.unknown()).default([]),
313
+ resourceVersion: z.literal('1.0').default('1.0'),
314
+ })
315
+ .and(spriteSequenceMomentTypeSchema)).default({ resourceType: 'KeyframeStore<MomentsEventKeyframe>' }),
316
+ tracks: ensureObjects(spriteSequenceTrackSchema),
317
+ /**
318
+ * Matches the YYP resource's 'id' value.
319
+ */
320
+ spriteId: yyResourceIdSchemaGenerator('sprites').optional(),
321
+ parent: yyResourceIdSchemaGenerator('sprites').optional(),
322
+ });
323
+ const yySpriteSchemaStrict = yyBaseSchema
324
+ .extend({
325
+ bboxMode: spriteBoundingBoxModeSchema.default(2),
326
+ collisionKind: spriteCollisionKindSchema.default(1),
327
+ /**
328
+ * The sprite type (Spine or Regular)
329
+ */
330
+ type: spriteTypeSchema.default(0),
331
+ /**
332
+ * The method used for specifying the origin
333
+ */
334
+ origin: spriteOriginSchema.default(4),
335
+ preMultiplyAlpha: z.boolean().default(false),
336
+ edgeFiltering: z.boolean().default(false),
337
+ /**
338
+ * Only meaningful if collision type is "Precise".
339
+ */
340
+ collisionTolerance: z.number().min(0).max(255).default(0),
341
+ /**
342
+ * (What is this?)
343
+ */
344
+ swfPrecision: z.number().default(2.525),
345
+ bbox_left: z.number().default(0),
346
+ bbox_right: z.number().default(0),
347
+ bbox_top: z.number().default(0),
348
+ bbox_bottom: z.number().default(0),
349
+ /**
350
+ * Horizontally tiled
351
+ */
352
+ HTile: z.boolean().default(false),
353
+ /**
354
+ * Vertically tiled
355
+ */
356
+ VTile: z.boolean().default(false),
357
+ /**
358
+ * Used for 3d (not sure how set...)
359
+ */
360
+ For3D: z.boolean().default(false),
361
+ DynamicTexturePage: z.boolean().default(false),
362
+ width: z.number().default(64),
363
+ height: z.number().default(64),
364
+ /**
365
+ * Matches the texture's id from the YYP file
366
+ */
367
+ textureGroupId: z
368
+ .object({
369
+ /** the name of the Texture Group */
370
+ name: z.string(),
371
+ /** seems to just be `texturegroups/${name}` */
372
+ path: z.string(),
373
+ })
374
+ .default({ name: 'Default', path: 'texturegroups/Default' }),
375
+ swatchColours: z.unknown().default(null),
376
+ gridX: z.number().default(0),
377
+ gridY: z.number().default(0),
378
+ frames: z.array(spriteFrameSchema).default([]),
379
+ sequence: ensureObject(spriteSequenceSchema),
380
+ layers: ensureObjects(spriteLayerSchema),
381
+ resourceType: z.literal('GMSprite').default('GMSprite'),
382
+ nineSlice: z.unknown().optional().default(null),
383
+ })
384
+ .transform((sprite) => {
385
+ // Remove any excess keyframes
386
+ const frameCount = sprite.frames.length;
387
+ sprite.sequence.tracks[0].keyframes.Keyframes =
388
+ sprite.sequence.tracks[0].keyframes.Keyframes.slice(0, frameCount);
389
+ // Ensure that sequence length is a tally of the frames
390
+ sprite.sequence.length = new FixedNumber(frameCount);
391
+ // Ensure keyframes map onto frames
392
+ for (const [i, keyframe,] of sprite.sequence.tracks[0].keyframes.Keyframes.entries()) {
393
+ keyframe.Channels['0'].Id.name = sprite.frames[i].name;
394
+ }
395
+ // Ensure starting size
396
+ sprite.width ||= 64;
397
+ sprite.height ||= 64;
398
+ sprite.bbox_right ||= sprite.width;
399
+ sprite.bbox_bottom ||= sprite.height;
400
+ // Ensure that the sequence has a name
401
+ sprite.sequence.name = sprite.name;
402
+ return sprite;
403
+ });
404
+ /**
405
+ * Schema for creating/updating a YySprite, with very
406
+ * forgiving preprocessing to allow for sparse inputs.
407
+ */
408
+ export const yySpriteSchema = z.preprocess((input) => {
409
+ if (!input || typeof input !== 'object' || !('name' in input)) {
410
+ return input;
411
+ }
412
+ // Cast stuff that can't be handled by local defaults
413
+ // (can use the final transform to override with more
414
+ // context after defaults are applied)
415
+ const sprite = ensureTrackKeyFrames(input);
416
+ return sprite;
417
+ }, yySpriteSchemaStrict);
418
418
  //# sourceMappingURL=YySprite.js.map