@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.
- package/LICENSE.md +23 -0
- package/dist/Yy.d.ts +6859 -6829
- package/dist/Yy.d.ts.map +1 -1
- package/dist/Yy.js +247 -246
- package/dist/Yy.js.map +1 -1
- package/dist/Yy.parse.d.ts +5 -5
- package/dist/Yy.parse.js +240 -240
- package/dist/Yy.stringify.d.ts +6 -6
- package/dist/Yy.stringify.js +129 -129
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +16 -16
- package/dist/index.d.ts +8 -8
- package/dist/index.js +8 -8
- package/dist/types/YyBase.d.ts +46 -46
- package/dist/types/YyBase.js +37 -37
- package/dist/types/YyObject.d.ts +454 -462
- package/dist/types/YyObject.d.ts.map +1 -1
- package/dist/types/YyObject.js +108 -108
- package/dist/types/YyRoom.d.ts +1474 -1507
- package/dist/types/YyRoom.d.ts.map +1 -1
- package/dist/types/YyRoom.js +155 -155
- package/dist/types/YyScript.d.ts +45 -47
- package/dist/types/YyScript.d.ts.map +1 -1
- package/dist/types/YyScript.js +8 -8
- package/dist/types/YySound.d.ts +107 -115
- package/dist/types/YySound.d.ts.map +1 -1
- package/dist/types/YySound.js +61 -61
- package/dist/types/YySprite.d.ts +5438 -5446
- package/dist/types/YySprite.d.ts.map +1 -1
- package/dist/types/YySprite.js +417 -417
- package/dist/types/YySprite.lib.d.ts +221 -215
- package/dist/types/YySprite.lib.d.ts.map +1 -1
- package/dist/types/YySprite.lib.js +35 -35
- package/dist/types/Yyp.d.ts +604 -604
- package/dist/types/Yyp.js +101 -101
- package/dist/types/utility.d.ts +64 -64
- package/dist/types/utility.js +104 -104
- package/package.json +16 -11
- package/dist/Schema.d.ts +0 -1
- package/dist/Schema.d.ts.map +0 -1
- package/dist/Schema.js +0 -2
- package/dist/Schema.js.map +0 -1
package/dist/types/YySprite.js
CHANGED
|
@@ -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
|