pxt-common-packages 10.3.3 → 10.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/built/common-sim.d.ts +12 -0
  2. package/built/common-sim.js +24 -0
  3. package/libs/azureiot/built/debug/binary.js +461 -461
  4. package/libs/color/built/debug/binary.js +8 -8
  5. package/libs/color-sensor/built/debug/binary.js +8 -8
  6. package/libs/controller/built/debug/binary.js +6980 -6980
  7. package/libs/controller---none/built/debug/binary.js +6960 -6960
  8. package/libs/datalogger/built/debug/binary.js +63 -63
  9. package/libs/edge-connector/built/debug/binary.js +8 -8
  10. package/libs/esp32/built/debug/binary.js +462 -462
  11. package/libs/game/built/debug/binary.js +6895 -6895
  12. package/libs/game/multiplayer.cpp +3 -0
  13. package/libs/game/multiplayer.ts +45 -0
  14. package/libs/game/sim/multiplayer.ts +32 -0
  15. package/libs/lcd/built/debug/binary.js +8 -8
  16. package/libs/light-spectrum-sensor/built/debug/binary.js +8 -8
  17. package/libs/lora/built/debug/binary.js +8 -8
  18. package/libs/matrix-keypad/built/debug/binary.js +8 -8
  19. package/libs/mqtt/built/debug/binary.js +176 -176
  20. package/libs/multiplayer/README.md +4 -0
  21. package/libs/multiplayer/docs/.gitkeep +0 -0
  22. package/libs/multiplayer/fieldEditors.ts +23 -0
  23. package/libs/multiplayer/images.ts +303 -0
  24. package/libs/multiplayer/mp.ts +643 -0
  25. package/libs/multiplayer/pxt.json +19 -0
  26. package/libs/multiplayer/stateKind.ts +14 -0
  27. package/libs/multiplayer/targetoverrides.ts +1 -0
  28. package/libs/multiplayer/test.ts +0 -0
  29. package/libs/net/built/debug/binary.js +176 -176
  30. package/libs/net-game/built/debug/binary.js +8488 -8488
  31. package/libs/palette/built/debug/binary.js +6898 -6898
  32. package/libs/pixel/built/debug/binary.js +8 -8
  33. package/libs/power/built/debug/binary.js +8 -8
  34. package/libs/proximity/built/debug/binary.js +8 -8
  35. package/libs/radio/built/debug/binary.js +8 -8
  36. package/libs/radio-broadcast/built/debug/binary.js +8 -8
  37. package/libs/rotary-encoder/built/debug/binary.js +8 -8
  38. package/libs/screen/built/debug/binary.js +50 -50
  39. package/libs/servo/built/debug/binary.js +8 -8
  40. package/libs/sprite-scaling/built/debug/binary.js +6898 -6898
  41. package/libs/storyboard/built/debug/binary.js +6898 -6898
  42. package/package.json +1 -1
