littlejsengine 1.15.8 → 1.16.1

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 (53) hide show
  1. package/dist/littlejs.d.ts +87 -85
  2. package/dist/littlejs.esm.js +578 -532
  3. package/dist/littlejs.esm.min.js +1 -1
  4. package/dist/littlejs.js +562 -521
  5. package/dist/littlejs.min.js +1 -1
  6. package/dist/littlejs.release.js +485 -444
  7. package/examples/box2d/game.js +2 -2
  8. package/examples/breakout/game.js +3 -3
  9. package/examples/electron/game.js +1 -2
  10. package/examples/electron/index.html +2 -2
  11. package/examples/htmlMenu/game.js +0 -1
  12. package/examples/index.html +1 -1
  13. package/examples/module/game.js +1 -2
  14. package/examples/particles/index.html +1 -1
  15. package/examples/platformer/game.js +11 -4
  16. package/examples/puzzle/game.js +2 -2
  17. package/examples/shorts/base.html +3 -4
  18. package/examples/shorts/box2dPool.js +2 -2
  19. package/examples/shorts/empty.js +1 -1
  20. package/examples/shorts/{systemFont.js → fontImage.js} +3 -3
  21. package/examples/shorts/fps.js +1 -1
  22. package/examples/shorts/helloWorld.js +2 -2
  23. package/examples/shorts/nineSlice.js +2 -2
  24. package/examples/shorts/slidingPuzzle.js +1 -1
  25. package/examples/shorts/uiSystem.js +1 -1
  26. package/examples/starter/game.js +1 -2
  27. package/examples/starter/index.html +2 -3
  28. package/examples/stress/index.html +1 -1
  29. package/examples/typescript/game.js +1 -2
  30. package/examples/typescript/game.ts +1 -2
  31. package/examples/uiSystem/game.js +4 -7
  32. package/package.json +1 -1
  33. package/plugins/box2d.js +8 -8
  34. package/plugins/drawUtilities.js +6 -6
  35. package/plugins/postProcess.js +13 -20
  36. package/plugins/uiSystem.js +15 -3
  37. package/reference.md +4 -6
  38. package/src/engine.js +240 -53
  39. package/src/engineAudio.js +3 -3
  40. package/src/engineBuild.js +0 -1
  41. package/src/engineDebug.js +78 -78
  42. package/src/engineDraw.js +107 -109
  43. package/src/engineExport.js +16 -11
  44. package/src/engineInput.js +14 -2
  45. package/src/engineMedals.js +3 -3
  46. package/src/engineObject.js +4 -2
  47. package/src/engineParticles.js +8 -6
  48. package/src/engineRelease.js +1 -1
  49. package/src/engineSettings.js +44 -30
  50. package/src/engineTileLayer.js +6 -6
  51. package/src/engineUtilities.js +2 -10
  52. package/src/engineWebGL.js +6 -5
  53. package/src/engineSplash.js +0 -173
package/reference.md CHANGED
@@ -145,7 +145,6 @@ drawCanvas2D(pos, size, angle=0, mirror, drawFunction, screenSpace, context)
145
145
 
146
146
  // Text functions
147
147
  drawText(text, pos, size=1, color=WHITE, lineWidth=0, lineColor=BLACK)
148
- drawTextOverlay(text, pos, size=1, color=WHITE, lineWidth=0, lineColor=BLACK)
149
148
  drawTextScreen(text, pos, size=1, color=WHITE, lineWidth=0, lineColor=BLACK)
150
149
 
151
150
  // Utility drawing functions
@@ -173,7 +172,6 @@ TextureInfo.glTexture // WebGL texture
173
172
  FontImage(image, tileSize=(8,8), paddingSize=(0,1)) // Create an image font
174
173
  FontImage.drawText(text, pos, scale, center) // Draw text in world space
175
174
  FontImage.drawTextScreen(text, pos, scale, center) // Draw text in screen space
176
- FontImage.drawTextOverlay(text, pos, scale, center) // Draw text to overlay canvas
177
175
 
178
176
  // Camera settings
179
177
  cameraPos = (0,0) // Position of camera in world space
@@ -193,8 +191,8 @@ showSplashScreen = false // Show the LittleJS splash screen on startup
193
191
  glEnable = true // Enable fast WebGL rendering
