sb-edit-custom 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +9 -0
- package/README.md +0 -0
- package/lib/Block.d.ts +388 -0
- package/lib/Block.js +631 -0
- package/lib/BlockInput.d.ts +213 -0
- package/lib/BlockInput.js +3 -0
- package/lib/Costume.d.ts +25 -0
- package/lib/Costume.js +23 -0
- package/lib/Data.d.ts +50 -0
- package/lib/Data.js +44 -0
- package/lib/OpCode.d.ts +212 -0
- package/lib/OpCode.js +219 -0
- package/lib/Project.d.ts +29 -0
- package/lib/Project.js +66 -0
- package/lib/Script.d.ts +16 -0
- package/lib/Script.js +62 -0
- package/lib/Sound.d.ts +21 -0
- package/lib/Sound.js +21 -0
- package/lib/Target.d.ts +47 -0
- package/lib/Target.js +120 -0
- package/lib/cli/index.d.ts +2 -0
- package/lib/cli/index.js +511 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.js +48 -0
- package/lib/io/leopard/toLeopard.d.ts +22 -0
- package/lib/io/leopard/toLeopard.js +2199 -0
- package/lib/io/sb2/fromSb2.d.ts +0 -0
- package/lib/io/sb2/fromSb2.js +2 -0
- package/lib/io/sb2/index.d.ts +48 -0
- package/lib/io/sb2/index.js +3 -0
- package/lib/io/sb2/toSb2.d.ts +0 -0
- package/lib/io/sb2/toSb2.js +2 -0
- package/lib/io/sb3/fromSb3.d.ts +16 -0
- package/lib/io/sb3/fromSb3.js +628 -0
- package/lib/io/sb3/interfaces.d.ts +624 -0
- package/lib/io/sb3/interfaces.js +336 -0
- package/lib/io/sb3/toSb3.d.ts +8 -0
- package/lib/io/sb3/toSb3.js +851 -0
- package/lib/io/scratchblocks/toScratchblocks.d.ts +7 -0
- package/lib/io/scratchblocks/toScratchblocks.js +606 -0
- package/lib/util/id.d.ts +1 -0
- package/lib/util/id.js +12 -0
- package/package.json +68 -0
|
@@ -0,0 +1,2199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
37
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
38
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
39
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
40
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
41
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
42
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
46
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
47
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
48
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
49
|
+
function step(op) {
|
|
50
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
51
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
52
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
53
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
54
|
+
switch (op[0]) {
|
|
55
|
+
case 0: case 1: t = op; break;
|
|
56
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
57
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
58
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
59
|
+
default:
|
|
60
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
61
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
62
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
63
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
64
|
+
if (t[2]) _.ops.pop();
|
|
65
|
+
_.trys.pop(); continue;
|
|
66
|
+
}
|
|
67
|
+
op = body.call(thisArg, _);
|
|
68
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
69
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
73
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
74
|
+
if (ar || !(i in from)) {
|
|
75
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
76
|
+
ar[i] = from[i];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
80
|
+
};
|
|
81
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
82
|
+
var OpCode_1 = require("../../OpCode");
|
|
83
|
+
var prettier = __importStar(require("prettier"));
|
|
84
|
+
var Data_1 = require("../../Data");
|
|
85
|
+
/**
|
|
86
|
+
* Words which are invalid for any JavaScript identifier to be, when it isn't
|
|
87
|
+
* on a namespace (like `this` or `this.vars`).
|
|
88
|
+
*
|
|
89
|
+
* This list may be more comprehensive than it needs to be in every case,
|
|
90
|
+
* erring to avoid potential issues.
|
|
91
|
+
*
|
|
92
|
+
* Mostly pulled from MDN:
|
|
93
|
+
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#reserved_words
|
|
94
|
+
*/
|
|
95
|
+
var JS_RESERVED_WORDS = [
|
|
96
|
+
"arguments",
|
|
97
|
+
"await",
|
|
98
|
+
"break",
|
|
99
|
+
"case",
|
|
100
|
+
"catch",
|
|
101
|
+
"class",
|
|
102
|
+
"const",
|
|
103
|
+
"continue",
|
|
104
|
+
"debugger",
|
|
105
|
+
"default",
|
|
106
|
+
"delete",
|
|
107
|
+
"do",
|
|
108
|
+
"else",
|
|
109
|
+
"enum",
|
|
110
|
+
"eval",
|
|
111
|
+
"export",
|
|
112
|
+
"extends",
|
|
113
|
+
"false",
|
|
114
|
+
"finally",
|
|
115
|
+
"for",
|
|
116
|
+
"function",
|
|
117
|
+
"if",
|
|
118
|
+
"implements",
|
|
119
|
+
"import",
|
|
120
|
+
"in",
|
|
121
|
+
"instanceof",
|
|
122
|
+
"interface",
|
|
123
|
+
"let",
|
|
124
|
+
"new",
|
|
125
|
+
"null",
|
|
126
|
+
"package",
|
|
127
|
+
"private",
|
|
128
|
+
"protected",
|
|
129
|
+
"public",
|
|
130
|
+
"return",
|
|
131
|
+
"static",
|
|
132
|
+
"super",
|
|
133
|
+
"switch",
|
|
134
|
+
"this",
|
|
135
|
+
"throw",
|
|
136
|
+
"true",
|
|
137
|
+
"try",
|
|
138
|
+
"typeof",
|
|
139
|
+
"yield",
|
|
140
|
+
"var",
|
|
141
|
+
"void",
|
|
142
|
+
"while",
|
|
143
|
+
"with"
|
|
144
|
+
];
|
|
145
|
+
/**
|
|
146
|
+
* Global identifiers which Leopard sprites (subclasses of `Sprite`) must not
|
|
147
|
+
* be named as, since that would overwrite or be a reference binding error.
|
|
148
|
+
*
|
|
149
|
+
* Only capitalized identifiers need to be listed here: generated sprite names
|
|
150
|
+
* will never conflict with identifiers whose first letter is lowercase.
|
|
151
|
+
* (This is also why JS reserved words aren't listed here - they're all
|
|
152
|
+
* lowercase, so don't conflict with generated sprite names.)
|
|
153
|
+
*
|
|
154
|
+
* However, it *must* include even (capitalized) identifiers which *aren't*
|
|
155
|
+
* provided by Leopard, if any part of generated Leopard code could directly
|
|
156
|
+
* refer to those identifiers (expecting some browser-provided value, rather
|
|
157
|
+
* than a generated `Sprite` subclass!).
|
|
158
|
+
*/
|
|
159
|
+
var LEOPARD_RESERVED_SPRITE_NAMES = [
|
|
160
|
+
// Flat-out syntax errors
|
|
161
|
+
"Infinity",
|
|
162
|
+
"NaN",
|
|
163
|
+
// Browser-provided identifiers
|
|
164
|
+
"Date",
|
|
165
|
+
"Math",
|
|
166
|
+
// Leopard-provided identifiers
|
|
167
|
+
"Color",
|
|
168
|
+
"Costume",
|
|
169
|
+
"Sound",
|
|
170
|
+
"Sprite",
|
|
171
|
+
"StageBase",
|
|
172
|
+
"Trigger",
|
|
173
|
+
"Watcher"
|
|
174
|
+
];
|
|
175
|
+
/**
|
|
176
|
+
* Property names which have special meaning in JavaScript. Custom properties
|
|
177
|
+
* must not overwrite these names, no matter the context.
|
|
178
|
+
*/
|
|
179
|
+
var JS_RESERVED_PROPERTIES = ["__proto__", "constructor", "prototype"];
|
|
180
|
+
/**
|
|
181
|
+
* Property names which are used by any Leopard target - these correspond to
|
|
182
|
+
* Leopard's `SpriteBase` abstract class. Properties here are present on
|
|
183
|
+
* sprites as well as the stage.
|
|
184
|
+
*
|
|
185
|
+
* Overwriting these properties would change behavior that Leopard itself
|
|
186
|
+
* provides and expects to be behave in certain ways. While this a coding wizard
|
|
187
|
+
* might like to take advantage of this in their own Leopard project, generated
|
|
188
|
+
* projects must never accidentally overwrite these!
|
|
189
|
+
*
|
|
190
|
+
* This list is a superset of `JS_RESERVED_PROPERTIES` (and so are all supersets
|
|
191
|
+
* of this list).
|
|
192
|
+
*
|
|
193
|
+
* Note that this is *not* a superset of ordinary JavaScript reserved
|
|
194
|
+
* words. Properties are always accessed with `this.${name}` syntax, not used
|
|
195
|
+
* as standalone identifiers (`let ${name} = foo`).
|
|
196
|
+
*/
|
|
197
|
+
var LEOPARD_RESERVED_SPRITE_BASE_PROPERTIES = __spreadArray(__spreadArray([], JS_RESERVED_PROPERTIES, true), [
|
|
198
|
+
// Internals
|
|
199
|
+
"_costumeNumber",
|
|
200
|
+
"_layerOrder",
|
|
201
|
+
"_project",
|
|
202
|
+
"_vars",
|
|
203
|
+
// Basic execution
|
|
204
|
+
"triggers",
|
|
205
|
+
"vars",
|
|
206
|
+
"warp",
|
|
207
|
+
// Other objects
|
|
208
|
+
"stage",
|
|
209
|
+
"sprites",
|
|
210
|
+
"watchers",
|
|
211
|
+
// Control & events
|
|
212
|
+
"broadcast",
|
|
213
|
+
"broadcastAndWait",
|
|
214
|
+
"wait",
|
|
215
|
+
// Operators - casting
|
|
216
|
+
"toNumber",
|
|
217
|
+
"toBoolean",
|
|
218
|
+
"toString",
|
|
219
|
+
"compare",
|
|
220
|
+
// Operators - strings
|
|
221
|
+
"stringIncludes",
|
|
222
|
+
"letterOf",
|
|
223
|
+
// Operators - numbers
|
|
224
|
+
"degToRad",
|
|
225
|
+
"degToScratch",
|
|
226
|
+
"radToDeg",
|
|
227
|
+
"radToScratch",
|
|
228
|
+
"random",
|
|
229
|
+
"scratchTan",
|
|
230
|
+
"scratchToDeg",
|
|
231
|
+
"scratchToRad",
|
|
232
|
+
"normalizeDeg",
|
|
233
|
+
"wrapClamp",
|
|
234
|
+
// Lists (arrays)
|
|
235
|
+
"arrayIncludes",
|
|
236
|
+
"indexInArray",
|
|
237
|
+
"itemOf",
|
|
238
|
+
// Sensing
|
|
239
|
+
"answer",
|
|
240
|
+
"askAndWait",
|
|
241
|
+
"keyPressed",
|
|
242
|
+
"loudness",
|
|
243
|
+
"mouse",
|
|
244
|
+
"restartTimer",
|
|
245
|
+
"timer",
|
|
246
|
+
// Looks
|
|
247
|
+
"costume",
|
|
248
|
+
"costumeNumber",
|
|
249
|
+
"costumes",
|
|
250
|
+
"effects",
|
|
251
|
+
// Sounds
|
|
252
|
+
"audioEffects",
|
|
253
|
+
"effectChain",
|
|
254
|
+
"getSound",
|
|
255
|
+
"getSoundsPlayedByMe",
|
|
256
|
+
"playSoundUntilDone",
|
|
257
|
+
"sounds",
|
|
258
|
+
"startSound",
|
|
259
|
+
"stopAllOfMySounds",
|
|
260
|
+
"stopAllSounds",
|
|
261
|
+
// Pen
|
|
262
|
+
"clearPen"
|
|
263
|
+
], false);
|
|
264
|
+
/**
|
|
265
|
+
* Property names which are used by Leopard stages (instances of `Stage`,
|
|
266
|
+
* whether any subclass or directly constructed from `Stage`). This list is
|
|
267
|
+
* a superset of `LEOPARD_RESERVED_SPRITE_BASE_PROPERTIES`.
|
|
268
|
+
*/
|
|
269
|
+
var LEOPARD_RESERVED_STAGE_PROPERTIES = __spreadArray(__spreadArray([], LEOPARD_RESERVED_SPRITE_BASE_PROPERTIES, true), [
|
|
270
|
+
// Essential properties
|
|
271
|
+
"__counter",
|
|
272
|
+
"fence",
|
|
273
|
+
"height",
|
|
274
|
+
"width",
|
|
275
|
+
// Events & control
|
|
276
|
+
"fireBackdropChanged"
|
|
277
|
+
], false);
|
|
278
|
+
/**
|
|
279
|
+
* Property names which are used by Leopard sprites (instances of `Sprite`,
|
|
280
|
+
* whether any subclass or directly constructed from `Sprite`). This list is
|
|
281
|
+
* a superset of `LEOPARD_RESERVED_SPRITE_BASE_PROPERTIES`.
|
|
282
|
+
*/
|
|
283
|
+
var LEOPARD_RESERVED_SPRITE_PROPERTIES = __spreadArray(__spreadArray([], LEOPARD_RESERVED_SPRITE_BASE_PROPERTIES, true), [
|
|
284
|
+
// Internals
|
|
285
|
+
"_direction",
|
|
286
|
+
"_penColor",
|
|
287
|
+
"_penDown",
|
|
288
|
+
"_speechBubble",
|
|
289
|
+
"_x",
|
|
290
|
+
"_y",
|
|
291
|
+
// Other objects
|
|
292
|
+
"andClones",
|
|
293
|
+
"clones",
|
|
294
|
+
"parent",
|
|
295
|
+
// Control & events
|
|
296
|
+
"createClone",
|
|
297
|
+
"deleteThisClone",
|
|
298
|
+
// Sensing
|
|
299
|
+
"colorTouching",
|
|
300
|
+
"touching",
|
|
301
|
+
"nearestEdge",
|
|
302
|
+
// Looks
|
|
303
|
+
"moveAhead",
|
|
304
|
+
"moveBehind",
|
|
305
|
+
"say",
|
|
306
|
+
"sayAndWait",
|
|
307
|
+
"size",
|
|
308
|
+
"think",
|
|
309
|
+
"thinkAndWait",
|
|
310
|
+
"visible",
|
|
311
|
+
// Motion
|
|
312
|
+
"direction",
|
|
313
|
+
"glide",
|
|
314
|
+
"goto",
|
|
315
|
+
"ifOnEdgeBounce",
|
|
316
|
+
"move",
|
|
317
|
+
"positionInFence",
|
|
318
|
+
"rotationStyle",
|
|
319
|
+
"x",
|
|
320
|
+
"y",
|
|
321
|
+
// Pen
|
|
322
|
+
"penColor",
|
|
323
|
+
"penDown",
|
|
324
|
+
"penSize",
|
|
325
|
+
"stamp"
|
|
326
|
+
], false);
|
|
327
|
+
/**
|
|
328
|
+
* Input shapes are the basic attribute controlling which of a set of syntaxes
|
|
329
|
+
* is returned for any given block (or primitive value). Provide an input shape
|
|
330
|
+
* to inputToJS to specify what kind of value should be provided as the value
|
|
331
|
+
* in that input. If the content of input does not match the desired shape, for
|
|
332
|
+
* example because it is a block which returns a different type than desired,
|
|
333
|
+
* it will be automatically cast to the correct type for use in the block.
|
|
334
|
+
*/
|
|
335
|
+
var InputShape;
|
|
336
|
+
(function (InputShape) {
|
|
337
|
+
/**
|
|
338
|
+
* Generic shape indicating that any kind of input is acceptable. The input
|
|
339
|
+
* will never be cast, and may be null, undefined, or any JavaScript value.
|
|
340
|
+
*/
|
|
341
|
+
InputShape["Any"] = "Any";
|
|
342
|
+
/**
|
|
343
|
+
* Number input shape. If the input block isn't guaranteed to be a number,
|
|
344
|
+
* it is automatically wrapped with this.toNumber(), which has particular
|
|
345
|
+
* behavior to match Scratch.
|
|
346
|
+
*/
|
|
347
|
+
InputShape["Number"] = "Number";
|
|
348
|
+
/**
|
|
349
|
+
* Special "index" shape, representing an arbitrary number which has been
|
|
350
|
+
* decremented (decreased by 1). Scratch lists are 1-based while JavaScript
|
|
351
|
+
* arrays and strings are indexed starting from 0, so all indexes converted
|
|
352
|
+
* from Scratch must be decreased to match. The "index" shape allows number
|
|
353
|
+
* primitives to be statically decremented, and blocks which include a plus
|
|
354
|
+
* or minus operator to automtaically "absorb" the following decrement.
|
|
355
|
+
*/
|
|
356
|
+
InputShape["Index"] = "Index";
|
|
357
|
+
/**
|
|
358
|
+
* String input shape. If the input block isn't guaranteed to be a string,
|
|
359
|
+
* it is automatically wrapped with this.toString(), which is just a wrapper
|
|
360
|
+
* around the built-in String() op but is written so for consistency.
|
|
361
|
+
*
|
|
362
|
+
* The string input shape also guarantees that primitive values which could
|
|
363
|
+
* be statically converted to a number, e.g. the string "1.234", will NOT be
|
|
364
|
+
* converted.
|
|
365
|
+
*/
|
|
366
|
+
InputShape["String"] = "String";
|
|
367
|
+
/**
|
|
368
|
+
* Boolean input shape. If the input block isn't guaranteed to be a boolean,
|
|
369
|
+
* it is automatically wrapped with this.toBoolean(), which has particular
|
|
370
|
+
* behavior to match Scratch. Note that Scratch doesn't have a concept of
|
|
371
|
+
* boolean primitives (no "true" or "false" blocks, nor a "switch" type
|
|
372
|
+
* control for directly inputting true/false as in Snap!).
|
|
373
|
+
*/
|
|
374
|
+
InputShape["Boolean"] = "Boolean";
|
|
375
|
+
/**
|
|
376
|
+
* "Stack" block, referring to blocks which can be put one after another and
|
|
377
|
+
* together represent a sequence of steps. Stack inputs may be empty and
|
|
378
|
+
* otherwise are one or more blocks. In JavaScript, there's no fundamental
|
|
379
|
+
* difference between a "function" for reporting values and a "command" for
|
|
380
|
+
* applying effects, so no additional syntax is required to cast any given
|
|
381
|
+
* input value to a stack.
|
|
382
|
+
*/
|
|
383
|
+
InputShape["Stack"] = "Stack";
|
|
384
|
+
})(InputShape || (InputShape = {}));
|
|
385
|
+
function uniqueNameFactory(reservedNames) {
|
|
386
|
+
if (reservedNames === void 0) { reservedNames = []; }
|
|
387
|
+
var usedNames = new Set(reservedNames);
|
|
388
|
+
return uniqueName;
|
|
389
|
+
function uniqueName(name) {
|
|
390
|
+
if (!usedNames.has(name)) {
|
|
391
|
+
usedNames.add(name);
|
|
392
|
+
return name;
|
|
393
|
+
}
|
|
394
|
+
var numResult = /\d+$/.exec(name);
|
|
395
|
+
if (numResult === null) {
|
|
396
|
+
return uniqueName(name + "2");
|
|
397
|
+
}
|
|
398
|
+
return uniqueName(name.slice(0, numResult.index) + String(parseInt(numResult[0], 10) + 1));
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
function camelCase(name, upper) {
|
|
402
|
+
if (upper === void 0) { upper = false; }
|
|
403
|
+
var validChars = /[^a-zA-Z0-9]/;
|
|
404
|
+
var ignoredChars = /[']/g;
|
|
405
|
+
var parts = name.replace(ignoredChars, "").split(validChars);
|
|
406
|
+
parts = parts.map(function (part) { return part.trim(); });
|
|
407
|
+
parts = parts.map(function (part) { return part.slice(0, 1).toUpperCase() + part.slice(1).toLowerCase(); });
|
|
408
|
+
if (!upper) {
|
|
409
|
+
parts[0] = parts[0].toLowerCase();
|
|
410
|
+
}
|
|
411
|
+
var result = parts.join("");
|
|
412
|
+
// A blank string is no good
|
|
413
|
+
if (result.length === 0) {
|
|
414
|
+
result = "_";
|
|
415
|
+
}
|
|
416
|
+
// Variable names cannot start with a number
|
|
417
|
+
if (!isNaN(parseInt(result[0], 10))) {
|
|
418
|
+
result = "_" + result;
|
|
419
|
+
}
|
|
420
|
+
return result;
|
|
421
|
+
}
|
|
422
|
+
function toLeopard(project, inOptions, prettierConfig) {
|
|
423
|
+
if (inOptions === void 0) { inOptions = {}; }
|
|
424
|
+
if (prettierConfig === void 0) { prettierConfig = {}; }
|
|
425
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
426
|
+
function staticBlockInputToLiteral(value, desiredInputShape) {
|
|
427
|
+
// Short-circuit for string inputs. These must never return number syntax.
|
|
428
|
+
if (desiredInputShape === InputShape.String) {
|
|
429
|
+
return JSON.stringify(value);
|
|
430
|
+
}
|
|
431
|
+
// Other input shapes which static inputs may fulfill: number, index, any.
|
|
432
|
+
// These are all OK to return JavaScript number literals for.
|
|
433
|
+
var asNum = Number(value);
|
|
434
|
+
if (!isNaN(asNum) && value !== "") {
|
|
435
|
+
if (desiredInputShape === InputShape.Index) {
|
|
436
|
+
return JSON.stringify(asNum - 1);
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
return JSON.stringify(asNum);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return JSON.stringify(value);
|
|
443
|
+
}
|
|
444
|
+
function triggerInitCode(script, target) {
|
|
445
|
+
var hat = script.hat;
|
|
446
|
+
if (hat === null) {
|
|
447
|
+
return null;
|
|
448
|
+
}
|
|
449
|
+
var triggerInitStr = function (name, options) {
|
|
450
|
+
var optionsStr = "";
|
|
451
|
+
if (options) {
|
|
452
|
+
var optionValues = [];
|
|
453
|
+
for (var _i = 0, _a = Object.entries(options); _i < _a.length; _i++) {
|
|
454
|
+
var _b = _a[_i], optionName = _b[0], optionValue = _b[1];
|
|
455
|
+
optionValues.push("".concat(optionName, ": ").concat(optionValue));
|
|
456
|
+
}
|
|
457
|
+
optionsStr = ", {".concat(optionValues.join(", "), "}");
|
|
458
|
+
}
|
|
459
|
+
return "new Trigger(Trigger.".concat(name).concat(optionsStr, ", this.").concat(script.name, ")");
|
|
460
|
+
};
|
|
461
|
+
switch (hat.opcode) {
|
|
462
|
+
case OpCode_1.OpCode.event_whenflagclicked:
|
|
463
|
+
return triggerInitStr("GREEN_FLAG");
|
|
464
|
+
case OpCode_1.OpCode.event_whenkeypressed:
|
|
465
|
+
return triggerInitStr("KEY_PRESSED", { key: JSON.stringify(hat.inputs.KEY_OPTION.value) });
|
|
466
|
+
case OpCode_1.OpCode.event_whenthisspriteclicked:
|
|
467
|
+
case OpCode_1.OpCode.event_whenstageclicked:
|
|
468
|
+
return triggerInitStr("CLICKED");
|
|
469
|
+
case OpCode_1.OpCode.event_whenbroadcastreceived:
|
|
470
|
+
return triggerInitStr("BROADCAST", { name: JSON.stringify(hat.inputs.BROADCAST_OPTION.value) });
|
|
471
|
+
case OpCode_1.OpCode.event_whengreaterthan: {
|
|
472
|
+
var valueInput = hat.inputs.VALUE;
|
|
473
|
+
// If the "greater than" value is a literal, we can include it directly.
|
|
474
|
+
// Otherwise, it's a block that may depend on sprite state and needs to
|
|
475
|
+
// be a function.
|
|
476
|
+
var value = valueInput.type === "block"
|
|
477
|
+
? "() => ".concat(blockToJSWithContext(valueInput.value, target))
|
|
478
|
+
: staticBlockInputToLiteral(valueInput.value, InputShape.Number);
|
|
479
|
+
return triggerInitStr("".concat(hat.inputs.WHENGREATERTHANMENU.value, "_GREATER_THAN"), {
|
|
480
|
+
VALUE: value
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
case OpCode_1.OpCode.control_start_as_clone:
|
|
484
|
+
return triggerInitStr("CLONE_START");
|
|
485
|
+
default:
|
|
486
|
+
return null;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
function scriptToJS(script, target) {
|
|
490
|
+
var body = script.body.map(function (block) { return blockToJSWithContext(block, target, script); }).join(";\n");
|
|
491
|
+
if (script.hat && script.hat.opcode === OpCode_1.OpCode.procedures_definition) {
|
|
492
|
+
return "\n * ".concat(script.name, "(").concat(script.hat.inputs.ARGUMENTS.value
|
|
493
|
+
.filter(function (arg) { return arg.type !== "label"; })
|
|
494
|
+
.map(function (arg) { return arg.name; })
|
|
495
|
+
.join(", "), ") {\n ").concat(body, "\n }\n ");
|
|
496
|
+
}
|
|
497
|
+
return "\n * ".concat(script.name, "() {\n ").concat(body, "\n }\n ");
|
|
498
|
+
}
|
|
499
|
+
function blockToJSWithContext(block, target, script) {
|
|
500
|
+
// This will be shared by all contained blockToJS calls, which should include
|
|
501
|
+
// all following/descendant relative to the provided one. Officially local names
|
|
502
|
+
// should be unique to the script, but if we don't have a script, they will still
|
|
503
|
+
// be unique to these "nearby" blocks (part of the same blockToJSWithContext call).
|
|
504
|
+
var uniqueLocalVarName;
|
|
505
|
+
if (script && uniqueLocalVarNameMap.has(script)) {
|
|
506
|
+
uniqueLocalVarName = uniqueLocalVarNameMap.get(script);
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
uniqueLocalVarName = uniqueNameFactory();
|
|
510
|
+
}
|
|
511
|
+
return blockToJS(block);
|
|
512
|
+
function increase(leftSide, input, allowIncrementDecrement) {
|
|
513
|
+
var n = parseNumber(input);
|
|
514
|
+
if (typeof n !== "number") {
|
|
515
|
+
return "".concat(leftSide, " += ").concat(inputToJS(input, InputShape.Number));
|
|
516
|
+
}
|
|
517
|
+
if (allowIncrementDecrement && n === 1) {
|
|
518
|
+
return "".concat(leftSide, "++");
|
|
519
|
+
}
|
|
520
|
+
else if (allowIncrementDecrement && n === -1) {
|
|
521
|
+
return "".concat(leftSide, "--");
|
|
522
|
+
}
|
|
523
|
+
else if (n >= 0) {
|
|
524
|
+
return "".concat(leftSide, " += ").concat(JSON.stringify(n));
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
return "".concat(leftSide, " -= ").concat(JSON.stringify(-n));
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
function decrease(leftSide, input, allowIncrementDecrement) {
|
|
531
|
+
var n = parseNumber(input);
|
|
532
|
+
if (typeof n !== "number") {
|
|
533
|
+
return "".concat(leftSide, " -= ").concat(inputToJS(input, InputShape.Number));
|
|
534
|
+
}
|
|
535
|
+
if (allowIncrementDecrement && n === 1) {
|
|
536
|
+
return "".concat(leftSide, "--");
|
|
537
|
+
}
|
|
538
|
+
else if (allowIncrementDecrement && n === -1) {
|
|
539
|
+
return "".concat(leftSide, "++");
|
|
540
|
+
}
|
|
541
|
+
else if (n > 0) {
|
|
542
|
+
return "".concat(leftSide, " -= ").concat(JSON.stringify(n));
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
return "".concat(leftSide, " += ").concat(JSON.stringify(-n));
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
function parseNumber(input) {
|
|
549
|
+
// Returns a number if the input was a primitive (static) value and was
|
|
550
|
+
// able to be parsed as a number; otherwise, returns null.
|
|
551
|
+
if (input.type === "block") {
|
|
552
|
+
return null;
|
|
553
|
+
}
|
|
554
|
+
var n = Number(input.value);
|
|
555
|
+
if (isNaN(n)) {
|
|
556
|
+
return null;
|
|
557
|
+
}
|
|
558
|
+
return n;
|
|
559
|
+
}
|
|
560
|
+
function spriteInputToJS(input) {
|
|
561
|
+
return "this.sprites[".concat(JSON.stringify(targetNameMap[input.value]), "]");
|
|
562
|
+
}
|
|
563
|
+
function colorInputToJS(input) {
|
|
564
|
+
if (input.type === "color") {
|
|
565
|
+
var _a = input.value, r = _a.r, g = _a.g, b = _a.b;
|
|
566
|
+
return "Color.rgb(".concat(r, ", ").concat(g, ", ").concat(b, ")");
|
|
567
|
+
}
|
|
568
|
+
else {
|
|
569
|
+
var num = inputToJS(input, InputShape.Number);
|
|
570
|
+
return "Color.num(".concat(num, ")");
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
function inputToJS(input, desiredInputShape) {
|
|
574
|
+
var _a, _b;
|
|
575
|
+
// TODO: Right now, inputs can be completely undefined if imported from
|
|
576
|
+
// the .sb3 format (because sb3 is weird). This little check will replace
|
|
577
|
+
// undefined inputs with the value `null`. In theory, this should
|
|
578
|
+
// eventually be removed when the sb3 import script is improved.
|
|
579
|
+
if (input === undefined) {
|
|
580
|
+
return "null";
|
|
581
|
+
}
|
|
582
|
+
switch (input.type) {
|
|
583
|
+
case "block": {
|
|
584
|
+
var inputSource = blockToJS(input.value, desiredInputShape);
|
|
585
|
+
if (desiredInputShape === InputShape.Stack) {
|
|
586
|
+
return inputSource;
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
return "(".concat(inputSource, ")");
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
case "blocks": {
|
|
593
|
+
return (_b = (_a = input.value) === null || _a === void 0 ? void 0 : _a.map(function (block) { return blockToJS(block); }).join(";\n")) !== null && _b !== void 0 ? _b : "";
|
|
594
|
+
}
|
|
595
|
+
default: {
|
|
596
|
+
return staticBlockInputToLiteral(input.value, desiredInputShape);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
function blockToJS(block, desiredInputShape) {
|
|
601
|
+
var warp = script && script.hat && script.hat.opcode === OpCode_1.OpCode.procedures_definition && script.hat.inputs.WARP.value;
|
|
602
|
+
// If the block contains a variable or list dropdown,
|
|
603
|
+
// get the code to grab that variable now for convenience
|
|
604
|
+
// TODO: set these to null and restructure control flow to avoid null checks
|
|
605
|
+
var selectedVarSource = "";
|
|
606
|
+
var selectedWatcherSource = "";
|
|
607
|
+
var varInputId = null;
|
|
608
|
+
if ("VARIABLE" in block.inputs) {
|
|
609
|
+
varInputId = block.inputs.VARIABLE.value.id;
|
|
610
|
+
}
|
|
611
|
+
else if ("LIST" in block.inputs) {
|
|
612
|
+
varInputId = block.inputs.LIST.value.id;
|
|
613
|
+
}
|
|
614
|
+
if (varInputId) {
|
|
615
|
+
var newName = variableNameMap[varInputId];
|
|
616
|
+
if (target === project.stage || !stageVariables.has(varInputId)) {
|
|
617
|
+
selectedVarSource = "this.vars.".concat(newName);
|
|
618
|
+
selectedWatcherSource = "this.watchers.".concat(newName);
|
|
619
|
+
}
|
|
620
|
+
else {
|
|
621
|
+
selectedVarSource = "this.stage.vars.".concat(newName);
|
|
622
|
+
selectedWatcherSource = "this.stage.watchers.".concat(newName);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
var stage = "this" + (target.isStage ? "" : ".stage");
|
|
626
|
+
var satisfiesInputShape;
|
|
627
|
+
var blockSource;
|
|
628
|
+
makeBlockSource: switch (block.opcode) {
|
|
629
|
+
case OpCode_1.OpCode.motion_movesteps: {
|
|
630
|
+
satisfiesInputShape = InputShape.Stack;
|
|
631
|
+
var steps = inputToJS(block.inputs.STEPS, InputShape.Number);
|
|
632
|
+
blockSource = "this.move(".concat(steps, ")");
|
|
633
|
+
break;
|
|
634
|
+
}
|
|
635
|
+
case OpCode_1.OpCode.motion_turnright: {
|
|
636
|
+
satisfiesInputShape = InputShape.Stack;
|
|
637
|
+
blockSource = increase("this.direction", block.inputs.DEGREES, false);
|
|
638
|
+
break;
|
|
639
|
+
}
|
|
640
|
+
case OpCode_1.OpCode.motion_turnleft: {
|
|
641
|
+
satisfiesInputShape = InputShape.Stack;
|
|
642
|
+
blockSource = decrease("this.direction", block.inputs.DEGREES, false);
|
|
643
|
+
break;
|
|
644
|
+
}
|
|
645
|
+
case OpCode_1.OpCode.motion_goto: {
|
|
646
|
+
satisfiesInputShape = InputShape.Stack;
|
|
647
|
+
var x = void 0;
|
|
648
|
+
var y = void 0;
|
|
649
|
+
switch (block.inputs.TO.value) {
|
|
650
|
+
case "_random_": {
|
|
651
|
+
x = "this.random(-240, 240)";
|
|
652
|
+
y = "this.random(-180, 180)";
|
|
653
|
+
break;
|
|
654
|
+
}
|
|
655
|
+
case "_mouse_": {
|
|
656
|
+
x = "this.mouse.x";
|
|
657
|
+
y = "this.mouse.y";
|
|
658
|
+
break;
|
|
659
|
+
}
|
|
660
|
+
default: {
|
|
661
|
+
var sprite = spriteInputToJS(block.inputs.TO);
|
|
662
|
+
x = "".concat(sprite, ".x");
|
|
663
|
+
y = "".concat(sprite, ".y");
|
|
664
|
+
break;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
blockSource = "this.goto(".concat(x, ", ").concat(y, ")");
|
|
668
|
+
break;
|
|
669
|
+
}
|
|
670
|
+
case OpCode_1.OpCode.motion_gotoxy: {
|
|
671
|
+
satisfiesInputShape = InputShape.Stack;
|
|
672
|
+
var x = inputToJS(block.inputs.X, InputShape.Number);
|
|
673
|
+
var y = inputToJS(block.inputs.Y, InputShape.Number);
|
|
674
|
+
blockSource = "this.goto(".concat(x, ", ").concat(y, ")");
|
|
675
|
+
break;
|
|
676
|
+
}
|
|
677
|
+
case OpCode_1.OpCode.motion_glideto: {
|
|
678
|
+
satisfiesInputShape = InputShape.Stack;
|
|
679
|
+
var secs = inputToJS(block.inputs.SECS, InputShape.Number);
|
|
680
|
+
var x = void 0;
|
|
681
|
+
var y = void 0;
|
|
682
|
+
switch (block.inputs.TO.value) {
|
|
683
|
+
case "_random_": {
|
|
684
|
+
x = "this.random(-240, 240)";
|
|
685
|
+
y = "this.random(-180, 180)";
|
|
686
|
+
break;
|
|
687
|
+
}
|
|
688
|
+
case "_mouse_": {
|
|
689
|
+
x = "this.mouse.x";
|
|
690
|
+
y = "this.mouse.y";
|
|
691
|
+
break;
|
|
692
|
+
}
|
|
693
|
+
default: {
|
|
694
|
+
var sprite = spriteInputToJS(block.inputs.TO);
|
|
695
|
+
x = "".concat(sprite, ".x");
|
|
696
|
+
y = "".concat(sprite, ".y");
|
|
697
|
+
break;
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
blockSource = "yield* this.glide(".concat(secs, ", ").concat(x, ", ").concat(y, ")");
|
|
701
|
+
break;
|
|
702
|
+
}
|
|
703
|
+
case OpCode_1.OpCode.motion_glidesecstoxy: {
|
|
704
|
+
satisfiesInputShape = InputShape.Stack;
|
|
705
|
+
var secs = inputToJS(block.inputs.SECS, InputShape.Number);
|
|
706
|
+
var x = inputToJS(block.inputs.X, InputShape.Number);
|
|
707
|
+
var y = inputToJS(block.inputs.Y, InputShape.Number);
|
|
708
|
+
blockSource = "yield* this.glide(".concat(secs, ", ").concat(x, ", ").concat(y, ")");
|
|
709
|
+
break;
|
|
710
|
+
}
|
|
711
|
+
case OpCode_1.OpCode.motion_pointindirection: {
|
|
712
|
+
satisfiesInputShape = InputShape.Stack;
|
|
713
|
+
var direction = inputToJS(block.inputs.DIRECTION, InputShape.Number);
|
|
714
|
+
blockSource = "this.direction = ".concat(direction);
|
|
715
|
+
break;
|
|
716
|
+
}
|
|
717
|
+
case OpCode_1.OpCode.motion_pointtowards: {
|
|
718
|
+
satisfiesInputShape = InputShape.Stack;
|
|
719
|
+
var x = void 0;
|
|
720
|
+
var y = void 0;
|
|
721
|
+
switch (block.inputs.TOWARDS.value) {
|
|
722
|
+
case "_mouse_": {
|
|
723
|
+
x = "this.mouse.x";
|
|
724
|
+
y = "this.mouse.y";
|
|
725
|
+
break;
|
|
726
|
+
}
|
|
727
|
+
default: {
|
|
728
|
+
var sprite = spriteInputToJS(block.inputs.TOWARDS);
|
|
729
|
+
x = "".concat(sprite, ".x");
|
|
730
|
+
y = "".concat(sprite, ".y");
|
|
731
|
+
break;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
blockSource = "this.direction = this.radToScratch(Math.atan2(".concat(y, " - this.y, ").concat(x, " - this.x))");
|
|
735
|
+
break;
|
|
736
|
+
}
|
|
737
|
+
case OpCode_1.OpCode.motion_changexby: {
|
|
738
|
+
satisfiesInputShape = InputShape.Stack;
|
|
739
|
+
blockSource = increase("this.x", block.inputs.DX, false);
|
|
740
|
+
break;
|
|
741
|
+
}
|
|
742
|
+
case OpCode_1.OpCode.motion_setx: {
|
|
743
|
+
satisfiesInputShape = InputShape.Stack;
|
|
744
|
+
var x = inputToJS(block.inputs.X, InputShape.Number);
|
|
745
|
+
blockSource = "this.x = ".concat(x);
|
|
746
|
+
break;
|
|
747
|
+
}
|
|
748
|
+
case OpCode_1.OpCode.motion_changeyby: {
|
|
749
|
+
satisfiesInputShape = InputShape.Stack;
|
|
750
|
+
blockSource = increase("this.y", block.inputs.DY, false);
|
|
751
|
+
break;
|
|
752
|
+
}
|
|
753
|
+
case OpCode_1.OpCode.motion_sety: {
|
|
754
|
+
satisfiesInputShape = InputShape.Stack;
|
|
755
|
+
var y = inputToJS(block.inputs.Y, InputShape.Number);
|
|
756
|
+
blockSource = "this.y = ".concat(y);
|
|
757
|
+
break;
|
|
758
|
+
}
|
|
759
|
+
case OpCode_1.OpCode.motion_ifonedgebounce: {
|
|
760
|
+
satisfiesInputShape = InputShape.Stack;
|
|
761
|
+
blockSource = "this.ifOnEdgeBounce()";
|
|
762
|
+
break;
|
|
763
|
+
}
|
|
764
|
+
case OpCode_1.OpCode.motion_setrotationstyle: {
|
|
765
|
+
satisfiesInputShape = InputShape.Stack;
|
|
766
|
+
var style = void 0;
|
|
767
|
+
switch (block.inputs.STYLE.value) {
|
|
768
|
+
case "left-right": {
|
|
769
|
+
style = "LEFT_RIGHT";
|
|
770
|
+
break;
|
|
771
|
+
}
|
|
772
|
+
case "don't rotate": {
|
|
773
|
+
style = "DONT_ROTATE";
|
|
774
|
+
break;
|
|
775
|
+
}
|
|
776
|
+
case "all around": {
|
|
777
|
+
style = "ALL_AROUND";
|
|
778
|
+
break;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
blockSource = "this.rotationStyle = Sprite.RotationStyle.".concat(style);
|
|
782
|
+
break;
|
|
783
|
+
}
|
|
784
|
+
case OpCode_1.OpCode.motion_xposition: {
|
|
785
|
+
satisfiesInputShape = InputShape.Number;
|
|
786
|
+
blockSource = "this.x";
|
|
787
|
+
break;
|
|
788
|
+
}
|
|
789
|
+
case OpCode_1.OpCode.motion_yposition: {
|
|
790
|
+
satisfiesInputShape = InputShape.Number;
|
|
791
|
+
blockSource = "this.y";
|
|
792
|
+
break;
|
|
793
|
+
}
|
|
794
|
+
case OpCode_1.OpCode.motion_direction: {
|
|
795
|
+
satisfiesInputShape = InputShape.Number;
|
|
796
|
+
blockSource = "this.direction";
|
|
797
|
+
break;
|
|
798
|
+
}
|
|
799
|
+
// Obsolete no-op blocks:
|
|
800
|
+
case OpCode_1.OpCode.motion_scroll_right:
|
|
801
|
+
case OpCode_1.OpCode.motion_scroll_up:
|
|
802
|
+
case OpCode_1.OpCode.motion_align_scene: {
|
|
803
|
+
satisfiesInputShape = InputShape.Stack;
|
|
804
|
+
blockSource = "";
|
|
805
|
+
break;
|
|
806
|
+
}
|
|
807
|
+
case OpCode_1.OpCode.motion_xscroll:
|
|
808
|
+
case OpCode_1.OpCode.motion_yscroll: {
|
|
809
|
+
satisfiesInputShape = InputShape.Any;
|
|
810
|
+
blockSource = "undefined"; // Compatibility with Scratch 3.0 \:)/
|
|
811
|
+
break;
|
|
812
|
+
}
|
|
813
|
+
case OpCode_1.OpCode.looks_sayforsecs: {
|
|
814
|
+
satisfiesInputShape = InputShape.Stack;
|
|
815
|
+
var message = inputToJS(block.inputs.MESSAGE, InputShape.Any);
|
|
816
|
+
var secs = inputToJS(block.inputs.SECS, InputShape.Number);
|
|
817
|
+
blockSource = "yield* this.sayAndWait(".concat(message, ", ").concat(secs, ")");
|
|
818
|
+
break;
|
|
819
|
+
}
|
|
820
|
+
case OpCode_1.OpCode.looks_say: {
|
|
821
|
+
satisfiesInputShape = InputShape.Stack;
|
|
822
|
+
var message = inputToJS(block.inputs.MESSAGE, InputShape.Any);
|
|
823
|
+
blockSource = "this.say(".concat(message, ")");
|
|
824
|
+
break;
|
|
825
|
+
}
|
|
826
|
+
case OpCode_1.OpCode.looks_thinkforsecs: {
|
|
827
|
+
satisfiesInputShape = InputShape.Stack;
|
|
828
|
+
var message = inputToJS(block.inputs.MESSAGE, InputShape.Any);
|
|
829
|
+
var secs = inputToJS(block.inputs.SECS, InputShape.Number);
|
|
830
|
+
blockSource = "yield* this.thinkAndWait(".concat(message, ", ").concat(secs, ")");
|
|
831
|
+
break;
|
|
832
|
+
}
|
|
833
|
+
case OpCode_1.OpCode.looks_think: {
|
|
834
|
+
satisfiesInputShape = InputShape.Stack;
|
|
835
|
+
var message = inputToJS(block.inputs.MESSAGE, InputShape.Any);
|
|
836
|
+
blockSource = "this.think(".concat(message, ")");
|
|
837
|
+
break;
|
|
838
|
+
}
|
|
839
|
+
case OpCode_1.OpCode.looks_switchcostumeto: {
|
|
840
|
+
satisfiesInputShape = InputShape.Stack;
|
|
841
|
+
var costume = inputToJS(block.inputs.COSTUME, InputShape.Any);
|
|
842
|
+
blockSource = "this.costume = ".concat(costume);
|
|
843
|
+
break;
|
|
844
|
+
}
|
|
845
|
+
case OpCode_1.OpCode.looks_nextcostume: {
|
|
846
|
+
satisfiesInputShape = InputShape.Stack;
|
|
847
|
+
blockSource = "this.costumeNumber++";
|
|
848
|
+
break;
|
|
849
|
+
}
|
|
850
|
+
case OpCode_1.OpCode.looks_switchbackdropto: {
|
|
851
|
+
satisfiesInputShape = InputShape.Stack;
|
|
852
|
+
var backdrop = inputToJS(block.inputs.BACKDROP, InputShape.Any);
|
|
853
|
+
blockSource = "".concat(stage, ".costume = ").concat(backdrop);
|
|
854
|
+
break;
|
|
855
|
+
}
|
|
856
|
+
case OpCode_1.OpCode.looks_nextbackdrop: {
|
|
857
|
+
satisfiesInputShape = InputShape.Stack;
|
|
858
|
+
blockSource = "".concat(stage, ".costumeNumber++");
|
|
859
|
+
break;
|
|
860
|
+
}
|
|
861
|
+
case OpCode_1.OpCode.looks_changesizeby: {
|
|
862
|
+
satisfiesInputShape = InputShape.Stack;
|
|
863
|
+
blockSource = increase("this.size", block.inputs.CHANGE, false);
|
|
864
|
+
break;
|
|
865
|
+
}
|
|
866
|
+
case OpCode_1.OpCode.looks_setsizeto: {
|
|
867
|
+
satisfiesInputShape = InputShape.Stack;
|
|
868
|
+
var size = inputToJS(block.inputs.SIZE, InputShape.Number);
|
|
869
|
+
blockSource = "this.size = ".concat(size);
|
|
870
|
+
break;
|
|
871
|
+
}
|
|
872
|
+
case OpCode_1.OpCode.looks_changeeffectby: {
|
|
873
|
+
satisfiesInputShape = InputShape.Stack;
|
|
874
|
+
var effect = block.inputs.EFFECT.value.toLowerCase();
|
|
875
|
+
blockSource = increase("this.effects.".concat(effect), block.inputs.CHANGE, false);
|
|
876
|
+
break;
|
|
877
|
+
}
|
|
878
|
+
case OpCode_1.OpCode.looks_seteffectto: {
|
|
879
|
+
satisfiesInputShape = InputShape.Stack;
|
|
880
|
+
var effect = block.inputs.EFFECT.value.toLowerCase();
|
|
881
|
+
var value = inputToJS(block.inputs.VALUE, InputShape.Number);
|
|
882
|
+
blockSource = "this.effects.".concat(effect, " = ").concat(value);
|
|
883
|
+
break;
|
|
884
|
+
}
|
|
885
|
+
case OpCode_1.OpCode.looks_cleargraphiceffects: {
|
|
886
|
+
satisfiesInputShape = InputShape.Stack;
|
|
887
|
+
blockSource = "this.effects.clear()";
|
|
888
|
+
break;
|
|
889
|
+
}
|
|
890
|
+
case OpCode_1.OpCode.looks_show: {
|
|
891
|
+
satisfiesInputShape = InputShape.Stack;
|
|
892
|
+
blockSource = "this.visible = true";
|
|
893
|
+
break;
|
|
894
|
+
}
|
|
895
|
+
case OpCode_1.OpCode.looks_hide: {
|
|
896
|
+
satisfiesInputShape = InputShape.Stack;
|
|
897
|
+
blockSource = "this.visible = false";
|
|
898
|
+
break;
|
|
899
|
+
}
|
|
900
|
+
case OpCode_1.OpCode.looks_gotofrontback: {
|
|
901
|
+
satisfiesInputShape = InputShape.Stack;
|
|
902
|
+
switch (block.inputs.FRONT_BACK.value) {
|
|
903
|
+
case "front": {
|
|
904
|
+
blockSource = "this.moveAhead()";
|
|
905
|
+
break;
|
|
906
|
+
}
|
|
907
|
+
case "back":
|
|
908
|
+
default: {
|
|
909
|
+
blockSource = "this.moveBehind()";
|
|
910
|
+
break;
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
break;
|
|
914
|
+
}
|
|
915
|
+
case OpCode_1.OpCode.looks_goforwardbackwardlayers: {
|
|
916
|
+
satisfiesInputShape = InputShape.Stack;
|
|
917
|
+
var num = inputToJS(block.inputs.NUM, InputShape.Number);
|
|
918
|
+
switch (block.inputs.FORWARD_BACKWARD.value) {
|
|
919
|
+
case "forward": {
|
|
920
|
+
blockSource = "this.moveAhead(".concat(num, ")");
|
|
921
|
+
break;
|
|
922
|
+
}
|
|
923
|
+
case "backward":
|
|
924
|
+
default: {
|
|
925
|
+
blockSource = "this.moveBehind(".concat(num, ")");
|
|
926
|
+
break;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
break;
|
|
930
|
+
}
|
|
931
|
+
// Obsolete no-op blocks:
|
|
932
|
+
case OpCode_1.OpCode.looks_hideallsprites:
|
|
933
|
+
case OpCode_1.OpCode.looks_changestretchby:
|
|
934
|
+
case OpCode_1.OpCode.looks_setstretchto: {
|
|
935
|
+
satisfiesInputShape = InputShape.Stack;
|
|
936
|
+
blockSource = "";
|
|
937
|
+
break;
|
|
938
|
+
}
|
|
939
|
+
case OpCode_1.OpCode.looks_costumenumbername: {
|
|
940
|
+
switch (block.inputs.NUMBER_NAME.value) {
|
|
941
|
+
case "name": {
|
|
942
|
+
satisfiesInputShape = InputShape.String;
|
|
943
|
+
blockSource = "this.costume.name";
|
|
944
|
+
break;
|
|
945
|
+
}
|
|
946
|
+
case "number":
|
|
947
|
+
default: {
|
|
948
|
+
satisfiesInputShape = InputShape.Number;
|
|
949
|
+
blockSource = "this.costumeNumber";
|
|
950
|
+
break;
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
break;
|
|
954
|
+
}
|
|
955
|
+
case OpCode_1.OpCode.looks_backdropnumbername: {
|
|
956
|
+
switch (block.inputs.NUMBER_NAME.value) {
|
|
957
|
+
case "name": {
|
|
958
|
+
satisfiesInputShape = InputShape.String;
|
|
959
|
+
blockSource = "".concat(stage, ".costume.name");
|
|
960
|
+
break;
|
|
961
|
+
}
|
|
962
|
+
case "number":
|
|
963
|
+
default: {
|
|
964
|
+
satisfiesInputShape = InputShape.Number;
|
|
965
|
+
blockSource = "".concat(stage, ".costumeNumber");
|
|
966
|
+
break;
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
break;
|
|
970
|
+
}
|
|
971
|
+
case OpCode_1.OpCode.looks_size: {
|
|
972
|
+
satisfiesInputShape = InputShape.Number;
|
|
973
|
+
blockSource = "this.size";
|
|
974
|
+
break;
|
|
975
|
+
}
|
|
976
|
+
case OpCode_1.OpCode.sound_playuntildone: {
|
|
977
|
+
satisfiesInputShape = InputShape.Stack;
|
|
978
|
+
var sound = inputToJS(block.inputs.SOUND_MENU, InputShape.Any);
|
|
979
|
+
blockSource = "yield* this.playSoundUntilDone(".concat(sound, ")");
|
|
980
|
+
break;
|
|
981
|
+
}
|
|
982
|
+
case OpCode_1.OpCode.sound_play: {
|
|
983
|
+
satisfiesInputShape = InputShape.Stack;
|
|
984
|
+
var sound = inputToJS(block.inputs.SOUND_MENU, InputShape.Any);
|
|
985
|
+
blockSource = "yield* this.startSound(".concat(sound, ")");
|
|
986
|
+
break;
|
|
987
|
+
}
|
|
988
|
+
case OpCode_1.OpCode.sound_setvolumeto: {
|
|
989
|
+
satisfiesInputShape = InputShape.Stack;
|
|
990
|
+
var volume = inputToJS(block.inputs.VOLUME, InputShape.Number);
|
|
991
|
+
blockSource = "this.audioEffects.volume = ".concat(volume);
|
|
992
|
+
break;
|
|
993
|
+
}
|
|
994
|
+
case OpCode_1.OpCode.sound_changevolumeby: {
|
|
995
|
+
satisfiesInputShape = InputShape.Stack;
|
|
996
|
+
blockSource = increase("this.audioEffects.volume", block.inputs.VOLUME, false);
|
|
997
|
+
break;
|
|
998
|
+
}
|
|
999
|
+
case OpCode_1.OpCode.sound_volume: {
|
|
1000
|
+
satisfiesInputShape = InputShape.Number;
|
|
1001
|
+
blockSource = "this.audioEffects.volume";
|
|
1002
|
+
break;
|
|
1003
|
+
}
|
|
1004
|
+
case OpCode_1.OpCode.sound_seteffectto: {
|
|
1005
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1006
|
+
var value = inputToJS(block.inputs.VALUE, InputShape.Number);
|
|
1007
|
+
if (block.inputs.EFFECT.type === "soundEffect") {
|
|
1008
|
+
var effect = block.inputs.EFFECT.value.toLowerCase();
|
|
1009
|
+
blockSource = "this.audioEffects.".concat(effect, " = ").concat(value);
|
|
1010
|
+
}
|
|
1011
|
+
else {
|
|
1012
|
+
var effect = inputToJS(block.inputs.EFFECT, InputShape.Any);
|
|
1013
|
+
blockSource = "this.audioEffects[".concat(effect, "] = ").concat(value);
|
|
1014
|
+
}
|
|
1015
|
+
break;
|
|
1016
|
+
}
|
|
1017
|
+
case OpCode_1.OpCode.sound_changeeffectby: {
|
|
1018
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1019
|
+
var value = block.inputs.VALUE;
|
|
1020
|
+
if (block.inputs.EFFECT.type === "soundEffect") {
|
|
1021
|
+
var effect = block.inputs.EFFECT.value.toLowerCase();
|
|
1022
|
+
blockSource = increase("this.audioEffects.".concat(effect), value, false);
|
|
1023
|
+
}
|
|
1024
|
+
else {
|
|
1025
|
+
var effect = inputToJS(block.inputs.EFFECT, InputShape.Any);
|
|
1026
|
+
blockSource = increase("this.audioEffects[".concat(effect, "]"), value, false);
|
|
1027
|
+
}
|
|
1028
|
+
break;
|
|
1029
|
+
}
|
|
1030
|
+
case OpCode_1.OpCode.sound_cleareffects: {
|
|
1031
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1032
|
+
blockSource = "this.audioEffects.clear()";
|
|
1033
|
+
break;
|
|
1034
|
+
}
|
|
1035
|
+
case OpCode_1.OpCode.sound_stopallsounds: {
|
|
1036
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1037
|
+
blockSource = "this.stopAllSounds()";
|
|
1038
|
+
break;
|
|
1039
|
+
}
|
|
1040
|
+
case OpCode_1.OpCode.event_broadcast: {
|
|
1041
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1042
|
+
var message = inputToJS(block.inputs.BROADCAST_INPUT, InputShape.String);
|
|
1043
|
+
blockSource = "this.broadcast(".concat(message, ")");
|
|
1044
|
+
break;
|
|
1045
|
+
}
|
|
1046
|
+
case OpCode_1.OpCode.event_broadcastandwait: {
|
|
1047
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1048
|
+
var message = inputToJS(block.inputs.BROADCAST_INPUT, InputShape.String);
|
|
1049
|
+
blockSource = "yield* this.broadcastAndWait(".concat(message, ")");
|
|
1050
|
+
break;
|
|
1051
|
+
}
|
|
1052
|
+
case OpCode_1.OpCode.control_wait: {
|
|
1053
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1054
|
+
var duration = inputToJS(block.inputs.DURATION, InputShape.Number);
|
|
1055
|
+
blockSource = "yield* this.wait(".concat(duration, ")");
|
|
1056
|
+
break;
|
|
1057
|
+
}
|
|
1058
|
+
case OpCode_1.OpCode.control_repeat: {
|
|
1059
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1060
|
+
var timesIsStatic = block.inputs.TIMES.type === "number";
|
|
1061
|
+
// Of course we convert blocks in a descending recursive hierarchy,
|
|
1062
|
+
// but we still need to make sure we get the relevant local var names
|
|
1063
|
+
// *before* processing the substack - which might include more "repeat"
|
|
1064
|
+
// blocks!
|
|
1065
|
+
var iVar = uniqueLocalVarName("i");
|
|
1066
|
+
var timesVar = timesIsStatic ? null : uniqueLocalVarName("times");
|
|
1067
|
+
var times = inputToJS(block.inputs.TIMES, InputShape.Number);
|
|
1068
|
+
var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
|
|
1069
|
+
if (timesIsStatic) {
|
|
1070
|
+
blockSource = "for (let ".concat(iVar, " = 0; ").concat(iVar, " < ").concat(times, "; ").concat(iVar, "++) {\n ").concat(substack, ";\n ").concat(warp ? "" : "yield;", "\n }");
|
|
1071
|
+
}
|
|
1072
|
+
else {
|
|
1073
|
+
blockSource = "for (let ".concat(iVar, " = 0, ").concat(timesVar, " = ").concat(times, "; ").concat(iVar, " < ").concat(timesVar, "; ").concat(iVar, "++) {\n ").concat(substack, ";\n ").concat(warp ? "" : "yield;", "\n }");
|
|
1074
|
+
}
|
|
1075
|
+
break;
|
|
1076
|
+
}
|
|
1077
|
+
case OpCode_1.OpCode.control_forever: {
|
|
1078
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1079
|
+
var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
|
|
1080
|
+
blockSource = "while (true) {\n ".concat(substack, ";\n ").concat(warp ? "" : "yield;", "\n }");
|
|
1081
|
+
break;
|
|
1082
|
+
}
|
|
1083
|
+
case OpCode_1.OpCode.control_if: {
|
|
1084
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1085
|
+
var condition = inputToJS(block.inputs.CONDITION, InputShape.Boolean);
|
|
1086
|
+
var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
|
|
1087
|
+
blockSource = "if (".concat(condition, ") {\n ").concat(substack, "\n }");
|
|
1088
|
+
break;
|
|
1089
|
+
}
|
|
1090
|
+
case OpCode_1.OpCode.control_if_else: {
|
|
1091
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1092
|
+
var condition = inputToJS(block.inputs.CONDITION, InputShape.Boolean);
|
|
1093
|
+
var substack1 = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
|
|
1094
|
+
var substack2 = inputToJS(block.inputs.SUBSTACK2, InputShape.Stack);
|
|
1095
|
+
blockSource = "if (".concat(condition, ") {\n ").concat(substack1, "\n } else {\n ").concat(substack2, "\n }");
|
|
1096
|
+
break;
|
|
1097
|
+
}
|
|
1098
|
+
case OpCode_1.OpCode.control_wait_until: {
|
|
1099
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1100
|
+
var condition = inputToJS(block.inputs.CONDITION, InputShape.Boolean);
|
|
1101
|
+
blockSource = "while (!".concat(condition, ") { yield; }");
|
|
1102
|
+
break;
|
|
1103
|
+
}
|
|
1104
|
+
case OpCode_1.OpCode.control_repeat_until: {
|
|
1105
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1106
|
+
var condition = inputToJS(block.inputs.CONDITION, InputShape.Boolean);
|
|
1107
|
+
var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
|
|
1108
|
+
blockSource = "while (!".concat(condition, ") {\n ").concat(substack, "\n ").concat(warp ? "" : "yield;", "\n }");
|
|
1109
|
+
break;
|
|
1110
|
+
}
|
|
1111
|
+
case OpCode_1.OpCode.control_while: {
|
|
1112
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1113
|
+
var condition = inputToJS(block.inputs.CONDITION, InputShape.Boolean);
|
|
1114
|
+
var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
|
|
1115
|
+
blockSource = "while (".concat(condition, ") {\n ").concat(substack, "\n ").concat(warp ? "" : "yield;", "\n }");
|
|
1116
|
+
break;
|
|
1117
|
+
}
|
|
1118
|
+
case OpCode_1.OpCode.control_for_each: {
|
|
1119
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1120
|
+
var value = inputToJS(block.inputs.VALUE, InputShape.Number);
|
|
1121
|
+
var substack = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
|
|
1122
|
+
// TODO: Verify compatibility if variable changes during evaluation
|
|
1123
|
+
blockSource = "for (".concat(selectedVarSource, " = 1; ").concat(selectedVarSource, " <= ").concat(value, "; ").concat(selectedVarSource, "++) {\n ").concat(substack, "\n ").concat(warp ? "" : "yield;", "\n }");
|
|
1124
|
+
break;
|
|
1125
|
+
}
|
|
1126
|
+
case OpCode_1.OpCode.control_all_at_once: {
|
|
1127
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1128
|
+
blockSource = inputToJS(block.inputs.SUBSTACK, InputShape.Stack);
|
|
1129
|
+
break;
|
|
1130
|
+
}
|
|
1131
|
+
case OpCode_1.OpCode.control_stop: {
|
|
1132
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1133
|
+
switch (block.inputs.STOP_OPTION.value) {
|
|
1134
|
+
case "this script": {
|
|
1135
|
+
blockSource = "\n this.stop(\"stop\");\n return;\n ";
|
|
1136
|
+
break;
|
|
1137
|
+
}
|
|
1138
|
+
case "other scripts in sprite": {
|
|
1139
|
+
blockSource = "this.stop(\"stopOther\")";
|
|
1140
|
+
break;
|
|
1141
|
+
}
|
|
1142
|
+
case "all": {
|
|
1143
|
+
blockSource = "\n this.stop(\"stopAll\");\n return;\n ";
|
|
1144
|
+
break;
|
|
1145
|
+
}
|
|
1146
|
+
default: {
|
|
1147
|
+
blockSource = "this.stop(\"stopAll\")";
|
|
1148
|
+
break;
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
break;
|
|
1152
|
+
}
|
|
1153
|
+
case OpCode_1.OpCode.control_create_clone_of: {
|
|
1154
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1155
|
+
var target_1;
|
|
1156
|
+
switch (block.inputs.CLONE_OPTION.value) {
|
|
1157
|
+
case "_myself_": {
|
|
1158
|
+
target_1 = "this";
|
|
1159
|
+
break;
|
|
1160
|
+
}
|
|
1161
|
+
default: {
|
|
1162
|
+
target_1 = spriteInputToJS(block.inputs.CLONE_OPTION);
|
|
1163
|
+
break;
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
blockSource = "".concat(target_1, ".createClone()");
|
|
1167
|
+
break;
|
|
1168
|
+
}
|
|
1169
|
+
case OpCode_1.OpCode.control_delete_this_clone: {
|
|
1170
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1171
|
+
blockSource = "this.deleteThisClone()";
|
|
1172
|
+
break;
|
|
1173
|
+
}
|
|
1174
|
+
case OpCode_1.OpCode.control_get_counter: {
|
|
1175
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1176
|
+
blockSource = "".concat(stage, ".__counter");
|
|
1177
|
+
break;
|
|
1178
|
+
}
|
|
1179
|
+
case OpCode_1.OpCode.control_incr_counter: {
|
|
1180
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1181
|
+
blockSource = "".concat(stage, ".__counter++");
|
|
1182
|
+
break;
|
|
1183
|
+
}
|
|
1184
|
+
case OpCode_1.OpCode.control_clear_counter: {
|
|
1185
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1186
|
+
blockSource = "".concat(stage, ".__counter = 0");
|
|
1187
|
+
break;
|
|
1188
|
+
}
|
|
1189
|
+
case OpCode_1.OpCode.sensing_touchingobject: {
|
|
1190
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1191
|
+
var target_2;
|
|
1192
|
+
switch (block.inputs.TOUCHINGOBJECTMENU.value) {
|
|
1193
|
+
case "_mouse_": {
|
|
1194
|
+
target_2 = JSON.stringify("mouse");
|
|
1195
|
+
break;
|
|
1196
|
+
}
|
|
1197
|
+
case "_edge_": {
|
|
1198
|
+
target_2 = JSON.stringify("edge");
|
|
1199
|
+
break;
|
|
1200
|
+
}
|
|
1201
|
+
default: {
|
|
1202
|
+
var sprite = spriteInputToJS(block.inputs.TOUCHINGOBJECTMENU);
|
|
1203
|
+
target_2 = "".concat(sprite, ".andClones()");
|
|
1204
|
+
break;
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
blockSource = "this.touching(".concat(target_2, ")");
|
|
1208
|
+
break;
|
|
1209
|
+
}
|
|
1210
|
+
case OpCode_1.OpCode.sensing_touchingcolor: {
|
|
1211
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1212
|
+
var color = colorInputToJS(block.inputs.COLOR);
|
|
1213
|
+
blockSource = "this.touching(".concat(color, ")");
|
|
1214
|
+
break;
|
|
1215
|
+
}
|
|
1216
|
+
case OpCode_1.OpCode.sensing_coloristouchingcolor: {
|
|
1217
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1218
|
+
var color1 = colorInputToJS(block.inputs.COLOR);
|
|
1219
|
+
var color2 = colorInputToJS(block.inputs.COLOR2);
|
|
1220
|
+
blockSource = "this.colorTouching(".concat(color1, ", ").concat(color2, ")");
|
|
1221
|
+
break;
|
|
1222
|
+
}
|
|
1223
|
+
case OpCode_1.OpCode.sensing_distanceto: {
|
|
1224
|
+
satisfiesInputShape = InputShape.Number;
|
|
1225
|
+
var x = void 0;
|
|
1226
|
+
var y = void 0;
|
|
1227
|
+
switch (block.inputs.DISTANCETOMENU.value) {
|
|
1228
|
+
case "_mouse_": {
|
|
1229
|
+
x = "this.mouse.x";
|
|
1230
|
+
y = "this.mouse.y";
|
|
1231
|
+
break;
|
|
1232
|
+
}
|
|
1233
|
+
default: {
|
|
1234
|
+
var sprite = spriteInputToJS(block.inputs.DISTANCETOMENU);
|
|
1235
|
+
x = "".concat(sprite, ".x");
|
|
1236
|
+
y = "".concat(sprite, ".y");
|
|
1237
|
+
break;
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
blockSource = "Math.hypot(".concat(x, " - this.x, ").concat(y, " - this.y)");
|
|
1241
|
+
break;
|
|
1242
|
+
}
|
|
1243
|
+
case OpCode_1.OpCode.sensing_askandwait: {
|
|
1244
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1245
|
+
var question = inputToJS(block.inputs.QUESTION, InputShape.Any);
|
|
1246
|
+
blockSource = "yield* this.askAndWait(".concat(question, ")");
|
|
1247
|
+
break;
|
|
1248
|
+
}
|
|
1249
|
+
case OpCode_1.OpCode.sensing_answer: {
|
|
1250
|
+
satisfiesInputShape = InputShape.String;
|
|
1251
|
+
blockSource = "this.answer";
|
|
1252
|
+
break;
|
|
1253
|
+
}
|
|
1254
|
+
case OpCode_1.OpCode.sensing_keypressed: {
|
|
1255
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1256
|
+
var key = inputToJS(block.inputs.KEY_OPTION, InputShape.String);
|
|
1257
|
+
blockSource = "this.keyPressed(".concat(key, ")");
|
|
1258
|
+
break;
|
|
1259
|
+
}
|
|
1260
|
+
case OpCode_1.OpCode.sensing_mousedown: {
|
|
1261
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1262
|
+
blockSource = "this.mouse.down";
|
|
1263
|
+
break;
|
|
1264
|
+
}
|
|
1265
|
+
case OpCode_1.OpCode.sensing_mousex: {
|
|
1266
|
+
satisfiesInputShape = InputShape.Number;
|
|
1267
|
+
blockSource = "this.mouse.x";
|
|
1268
|
+
break;
|
|
1269
|
+
}
|
|
1270
|
+
case OpCode_1.OpCode.sensing_mousey: {
|
|
1271
|
+
satisfiesInputShape = InputShape.Number;
|
|
1272
|
+
blockSource = "this.mouse.y";
|
|
1273
|
+
break;
|
|
1274
|
+
}
|
|
1275
|
+
case OpCode_1.OpCode.sensing_loudness: {
|
|
1276
|
+
satisfiesInputShape = InputShape.Number;
|
|
1277
|
+
blockSource = "this.loudness";
|
|
1278
|
+
break;
|
|
1279
|
+
}
|
|
1280
|
+
case OpCode_1.OpCode.sensing_timer: {
|
|
1281
|
+
satisfiesInputShape = InputShape.Number;
|
|
1282
|
+
blockSource = "this.timer";
|
|
1283
|
+
break;
|
|
1284
|
+
}
|
|
1285
|
+
case OpCode_1.OpCode.sensing_resettimer: {
|
|
1286
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1287
|
+
blockSource = "this.restartTimer()";
|
|
1288
|
+
break;
|
|
1289
|
+
}
|
|
1290
|
+
case OpCode_1.OpCode.sensing_of: {
|
|
1291
|
+
var propName = void 0;
|
|
1292
|
+
switch (block.inputs.PROPERTY.value) {
|
|
1293
|
+
case "x position": {
|
|
1294
|
+
satisfiesInputShape = InputShape.Number;
|
|
1295
|
+
propName = "x";
|
|
1296
|
+
break;
|
|
1297
|
+
}
|
|
1298
|
+
case "y position": {
|
|
1299
|
+
satisfiesInputShape = InputShape.Number;
|
|
1300
|
+
propName = "y";
|
|
1301
|
+
break;
|
|
1302
|
+
}
|
|
1303
|
+
case "direction": {
|
|
1304
|
+
satisfiesInputShape = InputShape.Number;
|
|
1305
|
+
propName = "direction";
|
|
1306
|
+
break;
|
|
1307
|
+
}
|
|
1308
|
+
case "costume #":
|
|
1309
|
+
case "backdrop #": {
|
|
1310
|
+
satisfiesInputShape = InputShape.Number;
|
|
1311
|
+
propName = "costumeNumber";
|
|
1312
|
+
break;
|
|
1313
|
+
}
|
|
1314
|
+
case "costume name":
|
|
1315
|
+
case "backdrop name": {
|
|
1316
|
+
satisfiesInputShape = InputShape.String;
|
|
1317
|
+
propName = "costume.name";
|
|
1318
|
+
break;
|
|
1319
|
+
}
|
|
1320
|
+
case "size": {
|
|
1321
|
+
satisfiesInputShape = InputShape.Number;
|
|
1322
|
+
propName = "size";
|
|
1323
|
+
break;
|
|
1324
|
+
}
|
|
1325
|
+
case "volume": {
|
|
1326
|
+
satisfiesInputShape = InputShape.Number;
|
|
1327
|
+
propName = "audioEffects.volume";
|
|
1328
|
+
break;
|
|
1329
|
+
}
|
|
1330
|
+
default: {
|
|
1331
|
+
satisfiesInputShape = InputShape.Any;
|
|
1332
|
+
var varOwner = project.stage;
|
|
1333
|
+
if (block.inputs.OBJECT.value !== "_stage_") {
|
|
1334
|
+
var sprite = project.sprites.find(function (sprite) { return sprite.name === targetNameMap[block.inputs.OBJECT.value]; });
|
|
1335
|
+
if (sprite) {
|
|
1336
|
+
varOwner = sprite;
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
// "of" block gets variables by name, not ID, using lookupVariableByNameAndType in scratch-vm.
|
|
1340
|
+
var variable = varOwner.variables.find(function (variable) { return variable.name === block.inputs.PROPERTY.value; });
|
|
1341
|
+
if (!variable) {
|
|
1342
|
+
satisfiesInputShape = InputShape.Number;
|
|
1343
|
+
blockSource = "(0 /* ".concat(varOwner.name, " doesn't have a \"").concat(block.inputs.PROPERTY.value, "\" variable */)");
|
|
1344
|
+
break makeBlockSource;
|
|
1345
|
+
}
|
|
1346
|
+
propName = "vars.".concat(variableNameMap[variable.id]);
|
|
1347
|
+
break;
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
if (propName === null) {
|
|
1351
|
+
blockSource = "/* Cannot access property ".concat(block.inputs.PROPERTY.value, " of target */ null");
|
|
1352
|
+
break;
|
|
1353
|
+
}
|
|
1354
|
+
var targetObj = void 0;
|
|
1355
|
+
if (block.inputs.OBJECT.value === "_stage_") {
|
|
1356
|
+
targetObj = "this.stage";
|
|
1357
|
+
}
|
|
1358
|
+
else {
|
|
1359
|
+
targetObj = spriteInputToJS(block.inputs.OBJECT);
|
|
1360
|
+
}
|
|
1361
|
+
blockSource = "".concat(targetObj, ".").concat(propName);
|
|
1362
|
+
break;
|
|
1363
|
+
}
|
|
1364
|
+
case OpCode_1.OpCode.sensing_current: {
|
|
1365
|
+
satisfiesInputShape = InputShape.Number;
|
|
1366
|
+
switch (block.inputs.CURRENTMENU.value) {
|
|
1367
|
+
case "YEAR": {
|
|
1368
|
+
blockSource = "new Date().getFullYear()";
|
|
1369
|
+
break;
|
|
1370
|
+
}
|
|
1371
|
+
case "MONTH": {
|
|
1372
|
+
blockSource = "new Date().getMonth() + 1";
|
|
1373
|
+
break;
|
|
1374
|
+
}
|
|
1375
|
+
case "DATE": {
|
|
1376
|
+
blockSource = "new Date().getDate()";
|
|
1377
|
+
break;
|
|
1378
|
+
}
|
|
1379
|
+
case "DAYOFWEEK": {
|
|
1380
|
+
blockSource = "new Date().getDay() + 1";
|
|
1381
|
+
break;
|
|
1382
|
+
}
|
|
1383
|
+
case "HOUR": {
|
|
1384
|
+
blockSource = "new Date().getHours()";
|
|
1385
|
+
break;
|
|
1386
|
+
}
|
|
1387
|
+
case "MINUTE": {
|
|
1388
|
+
blockSource = "new Date().getMinutes()";
|
|
1389
|
+
break;
|
|
1390
|
+
}
|
|
1391
|
+
case "SECOND": {
|
|
1392
|
+
blockSource = "new Date().getSeconds()";
|
|
1393
|
+
break;
|
|
1394
|
+
}
|
|
1395
|
+
default: {
|
|
1396
|
+
satisfiesInputShape = InputShape.String;
|
|
1397
|
+
blockSource = "\"\"";
|
|
1398
|
+
break;
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
break;
|
|
1402
|
+
}
|
|
1403
|
+
case OpCode_1.OpCode.sensing_dayssince2000: {
|
|
1404
|
+
satisfiesInputShape = InputShape.Number;
|
|
1405
|
+
blockSource = "((new Date().getTime() - new Date(2000, 0, 1)) / 1000 / 60 + new Date().getTimezoneOffset()) / 60 / 24";
|
|
1406
|
+
break;
|
|
1407
|
+
}
|
|
1408
|
+
case OpCode_1.OpCode.sensing_username: {
|
|
1409
|
+
satisfiesInputShape = InputShape.String;
|
|
1410
|
+
blockSource = "(/* no username */ \"\")";
|
|
1411
|
+
break;
|
|
1412
|
+
}
|
|
1413
|
+
case OpCode_1.OpCode.sensing_userid: {
|
|
1414
|
+
satisfiesInputShape = InputShape.Any;
|
|
1415
|
+
blockSource = "undefined"; // Obsolete no-op block.
|
|
1416
|
+
break;
|
|
1417
|
+
}
|
|
1418
|
+
case OpCode_1.OpCode.operator_add: {
|
|
1419
|
+
satisfiesInputShape = InputShape.Number;
|
|
1420
|
+
var num1 = inputToJS(block.inputs.NUM1, InputShape.Number);
|
|
1421
|
+
var num2 = inputToJS(block.inputs.NUM2, InputShape.Number);
|
|
1422
|
+
if (desiredInputShape === InputShape.Index) {
|
|
1423
|
+
// Attempt to fulfill a desired index input by subtracting 1 from either side
|
|
1424
|
+
// of the block. If neither side can be parsed as a number (i.e. both inputs
|
|
1425
|
+
// are filled with blocks), this clause just falls back to the normal number
|
|
1426
|
+
// shape.
|
|
1427
|
+
var val1 = parseNumber(block.inputs.NUM1);
|
|
1428
|
+
var val2 = parseNumber(block.inputs.NUM2);
|
|
1429
|
+
if (typeof val2 === "number") {
|
|
1430
|
+
satisfiesInputShape = InputShape.Index;
|
|
1431
|
+
blockSource = --val2 ? "".concat(num1, " + ").concat(val2) : num1;
|
|
1432
|
+
break;
|
|
1433
|
+
}
|
|
1434
|
+
else if (typeof val1 === "number") {
|
|
1435
|
+
satisfiesInputShape = InputShape.Index;
|
|
1436
|
+
blockSource = --val1 ? "".concat(val1, " + ").concat(num2) : num2;
|
|
1437
|
+
break;
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1440
|
+
blockSource = "".concat(num1, " + ").concat(num2);
|
|
1441
|
+
break;
|
|
1442
|
+
}
|
|
1443
|
+
case OpCode_1.OpCode.operator_subtract: {
|
|
1444
|
+
satisfiesInputShape = InputShape.Number;
|
|
1445
|
+
var num1 = inputToJS(block.inputs.NUM1, InputShape.Number);
|
|
1446
|
+
var num2 = inputToJS(block.inputs.NUM2, InputShape.Number);
|
|
1447
|
+
if (desiredInputShape === InputShape.Index) {
|
|
1448
|
+
// Do basically the same thing as the addition operator does, but with
|
|
1449
|
+
// specifics for subtraction: increment the right-hand or decrement the
|
|
1450
|
+
// left-hand.
|
|
1451
|
+
var val1 = parseNumber(block.inputs.NUM1);
|
|
1452
|
+
var val2 = parseNumber(block.inputs.NUM2);
|
|
1453
|
+
if (typeof val2 === "number") {
|
|
1454
|
+
satisfiesInputShape = InputShape.Index;
|
|
1455
|
+
blockSource = ++val2 ? "".concat(num1, " - ").concat(val2) : num1;
|
|
1456
|
+
break;
|
|
1457
|
+
}
|
|
1458
|
+
else if (typeof val1 === "number") {
|
|
1459
|
+
satisfiesInputShape = InputShape.Index;
|
|
1460
|
+
blockSource = --val1 ? "".concat(val1, " - ").concat(num2) : "-".concat(num2);
|
|
1461
|
+
break;
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
blockSource = "".concat(num1, " - ").concat(num2);
|
|
1465
|
+
break;
|
|
1466
|
+
}
|
|
1467
|
+
case OpCode_1.OpCode.operator_multiply: {
|
|
1468
|
+
satisfiesInputShape = InputShape.Number;
|
|
1469
|
+
var num1 = inputToJS(block.inputs.NUM1, InputShape.Number);
|
|
1470
|
+
var num2 = inputToJS(block.inputs.NUM2, InputShape.Number);
|
|
1471
|
+
blockSource = "".concat(num1, " * ").concat(num2);
|
|
1472
|
+
break;
|
|
1473
|
+
}
|
|
1474
|
+
case OpCode_1.OpCode.operator_divide: {
|
|
1475
|
+
satisfiesInputShape = InputShape.Number;
|
|
1476
|
+
var num1 = inputToJS(block.inputs.NUM1, InputShape.Number);
|
|
1477
|
+
var num2 = inputToJS(block.inputs.NUM2, InputShape.Number);
|
|
1478
|
+
blockSource = "".concat(num1, " / ").concat(num2);
|
|
1479
|
+
break;
|
|
1480
|
+
}
|
|
1481
|
+
case OpCode_1.OpCode.operator_random: {
|
|
1482
|
+
satisfiesInputShape = InputShape.Number;
|
|
1483
|
+
var from = inputToJS(block.inputs.FROM, InputShape.Number);
|
|
1484
|
+
var to = inputToJS(block.inputs.TO, InputShape.Number);
|
|
1485
|
+
blockSource = "this.random(".concat(from, ", ").concat(to, ")");
|
|
1486
|
+
break;
|
|
1487
|
+
}
|
|
1488
|
+
case OpCode_1.OpCode.operator_gt: {
|
|
1489
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1490
|
+
var operand1 = inputToJS(block.inputs.OPERAND1, InputShape.Any);
|
|
1491
|
+
var operand2 = inputToJS(block.inputs.OPERAND2, InputShape.Any);
|
|
1492
|
+
blockSource = "this.compare(".concat(operand1, ", ").concat(operand2, ") > 0");
|
|
1493
|
+
break;
|
|
1494
|
+
}
|
|
1495
|
+
case OpCode_1.OpCode.operator_lt: {
|
|
1496
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1497
|
+
var operand1 = inputToJS(block.inputs.OPERAND1, InputShape.Any);
|
|
1498
|
+
var operand2 = inputToJS(block.inputs.OPERAND2, InputShape.Any);
|
|
1499
|
+
blockSource = "this.compare(".concat(operand1, ", ").concat(operand2, ") < 0");
|
|
1500
|
+
break;
|
|
1501
|
+
}
|
|
1502
|
+
case OpCode_1.OpCode.operator_equals: {
|
|
1503
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1504
|
+
// If both sides are blocks, we can't make any assumptions about what kind of
|
|
1505
|
+
// values are being compared.(*) Use the custom .compare() function to ensure
|
|
1506
|
+
// compatibility with Scratch's equals block.
|
|
1507
|
+
//
|
|
1508
|
+
// (*) This is theoretically false, but we currently don't have a way to inspect
|
|
1509
|
+
// the returned InputShape of a block input to see if both sides match up.
|
|
1510
|
+
if (block.inputs.OPERAND1.type === "block" &&
|
|
1511
|
+
block.inputs.OPERAND2.type === "block") {
|
|
1512
|
+
var operand1_1 = inputToJS(block.inputs.OPERAND1, InputShape.Any);
|
|
1513
|
+
var operand2_1 = inputToJS(block.inputs.OPERAND2, InputShape.Any);
|
|
1514
|
+
blockSource = "this.compare(".concat(operand1_1, ", ").concat(operand2_1, ") === 0");
|
|
1515
|
+
break;
|
|
1516
|
+
}
|
|
1517
|
+
// From this point on, either the left- or right-hand side is definitely a
|
|
1518
|
+
// primitive (or both).
|
|
1519
|
+
var val1 = parseNumber(block.inputs.OPERAND1);
|
|
1520
|
+
if (typeof val1 === "number") {
|
|
1521
|
+
var operand2_2 = inputToJS(block.inputs.OPERAND2, InputShape.Number);
|
|
1522
|
+
blockSource = "".concat(val1, " === ").concat(operand2_2);
|
|
1523
|
+
break;
|
|
1524
|
+
}
|
|
1525
|
+
var val2 = parseNumber(block.inputs.OPERAND2);
|
|
1526
|
+
if (typeof val2 === "number") {
|
|
1527
|
+
var operand1_2 = inputToJS(block.inputs.OPERAND1, InputShape.Number);
|
|
1528
|
+
blockSource = "".concat(operand1_2, " === ").concat(val2);
|
|
1529
|
+
break;
|
|
1530
|
+
}
|
|
1531
|
+
// If neither side was parsed as a number, one side is definitely a string.
|
|
1532
|
+
// Compare both sides as strings.
|
|
1533
|
+
// TODO: Shouldn't this be case-insensitive?
|
|
1534
|
+
var operand1 = inputToJS(block.inputs.OPERAND1, InputShape.String);
|
|
1535
|
+
var operand2 = inputToJS(block.inputs.OPERAND2, InputShape.String);
|
|
1536
|
+
blockSource = "".concat(operand1, " === ").concat(operand2);
|
|
1537
|
+
break;
|
|
1538
|
+
}
|
|
1539
|
+
case OpCode_1.OpCode.operator_and: {
|
|
1540
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1541
|
+
var operand1 = inputToJS(block.inputs.OPERAND1, InputShape.Boolean);
|
|
1542
|
+
var operand2 = inputToJS(block.inputs.OPERAND2, InputShape.Boolean);
|
|
1543
|
+
blockSource = "".concat(operand1, " && ").concat(operand2);
|
|
1544
|
+
break;
|
|
1545
|
+
}
|
|
1546
|
+
case OpCode_1.OpCode.operator_or: {
|
|
1547
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1548
|
+
var operand1 = inputToJS(block.inputs.OPERAND1, InputShape.Boolean);
|
|
1549
|
+
var operand2 = inputToJS(block.inputs.OPERAND2, InputShape.Boolean);
|
|
1550
|
+
blockSource = "".concat(operand1, " || ").concat(operand2);
|
|
1551
|
+
break;
|
|
1552
|
+
}
|
|
1553
|
+
case OpCode_1.OpCode.operator_not: {
|
|
1554
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1555
|
+
var operand = inputToJS(block.inputs.OPERAND, InputShape.Boolean);
|
|
1556
|
+
blockSource = "!".concat(operand);
|
|
1557
|
+
break;
|
|
1558
|
+
}
|
|
1559
|
+
case OpCode_1.OpCode.operator_join: {
|
|
1560
|
+
satisfiesInputShape = InputShape.String;
|
|
1561
|
+
var string1 = inputToJS(block.inputs.STRING1, InputShape.String);
|
|
1562
|
+
var string2 = inputToJS(block.inputs.STRING2, InputShape.String);
|
|
1563
|
+
blockSource = "".concat(string1, " + ").concat(string2);
|
|
1564
|
+
break;
|
|
1565
|
+
}
|
|
1566
|
+
case OpCode_1.OpCode.operator_letter_of: {
|
|
1567
|
+
satisfiesInputShape = InputShape.String;
|
|
1568
|
+
var string = inputToJS(block.inputs.STRING, InputShape.Any);
|
|
1569
|
+
var letter = inputToJS(block.inputs.LETTER, InputShape.Index);
|
|
1570
|
+
blockSource = "this.letterOf(".concat(string, ", ").concat(letter, ")");
|
|
1571
|
+
break;
|
|
1572
|
+
}
|
|
1573
|
+
case OpCode_1.OpCode.operator_length: {
|
|
1574
|
+
satisfiesInputShape = InputShape.Number;
|
|
1575
|
+
var string = inputToJS(block.inputs.STRING, InputShape.Any);
|
|
1576
|
+
blockSource = "".concat(string, ".length");
|
|
1577
|
+
break;
|
|
1578
|
+
}
|
|
1579
|
+
case OpCode_1.OpCode.operator_contains: {
|
|
1580
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1581
|
+
var string1 = inputToJS(block.inputs.STRING1, InputShape.String);
|
|
1582
|
+
var string2 = inputToJS(block.inputs.STRING2, InputShape.String);
|
|
1583
|
+
blockSource = "this.stringIncludes(".concat(string1, ", ").concat(string2, ")");
|
|
1584
|
+
break;
|
|
1585
|
+
}
|
|
1586
|
+
case OpCode_1.OpCode.operator_mod: {
|
|
1587
|
+
satisfiesInputShape = InputShape.Number;
|
|
1588
|
+
var num1 = inputToJS(block.inputs.NUM1, InputShape.Number);
|
|
1589
|
+
var num2 = inputToJS(block.inputs.NUM2, InputShape.Number);
|
|
1590
|
+
blockSource = "".concat(num1, " % ").concat(num2);
|
|
1591
|
+
break;
|
|
1592
|
+
}
|
|
1593
|
+
case OpCode_1.OpCode.operator_round: {
|
|
1594
|
+
satisfiesInputShape = InputShape.Number;
|
|
1595
|
+
var num = inputToJS(block.inputs.NUM, InputShape.Number);
|
|
1596
|
+
blockSource = "Math.round(".concat(num, ")");
|
|
1597
|
+
break;
|
|
1598
|
+
}
|
|
1599
|
+
case OpCode_1.OpCode.operator_mathop: {
|
|
1600
|
+
// TODO: Verify this is true for all ops.
|
|
1601
|
+
satisfiesInputShape = InputShape.Number;
|
|
1602
|
+
var num = inputToJS(block.inputs.NUM, InputShape.Number);
|
|
1603
|
+
switch (block.inputs.OPERATOR.value) {
|
|
1604
|
+
case "abs": {
|
|
1605
|
+
blockSource = "Math.abs(".concat(num, ")");
|
|
1606
|
+
break;
|
|
1607
|
+
}
|
|
1608
|
+
case "floor": {
|
|
1609
|
+
blockSource = "Math.floor(".concat(num, ")");
|
|
1610
|
+
break;
|
|
1611
|
+
}
|
|
1612
|
+
case "ceiling": {
|
|
1613
|
+
blockSource = "Math.ceil(".concat(num, ")");
|
|
1614
|
+
break;
|
|
1615
|
+
}
|
|
1616
|
+
case "sqrt": {
|
|
1617
|
+
blockSource = "Math.sqrt(".concat(num, ")");
|
|
1618
|
+
break;
|
|
1619
|
+
}
|
|
1620
|
+
case "sin": {
|
|
1621
|
+
blockSource = "Math.sin(this.degToRad(".concat(num, "))");
|
|
1622
|
+
break;
|
|
1623
|
+
}
|
|
1624
|
+
case "cos": {
|
|
1625
|
+
blockSource = "Math.cos(this.degToRad(".concat(num, "))");
|
|
1626
|
+
break;
|
|
1627
|
+
}
|
|
1628
|
+
case "tan": {
|
|
1629
|
+
blockSource = "this.scratchTan(".concat(num, ")");
|
|
1630
|
+
break;
|
|
1631
|
+
}
|
|
1632
|
+
case "asin": {
|
|
1633
|
+
blockSource = "this.radToDeg(Math.asin(".concat(num, "))");
|
|
1634
|
+
break;
|
|
1635
|
+
}
|
|
1636
|
+
case "acos": {
|
|
1637
|
+
blockSource = "this.radToDeg(Math.acos(".concat(num, "))");
|
|
1638
|
+
break;
|
|
1639
|
+
}
|
|
1640
|
+
case "atan": {
|
|
1641
|
+
blockSource = "this.radToDeg(Math.atan(".concat(num, "))");
|
|
1642
|
+
break;
|
|
1643
|
+
}
|
|
1644
|
+
case "ln": {
|
|
1645
|
+
blockSource = "Math.log(".concat(num, ")");
|
|
1646
|
+
break;
|
|
1647
|
+
}
|
|
1648
|
+
case "log": {
|
|
1649
|
+
blockSource = "Math.log10(".concat(num, ")");
|
|
1650
|
+
break;
|
|
1651
|
+
}
|
|
1652
|
+
case "e ^": {
|
|
1653
|
+
blockSource = "Math.E ** ".concat(num);
|
|
1654
|
+
break;
|
|
1655
|
+
}
|
|
1656
|
+
case "10 ^": {
|
|
1657
|
+
blockSource = "10 ** ".concat(num);
|
|
1658
|
+
break;
|
|
1659
|
+
}
|
|
1660
|
+
}
|
|
1661
|
+
break;
|
|
1662
|
+
}
|
|
1663
|
+
case OpCode_1.OpCode.data_variable: {
|
|
1664
|
+
// TODO: Is this wrong?
|
|
1665
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1666
|
+
blockSource = selectedVarSource;
|
|
1667
|
+
break;
|
|
1668
|
+
}
|
|
1669
|
+
case OpCode_1.OpCode.data_setvariableto: {
|
|
1670
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1671
|
+
var value = inputToJS(block.inputs.VALUE, InputShape.Any);
|
|
1672
|
+
blockSource = "".concat(selectedVarSource, " = ").concat(value);
|
|
1673
|
+
break;
|
|
1674
|
+
}
|
|
1675
|
+
case OpCode_1.OpCode.data_changevariableby: {
|
|
1676
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1677
|
+
blockSource = increase(selectedVarSource, block.inputs.VALUE, true);
|
|
1678
|
+
break;
|
|
1679
|
+
}
|
|
1680
|
+
case OpCode_1.OpCode.data_showvariable: {
|
|
1681
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1682
|
+
blockSource = "".concat(selectedWatcherSource, ".visible = true");
|
|
1683
|
+
break;
|
|
1684
|
+
}
|
|
1685
|
+
case OpCode_1.OpCode.data_hidevariable: {
|
|
1686
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1687
|
+
blockSource = "".concat(selectedWatcherSource, ".visible = false");
|
|
1688
|
+
break;
|
|
1689
|
+
}
|
|
1690
|
+
case OpCode_1.OpCode.data_listcontents: {
|
|
1691
|
+
satisfiesInputShape = InputShape.String;
|
|
1692
|
+
// TODO: This isn't nuanced how Scratch works.
|
|
1693
|
+
blockSource = "".concat(selectedVarSource, ".join(\" \")");
|
|
1694
|
+
break;
|
|
1695
|
+
}
|
|
1696
|
+
case OpCode_1.OpCode.data_addtolist: {
|
|
1697
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1698
|
+
var item = inputToJS(block.inputs.ITEM, InputShape.Any);
|
|
1699
|
+
blockSource = "".concat(selectedVarSource, ".push(").concat(item, ")");
|
|
1700
|
+
break;
|
|
1701
|
+
}
|
|
1702
|
+
case OpCode_1.OpCode.data_deleteoflist: {
|
|
1703
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1704
|
+
switch (block.inputs.INDEX.value) {
|
|
1705
|
+
case "all": {
|
|
1706
|
+
blockSource = "".concat(selectedVarSource, " = []");
|
|
1707
|
+
break;
|
|
1708
|
+
}
|
|
1709
|
+
case "last": {
|
|
1710
|
+
blockSource = "".concat(selectedVarSource, ".splice(").concat(selectedVarSource, ".length - 1, 1)");
|
|
1711
|
+
break;
|
|
1712
|
+
}
|
|
1713
|
+
default: {
|
|
1714
|
+
var index = inputToJS(block.inputs.INDEX, InputShape.Index);
|
|
1715
|
+
blockSource = "".concat(selectedVarSource, ".splice(").concat(index, ", 1)");
|
|
1716
|
+
break;
|
|
1717
|
+
}
|
|
1718
|
+
}
|
|
1719
|
+
break;
|
|
1720
|
+
}
|
|
1721
|
+
case OpCode_1.OpCode.data_deletealloflist: {
|
|
1722
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1723
|
+
blockSource = "".concat(selectedVarSource, " = []");
|
|
1724
|
+
break;
|
|
1725
|
+
}
|
|
1726
|
+
case OpCode_1.OpCode.data_insertatlist: {
|
|
1727
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1728
|
+
var index = inputToJS(block.inputs.INDEX, InputShape.Index);
|
|
1729
|
+
var item = inputToJS(block.inputs.ITEM, InputShape.Any);
|
|
1730
|
+
blockSource = "".concat(selectedVarSource, ".splice(").concat(index, ", 0, ").concat(item, ")");
|
|
1731
|
+
break;
|
|
1732
|
+
}
|
|
1733
|
+
case OpCode_1.OpCode.data_replaceitemoflist: {
|
|
1734
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1735
|
+
var index = inputToJS(block.inputs.INDEX, InputShape.Index);
|
|
1736
|
+
var item = inputToJS(block.inputs.ITEM, InputShape.Any);
|
|
1737
|
+
blockSource = "".concat(selectedVarSource, ".splice(").concat(index, ", 1, ").concat(item, ")");
|
|
1738
|
+
break;
|
|
1739
|
+
}
|
|
1740
|
+
case OpCode_1.OpCode.data_itemoflist: {
|
|
1741
|
+
satisfiesInputShape = InputShape.Any;
|
|
1742
|
+
switch (block.inputs.INDEX.value) {
|
|
1743
|
+
case "last": {
|
|
1744
|
+
blockSource = "this.itemOf(".concat(selectedVarSource, ", ").concat(selectedVarSource, ".length - 1)");
|
|
1745
|
+
break;
|
|
1746
|
+
}
|
|
1747
|
+
default: {
|
|
1748
|
+
var index = inputToJS(block.inputs.INDEX, InputShape.Index);
|
|
1749
|
+
blockSource = "this.itemOf(".concat(selectedVarSource, ", ").concat(index, ")");
|
|
1750
|
+
break;
|
|
1751
|
+
}
|
|
1752
|
+
}
|
|
1753
|
+
break;
|
|
1754
|
+
}
|
|
1755
|
+
case OpCode_1.OpCode.data_itemnumoflist: {
|
|
1756
|
+
var item = inputToJS(block.inputs.ITEM, InputShape.Any);
|
|
1757
|
+
if (desiredInputShape === InputShape.Index) {
|
|
1758
|
+
satisfiesInputShape = InputShape.Index;
|
|
1759
|
+
blockSource = "this.indexInArray(".concat(selectedVarSource, ", ").concat(item, ")");
|
|
1760
|
+
}
|
|
1761
|
+
else {
|
|
1762
|
+
satisfiesInputShape = InputShape.Number;
|
|
1763
|
+
blockSource = "this.indexInArray(".concat(selectedVarSource, ", ").concat(item, ") + 1");
|
|
1764
|
+
}
|
|
1765
|
+
break;
|
|
1766
|
+
}
|
|
1767
|
+
case OpCode_1.OpCode.data_lengthoflist: {
|
|
1768
|
+
satisfiesInputShape = InputShape.Number;
|
|
1769
|
+
blockSource = "".concat(selectedVarSource, ".length");
|
|
1770
|
+
break;
|
|
1771
|
+
}
|
|
1772
|
+
case OpCode_1.OpCode.data_listcontainsitem: {
|
|
1773
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1774
|
+
var item = inputToJS(block.inputs.ITEM, InputShape.Any);
|
|
1775
|
+
blockSource = "this.arrayIncludes(".concat(selectedVarSource, ", ").concat(item, ")");
|
|
1776
|
+
break;
|
|
1777
|
+
}
|
|
1778
|
+
case OpCode_1.OpCode.data_showlist: {
|
|
1779
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1780
|
+
blockSource = "".concat(selectedWatcherSource, ".visible = true");
|
|
1781
|
+
break;
|
|
1782
|
+
}
|
|
1783
|
+
case OpCode_1.OpCode.data_hidelist: {
|
|
1784
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1785
|
+
blockSource = "".concat(selectedWatcherSource, ".visible = false");
|
|
1786
|
+
break;
|
|
1787
|
+
}
|
|
1788
|
+
case OpCode_1.OpCode.procedures_call: {
|
|
1789
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1790
|
+
// Get name of custom block script with given PROCCODE:
|
|
1791
|
+
// TODO: what if it doesn't exist?
|
|
1792
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1793
|
+
var procName = target.scripts.find(function (script) {
|
|
1794
|
+
return script.hat !== null &&
|
|
1795
|
+
script.hat.opcode === OpCode_1.OpCode.procedures_definition &&
|
|
1796
|
+
script.hat.inputs.PROCCODE.value === block.inputs.PROCCODE.value;
|
|
1797
|
+
}).name;
|
|
1798
|
+
// TODO: Boolean inputs should provide appropriate desiredInputShape instead of "any"
|
|
1799
|
+
var procArgs = block.inputs.INPUTS.value.map(function (input) { return inputToJS(input, InputShape.Any); }).join(", ");
|
|
1800
|
+
// Warp-mode procedures execute all child procedures in warp mode as well
|
|
1801
|
+
if (warp) {
|
|
1802
|
+
blockSource = "this.warp(this.".concat(procName, ")(").concat(procArgs, ")");
|
|
1803
|
+
}
|
|
1804
|
+
else {
|
|
1805
|
+
blockSource = "yield* this.".concat(procName, "(").concat(procArgs, ")");
|
|
1806
|
+
}
|
|
1807
|
+
break;
|
|
1808
|
+
}
|
|
1809
|
+
case OpCode_1.OpCode.argument_reporter_string_number:
|
|
1810
|
+
case OpCode_1.OpCode.argument_reporter_boolean: {
|
|
1811
|
+
// Argument reporters dragged outside their script return 0
|
|
1812
|
+
if (!script) {
|
|
1813
|
+
satisfiesInputShape = InputShape.Number;
|
|
1814
|
+
blockSource = "0";
|
|
1815
|
+
break;
|
|
1816
|
+
}
|
|
1817
|
+
var argNames = customBlockArgNameMap.get(script);
|
|
1818
|
+
// The procedure definition that this argument reporter was dragged out of doesn't exist (it's in another
|
|
1819
|
+
// sprite, or deleted). Scratch returns 0 here.
|
|
1820
|
+
if (!argNames) {
|
|
1821
|
+
satisfiesInputShape = InputShape.Number;
|
|
1822
|
+
blockSource = "0";
|
|
1823
|
+
break;
|
|
1824
|
+
}
|
|
1825
|
+
if (block.opcode === OpCode_1.OpCode.argument_reporter_boolean) {
|
|
1826
|
+
satisfiesInputShape = InputShape.Boolean;
|
|
1827
|
+
}
|
|
1828
|
+
else {
|
|
1829
|
+
satisfiesInputShape = InputShape.Any;
|
|
1830
|
+
}
|
|
1831
|
+
blockSource = argNames[block.inputs.VALUE.value];
|
|
1832
|
+
break;
|
|
1833
|
+
}
|
|
1834
|
+
case OpCode_1.OpCode.pen_clear: {
|
|
1835
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1836
|
+
blockSource = "this.clearPen()";
|
|
1837
|
+
break;
|
|
1838
|
+
}
|
|
1839
|
+
case OpCode_1.OpCode.pen_stamp: {
|
|
1840
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1841
|
+
blockSource = "this.stamp()";
|
|
1842
|
+
break;
|
|
1843
|
+
}
|
|
1844
|
+
case OpCode_1.OpCode.pen_penDown: {
|
|
1845
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1846
|
+
blockSource = "this.penDown = true";
|
|
1847
|
+
break;
|
|
1848
|
+
}
|
|
1849
|
+
case OpCode_1.OpCode.pen_penUp: {
|
|
1850
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1851
|
+
blockSource = "this.penDown = false";
|
|
1852
|
+
break;
|
|
1853
|
+
}
|
|
1854
|
+
case OpCode_1.OpCode.pen_setPenColorToColor: {
|
|
1855
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1856
|
+
var color = colorInputToJS(block.inputs.COLOR);
|
|
1857
|
+
blockSource = "this.penColor = ".concat(color);
|
|
1858
|
+
break;
|
|
1859
|
+
}
|
|
1860
|
+
case OpCode_1.OpCode.pen_changePenColorParamBy: {
|
|
1861
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1862
|
+
switch (block.inputs.COLOR_PARAM.value) {
|
|
1863
|
+
case "color": {
|
|
1864
|
+
blockSource = increase("this.penColor.h", block.inputs.VALUE, false);
|
|
1865
|
+
break;
|
|
1866
|
+
}
|
|
1867
|
+
case "saturation": {
|
|
1868
|
+
blockSource = increase("this.penColor.s", block.inputs.VALUE, false);
|
|
1869
|
+
break;
|
|
1870
|
+
}
|
|
1871
|
+
case "brightness": {
|
|
1872
|
+
blockSource = increase("this.penColor.v", block.inputs.VALUE, false);
|
|
1873
|
+
break;
|
|
1874
|
+
}
|
|
1875
|
+
case "transparency": {
|
|
1876
|
+
var value = inputToJS(block.inputs.VALUE, InputShape.Number);
|
|
1877
|
+
blockSource = "this.penColor.a -= ".concat(value, " / 100");
|
|
1878
|
+
break;
|
|
1879
|
+
}
|
|
1880
|
+
}
|
|
1881
|
+
break;
|
|
1882
|
+
}
|
|
1883
|
+
case OpCode_1.OpCode.pen_setPenColorParamTo: {
|
|
1884
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1885
|
+
var value = inputToJS(block.inputs.VALUE, InputShape.Number);
|
|
1886
|
+
switch (block.inputs.COLOR_PARAM.value) {
|
|
1887
|
+
case "color": {
|
|
1888
|
+
blockSource = "this.penColor.h = ".concat(value);
|
|
1889
|
+
break;
|
|
1890
|
+
}
|
|
1891
|
+
case "saturation": {
|
|
1892
|
+
blockSource = "this.penColor.s = ".concat(value);
|
|
1893
|
+
break;
|
|
1894
|
+
}
|
|
1895
|
+
case "brightness": {
|
|
1896
|
+
blockSource = "this.penColor.v = ".concat(value);
|
|
1897
|
+
break;
|
|
1898
|
+
}
|
|
1899
|
+
case "transparency": {
|
|
1900
|
+
blockSource = "this.penColor.a = 1 - (".concat(value, " / 100)");
|
|
1901
|
+
break;
|
|
1902
|
+
}
|
|
1903
|
+
}
|
|
1904
|
+
break;
|
|
1905
|
+
}
|
|
1906
|
+
case OpCode_1.OpCode.pen_setPenSizeTo: {
|
|
1907
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1908
|
+
var size = inputToJS(block.inputs.SIZE, InputShape.Number);
|
|
1909
|
+
blockSource = "this.penSize = ".concat(size);
|
|
1910
|
+
break;
|
|
1911
|
+
}
|
|
1912
|
+
case OpCode_1.OpCode.pen_changePenSizeBy: {
|
|
1913
|
+
satisfiesInputShape = InputShape.Stack;
|
|
1914
|
+
blockSource = increase("this.penSize", block.inputs.SIZE, false);
|
|
1915
|
+
break;
|
|
1916
|
+
}
|
|
1917
|
+
default: {
|
|
1918
|
+
satisfiesInputShape = InputShape.Any;
|
|
1919
|
+
blockSource = "/* TODO: Implement ".concat(block.opcode, " */ null");
|
|
1920
|
+
break;
|
|
1921
|
+
}
|
|
1922
|
+
}
|
|
1923
|
+
switch (desiredInputShape) {
|
|
1924
|
+
case satisfiesInputShape: {
|
|
1925
|
+
return blockSource;
|
|
1926
|
+
}
|
|
1927
|
+
case InputShape.Number: {
|
|
1928
|
+
return "this.toNumber(".concat(blockSource, ")");
|
|
1929
|
+
}
|
|
1930
|
+
case InputShape.Index: {
|
|
1931
|
+
return "(".concat(blockSource, ") - 1");
|
|
1932
|
+
}
|
|
1933
|
+
case InputShape.Boolean: {
|
|
1934
|
+
return "this.toBoolean(".concat(blockSource, ")");
|
|
1935
|
+
}
|
|
1936
|
+
case InputShape.String: {
|
|
1937
|
+
return "this.toString(".concat(blockSource, ")");
|
|
1938
|
+
}
|
|
1939
|
+
default: {
|
|
1940
|
+
return blockSource;
|
|
1941
|
+
}
|
|
1942
|
+
}
|
|
1943
|
+
}
|
|
1944
|
+
}
|
|
1945
|
+
// Scratch doesn't care much about "types" (like numbers vs strings), but
|
|
1946
|
+
// sometimes Javascript does. This function attempts to parse a Scratch
|
|
1947
|
+
// value and turn it into the most appropriate Javascript representation
|
|
1948
|
+
function toOptimalJavascriptRepresentation(value) {
|
|
1949
|
+
if (Array.isArray(value)) {
|
|
1950
|
+
return "[".concat(value.map(toOptimalJavascriptRepresentation).join(", "), "]");
|
|
1951
|
+
}
|
|
1952
|
+
if (typeof value === "string") {
|
|
1953
|
+
// Does this string look like a number?
|
|
1954
|
+
var numValue = Number(value);
|
|
1955
|
+
if (isNaN(numValue)) {
|
|
1956
|
+
// Not a number! Treat it like a string!
|
|
1957
|
+
return JSON.stringify(value);
|
|
1958
|
+
}
|
|
1959
|
+
if (Number.isInteger(numValue) && !Number.isSafeInteger(numValue)) {
|
|
1960
|
+
// If this number is an integer that is so large it cannot be reliably
|
|
1961
|
+
// stored, leave it as a string instead. (Usually in these cases the
|
|
1962
|
+
// Scratch user is treating the number like a string anyway.)
|
|
1963
|
+
return JSON.stringify(value);
|
|
1964
|
+
}
|
|
1965
|
+
// This looks like a nice, safe number
|
|
1966
|
+
return JSON.stringify(numValue);
|
|
1967
|
+
}
|
|
1968
|
+
// Here's the catch-all for something else that might pass through
|
|
1969
|
+
return JSON.stringify(value);
|
|
1970
|
+
}
|
|
1971
|
+
var defaultOptions, options, targetNameMap, customBlockArgNameMap, uniqueLocalVarNameMap, variableNameMap, uniqueSpriteName, _i, _a, target, newTargetName, uniqueVariableName, _b, _c, _d, id, name_1, newName, uniqueScriptName, _e, _f, script, argNameMap, uniqueParamName, _g, _h, block, _j, _k, argument, newName, stageVariables, _l, _m, variable, _o, _p, list, getPathsToRelativeOrAbsolute, toLeopardJS, toLeopardCSS, files, _loop_1, _q, _r, target;
|
|
1972
|
+
var _this = this;
|
|
1973
|
+
return __generator(this, function (_s) {
|
|
1974
|
+
switch (_s.label) {
|
|
1975
|
+
case 0:
|
|
1976
|
+
defaultOptions = {
|
|
1977
|
+
leopardJSURL: "https://pub-3089f37cd1294d71b62f5431c86b90ef.r2.dev/dist/index.esm.js",
|
|
1978
|
+
leopardCSSURL: "https://unpkg.com/leopard@^1/dist/index.min.css",
|
|
1979
|
+
getTargetURL: function (_a) {
|
|
1980
|
+
var name = _a.name, from = _a.from;
|
|
1981
|
+
switch (from) {
|
|
1982
|
+
case "index":
|
|
1983
|
+
return "./".concat(name, "/").concat(name, ".js");
|
|
1984
|
+
case "target":
|
|
1985
|
+
return "../".concat(name, "/").concat(name, ".js");
|
|
1986
|
+
}
|
|
1987
|
+
},
|
|
1988
|
+
getAssetURL: function (_a) {
|
|
1989
|
+
var type = _a.type, target = _a.target, name = _a.name, ext = _a.ext;
|
|
1990
|
+
switch (type) {
|
|
1991
|
+
case "costume":
|
|
1992
|
+
return "./".concat(target, "/costumes/").concat(name, ".").concat(ext);
|
|
1993
|
+
case "sound":
|
|
1994
|
+
return "./".concat(target, "/sounds/").concat(name, ".").concat(ext);
|
|
1995
|
+
}
|
|
1996
|
+
},
|
|
1997
|
+
indexURL: "./index.js",
|
|
1998
|
+
autoplay: true
|
|
1999
|
+
};
|
|
2000
|
+
options = __assign(__assign({}, defaultOptions), inOptions);
|
|
2001
|
+
targetNameMap = {};
|
|
2002
|
+
customBlockArgNameMap = new Map();
|
|
2003
|
+
uniqueLocalVarNameMap = new Map();
|
|
2004
|
+
variableNameMap = {};
|
|
2005
|
+
uniqueSpriteName = uniqueNameFactory(LEOPARD_RESERVED_SPRITE_NAMES);
|
|
2006
|
+
for (_i = 0, _a = __spreadArray([project.stage], project.sprites, true); _i < _a.length; _i++) {
|
|
2007
|
+
target = _a[_i];
|
|
2008
|
+
newTargetName = uniqueSpriteName(camelCase(target.name, true));
|
|
2009
|
+
targetNameMap[target.name] = newTargetName;
|
|
2010
|
+
target.setName(newTargetName);
|
|
2011
|
+
uniqueVariableName = uniqueNameFactory(JS_RESERVED_PROPERTIES);
|
|
2012
|
+
for (_b = 0, _c = __spreadArray(__spreadArray([], target.lists, true), target.variables, true); _b < _c.length; _b++) {
|
|
2013
|
+
_d = _c[_b], id = _d.id, name_1 = _d.name;
|
|
2014
|
+
newName = uniqueVariableName(camelCase(name_1));
|
|
2015
|
+
variableNameMap[id] = newName;
|
|
2016
|
+
}
|
|
2017
|
+
uniqueScriptName = uniqueNameFactory(target === project.stage ? LEOPARD_RESERVED_STAGE_PROPERTIES : LEOPARD_RESERVED_SPRITE_PROPERTIES);
|
|
2018
|
+
for (_e = 0, _f = target.scripts; _e < _f.length; _e++) {
|
|
2019
|
+
script = _f[_e];
|
|
2020
|
+
script.setName(uniqueScriptName(camelCase(script.name)));
|
|
2021
|
+
argNameMap = {};
|
|
2022
|
+
customBlockArgNameMap.set(script, argNameMap);
|
|
2023
|
+
uniqueParamName = uniqueNameFactory(JS_RESERVED_WORDS);
|
|
2024
|
+
for (_g = 0, _h = script.blocks; _g < _h.length; _g++) {
|
|
2025
|
+
block = _h[_g];
|
|
2026
|
+
if (block.opcode === OpCode_1.OpCode.procedures_definition) {
|
|
2027
|
+
for (_j = 0, _k = block.inputs.ARGUMENTS.value; _j < _k.length; _j++) {
|
|
2028
|
+
argument = _k[_j];
|
|
2029
|
+
if (argument.type !== "label") {
|
|
2030
|
+
newName = uniqueParamName(camelCase(argument.name));
|
|
2031
|
+
argNameMap[argument.name] = newName;
|
|
2032
|
+
argument.name = newName;
|
|
2033
|
+
}
|
|
2034
|
+
}
|
|
2035
|
+
}
|
|
2036
|
+
}
|
|
2037
|
+
uniqueLocalVarNameMap.set(script, uniqueNameFactory(Object.values(argNameMap)));
|
|
2038
|
+
}
|
|
2039
|
+
}
|
|
2040
|
+
stageVariables = new Set();
|
|
2041
|
+
for (_l = 0, _m = project.stage.variables; _l < _m.length; _l++) {
|
|
2042
|
+
variable = _m[_l];
|
|
2043
|
+
stageVariables.add(variable.id);
|
|
2044
|
+
}
|
|
2045
|
+
for (_o = 0, _p = project.stage.lists; _o < _p.length; _o++) {
|
|
2046
|
+
list = _p[_o];
|
|
2047
|
+
stageVariables.add(list.id);
|
|
2048
|
+
}
|
|
2049
|
+
getPathsToRelativeOrAbsolute = function (destination) {
|
|
2050
|
+
var fakeOrigin = "http://".concat(Math.random(), ".com");
|
|
2051
|
+
var isExternal = new URL(destination, fakeOrigin).origin !== fakeOrigin;
|
|
2052
|
+
var isAbsolute = isExternal || destination.startsWith("/");
|
|
2053
|
+
if (isAbsolute) {
|
|
2054
|
+
return function () { return destination; };
|
|
2055
|
+
}
|
|
2056
|
+
else {
|
|
2057
|
+
// return "/" + destination;
|
|
2058
|
+
return function (_a) {
|
|
2059
|
+
var from = _a.from;
|
|
2060
|
+
switch (from) {
|
|
2061
|
+
case "index":
|
|
2062
|
+
return "./" + destination;
|
|
2063
|
+
case "target":
|
|
2064
|
+
return "../" + destination;
|
|
2065
|
+
}
|
|
2066
|
+
};
|
|
2067
|
+
}
|
|
2068
|
+
};
|
|
2069
|
+
toLeopardJS = getPathsToRelativeOrAbsolute(options.leopardJSURL);
|
|
2070
|
+
toLeopardCSS = getPathsToRelativeOrAbsolute(options.leopardCSSURL);
|
|
2071
|
+
files = {
|
|
2072
|
+
"index.html": "\n <!DOCTYPE html>\n <html>\n <head>\n <link rel=\"stylesheet\" href=\"".concat(toLeopardCSS({ from: "index" }), "\" />\n </head>\n <body>\n <button id=\"greenFlag\">Green Flag</button>\n <div id=\"project\"></div>\n\n <script type=\"importmap\">\n {\n \"imports\": {\n \"effect\": \"https://cdn.jsdelivr.net/npm/effect@latest/+esm\",\n \"js-sdsl\": \"https://cdn.jsdelivr.net/npm/js-sdsl@latest/+esm\"\n }\n }\n </script>\n\n <script type=\"module\" src=\"/index.js\"></script>\n </body>\n </html>\n "),
|
|
2073
|
+
"index.js": "\n import { Project, Sprite } from ".concat(JSON.stringify(toLeopardJS({ from: "index" })), ";\n\n ").concat(__spreadArray([project.stage], project.sprites, true).map(function (target) {
|
|
2074
|
+
return "import ".concat(target.name, " from ").concat(JSON.stringify(options.getTargetURL({ name: target.name, from: "index" })), ";");
|
|
2075
|
+
})
|
|
2076
|
+
.join("\n"), "\n\n const stage = new Stage(").concat(JSON.stringify({ costumeNumber: project.stage.costumeNumber + 1 }), ");\n\n const sprites = {\n ").concat(project.sprites
|
|
2077
|
+
.map(function (sprite) {
|
|
2078
|
+
return "".concat(sprite.name, ": new ").concat(sprite.name, "({").concat(Object.entries({
|
|
2079
|
+
x: sprite.x,
|
|
2080
|
+
y: sprite.y,
|
|
2081
|
+
direction: sprite.direction,
|
|
2082
|
+
rotationStyle: "Sprite.RotationStyle.".concat({
|
|
2083
|
+
normal: "ALL_AROUND",
|
|
2084
|
+
leftRight: "LEFT_RIGHT",
|
|
2085
|
+
none: "DONT_ROTATE"
|
|
2086
|
+
}[sprite.rotationStyle]),
|
|
2087
|
+
costumeNumber: sprite.costumeNumber + 1,
|
|
2088
|
+
size: sprite.size,
|
|
2089
|
+
visible: sprite.visible,
|
|
2090
|
+
layerOrder: sprite.layerOrder
|
|
2091
|
+
})
|
|
2092
|
+
.map(function (_a) {
|
|
2093
|
+
var key = _a[0], value = _a[1];
|
|
2094
|
+
return "".concat(key, ":").concat(value.toString());
|
|
2095
|
+
})
|
|
2096
|
+
.join(","), "})");
|
|
2097
|
+
})
|
|
2098
|
+
.join(",\n"), "\n };\n\n const project = new Project(stage, sprites, {\n frameRate: 30 // Set to 60 to make your project run faster\n });\n\n project.attach('#project');\n\n document.querySelector('#greenFlag').addEventListener('click', () => {\n project.greenFlag();\n });\n\n // Autoplay\n project.greenFlag();\n\n export default project;\n "),
|
|
2099
|
+
"server.mjs": "\n // server.mjs\n import http from 'node:http';\n import { createReadStream, promises as fsp } from 'node:fs';\n import { extname, normalize, resolve } from 'node:path';\n import { fileURLToPath } from 'node:url';\n\n const root = fileURLToPath(new URL('.', import.meta.url));\n const PORT = Number(process.env.PORT || 5173);\n\n const types = {\n '.mjs': 'application/javascript; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.html': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.wav': 'audio/wav',\n };\n\n const ASSET_RE = /\\.(png|jpe?g|gif|wav)$/i;\n\n function resolvePath(reqUrl = '/') {\n const u = new URL(reqUrl, 'http://local');\n let p = decodeURIComponent(u.pathname);\n p = normalize(p).replace(/^[/\\\\]+/, ''); // strip leading slash(es)\n if (p === '') p = 'index.html';\n const full = resolve(root, p);\n if (!full.startsWith(root)) return null; // prevent path escape\n return full;\n }\n\n function isPointerBuffer(buf) {\n const head = buf.toString('utf8', 0, Math.min(buf.length, 16)).trim();\n return /^https?:///i.test(head);\n }\n\n function isPNG(buf) {\n return (\n buf.length >= 8 &&\n buf[0] === 137 &&\n buf[1] === 80 &&\n buf[2] === 78 &&\n buf[3] === 71 &&\n buf[4] === 13 &&\n buf[5] === 10 &&\n buf[6] === 26 &&\n buf[7] === 10\n );\n }\n\n const server = http.createServer(async (req, res) => {\n try {\n const filePath = resolvePath(req.url);\n if (!filePath) {\n res.writeHead(403, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Forbidden');\n return;\n }\n\n const ext = extname(filePath).toLowerCase();\n const ctype = types[ext] || 'application/octet-stream';\n\n // Asset branch: detect pointer files and redirect\n if (ASSET_RE.test(ext)) {\n const buf = await fsp.readFile(filePath);\n\n if (!isPNG(buf) && isPointerBuffer(buf)) {\n const target = buf.toString('utf8').trim();\n res.writeHead(302, {\n Location: target,\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'public, max-age=31536000, immutable',\n });\n res.end();\n return;\n }\n\n // Real bytes on disk\n res.writeHead(200, {\n 'Content-Type': ctype,\n 'Content-Length': String(buf.length),\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'public, max-age=31536000, immutable',\n });\n res.end(buf);\n return;\n }\n\n // Everything else: stream normally\n res.writeHead(200, { 'Content-Type': ctype });\n createReadStream(filePath)\n .on('error', () => {\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Not found');\n })\n .pipe(res);\n } catch {\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Not found');\n }\n });\n\n server.listen(PORT, () => {\n console.log(`Serving on http://localhost:${PORT}`);\n });\n ",
|
|
2100
|
+
"package.json": "\n {\n \"name\": \"static-preview\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"start\": \"npm install; node server.mjs\"\n }\n }\n ",
|
|
2101
|
+
".stackblitzrc": "\n {\n \"startCommand\": \"npm start\",\n \"installCommand\": \"npm install\",\n \"template\": \"node\"\n }\n "
|
|
2102
|
+
};
|
|
2103
|
+
_loop_1 = function (target) {
|
|
2104
|
+
// We don't want to include JavaScript for unused variable watchers.
|
|
2105
|
+
// Some watchers start invisible but appear later, so this code builds a list of
|
|
2106
|
+
// watchers that appear in "show variable" and "show list" blocks. The list is
|
|
2107
|
+
// actually *used* later, by some other code.
|
|
2108
|
+
var shownWatchers = new Set();
|
|
2109
|
+
var targetsToCheckForShowBlocks = void 0;
|
|
2110
|
+
if (target.isStage) {
|
|
2111
|
+
targetsToCheckForShowBlocks = __spreadArray([project.stage], project.sprites, true);
|
|
2112
|
+
}
|
|
2113
|
+
else {
|
|
2114
|
+
targetsToCheckForShowBlocks = [target];
|
|
2115
|
+
}
|
|
2116
|
+
for (var _t = 0, targetsToCheckForShowBlocks_1 = targetsToCheckForShowBlocks; _t < targetsToCheckForShowBlocks_1.length; _t++) {
|
|
2117
|
+
var checkTarget = targetsToCheckForShowBlocks_1[_t];
|
|
2118
|
+
for (var _u = 0, _v = checkTarget.blocks; _u < _v.length; _u++) {
|
|
2119
|
+
var block = _v[_u];
|
|
2120
|
+
if (block.opcode === OpCode_1.OpCode.data_showvariable || block.opcode === OpCode_1.OpCode.data_hidevariable) {
|
|
2121
|
+
shownWatchers.add(block.inputs.VARIABLE.value.id);
|
|
2122
|
+
}
|
|
2123
|
+
if (block.opcode === OpCode_1.OpCode.data_showlist || block.opcode === OpCode_1.OpCode.data_hidelist) {
|
|
2124
|
+
shownWatchers.add(block.inputs.LIST.value.id);
|
|
2125
|
+
}
|
|
2126
|
+
}
|
|
2127
|
+
}
|
|
2128
|
+
files["".concat(target.name, "/").concat(target.name, ".js")] = "\n import { ".concat(target.isStage ? "Stage as StageBase" : "Sprite", ", Trigger, Watcher, Costume, Color, Sound } from '").concat(toLeopardJS({ from: "target" }), "';\n\n export default class ").concat(target.name, " extends ").concat(target.isStage ? "StageBase" : "Sprite", " {\n constructor(...args) {\n super(...args);\n\n this.costumes = [\n ").concat(target.costumes
|
|
2129
|
+
.map(function (costume) {
|
|
2130
|
+
return "new Costume(".concat(JSON.stringify(costume.name), ", ").concat(JSON.stringify(options.getAssetURL({
|
|
2131
|
+
type: "costume",
|
|
2132
|
+
target: target.name,
|
|
2133
|
+
name: costume.name,
|
|
2134
|
+
md5: costume.md5,
|
|
2135
|
+
ext: costume.ext
|
|
2136
|
+
})), ", ").concat(JSON.stringify({
|
|
2137
|
+
// x: costume.centerX,
|
|
2138
|
+
// y: costume.centerY
|
|
2139
|
+
x: target.isStage ? 480 : costume.centerX,
|
|
2140
|
+
y: target.isStage ? 360 : costume.centerY, // costume.centerY
|
|
2141
|
+
}), ")");
|
|
2142
|
+
})
|
|
2143
|
+
.join(",\n"), "\n ];\n\n this.sounds = [\n ").concat(target.sounds
|
|
2144
|
+
.map(function (sound) {
|
|
2145
|
+
return "new Sound(".concat(JSON.stringify(sound.name), ", ").concat(JSON.stringify(options.getAssetURL({
|
|
2146
|
+
type: "sound",
|
|
2147
|
+
target: target.name,
|
|
2148
|
+
name: sound.name,
|
|
2149
|
+
md5: sound.md5,
|
|
2150
|
+
ext: sound.ext
|
|
2151
|
+
})), ")");
|
|
2152
|
+
})
|
|
2153
|
+
.join(",\n"), "\n ];\n\n this.triggers = [\n ").concat(target.scripts
|
|
2154
|
+
.map(function (script) { return triggerInitCode(script, target); })
|
|
2155
|
+
.filter(function (trigger) { return trigger !== null; })
|
|
2156
|
+
.join(",\n"), "\n ];\n\n ").concat(target.volume !== 100 ? "this.audioEffects.volume = ".concat(target.volume, ";") : "", "\n\n ").concat(__spreadArray(__spreadArray([], target.variables, true), target.lists, true).map(function (variable) {
|
|
2157
|
+
return "this.vars.".concat(variableNameMap[variable.id], " = ").concat(toOptimalJavascriptRepresentation(variable.value), ";");
|
|
2158
|
+
})
|
|
2159
|
+
.join("\n"), "\n\n ").concat(__spreadArray(__spreadArray([], target.variables, true), target.lists, true).filter(function (variable) { return variable.visible || shownWatchers.has(variable.id); })
|
|
2160
|
+
.map(function (variable) {
|
|
2161
|
+
var newName = variableNameMap[variable.id];
|
|
2162
|
+
return "this.watchers.".concat(newName, " = new Watcher({\n label: ").concat(JSON.stringify((target.isStage ? "" : "".concat(target.name, ": ")) + variable.name), ",\n style: ").concat(JSON.stringify(variable instanceof Data_1.List
|
|
2163
|
+
? "normal"
|
|
2164
|
+
: { default: "normal", large: "large", slider: "slider" }[variable.mode]), ",\n visible: ").concat(JSON.stringify(variable.visible), ",\n value: () => this.vars.").concat(newName, ",\n ").concat(variable instanceof Data_1.Variable && variable.mode === "slider"
|
|
2165
|
+
? "setValue: (value) => { this.vars.".concat(newName, " = value; },\n step: ").concat(JSON.stringify(variable.isDiscrete ? 1 : 0.01), ",\n min: ").concat(JSON.stringify(variable.sliderMin), ",\n max: ").concat(JSON.stringify(variable.sliderMax), ",")
|
|
2166
|
+
: "", "x: ").concat(JSON.stringify(variable.x + 240), ",\n y: ").concat(JSON.stringify(180 - variable.y), ",\n ").concat("width" in variable ? "width: ".concat(JSON.stringify(variable.width), ",") : "", "\n ").concat("height" in variable ? "height: ".concat(JSON.stringify(variable.height), ",") : "", "\n });");
|
|
2167
|
+
})
|
|
2168
|
+
.join("\n"), "\n }\n\n ").concat(target.scripts
|
|
2169
|
+
.filter(function (script) { return script.hat !== null; })
|
|
2170
|
+
.map(function (script) { return scriptToJS(script, target); })
|
|
2171
|
+
.join("\n\n"), "\n }\n ");
|
|
2172
|
+
};
|
|
2173
|
+
for (_q = 0, _r = __spreadArray([project.stage], project.sprites, true); _q < _r.length; _q++) {
|
|
2174
|
+
target = _r[_q];
|
|
2175
|
+
_loop_1(target);
|
|
2176
|
+
}
|
|
2177
|
+
return [4 /*yield*/, Object.keys(files).forEach(function (filepath) { return __awaiter(_this, void 0, void 0, function () {
|
|
2178
|
+
var _a, _b;
|
|
2179
|
+
return __generator(this, function (_c) {
|
|
2180
|
+
switch (_c.label) {
|
|
2181
|
+
case 0:
|
|
2182
|
+
_a = files;
|
|
2183
|
+
_b = filepath;
|
|
2184
|
+
return [4 /*yield*/, prettier.format(files[filepath], __assign(__assign({}, prettierConfig), { filepath: filepath }))];
|
|
2185
|
+
case 1:
|
|
2186
|
+
_a[_b] = _c.sent();
|
|
2187
|
+
return [2 /*return*/];
|
|
2188
|
+
}
|
|
2189
|
+
});
|
|
2190
|
+
}); })];
|
|
2191
|
+
case 1:
|
|
2192
|
+
_s.sent();
|
|
2193
|
+
return [2 /*return*/, files];
|
|
2194
|
+
}
|
|
2195
|
+
});
|
|
2196
|
+
});
|
|
2197
|
+
}
|
|
2198
|
+
exports.default = toLeopard;
|
|
2199
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9MZW9wYXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lvL2xlb3BhcmQvdG9MZW9wYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlBLHVDQUFzQztBQUV0QyxpREFBcUM7QUFFckMsbUNBQTRDO0FBRTVDOzs7Ozs7Ozs7R0FTRztBQUNILElBQU0saUJBQWlCLEdBQUc7SUFDeEIsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixJQUFJO0lBQ0osTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULEtBQUs7SUFDTCxVQUFVO0lBQ1YsSUFBSTtJQUNKLFlBQVk7SUFDWixRQUFRO0lBQ1IsSUFBSTtJQUNKLFlBQVk7SUFDWixXQUFXO0lBQ1gsS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixLQUFLO0lBQ0wsUUFBUTtJQUNSLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0NBQ1AsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxJQUFNLDZCQUE2QixHQUFHO0lBQ3BDLHlCQUF5QjtJQUN6QixVQUFVO0lBQ1YsS0FBSztJQUVMLCtCQUErQjtJQUMvQixNQUFNO0lBQ04sTUFBTTtJQUVOLCtCQUErQjtJ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
|