@@ -0,0 +1,643 @@
1
+ namespace sprites.mp {
2
+ //% blockId=mp_setPlayerSprite
3
+ //% block="set $player sprite to $sprite=variables_get(mySprite)"
4
+ //% player.shadow=mp_playernumber
5
+ //% weight=75
6
+ //% blockGap=8
7
+ //% group="Multiplayer"
8
+ //% parts="multiplayer"
9
+ export function setPlayerSprite(player: number, sprite: Sprite) {
10
+ if (sprite && sprite.image) {
11
+ // Passing 'implicit' flag so we don't override icons that
12
+ // user has explicitly defined.
13
+ multiplayer.postPresenceIcon(
14
+ player,
15
+ sprite.image,
16
+ /** implicit **/ true
17
+ );
18
+ } else {
19
+ // Passing 'implicit' flag so we don't override icons that
20
+ // user has explicitly defined.
21
+ multiplayer.postPresenceIcon(
22
+ player,
23
+ undefined,
24
+ /** implicit **/ true
25
+ );
26
+
27
+ }
28
+ multiplayer._state().setPlayerSprite(player, sprite);
29
+ }
30
+
31
+ //% blockId=mp_getPlayerSprite
32
+ //% block="$player sprite"
33
+ //% player.shadow=mp_playernumber
34
+ //% weight=70
35
+ //% blockGap=8
36
+ //% group="Multiplayer"
37
+ //% parts="multiplayer"
38
+ export function getPlayerSprite(player: number): Sprite {
39
+ return multiplayer._state().getPlayerSprite(player);
40
+ }
41
+
42
+ //% blockId=mp_isPlayerSprite
43
+ //% block="is $sprite $player sprite"
44
+ //% sprite.shadow=variables_get
45
+ //% sprite.defl=mySprite
46
+ //% player.shadow=mp_playernumber
47
+ //% weight=60
48
+ //% group="Multiplayer"
49
+ //% parts="multiplayer"
50
+ export function isPlayerSprite(sprite: Sprite, player: number): boolean {
51
+ return getPlayerSprite(player) === sprite;
52
+ }
53
+ }
54
+
55
+ namespace controller.mp {
56
+ //% blockId=mp_moveWithButtons
57
+ //% block="$player move $sprite with buttons||vx $vx vy $vy"
58
+ //% player.shadow=mp_playernumber
59
+ //% sprite.shadow=variables_get
60
+ //% sprite.defl=mySprite
61
+ //% vx.defl=100
62
+ //% vy.defl=100
63
+ //% vx.shadow="spriteSpeedPicker"
64
+ //% vy.shadow="spriteSpeedPicker"
65
+ //% expandableArgumentMode="toggle"
66
+ //% inlineInputMode=inline
67
+ //% group="Multiplayer"
68
+ //% parts="multiplayer"
69
+ //% weight=100
70
+ export function moveWithButtons(
71
+ player: number,
72
+ sprite: Sprite,
73
+ vx?: number,
74
+ vy?: number
75
+ ) {
76
+ multiplayer.getController(player).moveSprite(sprite, vx, vy);
77
+ }
78
+
79
+ //% blockId=mp_onButtonEvent
80
+ //% block="on $button button $event for $player"
81
+ //% draggableParameters=reporter
82
+ //% group="Multiplayer"
83
+ //% parts="multiplayer"
84
+ //% weight=90
85
+ export function onButtonEvent(
86
+ button: multiplayer.MultiplayerButton,
87
+ event: ControllerButtonEvent,
88
+ handler: (player: number) => void
89
+ ) {
90
+ multiplayer._state().onButtonEvent(button, event, handler);
91
+ }
92
+
93
+ //% blockId=mp_isButtonPressed
94
+ //% block="is $player $button button pressed"
95
+ //% player.shadow=mp_playernumber
96
+ //% group="Multiplayer"
97
+ //% parts="multiplayer"
98
+ //% weight=80
99
+ //% blockGap=8
100
+ export function isButtonPressed(
101
+ player: number,
102
+ button: multiplayer.MultiplayerButton
103
+ ): boolean {
104
+ return multiplayer.getButton(multiplayer.getController(player), button).isPressed();
105
+ }
106
+ }
107
+
108
+ namespace info.mp {
109
+ //% blockId=mp_getPlayerState
110
+ //% block="$player $state"
111
+ //% player.shadow=mp_playernumber
112
+ //% state.shadow=mp_multiplayerstate
113
+ //% group="Multiplayer"
114
+ //% parts="multiplayer"
115
+ //% weight=100
116
+ //% blockGap=8
117
+ export function getPlayerState(player: number, state: number): number {
118
+ if (state === MultiplayerState.Score) {
119
+ return multiplayer.getInfo(player).score();
120
+ } else if (state === MultiplayerState.Lives) {
121
+ return multiplayer.getInfo(player).life();
122
+ }
123
+
124
+ return multiplayer._state().getPlayerState(player, state);
125
+ }
126
+
127
+ //% blockId=mp_setPlayerState
128
+ //% block="set $player $state to $value"
129
+ //% player.shadow=mp_playernumber
130
+ //% state.shadow=mp_multiplayerstate
131
+ //% group="Multiplayer"
132
+ //% parts="multiplayer"
133
+ //% weight=90
134
+ //% blockGap=8
135
+ export function setPlayerState(
136
+ player: number,
137
+ state: number,
138
+ value: number
139
+ ) {
140
+ if (state === MultiplayerState.Score) {
141
+ return multiplayer.getInfo(player).setScore(value);
142
+ } else if (state === MultiplayerState.Lives) {
143
+ return multiplayer.getInfo(player).setLife(value);
144
+ }
145
+
146
+ multiplayer._state().setPlayerState(player, state, value);
147
+ }
148
+
149
+ //% blockId=mp_changePlayerStateBy
150
+ //% block="change $player $state by $deltaValue"
151
+ //% player.shadow=mp_playernumber
152
+ //% state.shadow=mp_multiplayerstate
153
+ //% deltaValue.defl=1
154
+ //% group="Multiplayer"
155
+ //% parts="multiplayer"
156
+ //% weight=80
157
+ export function changePlayerStateBy(
158
+ player: number,
159
+ state: number,
160
+ deltaValue: number
161
+ ) {
162
+ setPlayerState(
163
+ player,
164
+ state,
165
+ getPlayerState(player, state) + deltaValue
166
+ );
167
+ }
168
+
169
+ //% blockId=mp_onScore
170
+ //% block="on score $score for $player"
171
+ //% score.defl=100
172
+ //% draggableParameters=reporter
173
+ //% group="Multiplayer"
174
+ //% parts="multiplayer"
175
+ //% weight=70
176
+ //% blockGap=8
177
+ export function onScore(score: number, handler: (player: number) => void) {
178
+ multiplayer._state().onReachedScore(score, handler);
179
+ }
180
+
181
+ //% blockId=mp_onLifeZero
182
+ //% block="on life zero for $player"
183
+ //% draggableParameters=reporter
184
+ //% group="Multiplayer"
185
+ //% parts="multiplayer"
186
+ //% weight=60
187
+ export function onLifeZero(handler: (player: number) => void) {
188
+ multiplayer._state().onLifeZero(handler);
189
+ }
190
+ }
191
+
192
+ //% icon="\uf0c0"
193
+ //% block="Multiplayer"
194
+ //% color="#207a77"
195
+ namespace multiplayer {
196
+ export enum PlayerNumber {
197
+ //% block="1"
198
+ One = 1,
199
+ //% block="2"
200
+ Two = 2,
201
+ //% block="3"
202
+ Three = 3,
203
+ //% block="4"
204
+ Four = 4,
205
+ }
206
+
207
+ export enum MultiplayerButton {
208
+ //% block="A"
209
+ A,
210
+ //% block="B"
211
+ B,
212
+ //% block="up"
213
+ Up,
214
+ //% block="right"
215
+ Right,
216
+ //% block="down"
217
+ Down,
218
+ //% block="left"
219
+ Left,
220
+ }
221
+
222
+ //% blockId=mp_setPlayerIndicatorsVisible
223
+ //% block="set player indicators $visible"
224
+ //% visible.shadow=toggleOnOff
225
+ //% visible.defl=true
226
+ //% group="Utility"
227
+ //% parts="multiplayer"
228
+ //% weight=100
229
+ export function setPlayerIndicatorsVisible(visible: boolean) {
230
+ multiplayer._state().setPlayerIndicatorsVisible(visible);
231
+ }
232
+
233
+ //% blockId=mp_isPlayer
234
+ //% block="$toCheck is $player"
235
+ //% toCheck.shadow=variables_get
236
+ //% toCheck.defl=player
237
+ //% player.shadow=mp_playernumber
238
+ //% group="Utility"
239
+ //% parts="multiplayer"
240
+ //% weight=90
241
+ export function isPlayer(toCheck: number, player: number): boolean {
242
+ return toCheck === player;
243
+ }
244
+
245
+ //% blockId=mp_allPlayers
246
+ //% block="array of all players"
247
+ //% group="Utility"
248
+ //% parts="multiplayer"
249
+ //% weight=80
250
+ export function allPlayers(): number[] {
251
+ return [1, 2, 3, 4];
252
+ }
253
+
254
+ //% blockId=mp_indexToPlayer
255
+ //% block="$index to player number"
256
+ //% index.shadow=variables_get
257
+ //% index.defl=index
258
+ //% group="Utility"
259
+ //% parts="multiplayer"
260
+ //% weight=70
261
+ //% blockGap=8
262
+ export function indexToPlayer(index: number) {
263
+ if (index < 0 || index > 3) return -1;
264
+ return (index | 0) + 1;
265
+ }
266
+
267
+ //% blockId=mp_playerToIndex
268
+ //% block="$player to index"
269
+ //% player.shadow=mp_playernumber
270
+ //% group="Utility"
271
+ //% parts="multiplayer"
272
+ //% weight=60
273
+ export function playerToIndex(player: number) {
274
+ if (player < 1 || player > 4) return -1;
275
+ return (player | 0) - 1;
276
+ }
277
+
278
+ export function getController(player: number): controller.Controller {
279
+ switch (player) {
280
+ case 1:
281
+ return controller.player1 as any;
282
+ case 2:
283
+ return controller.player2;
284
+ case 3:
285
+ return controller.player3;
286
+ case 4:
287
+ return controller.player4;
288
+ }
289
+ return undefined;
290
+ }
291
+
292
+ export function getInfo(player: number) {
293
+ switch (player) {
294
+ case 1:
295
+ return info.player1;
296
+ case 2:
297
+ return info.player2;
298
+ case 3:
299
+ return info.player3;
300
+ case 4:
301
+ return info.player4;
302
+ }
303
+ return undefined;
304
+ }
305
+
306
+ export function getButton(
307
+ ctrl: controller.Controller,
308
+ button: MultiplayerButton
309
+ ) {
310
+ switch (button) {
311
+ case MultiplayerButton.A:
312
+ return ctrl.A;
313
+ case MultiplayerButton.B:
314
+ return ctrl.B;
315
+ case MultiplayerButton.Up:
316
+ return ctrl.up;
317
+ case MultiplayerButton.Right:
318
+ return ctrl.right;
319
+ case MultiplayerButton.Down:
320
+ return ctrl.down;
321
+ case MultiplayerButton.Left:
322
+ return ctrl.left;
323
+ }
324
+ }
325
+
326
+ let stateStack: MPState[];
327
+
328
+ class ButtonHandler {
329
+ constructor(
330
+ public button: multiplayer.MultiplayerButton,
331
+ public event: ControllerButtonEvent,
332
+ public handler: (player: number) => void
333
+ ) {}
334
+ }
335
+
336
+ class ScoreHandler {
337
+ constructor(
338
+ public target: number,
339
+ public handler: (player: number) => void
340
+ ) {}
341
+ }
342
+
343
+ class PlayerStateEntry {
344
+ public player1: number;
345
+ public player2: number;
346
+ public player3: number;
347
+ public player4: number;
348
+
349
+ constructor() {
350
+ this.player1 = 0;
351
+ this.player2 = 0;
352
+ this.player3 = 0;
353
+ this.player4 = 0;
354
+ }
355
+
356
+ getForPlayer(player: number) {
357
+ switch (player) {
358
+ case 1:
359
+ return this.player1;
360
+ case 2:
361
+ return this.player2;
362
+ case 3:
363
+ return this.player3;
364
+ case 4:
365
+ return this.player4;
366
+ }
367
+ return undefined;
368
+ }
369
+
370
+ setForPlayer(player: number, value: number) {
371
+ switch (player) {
372
+ case 1:
373
+ this.player1 = value;
374
+ break;
375
+ case 2:
376
+ this.player2 = value;
377
+ break;
378
+ case 3:
379
+ this.player3 = value;
380
+ break;
381
+ case 4:
382
+ this.player4 = value;
383
+ break;
384
+ }
385
+ }
386
+ }
387
+
388
+ class MPState {
389
+ playerSprites: Sprite[];
390
+ buttonHandlers: ButtonHandler[];
391
+ scoreHandlers: ScoreHandler[];
392
+ playerState: PlayerStateEntry[];
393
+ lifeZeroHandler: (player: number) => void;
394
+ indicatorsVisible: boolean;
395
+ indicatorRenderable: scene.Renderable;
396
+
397
+ constructor() {
398
+ this.playerSprites = [];
399
+ this.buttonHandlers = [];
400
+ this.playerState = [];
401
+ this.scoreHandlers = [];
402
+ this.indicatorsVisible = false;
403
+ }
404
+
405
+ onButtonEvent(
406
+ button: multiplayer.MultiplayerButton,
407
+ event: ControllerButtonEvent,
408
+ handler: (playerNumber: number) => void
409
+ ) {
410
+ const existing = this.getButtonHandler(button, event);
411
+
412
+ if (existing) {
413
+ existing.handler = handler;
414
+ return;
415
+ }
416
+
417
+ this.buttonHandlers.push(new ButtonHandler(button, event, handler));
418
+
419
+ const registerHandler = (p: number) => {
420
+ multiplayer.getButton(multiplayer.getController(p), button).onEvent(event, () => {
421
+ this.getButtonHandler(button, event).handler(p);
422
+ });
423
+ };
424
+
425
+ for (let player = 1; player < 5; player++) {
426
+ registerHandler(player);
427
+ }
428
+ }
429
+
430
+ onReachedScore(score: number, handler: (playerNumber: number) => void) {
431
+ const existing = this.getScoreHandler(score);
432
+
433
+ if (existing) {
434
+ existing.handler = handler;
435
+ return;
436
+ }
437
+
438
+ this.scoreHandlers.push(new ScoreHandler(score, handler));
439
+
440
+ const registerHandler = (p: number) => {
441
+ multiplayer.getInfo(p).onScore(score, () => {
442
+ this.getScoreHandler(score).handler(p);
443
+ });
444
+ };
445
+
446
+ for (let player = 1; player < 5; player++) {
447
+ registerHandler(player);
448
+ }
449
+ }
450
+
451
+ onLifeZero(handler: (playerNumber: number) => void) {
452
+ if (!this.lifeZeroHandler) {
453
+ const registerHandler = (p: number) => {
454
+ multiplayer.getInfo(p).onLifeZero(() => {
455
+ this.lifeZeroHandler(p);
456
+ });
457
+ };
458
+
459
+ for (let player = 1; player < 5; player++) {
460
+ registerHandler(player);
461
+ }
462
+ }
463
+
464
+ this.lifeZeroHandler = handler;
465
+ }
466
+
467
+ setPlayerSprite(player: number, sprite: Sprite) {
468
+ player |= 0;
469
+ if (player < 1 || player > 4) return;
470
+
471
+ while (this.playerSprites.length < player + 1) {
472
+ this.playerSprites.push(undefined);
473
+ }
474
+
475
+ this.playerSprites[player] = sprite;
476
+ }
477
+
478
+ getPlayerSprite(player: number) {
479
+ return this.playerSprites[player];
480
+ }
481
+
482
+ setPlayerState(player: number, state: number, value: number) {
483
+ this.getOrCreatePlayerStateEntry(state).setForPlayer(player, value);
484
+ }
485
+
486
+ getPlayerState(player: number, state: number) {
487
+ return this.getOrCreatePlayerStateEntry(state).getForPlayer(player);
488
+ }
489
+
490
+ setPlayerIndicatorsVisible(visible: boolean) {
491
+ this.indicatorsVisible = visible;
492
+
493
+ if (visible && !this.indicatorRenderable) {
494
+ this.indicatorRenderable = scene.createRenderable(
495
+ 99,
496
+ (target, camera) => {
497
+ if (this.indicatorsVisible)
498
+ this.drawIndicators(target, camera);
499
+ }
500
+ );
501
+ }
502
+ }
503
+
504
+ protected getOrCreatePlayerStateEntry(state: number) {
505
+ if (!this.playerState[state]) {
506
+ while (this.playerState.length < state + 1) {
507
+ this.playerState.push(undefined);
508
+ }
509
+
510
+ this.playerState[state] = new PlayerStateEntry();
511
+ }
512
+
513
+ return this.playerState[state];
514
+ }
515
+
516
+ protected getButtonHandler(
517
+ button: multiplayer.MultiplayerButton,
518
+ event: ControllerButtonEvent
519
+ ) {
520
+ for (const bHandler of this.buttonHandlers) {
521
+ if (bHandler.button === button && bHandler.event === event)
522
+ return bHandler;
523
+ }
524
+
525
+ return undefined;
526
+ }
527
+
528
+ protected getScoreHandler(score: number) {
529
+ for (const sHandler of this.scoreHandlers) {
530
+ if (sHandler.target === score) return sHandler;
531
+ }
532
+ return undefined;
533
+ }
534
+
535
+ protected drawIndicators(target: Image, camera: scene.Camera) {
536
+ for (let player = 1; player < 5; player++) {
537
+ const sprite = this.getPlayerSprite(player);
538
+
539
+ if (
540
+ !sprite ||
541
+ sprite.flags &
542
+ (sprites.Flag.Destroyed | sprites.Flag.Invisible)
543
+ ) {
544
+ continue;
545
+ }
546
+
547
+ let top = Fx.toInt(sprite._hitbox.top);
548
+ let bottom = Fx.toInt(sprite._hitbox.bottom);
549
+ let left = Fx.toInt(sprite._hitbox.left);
550
+ let right = Fx.toInt(sprite._hitbox.right);
551
+
552
+ if (!(sprite.flags & sprites.Flag.RelativeToCamera)) {
553
+ top -= camera.drawOffsetY;
554
+ bottom -= camera.drawOffsetY;
555
+ left -= camera.drawOffsetX;
556
+ right -= camera.drawOffsetX;
557
+ }
558
+
559
+ if (left < 0) {
560
+ const indicator = multiplayer._indicatorForPlayer(
561
+ player,
562
+ CollisionDirection.Right
563
+ );
564
+ target.drawTransparentImage(
565
+ indicator,
566
+ Math.max(right + 2, 0),
567
+ Math.min(
568
+ Math.max(
569
+ top +
570
+ ((bottom - top) >> 1) -
571
+ (indicator.height >> 1),
572
+ 0
573
+ ),
574
+ screen.height - indicator.height
575
+ )
576
+ );
577
+ } else if (right > 160) {
578
+ const indicator = multiplayer._indicatorForPlayer(
579
+ player,
580
+ CollisionDirection.Left
581
+ );
582
+ target.drawTransparentImage(
583
+ indicator,
584
+ Math.min(
585
+ left - indicator.width - 2,
586
+ screen.width - indicator.width
587
+ ),
588
+ Math.min(
589
+ Math.max(
590
+ top +
591
+ ((bottom - top) >> 1) -
592
+ (indicator.height >> 1),
593
+ 0
594
+ ),
595
+ screen.height - indicator.height
596
+ )
597
+ );
598
+ } else if (top < 18) {
599
+ const indicator = multiplayer._indicatorForPlayer(
600
+ player,
601
+ CollisionDirection.Bottom
602
+ );
603
+ target.drawTransparentImage(
604
+ indicator,
605
+ left + ((right - left) >> 1) - (indicator.width >> 1),
606
+ Math.max(bottom + 2, 0)
607
+ );
608
+ } else {
609
+ const indicator = multiplayer._indicatorForPlayer(
610
+ player,
611
+ CollisionDirection.Top
612
+ );
613
+ target.drawTransparentImage(
614
+ indicator,
615
+ left + ((right - left) >> 1) - (indicator.width >> 1),
616
+ Math.min(
617
+ top - indicator.height - 2,
618
+ screen.height - indicator.height
619
+ )
620
+ );
621
+ }
622
+ }
623
+ }
624
+ }
625
+
626
+ function init() {
627
+ if (stateStack) return;
628
+ stateStack = [new MPState()];
629
+ game.addScenePushHandler(() => {
630
+ stateStack.push(new MPState());
631
+ });
632
+
633
+ game.addScenePopHandler(() => {
634
+ stateStack.pop();
635
+ if (stateStack.length === 0) stateStack.push(new MPState());
636
+ });
637
+ }
638
+
639
+ export function _state() {
640
+ init();
641
+ return stateStack[stateStack.length - 1];
642
+ }
643
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "multiplayer",
3
+ "description": "Additional blocks for building multiplayer games",
4
+ "files": [
5
+ "README.md",
6
+ "fieldEditors.ts",
7
+ "images.ts",
8
+ "mp.ts",
9
+ "stateKind.ts",
10
+ "targetoverrides.ts"
11
+ ],
12
+ "testFiles": [
13
+ "test.ts"
14
+ ],
15
+ "public": true,
16
+ "dependencies": {
17
+ "game": "file:../game"
18
+ }
19
+ }
@@ -0,0 +1,14 @@
1
+ namespace MultiplayerState {
2
+ let nextKind: number;
3
+
4
+ export function create() {
5
+ if (nextKind === undefined) nextKind = 0;
6
+ return nextKind++;
7
+ }
8
+
9
+ //% isKind
10
+ export const Score = create();
11
+
12
+ //% isKind
13
+ export const Lives = create();
14
+ }
@@ -0,0 +1 @@
1
+ // TODO any platform specific overrides
File without changes