194
192
 
195
193
  // Tile sheet settings
196
- tileSizeDefault = (16,16) // Default size of tiles in pixels
197
- tileFixBleedScale = .3 // How much smaller to draw tiles to prevent bleeding
194
+ tileDefaultSize = (16,16) // Default size of tiles in pixels
195
+ tileDefaultBleed = .3 // How much smaller to draw tiles to prevent bleeding
198
196
  ```
199
197
 
200
198
  ## LittleJS Audio System
@@ -440,8 +438,8 @@ debugSaveDataURL(dataURL, filename) // Save url to a file
440
438
  debug // Is debug enabled?
441
439
  debugPointSize = .5 // Size to render debug points by default
442
440
  debugKey = 'Escape' // Key code used to toggle debug mode
443
- debugOverlay // True if the debug overlay is active
444
- showWatermark // True if watermark with FPS should be show
441
+ debugOverlay // Is the debug overlay is active?
442
+ debugWatermark // Should watermark with FPS appear in debug mode?
445
443
  ```
446
444
 
447
445
  [LittleJS Engine](https://github.com/KilledByAPixel/LittleJS) Copyright 2021 Frank Force
package/src/engine.js CHANGED
@@ -30,7 +30,7 @@ const engineName = 'LittleJS';
30
30
  * @type {string}
31
31
  * @default
32
32
  * @memberof Engine */
33
- const engineVersion = '1.15.8';
33
+ const engineVersion = '1.16.1';
34
34
 
35
35
  /** Frames per second to update
36
36
  * @type {number}
@@ -177,8 +177,7 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
177
177
  mainCanvasSize = vec2(mainCanvas.width, mainCanvas.height);
178
178
 
179
179
  // disable smoothing for pixel art
180
- overlayContext.imageSmoothingEnabled =
181
- mainContext.imageSmoothingEnabled = !tilesPixelated;
180
+ mainContext.imageSmoothingEnabled = !tilesPixelated;
182
181
 
183
182
  // setup gl rendering if enabled
184
183
  glPreRender();
@@ -190,7 +189,7 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
190
189
  // update time keeping
191
190
  let frameTimeDeltaMS = frameTimeMS - frameTimeLastMS;
192
191
  frameTimeLastMS = frameTimeMS;
193
- if (debug || showWatermark)
192
+ if (debug || debugWatermark)
194
193
  averageFPS = lerp(averageFPS, 1e3/(frameTimeDeltaMS||1), .05);
195
194
  const debugSpeedUp = debug && keyIsDown('Equal'); // +
196
195
  const debugSpeedDown = debug && keyIsDown('Minus'); // -
@@ -218,6 +217,8 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
218
217
  debugUpdate();
219
218
  gameUpdatePost();
220
219
  inputUpdatePost();
220
+ if (debugVideoCaptureIsActive())
221
+ renderFrame();
221
222
  }
222
223
  else
223
224
  {
@@ -281,19 +282,19 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
281
282
  glFlush();
282
283
  debugVideoCaptureUpdate();
283
284
 
284
- if (showWatermark && !debugVideoCaptureIsActive())
285
+ if (debugWatermark && !debugVideoCaptureIsActive())
285
286
  {
286
287
  // update fps display
287
- overlayContext.textAlign = 'right';
288
- overlayContext.textBaseline = 'top';
289
- overlayContext.font = '1em monospace';
290
- overlayContext.fillStyle = '#000';
288
+ mainContext.textAlign = 'right';
289
+ mainContext.textBaseline = 'top';
290
+ mainContext.font = '1em monospace';
291
+ mainContext.fillStyle = '#000';
291
292
  const text = engineName + ' ' + 'v' + engineVersion + ' / '
292
293
  + drawCount + ' / ' + engineObjects.length + ' / ' + averageFPS.toFixed(1)
293
294
  + (glEnable ? ' GL' : ' 2D') ;
294
- overlayContext.fillText(text, mainCanvas.width-3, 3);
295
- overlayContext.fillStyle = '#fff';
296
- overlayContext.fillText(text, mainCanvas.width-2, 2);
295
+ mainContext.fillText(text, mainCanvas.width-3, 3);
296
+ mainContext.fillStyle = '#fff';
297
+ mainContext.fillText(text, mainCanvas.width-2, 2);
297
298
  }
298
299
  drawCount = 0;
299
300
  }
@@ -305,42 +306,60 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
305
306
 
306
307
  if (canvasFixedSize.x)
307
308
  {
308
- // clear canvas and set fixed size
309
- mainCanvas.width = canvasFixedSize.x;
310
- mainCanvas.height = canvasFixedSize.y;
311
-
312
- // fit to window by adding space on top or bottom if necessary
313
- const aspect = innerWidth / innerHeight;
314
- const fixedAspect = mainCanvas.width / mainCanvas.height;
315
- (glCanvas||mainCanvas).style.width = mainCanvas.style.width = overlayCanvas.style.width = aspect < fixedAspect ? '100%' : '';
316
- (glCanvas||mainCanvas).style.height = mainCanvas.style.height = overlayCanvas.style.height = aspect < fixedAspect ? '' : '100%';
309
+ // set canvas fixed size
310
+ mainCanvasSize = canvasFixedSize.copy();
311
+
312
+ // fit to window using css width and height
313
+ const innerAspect = innerWidth / innerHeight;
314
+ const fixedAspect = canvasFixedSize.x / canvasFixedSize.y;
315
+ const w = innerAspect < fixedAspect ? '100%' : '';
316
+ const h = innerAspect < fixedAspect ? '' : '100%';
317
+ mainCanvas.style.width = w;
318
+ mainCanvas.style.height = h;
319
+ if (glCanvas)
320
+ {
321
+ glCanvas.style.width = w;
322
+ glCanvas.style.height = h;
323
+ }
317
324
  }
318
325
  else
319
326
  {
320
- // clear canvas and set size to same as window
321
- mainCanvas.width = min(innerWidth, canvasMaxSize.x);
322
- mainCanvas.height = min(innerHeight, canvasMaxSize.y);
327
+ // get main canvas size based on window size
328
+ mainCanvasSize.x = min(innerWidth, canvasMaxSize.x);
329
+ mainCanvasSize.y = min(innerHeight, canvasMaxSize.y);
330
+
331
+ // responsive aspect ratio with native resolution
332
+ const innerAspect = innerWidth / innerHeight;
333
+ ASSERT(canvasMinAspect <= canvasMaxAspect);
334
+ if (canvasMaxAspect && innerAspect > canvasMaxAspect)
335
+ {
336
+ // full height
337
+ const w = mainCanvasSize.y * canvasMaxAspect | 0;
338
+ mainCanvasSize.x = min(w, canvasMaxSize.x);
339
+ }
340
+ else if (innerAspect < canvasMinAspect)
341
+ {
342
+ // full width
343
+ const h = mainCanvasSize.x / canvasMinAspect | 0;
344
+ mainCanvasSize.y = min(h, canvasMaxSize.y);
345
+ }
323
346
  }
324
347
 
348
+ // clear main canvas and set size
349
+ mainCanvas.width = mainCanvasSize.x;
350
+ mainCanvas.height = mainCanvasSize.y;
351
+
325
352
  // apply the clear color to main canvas
326
- if (canvasClearColor.a > 0)
353
+ if (canvasClearColor.a > 0 && !glEnable)
327
354
  {
328
355
  mainContext.fillStyle = canvasClearColor.toString();
329
356
  mainContext.fillRect(0, 0, mainCanvasSize.x, mainCanvasSize.y);
330
357
  mainContext.fillStyle = BLACK.toString();
331
358
  }
332
359
 
333
- // clear overlay canvas and set size
334
- overlayCanvas.width = mainCanvas.width;
335
- overlayCanvas.height = mainCanvas.height;
336
-
337
- // save canvas size
338
- mainCanvasSize = vec2(mainCanvas.width, mainCanvas.height);
339
-
340
360
  // set default line join and cap
341
- const lineJoin = 'round', lineCap = 'round';
342
- mainContext.lineJoin = overlayContext.lineJoin = lineJoin;
343
- mainContext.lineCap = overlayContext.lineCap = lineCap;
361
+ mainContext.lineJoin = 'round';
362
+ mainContext.lineCap = 'round';
344
363
  }
345
364
 
346
365
  // wait for gameInit to load
@@ -352,6 +371,9 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
352
371
  if (headlessMode)
353
372
  return startEngine();
354
373
 
374
+ // setup webgl
375
+ glInit(rootElement);
376
+
355
377
  // setup html
356
378
  const styleRoot =
357
379
  'margin:0;' + // fill the window
@@ -360,37 +382,32 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
360
382
  'user-select:none;' + // prevent hold to select
361
383
  '-webkit-user-select:none;' + // compatibility for ios
362
384
  'touch-action:none;' + // prevent mobile pinch to resize
363
- '-webkit-touch-callout:none';// compatibility for ios
385
+ '-webkit-touch-callout:none'; // compatibility for ios
364
386
  rootElement.style.cssText = styleRoot;
365
- drawCanvas = mainCanvas = document.createElement('canvas');
366
- rootElement.appendChild(mainCanvas);
387
+ drawCanvas = mainCanvas = rootElement.appendChild(document.createElement('canvas'));
367
388
  drawContext = mainContext = mainCanvas.getContext('2d');
368
389
 
369
390
  // init stuff and start engine
370
391
  inputInit();
371
392
  audioInit();
372
393
  debugInit();
373
- glInit();
374
394
 
375
- // create overlay canvas for hud to appear above gl canvas
376
- overlayCanvas = document.createElement('canvas')
377
- rootElement.appendChild(overlayCanvas);
378
- overlayContext = overlayCanvas.getContext('2d');
379
-
380
- // set canvases
395
+ // setup canvases
396
+ // transform way is still more reliable then flexbox or grid
381
397
  const styleCanvas = 'position:absolute;'+ // allow canvases to overlap
382
398
  'top:50%;left:50%;transform:translate(-50%,-50%)'; // center on screen
383
- mainCanvas.style.cssText = overlayCanvas.style.cssText = styleCanvas;
399
+ mainCanvas.style.cssText = styleCanvas;
384
400
  if (glCanvas)
385
401
  glCanvas.style.cssText = styleCanvas;
386
402
  setCanvasPixelated(canvasPixelated);
387
- setOverlayCanvasPixelated(overlayCanvasPixelated);
388
403
  updateCanvas();
389
404
  glPreRender();
390
405
 
391
- // create offscreen canvas for image processing
392
- workCanvas = new OffscreenCanvas(256, 256);
393
- workContext = workCanvas.getContext('2d', { willReadFrequently: true });
406
+ // create offscreen canvases for image processing
407
+ workCanvas = new OffscreenCanvas(64, 64);
408
+ workContext = workCanvas.getContext('2d');
409
+ workReadCanvas = new OffscreenCanvas(64, 64);
410
+ workReadContext = workReadCanvas.getContext('2d', { willReadFrequently: true });
394
411
 
395
412
  // create promises for loading images
396
413
  const promises = imageSources.map((src, textureIndex)=>
@@ -441,9 +458,176 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
441
458
  // wait for all the promises to finish
442
459
  await Promise.all(promises);
443
460
  return startEngine();
461
+
462
+ ///////////////////////////////////////////////////////////////////////////
463
+ // LittleJS Splash Screen
464
+ function drawEngineSplashScreen(t)
465
+ {
466
+ const x = mainContext;
467
+ const w = mainCanvas.width = innerWidth;
468
+ const h = mainCanvas.height = innerHeight;
469
+
470
+ {
471
+ // background
472
+ const p3 = percent(t, 1, .8);
473
+ const p4 = percent(t, 0, .5);
474
+ const g = x.createRadialGradient(w/2,h/2,0,w/2,h/2,hypot(w,h)*.7);
475
+ g.addColorStop(0,hsl(0,0,lerp(0,p3/2,p4),p3).toString());
476
+ g.addColorStop(1,hsl(0,0,0,p3).toString());
477
+ x.save();
478
+ x.fillStyle = g;
479
+ x.fillRect(0,0,w,h);
480
+ }
481
+
482
+ // draw LittleJS logo...
483
+ const rect = (X, Y, W, H, C)=>
484
+ {
485
+ x.beginPath();
486
+ x.rect(X,Y,W,C?H*p:H);
487
+ x.fillStyle = C;
488
+ C ? x.fill() : x.stroke();
489
+ };
490
+ const line = (X, Y, Z, W)=>
491
+ {
492
+ x.beginPath();
493
+ x.lineTo(X,Y);
494
+ x.lineTo(Z,W);
495
+ x.stroke();
496
+ };
497
+ const circle = (X, Y, R, A=0, B=2*PI, C, F)=>
498
+ {
499
+ const D = (A+B)/2, E = p*(B-A)/2;
500
+ x.beginPath();
501
+ F && x.lineTo(X,Y);
502
+ x.arc(X,Y,R,D-E,D+E);
503
+ x.fillStyle = C;
504
+ C ? x.fill() : x.stroke();
505
+ };
506
+ const color = (c=0, l=0) =>
507
+ hsl([.98,.3,.57,.14][c%4],.8,[0,.3,.5,.8,.9][l]).toString();
508
+ const alpha = wave(1,1,t);
509
+ const p = percent(alpha, .1, .5);
510
+
511
+ // setup
512
+ x.translate(w/2,h/2);
513
+ const size = min(6, min(w,h)/99); // fit to screen
514
+ x.scale(size,size);
515
+ x.translate(-40,-35);
516
+ x.lineJoin = x.lineCap = 'round';
517
+ x.lineWidth = .1 + p*1.9;
518
+
519
+ // drawing effect
520
+ const p2 = percent(alpha,.1,1);
521
+ x.setLineDash([99*p2,99]);
522
+
523
+ // cab top
524
+ rect(7,16,18,-8,color(2,2));
525
+ rect(7,8,18,4,color(2,3));
526
+ rect(25,8,8,8,color(2,1));
527
+ rect(25,8,-18,8);
528
+ rect(25,8,8,8);
529
+
530
+ // cab
531
+ rect(25,16,7,23,color());
532
+ rect(11,39,14,-23,color(1,1));
533
+ rect(11,16,14,18,color(1,2));
534
+ rect(11,16,14,8,color(1,3));
535
+ rect(25,16,-14,24);
536
+
537
+ // cab window
538
+ rect(15,29,6,-9,color(2,2));
539
+ circle(15,21,5,0,PI/2,color(2,4),1);
540
+ rect(21,21,-6,9);
541
+
542
+ // little stack
543
+ rect(37,14,9,6,color(3,2));
544
+ rect(37,14,4.5,6,color(3,3));
545
+ rect(37,14,9,6);
546
+
547
+ // big stack
548
+ rect(50,20,10,-8,color(0,1));
549
+ rect(50,20,6.5,-8,color(0,2));
550
+ rect(50,20,3.5,-8,color(0,3));
551
+ rect(50,20,10,-8);
552
+ circle(55,2,11.4,.5,PI-.5,color(3,3));
553
+ circle(55,2,11.4,.5,PI/2,color(3,2),1);
554
+ circle(55,2,11.4,.5,PI-.5);
555
+ rect(45,7,20,-7,color(0,2));
556
+ rect(45,-1,20,4,color(0,3));
557
+ rect(45,-1,20,8);
558
+
559
+ // engine
560
+ for (let i=5; i--;)
561
+ {
562
+ // stagger radius to fix slight seam
563
+ circle(60-i*6,30, 9.9,0,2*PI,color(i+2,3));
564
+ circle(60-i*6,30,10.0,-.5,PI+.5,color(i+2,2));
565
+ circle(60-i*6,30,10.1,.5,PI-.5,color(i+2,1));
566
+ }
567
+
568
+ // engine outline
569
+ circle(36,30,10,PI/2,PI*3/2);
570
+ circle(48,30,10,PI/2,PI*3/2);
571
+ circle(60,30,10);
572
+ line(36,20,60,20);
573
+
574
+ // engine front light
575
+ circle(60,30,4,PI,3*PI,color(3,2));
576
+ circle(60,30,4,PI,2*PI,color(3,3));
577
+ circle(60,30,4,PI,3*PI);
578
+
579
+ // front brush
580
+ for (let i=6; i--;)
581
+ {
582
+ x.beginPath();
583
+ x.lineTo(53,54);
584
+ x.lineTo(53,40);
585
+ x.lineTo(53+(1+i*2.9)*p,40);
586
+ x.lineTo(53+(4+i*3.5)*p,54);
587
+ x.fillStyle = color(0,i%2+2);
588
+ x.fill();
589
+ i%2 && x.stroke();
590
+ }
591
+
592
+ // wheels
593
+ rect(6,40,5,5);
594
+ rect(6,40,5,5,color());
595
+ rect(15,54,38,-14,color());
596
+ for (let i=3; i--;)
597
+ for (let j=2; j--;)
598
+ {
599
+ circle(15*i+15,47,j?7:1,PI,3*PI,color(i,3));
600
+ x.stroke();
601
+ circle(15*i+15,47,j?7:1,0,PI,color(i,2));
602
+ x.stroke();
603
+ }
604
+ line(6,40,68,40); // center
605
+ line(77,54,4,54); // bottom
606
+
607
+ // draw engine name
608
+ const s = engineName;
609
+ x.font = '900 16px arial';
610
+ x.textAlign = 'center';
611
+ x.textBaseline = 'top';
612
+ x.lineWidth = .1+p*3.9;
613
+ let w2 = 0;
614
+ for (let i=0; i<s.length; ++i)
615
+ w2 += x.measureText(s[i]).width;
616
+ for (let j=2; j--;)
617
+ for (let i=0, X=41-w2/2; i<s.length; ++i)
618
+ {
619
+ x.fillStyle = color(i,2);
620
+ const w = x.measureText(s[i]).width;
621
+ x[j?'strokeText':'fillText'](s[i],X+w/2,55.5,17*p);
622
+ X += w;
623
+ }
624
+ x.restore();
625
+ }
626
+ ///////////////////////////////////////////////////////////////////////////
444
627
  }
445
628
 
446
629
  /** Update each engine object, remove destroyed objects, and update time
630
+ * can be called manually if objects need to be updated outside of main loop
447
631
  * @memberof Engine */
448
632
  function engineObjectsUpdate()
449
633
  {
@@ -495,18 +679,21 @@ function engineObjectsDestroy()
495
679
  function engineObjectsCollect(pos, size, objects=engineObjects)
496
680
  {
497
681
  const collectedObjects = [];
498
- if (!pos) // all objects
682
+ if (!pos)
499
683
  {
684
+ // all objects
500
685
  for (const o of objects)
501
686
  collectedObjects.push(o);
502
687
  }
503
- else if (size instanceof Vector2) // bounding box test
688
+ else if (size instanceof Vector2)
504
689
  {
690
+ // bounding box test
505
691
  for (const o of objects)
506
692
  o.isOverlapping(pos, size) && collectedObjects.push(o);
507
693
  }
508
- else // circle test
694
+ else
509
695
  {
696
+ // circle test
510
697
  const sizeSquared = size*size;
511
698
  for (const o of objects)
512
699
  pos.distanceSquared(o.pos) < sizeSquared && collectedObjects.push(o);
@@ -178,12 +178,12 @@ class Sound
178
178
  ///////////////////////////////////////////////////////////////////////////////
179
179
 
180
180
  /**
181
- * Sound Wave Object - Stores a wave sound for later use and can be played positionally
182
- * - this can be used to play wave, mp3, and ogg files
181
+ * Sound Wave Object - Loads and stores an audio file for later use
182
+ * - this can be used to load and play wave, mp3, and ogg files
183
183
  * @extends Sound
184
184
  * @memberof Audio
185
185
  * @example
186
- * // create a sound
186
+ * // load an audio asset file
187
187
  * const sound_example = new SoundWave('sound.mp3');
188
188
  *
189
189
  * // play the sound
@@ -26,7 +26,6 @@ const engineSourceFiles =
26
26
  `${SOURCE_FOLDER}/engineParticles.js`,
27
27
  `${SOURCE_FOLDER}/engineMedals.js`,
28
28
  `${SOURCE_FOLDER}/engineWebGL.js`,
29
- `${SOURCE_FOLDER}/engineSplash.js`,
30
29
  ];
31
30
  const enginePluginFiles =
32
31
  [