littlejsengine 1.11.17 → 1.12.4

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 (62) hide show
  1. package/dist/littlejs.d.ts +112 -43
  2. package/dist/littlejs.esm.js +586 -500
  3. package/dist/littlejs.esm.min.js +1 -1
  4. package/dist/littlejs.js +2993 -122
  5. package/dist/littlejs.min.js +1 -1
  6. package/dist/littlejs.release.js +2992 -119
  7. package/examples/box2d/game.js +70 -39
  8. package/examples/box2d/gameObjects.js +81 -77
  9. package/examples/box2d/index.html +2 -7
  10. package/examples/box2d/scenes.js +80 -90
  11. package/examples/breakout/game.js +63 -28
  12. package/examples/breakout/gameObjects.js +45 -47
  13. package/examples/breakout/index.html +1 -5
  14. package/examples/breakoutTutorial/game.js +36 -29
  15. package/examples/breakoutTutorial/index.html +1 -3
  16. package/examples/empty/game.js +5 -2
  17. package/examples/empty/index.html +1 -3
  18. package/examples/htmlMenu/game.js +24 -15
  19. package/examples/htmlMenu/index.html +5 -7
  20. package/examples/index.html +2 -3
  21. package/examples/module/game.js +32 -34
  22. package/examples/module/index.html +1 -1
  23. package/examples/particles/index.html +27 -22
  24. package/examples/platformer/game.js +71 -45
  25. package/examples/platformer/gameCharacter.js +42 -34
  26. package/examples/platformer/gameEffects.js +82 -75
  27. package/examples/platformer/gameLevel.js +67 -38
  28. package/examples/platformer/{gameLevelData.js → gameLevelData.json} +1 -11
  29. package/examples/platformer/gameObjects.js +70 -64
  30. package/examples/platformer/gamePlayer.js +12 -7
  31. package/examples/platformer/index.html +1 -9
  32. package/examples/puzzle/game.js +59 -40
  33. package/examples/puzzle/index.html +1 -3
  34. package/examples/shorts/base.html +2 -2
  35. package/examples/shorts/particles.js +1 -1
  36. package/examples/shorts/platformer.js +1 -1
  37. package/examples/shorts/tileLayer.js +5 -6
  38. package/examples/shorts/tiles.png +0 -0
  39. package/examples/starter/game.js +9 -12
  40. package/examples/starter/index.html +13 -13
  41. package/examples/stress/index.html +44 -44
  42. package/examples/typescript/build.js +17 -18
  43. package/examples/typescript/game.js +32 -34
  44. package/examples/typescript/game.ts +32 -34
  45. package/examples/typescript/index.html +1 -1
  46. package/examples/uiSystem/game.js +34 -31
  47. package/examples/uiSystem/index.html +1 -5
  48. package/package.json +1 -1
  49. package/plugins/box2d.js +6 -2
  50. package/plugins/pluginExport.js +1 -2
  51. package/reference.md +29 -27
  52. package/src/engine.js +1 -1
  53. package/src/engineBuild.js +13 -6
  54. package/src/engineDebug.js +1 -3
  55. package/src/engineExport.js +2 -6
  56. package/src/engineInput.js +3 -1
  57. package/src/engineObject.js +18 -14
  58. package/src/engineSettings.js +6 -6
  59. package/src/engineTileLayer.js +179 -96
  60. package/examples/typescript/build/dist/littlejs.esm.js +0 -4834
  61. package/examples/typescript/build/examples/typescript/build.js +0 -24
  62. package/examples/typescript/build/examples/typescript/game.js +0 -102
@@ -1 +1 @@
1
- let showWatermark$$module$dist$littlejs_esm_min_js_tmp=0,debugKey$$module$dist$littlejs_esm_min_js_tmp="";const debug$$module$dist$littlejs_esm_min_js_tmp=0,debugOverlay$$module$dist$littlejs_esm_min_js_tmp=0,debugPhysics$$module$dist$littlejs_esm_min_js_tmp=0,debugParticles$$module$dist$littlejs_esm_min_js_tmp=0,debugRaycast$$module$dist$littlejs_esm_min_js_tmp=0,debugGamepads$$module$dist$littlejs_esm_min_js_tmp=0,debugMedals$$module$dist$littlejs_esm_min_js_tmp=0;function ASSERT$$module$dist$littlejs_esm_min_js_tmp(){}function debugInit$$module$dist$littlejs_esm_min_js_tmp(){}function debugUpdate$$module$dist$littlejs_esm_min_js_tmp(){}function debugRender$$module$dist$littlejs_esm_min_js_tmp(){}function debugRect$$module$dist$littlejs_esm_min_js_tmp(){}function debugPoly$$module$dist$littlejs_esm_min_js_tmp(){}function debugCircle$$module$dist$littlejs_esm_min_js_tmp(){}function debugPoint$$module$dist$littlejs_esm_min_js_tmp(){}function debugLine$$module$dist$littlejs_esm_min_js_tmp(){}function debugOverlap$$module$dist$littlejs_esm_min_js_tmp(){}function debugText$$module$dist$littlejs_esm_min_js_tmp(){}function debugClear$$module$dist$littlejs_esm_min_js_tmp(){}function debugScreenshot$$module$dist$littlejs_esm_min_js_tmp(){}function debugSaveCanvas$$module$dist$littlejs_esm_min_js_tmp(){}function debugSaveText$$module$dist$littlejs_esm_min_js_tmp(){}function debugSaveDataURL$$module$dist$littlejs_esm_min_js_tmp(){}function debugShowErrors$$module$dist$littlejs_esm_min_js_tmp(){}function debugVideoCaptureIsActive$$module$dist$littlejs_esm_min_js_tmp(){return!1}function debugVideoCaptureStart$$module$dist$littlejs_esm_min_js_tmp(){}function debugVideoCaptureStop$$module$dist$littlejs_esm_min_js_tmp(){}function debugVideoCaptureUpdate$$module$dist$littlejs_esm_min_js_tmp(){}const PI$$module$dist$littlejs_esm_min_js_tmp=Math.PI;function abs$$module$dist$littlejs_esm_min_js_tmp(a){return Math.abs(a)}function min$$module$dist$littlejs_esm_min_js_tmp(a,b){return Math.min(a,b)}function max$$module$dist$littlejs_esm_min_js_tmp(a,b){return Math.max(a,b)}function sign$$module$dist$littlejs_esm_min_js_tmp(a){return Math.sign(a)}function mod$$module$dist$littlejs_esm_min_js_tmp(a,b=1){return(a%b+b)%b}function clamp$$module$dist$littlejs_esm_min_js_tmp(a,b=0,c=1){return a<b?b:a>c?c:a}function percent$$module$dist$littlejs_esm_min_js_tmp(a,b,c){return(c-=b)?clamp$$module$dist$littlejs_esm_min_js_tmp((a-b)/c):0}function lerp$$module$dist$littlejs_esm_min_js_tmp(a,b,c){return b+clamp$$module$dist$littlejs_esm_min_js_tmp(a)*(c-b)}function distanceWrap$$module$dist$littlejs_esm_min_js_tmp(a,b,c=1){a=(a-b)%c;return 2*a%c-a}function lerpWrap$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d=1){return b+clamp$$module$dist$littlejs_esm_min_js_tmp(a)*distanceWrap$$module$dist$littlejs_esm_min_js_tmp(c,b,d)}function distanceAngle$$module$dist$littlejs_esm_min_js_tmp(a,b){return distanceWrap$$module$dist$littlejs_esm_min_js_tmp(a,b,2*PI$$module$dist$littlejs_esm_min_js_tmp)}function lerpAngle$$module$dist$littlejs_esm_min_js_tmp(a,b,c){return lerpWrap$$module$dist$littlejs_esm_min_js_tmp(a,b,c,2*PI$$module$dist$littlejs_esm_min_js_tmp)}function smoothStep$$module$dist$littlejs_esm_min_js_tmp(a){return a*a*(3-2*a)}function nearestPowerOfTwo$$module$dist$littlejs_esm_min_js_tmp(a){return 2**Math.ceil(Math.log2(a))}function isOverlapping$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d=vec2$$module$dist$littlejs_esm_min_js_tmp()){return 2*abs$$module$dist$littlejs_esm_min_js_tmp(a.x-c.x)<b.x+d.x&&2*abs$$module$dist$littlejs_esm_min_js_tmp(a.y-c.y)<b.y+d.y}function isIntersecting$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d){c=c.subtract(d.scale(.5));d=c.add(d);b=b.subtract(a);c=a.subtract(c);d=a.subtract(d);a=[-b.x,b.x,-b.y,b.y];b=[c.x,-d.x,c.y,-d.y];c=0;d=1;for(let e=4;e--;)if(a[e]){const f=b[e]/a[e];if(0>a[e]){if(f>d)return!1;c=max$$module$dist$littlejs_esm_min_js_tmp(f,c)}else{if(f<c)return!1;d=min$$module$dist$littlejs_esm_min_js_tmp(f,d)}}else if(0>b[e])return!1;return!0}function wave$$module$dist$littlejs_esm_min_js_tmp(a=1,b=1,c=time$$module$dist$littlejs_esm_min_js_tmp){return b/2*(1-Math.cos(c*a*2*PI$$module$dist$littlejs_esm_min_js_tmp))}function formatTime$$module$dist$littlejs_esm_min_js_tmp(a){return(a/60|0)+":"+(10>a%60?"0":"")+(a%60|0)}function rand$$module$dist$littlejs_esm_min_js_tmp(a=1,b=0){return b+Math.random()*(a-b)}function randInt$$module$dist$littlejs_esm_min_js_tmp(a,b=0){return Math.floor(rand$$module$dist$littlejs_esm_min_js_tmp(a,b))}function randSign$$module$dist$littlejs_esm_min_js_tmp(){return 2*randInt$$module$dist$littlejs_esm_min_js_tmp(2)-1}function randVector$$module$dist$littlejs_esm_min_js_tmp(a=1){return(new Vector2$$module$dist$littlejs_esm_min_js_tmp).setAngle(rand$$module$dist$littlejs_esm_min_js_tmp(2*PI$$module$dist$littlejs_esm_min_js_tmp),a)}function randInCircle$$module$dist$littlejs_esm_min_js_tmp(a=1,b=0){return 0<a?randVector$$module$dist$littlejs_esm_min_js_tmp(a*rand$$module$dist$littlejs_esm_min_js_tmp(b/a,1)**.5):new Vector2$$module$dist$littlejs_esm_min_js_tmp}function randColor$$module$dist$littlejs_esm_min_js_tmp(a=new Color$$module$dist$littlejs_esm_min_js_tmp,b=new Color$$module$dist$littlejs_esm_min_js_tmp(0,0,0,1),c=!1){return c?a.lerp(b,rand$$module$dist$littlejs_esm_min_js_tmp()):new Color$$module$dist$littlejs_esm_min_js_tmp(rand$$module$dist$littlejs_esm_min_js_tmp(a.r,b.r),rand$$module$dist$littlejs_esm_min_js_tmp(a.g,b.g),rand$$module$dist$littlejs_esm_min_js_tmp(a.b,b.b),rand$$module$dist$littlejs_esm_min_js_tmp(a.a,b.a))}class RandomGenerator$$module$dist$littlejs_esm_min_js_tmp{constructor(a){this.seed=a}float(a=1,b=0){this.seed^=this.seed<<13;this.seed^=this.seed>>>17;this.seed^=this.seed<<5;return b+(this.seed>>>0)/2**32*(a-b)}int(a,b=0){return Math.floor(this.float(a,b))}sign(){return.5<this.float()?1:-1}}function vec2$$module$dist$littlejs_esm_min_js_tmp(a=0,b){return new Vector2$$module$dist$littlejs_esm_min_js_tmp(a,void 0==b?a:b)}function isVector2$$module$dist$littlejs_esm_min_js_tmp(a){return a instanceof Vector2$$module$dist$littlejs_esm_min_js_tmp}class Vector2$$module$dist$littlejs_esm_min_js_tmp{constructor(a=0,b=0){this.x=a;this.y=b;ASSERT$$module$dist$littlejs_esm_min_js_tmp(this.isValid())}set(a=0,b=0){this.x=a;this.y=b;ASSERT$$module$dist$littlejs_esm_min_js_tmp(this.isValid());return this}copy(){return new Vector2$$module$dist$littlejs_esm_min_js_tmp(this.x,this.y)}add(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a));return new Vector2$$module$dist$littlejs_esm_min_js_tmp(this.x+a.x,this.y+a.y)}subtract(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a));return new Vector2$$module$dist$littlejs_esm_min_js_tmp(this.x-a.x,this.y-a.y)}multiply(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a));return new Vector2$$module$dist$littlejs_esm_min_js_tmp(this.x*a.x,this.y*a.y)}divide(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a));return new Vector2$$module$dist$littlejs_esm_min_js_tmp(this.x/a.x,this.y/a.y)}scale(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!isVector2$$module$dist$littlejs_esm_min_js_tmp(a));return new Vector2$$module$dist$littlejs_esm_min_js_tmp(this.x*a,this.y*a)}length(){return this.lengthSquared()**.5}lengthSquared(){return this.x**2+this.y**2}distance(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a));return this.distanceSquared(a)**.5}distanceSquared(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a));return(this.x-a.x)**2+(this.y-a.y)**2}normalize(a=1){const b=this.length();return b?this.scale(a/b):new Vector2$$module$dist$littlejs_esm_min_js_tmp(0,a)}clampLength(a=1){const b=this.length();return b>a?this.scale(a/b):this}dot(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a));return this.x*a.x+this.y*a.y}cross(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a));return this.x*a.y-this.y*a.x}angle(){return Math.atan2(this.x,this.y)}setAngle(a=0,b=1){this.x=b*Math.sin(a);this.y=b*Math.cos(a);return this}rotate(a){const b=Math.cos(-a);a=Math.sin(-a);return new Vector2$$module$dist$littlejs_esm_min_js_tmp(this.x*b-this.y*a,this.x*a+this.y*b)}setDirection(a,b=1){a=mod$$module$dist$littlejs_esm_min_js_tmp(a,4);ASSERT$$module$dist$littlejs_esm_min_js_tmp(0==a||1==a||2==a||3==a);return vec2$$module$dist$littlejs_esm_min_js_tmp(a%2?a-1?-b:b:0,a%2?0:a?-b:b)}direction(){return abs$$module$dist$littlejs_esm_min_js_tmp(this.x)>abs$$module$dist$littlejs_esm_min_js_tmp(this.y)?0>this.x?3:1:0>this.y?2:0}invert(){return new Vector2$$module$dist$littlejs_esm_min_js_tmp(this.y,-this.x)}floor(){return new Vector2$$module$dist$littlejs_esm_min_js_tmp(Math.floor(this.x),Math.floor(this.y))}area(){return abs$$module$dist$littlejs_esm_min_js_tmp(this.x*this.y)}lerp(a,b){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a));return this.add(a.subtract(this).scale(clamp$$module$dist$littlejs_esm_min_js_tmp(b)))}arrayCheck(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a));return 0<=this.x&&0<=this.y&&this.x<a.x&&this.y<a.y}toString(a=3){if(debug$$module$dist$littlejs_esm_min_js_tmp)return`(${(0>this.x?"":" ")+this.x.toFixed(a)},${(0>this.y?"":" ")+this.y.toFixed(a)} )`}isValid(){return"number"==typeof this.x&&!isNaN(this.x)&&"number"==typeof this.y&&!isNaN(this.y)}}function rgb$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d){return new Color$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d)}function hsl$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d){return(new Color$$module$dist$littlejs_esm_min_js_tmp).setHSLA(a,b,c,d)}function isColor$$module$dist$littlejs_esm_min_js_tmp(a){return a instanceof Color$$module$dist$littlejs_esm_min_js_tmp}class Color$$module$dist$littlejs_esm_min_js_tmp{constructor(a=1,b=1,c=1,d=1){this.r=a;this.g=b;this.b=c;this.a=d;ASSERT$$module$dist$littlejs_esm_min_js_tmp(this.isValid())}set(a=1,b=1,c=1,d=1){this.r=a;this.g=b;this.b=c;this.a=d;ASSERT$$module$dist$littlejs_esm_min_js_tmp(this.isValid());return this}copy(){return new Color$$module$dist$littlejs_esm_min_js_tmp(this.r,this.g,this.b,this.a)}add(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isColor$$module$dist$littlejs_esm_min_js_tmp(a));return new Color$$module$dist$littlejs_esm_min_js_tmp(this.r+a.r,this.g+a.g,this.b+a.b,this.a+a.a)}subtract(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isColor$$module$dist$littlejs_esm_min_js_tmp(a));return new Color$$module$dist$littlejs_esm_min_js_tmp(this.r-a.r,this.g-a.g,this.b-a.b,this.a-a.a)}multiply(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isColor$$module$dist$littlejs_esm_min_js_tmp(a));return new Color$$module$dist$littlejs_esm_min_js_tmp(this.r*a.r,this.g*a.g,this.b*a.b,this.a*a.a)}divide(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isColor$$module$dist$littlejs_esm_min_js_tmp(a));return new Color$$module$dist$littlejs_esm_min_js_tmp(this.r/a.r,this.g/a.g,this.b/a.b,this.a/a.a)}scale(a,b=a){return new Color$$module$dist$littlejs_esm_min_js_tmp(this.r*a,this.g*a,this.b*a,this.a*b)}clamp(){return new Color$$module$dist$littlejs_esm_min_js_tmp(clamp$$module$dist$littlejs_esm_min_js_tmp(this.r),clamp$$module$dist$littlejs_esm_min_js_tmp(this.g),clamp$$module$dist$littlejs_esm_min_js_tmp(this.b),clamp$$module$dist$littlejs_esm_min_js_tmp(this.a))}lerp(a,b){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isColor$$module$dist$littlejs_esm_min_js_tmp(a));return this.add(a.subtract(this).scale(clamp$$module$dist$littlejs_esm_min_js_tmp(b)))}setHSLA(a=0,b=0,c=1,d=1){a=mod$$module$dist$littlejs_esm_min_js_tmp(a,1);b=clamp$$module$dist$littlejs_esm_min_js_tmp(b);c=clamp$$module$dist$littlejs_esm_min_js_tmp(c);b=.5>c?c*(1+b):c+b-c*b;c=2*c-b;const e=(f,g,h)=>1>6*(h=mod$$module$dist$littlejs_esm_min_js_tmp(h,1))?f+6*(g-f)*h:1>2*h?g:2>3*h?f+(g-f)*(4-6*h):f;this.r=e(c,b,a+1/3);this.g=e(c,b,a);this.b=e(c,b,a-1/3);this.a=d;ASSERT$$module$dist$littlejs_esm_min_js_tmp(this.isValid());return this}HSLA(){const a=clamp$$module$dist$littlejs_esm_min_js_tmp(this.r),b=clamp$$module$dist$littlejs_esm_min_js_tmp(this.g),c=clamp$$module$dist$littlejs_esm_min_js_tmp(this.b),d=clamp$$module$dist$littlejs_esm_min_js_tmp(this.a),e=Math.max(a,b,c),f=Math.min(a,b,c),g=(e+f)/2;let h=0,k=0;if(e!=f){let n=e-f;k=.5<g?n/(2-e-f):n/(e+f);a==e?h=(b-c)/n+(b<c?6:0):b==e?h=(c-a)/n+2:c==e&&(h=(a-b)/n+4)}return[h/6,k,g,d]}mutate(a=.05,b=0){return new Color$$module$dist$littlejs_esm_min_js_tmp(this.r+rand$$module$dist$littlejs_esm_min_js_tmp(a,-a),this.g+rand$$module$dist$littlejs_esm_min_js_tmp(a,-a),this.b+rand$$module$dist$littlejs_esm_min_js_tmp(a,-a),this.a+rand$$module$dist$littlejs_esm_min_js_tmp(b,-b)).clamp()}toString(a=!0){const b=c=>(16>(c=255*clamp$$module$dist$littlejs_esm_min_js_tmp(c)|0)?"0":"")+c.toString(16);return"#"+b(this.r)+b(this.g)+b(this.b)+(a?b(this.a):"")}setHex(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp("string"==typeof a&&"#"==a[0]);ASSERT$$module$dist$littlejs_esm_min_js_tmp([4,5,7,9].includes(a.length),"Invalid hex");6>a.length?(this.r=clamp$$module$dist$littlejs_esm_min_js_tmp(parseInt(a[1],16)/15),this.g=clamp$$module$dist$littlejs_esm_min_js_tmp(parseInt(a[2],16)/15),this.b=clamp$$module$dist$littlejs_esm_min_js_tmp(parseInt(a[3],16)/15),this.a=5==a.length?clamp$$module$dist$littlejs_esm_min_js_tmp(parseInt(a[4],16)/15):1):(this.r=clamp$$module$dist$littlejs_esm_min_js_tmp(parseInt(a.slice(1,3),16)/255),this.g=clamp$$module$dist$littlejs_esm_min_js_tmp(parseInt(a.slice(3,5),16)/255),this.b=clamp$$module$dist$littlejs_esm_min_js_tmp(parseInt(a.slice(5,7),16)/255),this.a=9==a.length?clamp$$module$dist$littlejs_esm_min_js_tmp(parseInt(a.slice(7,9),16)/255):1);ASSERT$$module$dist$littlejs_esm_min_js_tmp(this.isValid());return this}rgbaInt(){const a=255*clamp$$module$dist$littlejs_esm_min_js_tmp(this.r)|0,b=255*clamp$$module$dist$littlejs_esm_min_js_tmp(this.g)<<8,c=255*clamp$$module$dist$littlejs_esm_min_js_tmp(this.b)<<16,d=255*clamp$$module$dist$littlejs_esm_min_js_tmp(this.a)<<24;return a+b+c+d}isValid(){return"number"==typeof this.r&&!isNaN(this.r)&&"number"==typeof this.g&&!isNaN(this.g)&&"number"==typeof this.b&&!isNaN(this.b)&&"number"==typeof this.a&&!isNaN(this.a)}}const WHITE$$module$dist$littlejs_esm_min_js_tmp=rgb$$module$dist$littlejs_esm_min_js_tmp(),BLACK$$module$dist$littlejs_esm_min_js_tmp=rgb$$module$dist$littlejs_esm_min_js_tmp(0,0,0),GRAY$$module$dist$littlejs_esm_min_js_tmp=rgb$$module$dist$littlejs_esm_min_js_tmp(.5,.5,.5),RED$$module$dist$littlejs_esm_min_js_tmp=rgb$$module$dist$littlejs_esm_min_js_tmp(1,0,0),ORANGE$$module$dist$littlejs_esm_min_js_tmp=rgb$$module$dist$littlejs_esm_min_js_tmp(1,.5,0),YELLOW$$module$dist$littlejs_esm_min_js_tmp=rgb$$module$dist$littlejs_esm_min_js_tmp(1,1,0),GREEN$$module$dist$littlejs_esm_min_js_tmp=rgb$$module$dist$littlejs_esm_min_js_tmp(0,1,0),CYAN$$module$dist$littlejs_esm_min_js_tmp=rgb$$module$dist$littlejs_esm_min_js_tmp(0,1,1),BLUE$$module$dist$littlejs_esm_min_js_tmp=rgb$$module$dist$littlejs_esm_min_js_tmp(0,0,1),PURPLE$$module$dist$littlejs_esm_min_js_tmp=rgb$$module$dist$littlejs_esm_min_js_tmp(.5,0,1),MAGENTA$$module$dist$littlejs_esm_min_js_tmp=rgb$$module$dist$littlejs_esm_min_js_tmp(1,0,1);class Timer$$module$dist$littlejs_esm_min_js_tmp{constructor(a){this.time=void 0==a?void 0:time$$module$dist$littlejs_esm_min_js_tmp+a;this.setTime=a}set(a=0){this.time=time$$module$dist$littlejs_esm_min_js_tmp+a;this.setTime=a}unset(){this.time=void 0}isSet(){return void 0!=this.time}active(){return time$$module$dist$littlejs_esm_min_js_tmp<this.time}elapsed(){return time$$module$dist$littlejs_esm_min_js_tmp>=this.time}get(){return this.isSet()?time$$module$dist$littlejs_esm_min_js_tmp-this.time:0}getPercent(){return this.isSet()?1-percent$$module$dist$littlejs_esm_min_js_tmp(this.time-time$$module$dist$littlejs_esm_min_js_tmp,0,this.setTime):0}toString(){if(debug$$module$dist$littlejs_esm_min_js_tmp)return this.isSet()?Math.abs(this.get())+" seconds "+(0>this.get()?"before":"after"):"unset"}valueOf(){return this.get()}}let cameraPos$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp(),cameraScale$$module$dist$littlejs_esm_min_js_tmp=32,canvasMaxSize$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp(1920,1080),canvasFixedSize$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp(),canvasPixelated$$module$dist$littlejs_esm_min_js_tmp=!0,tilesPixelated$$module$dist$littlejs_esm_min_js_tmp=!0,fontDefault$$module$dist$littlejs_esm_min_js_tmp="arial",showSplashScreen$$module$dist$littlejs_esm_min_js_tmp=!1,headlessMode$$module$dist$littlejs_esm_min_js_tmp=!1,glEnable$$module$dist$littlejs_esm_min_js_tmp=!0,glOverlay$$module$dist$littlejs_esm_min_js_tmp=!0,tileSizeDefault$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp(16),tileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp=0,enablePhysicsSolver$$module$dist$littlejs_esm_min_js_tmp=!0,objectDefaultMass$$module$dist$littlejs_esm_min_js_tmp=1,objectDefaultDamping$$module$dist$littlejs_esm_min_js_tmp=1,objectDefaultAngleDamping$$module$dist$littlejs_esm_min_js_tmp=1,objectDefaultElasticity$$module$dist$littlejs_esm_min_js_tmp=0,objectDefaultFriction$$module$dist$littlejs_esm_min_js_tmp=.8,objectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp=1,gravity$$module$dist$littlejs_esm_min_js_tmp=0,particleEmitRateScale$$module$dist$littlejs_esm_min_js_tmp=1,gamepadsEnable$$module$dist$littlejs_esm_min_js_tmp=!0,gamepadDirectionEmulateStick$$module$dist$littlejs_esm_min_js_tmp=!0,inputWASDEmulateDirection$$module$dist$littlejs_esm_min_js_tmp=!0,touchInputEnable$$module$dist$littlejs_esm_min_js_tmp=!0,touchGamepadEnable$$module$dist$littlejs_esm_min_js_tmp=!1,touchGamepadAnalog$$module$dist$littlejs_esm_min_js_tmp=!0,touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp=99,touchGamepadAlpha$$module$dist$littlejs_esm_min_js_tmp=.3,vibrateEnable$$module$dist$littlejs_esm_min_js_tmp=!0,soundEnable$$module$dist$littlejs_esm_min_js_tmp=!0,soundVolume$$module$dist$littlejs_esm_min_js_tmp=.3,soundDefaultRange$$module$dist$littlejs_esm_min_js_tmp=40,soundDefaultTaper$$module$dist$littlejs_esm_min_js_tmp=.7,medalDisplayTime$$module$dist$littlejs_esm_min_js_tmp=5,medalDisplaySlideTime$$module$dist$littlejs_esm_min_js_tmp=.5,medalDisplaySize$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp(640,80),medalsPreventUnlock$$module$dist$littlejs_esm_min_js_tmp=!1;function setCameraPos$$module$dist$littlejs_esm_min_js_tmp(a){cameraPos$$module$dist$littlejs_esm_min_js_tmp=a}function setCameraScale$$module$dist$littlejs_esm_min_js_tmp(a){cameraScale$$module$dist$littlejs_esm_min_js_tmp=a}function setCanvasMaxSize$$module$dist$littlejs_esm_min_js_tmp(a){canvasMaxSize$$module$dist$littlejs_esm_min_js_tmp=a}function setCanvasFixedSize$$module$dist$littlejs_esm_min_js_tmp(a){canvasFixedSize$$module$dist$littlejs_esm_min_js_tmp=a}function setCanvasPixelated$$module$dist$littlejs_esm_min_js_tmp(a){canvasPixelated$$module$dist$littlejs_esm_min_js_tmp=a}function setTilesPixelated$$module$dist$littlejs_esm_min_js_tmp(a){tilesPixelated$$module$dist$littlejs_esm_min_js_tmp=a}function setFontDefault$$module$dist$littlejs_esm_min_js_tmp(a){fontDefault$$module$dist$littlejs_esm_min_js_tmp=a}function setShowSplashScreen$$module$dist$littlejs_esm_min_js_tmp(a){showSplashScreen$$module$dist$littlejs_esm_min_js_tmp=a}function setHeadlessMode$$module$dist$littlejs_esm_min_js_tmp(a){headlessMode$$module$dist$littlejs_esm_min_js_tmp=a}function setGlEnable$$module$dist$littlejs_esm_min_js_tmp(a){glEnable$$module$dist$littlejs_esm_min_js_tmp=a}function setGlOverlay$$module$dist$littlejs_esm_min_js_tmp(a){glOverlay$$module$dist$littlejs_esm_min_js_tmp=a}function setTileSizeDefault$$module$dist$littlejs_esm_min_js_tmp(a){tileSizeDefault$$module$dist$littlejs_esm_min_js_tmp=a}function setTileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp(a){tileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp=a}function setEnablePhysicsSolver$$module$dist$littlejs_esm_min_js_tmp(a){enablePhysicsSolver$$module$dist$littlejs_esm_min_js_tmp=a}function setObjectDefaultMass$$module$dist$littlejs_esm_min_js_tmp(a){objectDefaultMass$$module$dist$littlejs_esm_min_js_tmp=a}function setObjectDefaultDamping$$module$dist$littlejs_esm_min_js_tmp(a){objectDefaultDamping$$module$dist$littlejs_esm_min_js_tmp=a}function setObjectDefaultAngleDamping$$module$dist$littlejs_esm_min_js_tmp(a){objectDefaultAngleDamping$$module$dist$littlejs_esm_min_js_tmp=a}function setObjectDefaultElasticity$$module$dist$littlejs_esm_min_js_tmp(a){objectDefaultElasticity$$module$dist$littlejs_esm_min_js_tmp=a}function setObjectDefaultFriction$$module$dist$littlejs_esm_min_js_tmp(a){objectDefaultFriction$$module$dist$littlejs_esm_min_js_tmp=a}function setObjectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp(a){objectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp=a}function setGravity$$module$dist$littlejs_esm_min_js_tmp(a){gravity$$module$dist$littlejs_esm_min_js_tmp=a}function setParticleEmitRateScale$$module$dist$littlejs_esm_min_js_tmp(a){particleEmitRateScale$$module$dist$littlejs_esm_min_js_tmp=a}function setGamepadsEnable$$module$dist$littlejs_esm_min_js_tmp(a){gamepadsEnable$$module$dist$littlejs_esm_min_js_tmp=a}function setGamepadDirectionEmulateStick$$module$dist$littlejs_esm_min_js_tmp(a){gamepadDirectionEmulateStick$$module$dist$littlejs_esm_min_js_tmp=a}function setInputWASDEmulateDirection$$module$dist$littlejs_esm_min_js_tmp(a){inputWASDEmulateDirection$$module$dist$littlejs_esm_min_js_tmp=a}function setTouchInputEnable$$module$dist$littlejs_esm_min_js_tmp(a){touchInputEnable$$module$dist$littlejs_esm_min_js_tmp=a}function setTouchGamepadEnable$$module$dist$littlejs_esm_min_js_tmp(a){touchGamepadEnable$$module$dist$littlejs_esm_min_js_tmp=a}function setTouchGamepadAnalog$$module$dist$littlejs_esm_min_js_tmp(a){touchGamepadAnalog$$module$dist$littlejs_esm_min_js_tmp=a}function setTouchGamepadSize$$module$dist$littlejs_esm_min_js_tmp(a){touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp=a}function setTouchGamepadAlpha$$module$dist$littlejs_esm_min_js_tmp(a){touchGamepadAlpha$$module$dist$littlejs_esm_min_js_tmp=a}function setVibrateEnable$$module$dist$littlejs_esm_min_js_tmp(a){vibrateEnable$$module$dist$littlejs_esm_min_js_tmp=a}function setSoundEnable$$module$dist$littlejs_esm_min_js_tmp(a){soundEnable$$module$dist$littlejs_esm_min_js_tmp=a}function setSoundVolume$$module$dist$littlejs_esm_min_js_tmp(a){soundVolume$$module$dist$littlejs_esm_min_js_tmp=a;soundEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&audioMasterGain$$module$dist$littlejs_esm_min_js_tmp&&(audioMasterGain$$module$dist$littlejs_esm_min_js_tmp.gain.value=a)}function setSoundDefaultRange$$module$dist$littlejs_esm_min_js_tmp(a){soundDefaultRange$$module$dist$littlejs_esm_min_js_tmp=a}function setSoundDefaultTaper$$module$dist$littlejs_esm_min_js_tmp(a){soundDefaultTaper$$module$dist$littlejs_esm_min_js_tmp=a}function setMedalDisplayTime$$module$dist$littlejs_esm_min_js_tmp(a){medalDisplayTime$$module$dist$littlejs_esm_min_js_tmp=a}function setMedalDisplaySlideTime$$module$dist$littlejs_esm_min_js_tmp(a){medalDisplaySlideTime$$module$dist$littlejs_esm_min_js_tmp=a}function setMedalDisplaySize$$module$dist$littlejs_esm_min_js_tmp(a){medalDisplaySize$$module$dist$littlejs_esm_min_js_tmp=a}function setMedalsPreventUnlock$$module$dist$littlejs_esm_min_js_tmp(a){medalsPreventUnlock$$module$dist$littlejs_esm_min_js_tmp=a}function setShowWatermark$$module$dist$littlejs_esm_min_js_tmp(a){showWatermark$$module$dist$littlejs_esm_min_js_tmp=a}function setDebugKey$$module$dist$littlejs_esm_min_js_tmp(a){debugKey$$module$dist$littlejs_esm_min_js_tmp=a}class EngineObject$$module$dist$littlejs_esm_min_js_tmp{constructor(a=vec2$$module$dist$littlejs_esm_min_js_tmp(),b=vec2$$module$dist$littlejs_esm_min_js_tmp(1),c,d=0,e=new Color$$module$dist$littlejs_esm_min_js_tmp,f=0){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a)&&isVector2$$module$dist$littlejs_esm_min_js_tmp(b),"ensure pos and size are vec2s");ASSERT$$module$dist$littlejs_esm_min_js_tmp("number"!==typeof c||!c,"old style tile setup");this.pos=a.copy();this.size=b;this.drawSize=void 0;this.tileInfo=c;this.angle=d;this.color=e;this.additiveColor=void 0;this.mirror=!1;this.mass=objectDefaultMass$$module$dist$littlejs_esm_min_js_tmp;this.damping=objectDefaultDamping$$module$dist$littlejs_esm_min_js_tmp;this.angleDamping=objectDefaultAngleDamping$$module$dist$littlejs_esm_min_js_tmp;this.elasticity=objectDefaultElasticity$$module$dist$littlejs_esm_min_js_tmp;this.friction=objectDefaultFriction$$module$dist$littlejs_esm_min_js_tmp;this.gravityScale=1;this.renderOrder=f;this.velocity=vec2$$module$dist$littlejs_esm_min_js_tmp();this.angleVelocity=0;this.spawnTime=time$$module$dist$littlejs_esm_min_js_tmp;this.children=[];this.clampSpeedLinear=!0;this.parent=this.groundObject=void 0;this.localPos=vec2$$module$dist$littlejs_esm_min_js_tmp();this.localAngle=0;this.collideRaycast=this.isSolid=this.collideSolidObjects=this.collideTiles=!1;engineObjects$$module$dist$littlejs_esm_min_js_tmp.push(this)}updateTransforms(){const a=this.parent;if(a){const b=a.getMirrorSign();this.pos=this.localPos.multiply(vec2$$module$dist$littlejs_esm_min_js_tmp(b,1)).rotate(a.angle).add(a.pos);this.angle=b*this.localAngle+a.angle}for(const b of this.children)b.updateTransforms()}update(){if(!this.parent){if(this.clampSpeedLinear)this.velocity.x=clamp$$module$dist$littlejs_esm_min_js_tmp(this.velocity.x,-objectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp,objectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp),this.velocity.y=clamp$$module$dist$littlejs_esm_min_js_tmp(this.velocity.y,-objectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp,objectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp);else{var a=this.velocity.lengthSquared();a>objectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp*objectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp&&(a=objectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp/a**.5,this.velocity.x*=a,this.velocity.y*=a)}a=this.pos.copy();this.velocity.x*=this.damping;this.velocity.y*=this.damping;this.mass&&(this.velocity.y+=gravity$$module$dist$littlejs_esm_min_js_tmp*this.gravityScale);this.pos.x+=this.velocity.x;this.pos.y+=this.velocity.y;this.angle+=this.angleVelocity*=this.angleDamping;ASSERT$$module$dist$littlejs_esm_min_js_tmp(0<=this.angleDamping&&1>=this.angleDamping);ASSERT$$module$dist$littlejs_esm_min_js_tmp(0<=this.damping&&1>=this.damping);if(enablePhysicsSolver$$module$dist$littlejs_esm_min_js_tmp&&this.mass){var b=0>this.velocity.y;if(this.groundObject){var c=this.groundObject!=this&&this.groundObject.velocity?this.groundObject.velocity.x:0;this.velocity.x=c+(this.velocity.x-c)*this.friction;this.groundObject=void 0}if(this.collideSolidObjects)for(var d of engineObjectsCollide$$module$dist$littlejs_esm_min_js_tmp){if(!this.isSolid&&!d.isSolid||d.destroyed||d.parent||d==this)continue;if(!isOverlapping$$module$dist$littlejs_esm_min_js_tmp(this.pos,this.size,d.pos,d.size))continue;c=this.collideWithObject(d);var e=d.collideWithObject(this);if(!c||!e)continue;if(isOverlapping$$module$dist$littlejs_esm_min_js_tmp(a,this.size,d.pos,d.size)){c=a.subtract(d.pos);e=c.length();c=.01>e?randVector$$module$dist$littlejs_esm_min_js_tmp(.001):c.scale(.001/e);this.velocity=this.velocity.add(c);d.mass&&(d.velocity=d.velocity.subtract(c));debugOverlay$$module$dist$littlejs_esm_min_js_tmp&&debugPhysics$$module$dist$littlejs_esm_min_js_tmp&&debugOverlap$$module$dist$littlejs_esm_min_js_tmp(this.pos,this.size,d.pos,d.size,"#f00");continue}e=this.size.add(d.size);var f=2*(a.y-d.pos.y)>e.y+gravity$$module$dist$littlejs_esm_min_js_tmp;const h=2*abs$$module$dist$littlejs_esm_min_js_tmp(a.y-d.pos.y)<e.y;var g=2*abs$$module$dist$littlejs_esm_min_js_tmp(a.x-d.pos.x)<e.x;c=max$$module$dist$littlejs_esm_min_js_tmp(this.elasticity,d.elasticity);if(f||g||!h)if(this.pos.y=d.pos.y+(e.y/2+.001)*sign$$module$dist$littlejs_esm_min_js_tmp(a.y-d.pos.y),d.groundObject&&b||!d.mass)b&&(this.groundObject=d),this.velocity.y*=-c;else if(d.mass){g=(this.mass*this.velocity.y+d.mass*d.velocity.y)/(this.mass+d.mass);const k=d.velocity.y*(d.mass-this.mass)/(this.mass+d.mass)+2*this.velocity.y*this.mass/(this.mass+d.mass);this.velocity.y=lerp$$module$dist$littlejs_esm_min_js_tmp(c,g,this.velocity.y*(this.mass-d.mass)/(this.mass+d.mass)+2*d.velocity.y*d.mass/(this.mass+d.mass));d.velocity.y=lerp$$module$dist$littlejs_esm_min_js_tmp(c,g,k)}!f&&h&&(this.pos.x=d.pos.x+(e.x/2+.001)*sign$$module$dist$littlejs_esm_min_js_tmp(a.x-d.pos.x),d.mass?(e=(this.mass*this.velocity.x+d.mass*d.velocity.x)/(this.mass+d.mass),f=d.velocity.x*(d.mass-this.mass)/(this.mass+d.mass)+2*this.velocity.x*this.mass/(this.mass+d.mass),this.velocity.x=lerp$$module$dist$littlejs_esm_min_js_tmp(c,e,this.velocity.x*(this.mass-d.mass)/(this.mass+d.mass)+2*d.velocity.x*d.mass/(this.mass+d.mass)),d.velocity.x=lerp$$module$dist$littlejs_esm_min_js_tmp(c,e,f)):this.velocity.x*=-c);debugOverlay$$module$dist$littlejs_esm_min_js_tmp&&debugPhysics$$module$dist$littlejs_esm_min_js_tmp&&debugOverlap$$module$dist$littlejs_esm_min_js_tmp(this.pos,this.size,d.pos,d.size,"#f0f")}if(this.collideTiles&&tileCollisionTest$$module$dist$littlejs_esm_min_js_tmp(this.pos,this.size,this)&&!tileCollisionTest$$module$dist$littlejs_esm_min_js_tmp(a,this.size,this)){d=tileCollisionTest$$module$dist$littlejs_esm_min_js_tmp(vec2$$module$dist$littlejs_esm_min_js_tmp(a.x,this.pos.y),this.size,this);c=tileCollisionTest$$module$dist$littlejs_esm_min_js_tmp(vec2$$module$dist$littlejs_esm_min_js_tmp(this.pos.x,a.y),this.size,this);if(d||!c)this.velocity.y*=-this.elasticity,b?(this.pos.y=(a.y-this.size.y/2|0)+this.size.y/2+1e-4,this.groundObject=this):(this.pos.y=a.y,this.groundObject=void 0);c&&(this.pos.x=a.x,this.velocity.x*=-this.elasticity);debugOverlay$$module$dist$littlejs_esm_min_js_tmp&&debugPhysics$$module$dist$littlejs_esm_min_js_tmp&&debugRect$$module$dist$littlejs_esm_min_js_tmp(this.pos,this.size,"#f00")}}}}render(){drawTile$$module$dist$littlejs_esm_min_js_tmp(this.pos,this.drawSize||this.size,this.tileInfo,this.color,this.angle,this.mirror,this.additiveColor)}destroy(){if(!this.destroyed){this.destroyed=1;this.parent&&this.parent.removeChild(this);for(const a of this.children)a.destroy(a.parent=0)}}localToWorld(a){return this.pos.add(a.rotate(this.angle))}worldToLocal(a){return a.subtract(this.pos).rotate(-this.angle)}localToWorldVector(a){return a.rotate(this.angle)}worldToLocalVector(a){return a.rotate(-this.angle)}collideWithTile(a,b){return 0<a}collideWithObject(a){return!0}getAliveTime(){return time$$module$dist$littlejs_esm_min_js_tmp-this.spawnTime}applyAcceleration(a){this.mass&&(this.velocity=this.velocity.add(a))}applyForce(a){this.applyAcceleration(a.scale(1/this.mass))}getMirrorSign(){return this.mirror?-1:1}addChild(a,b=vec2$$module$dist$littlejs_esm_min_js_tmp(),c=0){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!a.parent&&!this.children.includes(a));this.children.push(a);a.parent=this;a.localPos=b.copy();a.localAngle=c}removeChild(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(a.parent==this&&this.children.includes(a));this.children.splice(this.children.indexOf(a),1);a.parent=0}setCollision(a=!0,b=!0,c=!0,d=!0){ASSERT$$module$dist$littlejs_esm_min_js_tmp(a||!b,"solid objects must be set to collide");this.collideSolidObjects=a;this.isSolid=b;this.collideTiles=c;this.collideRaycast=d}toString(){if(debug$$module$dist$littlejs_esm_min_js_tmp){let a="type = "+this.constructor.name;if(this.pos.x||this.pos.y)a+="\npos = "+this.pos;if(this.velocity.x||this.velocity.y)a+="\nvelocity = "+this.velocity;if(this.size.x||this.size.y)a+="\nsize = "+this.size;this.angle&&(a+="\nangle = "+this.angle.toFixed(3));this.color&&(a+="\ncolor = "+this.color);return a}}renderDebugInfo(){if(debug$$module$dist$littlejs_esm_min_js_tmp){const a=vec2$$module$dist$littlejs_esm_min_js_tmp(max$$module$dist$littlejs_esm_min_js_tmp(this.size.x,.2),max$$module$dist$littlejs_esm_min_js_tmp(this.size.y,.2)),b=rgb$$module$dist$littlejs_esm_min_js_tmp(this.collideTiles?1:0,this.collideSolidObjects?1:0,this.isSolid?1:0,this.parent?.2:.5),c=this.parent?rgb$$module$dist$littlejs_esm_min_js_tmp(1,1,1,.5):rgb$$module$dist$littlejs_esm_min_js_tmp(0,0,0,.8);drawRect$$module$dist$littlejs_esm_min_js_tmp(this.pos,a,b,this.angle,!1);drawRect$$module$dist$littlejs_esm_min_js_tmp(this.pos,a.scale(.8),c,this.angle,!1);this.parent&&drawLine$$module$dist$littlejs_esm_min_js_tmp(this.pos,this.parent.pos,.1,rgb$$module$dist$littlejs_esm_min_js_tmp(0,0,1,.5),!1)}}}let mainCanvas$$module$dist$littlejs_esm_min_js_tmp,mainContext$$module$dist$littlejs_esm_min_js_tmp,overlayCanvas$$module$dist$littlejs_esm_min_js_tmp,overlayContext$$module$dist$littlejs_esm_min_js_tmp,mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp(),textureInfos$$module$dist$littlejs_esm_min_js_tmp=[],drawCount$$module$dist$littlejs_esm_min_js_tmp;function tile$$module$dist$littlejs_esm_min_js_tmp(a=vec2$$module$dist$littlejs_esm_min_js_tmp(),b=tileSizeDefault$$module$dist$littlejs_esm_min_js_tmp,c=0,d=0){if(headlessMode$$module$dist$littlejs_esm_min_js_tmp)return new TileInfo$$module$dist$littlejs_esm_min_js_tmp;"number"===typeof b&&(ASSERT$$module$dist$littlejs_esm_min_js_tmp(0<b),b=vec2$$module$dist$littlejs_esm_min_js_tmp(b));var e=textureInfos$$module$dist$littlejs_esm_min_js_tmp[c];ASSERT$$module$dist$littlejs_esm_min_js_tmp(!!e,"Texture not loaded");const f=b.add(vec2$$module$dist$littlejs_esm_min_js_tmp(2*d));"number"===typeof a&&(e=e.size.x/f.x|0,a=0<e?vec2$$module$dist$littlejs_esm_min_js_tmp(a%e,a/e|0):vec2$$module$dist$littlejs_esm_min_js_tmp());a=vec2$$module$dist$littlejs_esm_min_js_tmp(a.x*f.x+d,a.y*f.y+d);return new TileInfo$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d)}class TileInfo$$module$dist$littlejs_esm_min_js_tmp{constructor(a=vec2$$module$dist$littlejs_esm_min_js_tmp(),b=tileSizeDefault$$module$dist$littlejs_esm_min_js_tmp,c=0,d=0){this.pos=a.copy();this.size=b.copy();this.textureIndex=c;this.padding=d}offset(a){return new TileInfo$$module$dist$littlejs_esm_min_js_tmp(this.pos.add(a),this.size,this.textureIndex)}frame(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp("number"==typeof a);return this.offset(vec2$$module$dist$littlejs_esm_min_js_tmp(a*(this.size.x+2*this.padding),0))}getTextureInfo(){return textureInfos$$module$dist$littlejs_esm_min_js_tmp[this.textureIndex]}}class TextureInfo$$module$dist$littlejs_esm_min_js_tmp{constructor(a){this.image=a;this.size=vec2$$module$dist$littlejs_esm_min_js_tmp(a.width,a.height);this.sizeInverse=vec2$$module$dist$littlejs_esm_min_js_tmp(1/a.width,1/a.height);this.glTexture=glEnable$$module$dist$littlejs_esm_min_js_tmp&&glCreateTexture$$module$dist$littlejs_esm_min_js_tmp(a)}}function screenToWorld$$module$dist$littlejs_esm_min_js_tmp(a){return new Vector2$$module$dist$littlejs_esm_min_js_tmp((a.x-mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.x/2+.5)/cameraScale$$module$dist$littlejs_esm_min_js_tmp+cameraPos$$module$dist$littlejs_esm_min_js_tmp.x,(a.y-mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.y/2+.5)/-cameraScale$$module$dist$littlejs_esm_min_js_tmp+cameraPos$$module$dist$littlejs_esm_min_js_tmp.y)}function worldToScreen$$module$dist$littlejs_esm_min_js_tmp(a){return new Vector2$$module$dist$littlejs_esm_min_js_tmp((a.x-cameraPos$$module$dist$littlejs_esm_min_js_tmp.x)*cameraScale$$module$dist$littlejs_esm_min_js_tmp+mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.x/2-.5,(a.y-cameraPos$$module$dist$littlejs_esm_min_js_tmp.y)*-cameraScale$$module$dist$littlejs_esm_min_js_tmp+mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.y/2-.5)}function getCameraSize$$module$dist$littlejs_esm_min_js_tmp(){return mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.scale(1/cameraScale$$module$dist$littlejs_esm_min_js_tmp)}function drawTile$$module$dist$littlejs_esm_min_js_tmp(a,b=vec2$$module$dist$littlejs_esm_min_js_tmp(1),c,d=new Color$$module$dist$littlejs_esm_min_js_tmp,e=0,f,g,h=glEnable$$module$dist$littlejs_esm_min_js_tmp,k,n){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!n||!h,"context only supported in canvas 2D mode");ASSERT$$module$dist$littlejs_esm_min_js_tmp("number"!==typeof c||!c,"this is an old style calls, to fix replace it with tile(tileIndex, tileSize)");ASSERT$$module$dist$littlejs_esm_min_js_tmp(isVector2$$module$dist$littlejs_esm_min_js_tmp(a)&&isVector2$$module$dist$littlejs_esm_min_js_tmp(b));ASSERT$$module$dist$littlejs_esm_min_js_tmp(isColor$$module$dist$littlejs_esm_min_js_tmp(d)&&(!g||isColor$$module$dist$littlejs_esm_min_js_tmp(g)));const l=c&&c.getTextureInfo();if(h)if(k&&(a=screenToWorld$$module$dist$littlejs_esm_min_js_tmp(a),b=b.scale(1/cameraScale$$module$dist$littlejs_esm_min_js_tmp)),l){var m=l.sizeInverse;h=c.pos.x*m.x;k=c.pos.y*m.y;n=c.size.x*m.x;const r=c.size.y*m.y;glSetTexture$$module$dist$littlejs_esm_min_js_tmp(l.glTexture);if(tileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp){const p=m.x*tileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp;m=m.y*tileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp;glDraw$$module$dist$littlejs_esm_min_js_tmp(a.x,a.y,f?-b.x:b.x,b.y,e,h+p,k+m,h-p+n,k-m+r,d.rgbaInt(),g&&g.rgbaInt())}else glDraw$$module$dist$littlejs_esm_min_js_tmp(a.x,a.y,f?-b.x:b.x,b.y,e,h,k,h+n,k+r,d.rgbaInt(),g&&g.rgbaInt())}else glDraw$$module$dist$littlejs_esm_min_js_tmp(a.x,a.y,b.x,b.y,e,0,0,0,0,0,d.rgbaInt());else showWatermark$$module$dist$littlejs_esm_min_js_tmp&&++drawCount$$module$dist$littlejs_esm_min_js_tmp,b=vec2$$module$dist$littlejs_esm_min_js_tmp(b.x,-b.y),drawCanvas2D$$module$dist$littlejs_esm_min_js_tmp(a,b,e,f,r=>{if(l){const p=c.pos.x+tileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp,q=c.pos.y+tileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp,t=c.size.x-2*tileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp,u=c.size.y-2*tileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp;r.globalAlpha=d.a;r.drawImage(l.image,p,q,t,u,-.5,-.5,1,1);r.globalAlpha=1}else r.fillStyle=d.toString(),r.fillRect(-.5,-.5,1,1)},k,n)}function drawRect$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d,e,f,g){drawTile$$module$dist$littlejs_esm_min_js_tmp(a,b,void 0,c,d,!1,void 0,e,f,g)}function drawLine$$module$dist$littlejs_esm_min_js_tmp(a,b,c=.1,d,e,f,g){b=vec2$$module$dist$littlejs_esm_min_js_tmp((b.x-a.x)/2,(b.y-a.y)/2);c=vec2$$module$dist$littlejs_esm_min_js_tmp(c,2*b.length());drawRect$$module$dist$littlejs_esm_min_js_tmp(a.add(b),c,d,b.angle(),e,f,g)}function drawPoly$$module$dist$littlejs_esm_min_js_tmp(a,b=new Color$$module$dist$littlejs_esm_min_js_tmp,c=0,d=new Color$$module$dist$littlejs_esm_min_js_tmp(0,0,0),e,f=mainContext$$module$dist$littlejs_esm_min_js_tmp){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isColor$$module$dist$littlejs_esm_min_js_tmp(b)&&isColor$$module$dist$littlejs_esm_min_js_tmp(d));f.fillStyle=b.toString();f.beginPath();for(const g of e?a:a.map(worldToScreen$$module$dist$littlejs_esm_min_js_tmp))f.lineTo(g.x,g.y);f.closePath();f.fill();c&&(f.strokeStyle=d.toString(),f.lineWidth=e?c:c*cameraScale$$module$dist$littlejs_esm_min_js_tmp,f.stroke())}function drawEllipse$$module$dist$littlejs_esm_min_js_tmp(a,b=1,c=1,d=0,e=new Color$$module$dist$littlejs_esm_min_js_tmp,f=0,g=new Color$$module$dist$littlejs_esm_min_js_tmp(0,0,0),h,k=mainContext$$module$dist$littlejs_esm_min_js_tmp){ASSERT$$module$dist$littlejs_esm_min_js_tmp(isColor$$module$dist$littlejs_esm_min_js_tmp(e)&&isColor$$module$dist$littlejs_esm_min_js_tmp(g));h||(a=worldToScreen$$module$dist$littlejs_esm_min_js_tmp(a),b*=cameraScale$$module$dist$littlejs_esm_min_js_tmp,c*=cameraScale$$module$dist$littlejs_esm_min_js_tmp,f*=cameraScale$$module$dist$littlejs_esm_min_js_tmp);k.fillStyle=e.toString();k.beginPath();k.ellipse(a.x,a.y,b,c,d,0,9);k.fill();f&&(k.strokeStyle=g.toString(),k.lineWidth=f,k.stroke())}function drawCircle$$module$dist$littlejs_esm_min_js_tmp(a,b=1,c=new Color$$module$dist$littlejs_esm_min_js_tmp,d=0,e=new Color$$module$dist$littlejs_esm_min_js_tmp(0,0,0),f,g=mainContext$$module$dist$littlejs_esm_min_js_tmp){drawEllipse$$module$dist$littlejs_esm_min_js_tmp(a,b,b,0,c,d,e,f,g)}function drawCanvas2D$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d,e,f,g=mainContext$$module$dist$littlejs_esm_min_js_tmp){f||(a=worldToScreen$$module$dist$littlejs_esm_min_js_tmp(a),b=b.scale(cameraScale$$module$dist$littlejs_esm_min_js_tmp));g.save();g.translate(a.x+.5,a.y+.5);g.rotate(c);g.scale(d?-b.x:b.x,-b.y);e(g);g.restore()}function drawText$$module$dist$littlejs_esm_min_js_tmp(a,b,c=1,d,e=0,f,g,h,k,n=mainContext$$module$dist$littlejs_esm_min_js_tmp){drawTextScreen$$module$dist$littlejs_esm_min_js_tmp(a,worldToScreen$$module$dist$littlejs_esm_min_js_tmp(b),c*cameraScale$$module$dist$littlejs_esm_min_js_tmp,d,e*cameraScale$$module$dist$littlejs_esm_min_js_tmp,f,g,h,k,n)}function drawTextOverlay$$module$dist$littlejs_esm_min_js_tmp(a,b,c=1,d,e=0,f,g,h,k){drawText$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d,e,f,g,h,k,overlayContext$$module$dist$littlejs_esm_min_js_tmp)}function drawTextScreen$$module$dist$littlejs_esm_min_js_tmp(a,b,c=1,d=new Color$$module$dist$littlejs_esm_min_js_tmp,e=0,f=new Color$$module$dist$littlejs_esm_min_js_tmp(0,0,0),g="center",h=fontDefault$$module$dist$littlejs_esm_min_js_tmp,k,n=overlayContext$$module$dist$littlejs_esm_min_js_tmp){n.fillStyle=d.toString();n.strokeStyle=f.toString();n.lineWidth=e;n.textAlign=g;n.font=c+"px "+h;n.textBaseline="middle";n.lineJoin="round";a=(a+"").split("\n");b=b.copy();b.y-=(a.length-1)*c/2;a.forEach(l=>{e&&n.strokeText(l,b.x,b.y,k);n.fillText(l,b.x,b.y,k);b.y+=c})}function setBlendMode$$module$dist$littlejs_esm_min_js_tmp(a,b=glEnable$$module$dist$littlejs_esm_min_js_tmp,c){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!c||!b,"context only supported in canvas 2D mode");b?glAdditive$$module$dist$littlejs_esm_min_js_tmp=a:(c||=mainContext$$module$dist$littlejs_esm_min_js_tmp,c.globalCompositeOperation=a?"lighter":"source-over")}function combineCanvases$$module$dist$littlejs_esm_min_js_tmp(){glCopyToContext$$module$dist$littlejs_esm_min_js_tmp(mainContext$$module$dist$littlejs_esm_min_js_tmp,!0);mainContext$$module$dist$littlejs_esm_min_js_tmp.drawImage(overlayCanvas$$module$dist$littlejs_esm_min_js_tmp,0,0);glClearCanvas$$module$dist$littlejs_esm_min_js_tmp();overlayCanvas$$module$dist$littlejs_esm_min_js_tmp.width|=0}let engineFontImage$$module$dist$littlejs_esm_min_js_tmp;class FontImage$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b=vec2$$module$dist$littlejs_esm_min_js_tmp(8),c=vec2$$module$dist$littlejs_esm_min_js_tmp(0,1),d=overlayContext$$module$dist$littlejs_esm_min_js_tmp){engineFontImage$$module$dist$littlejs_esm_min_js_tmp||(engineFontImage$$module$dist$littlejs_esm_min_js_tmp=new Image,engineFontImage$$module$dist$littlejs_esm_min_js_tmp.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAAYAQAAAAA9+x6JAAAAAnRSTlMAAHaTzTgAAAGiSURBVHjaZZABhxxBEIUf6ECLBdFY+Q0PMNgf0yCgsSAGZcT9sgIPtBWwIA5wgAPEoHUyJeeSlW+gjK+fegWwtROWpVQEyWh2npdpBmTUFVhb29RINgLIukoXr5LIAvYQ5ve+1FqWEMqNKTX3FAJHyQDRZvmKWubAACcv5z5Gtg2oyCWE+Yk/8JZQX1jTTCpKAFGIgza+dJCNBF2UskRlsgwitHbSV0QLgt9sTPtsRlvJjEr8C/FARWA2bJ/TtJ7lko34dNDn6usJUMzuErP89UUBJbWeozrwLLncXczd508deAjLWipLO4Q5XGPcJvPu92cNDaN0P5G1FL0nSOzddZOrJ6rNhbXGmeDvO3TF7DeJWl4bvaYQTNHCTeuqKZmbjHaSOFes+IX/+IhHrnAkXOAsfn24EM68XieIECoccD4KZLk/odiwzeo2rovYdhvb2HYFgyznJyDpYJdYOmfXgVdJTaUi4xA2uWYNYec9BLeqdl9EsoTw582mSFDX2DxVLbNt9U3YYoeatBad1c2Tj8t2akrjaIGJNywKB/7h75/gN3vCMSaadIUTAAAAAElFTkSuQmCC");this.image=a||engineFontImage$$module$dist$littlejs_esm_min_js_tmp;this.tileSize=b;this.paddingSize=c;this.context=d}drawText(a,b,c=1,d){this.drawTextScreen(a,worldToScreen$$module$dist$littlejs_esm_min_js_tmp(b).floor(),c*cameraScale$$module$dist$littlejs_esm_min_js_tmp|0,d)}drawTextScreen(a,b,c=4,d){const e=this.context;e.save();const f=this.tileSize,g=f.add(this.paddingSize).scale(c),h=this.image.width/this.tileSize.x|0;(a+"").split("\n").forEach((k,n)=>{const l=d?k.length*f.x*c/2|0:0;for(let p=k.length;p--;){var m=k[p].charCodeAt(0);if(32>m||127<m)m=127;var r=m-32;m=r%h;r=r/h|0;const q=b.add(vec2$$module$dist$littlejs_esm_min_js_tmp(p,n).multiply(g));e.drawImage(this.image,m*f.x,r*f.y,f.x,f.y,q.x-l,q.y,f.x*c,f.y*c)}});e.restore()}}function isFullscreen$$module$dist$littlejs_esm_min_js_tmp(){return!!document.fullscreenElement}function toggleFullscreen$$module$dist$littlejs_esm_min_js_tmp(){const a=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.parentElement;isFullscreen$$module$dist$littlejs_esm_min_js_tmp()?document.exitFullscreen&&document.exitFullscreen():a.requestFullscreen&&a.requestFullscreen()}function setCursor$$module$dist$littlejs_esm_min_js_tmp(a="auto"){mainCanvas$$module$dist$littlejs_esm_min_js_tmp.parentElement.style.cursor=a}function keyIsDown$$module$dist$littlejs_esm_min_js_tmp(a,b=0){ASSERT$$module$dist$littlejs_esm_min_js_tmp(0<b||"number"!==typeof a||3>a,"use code string for keyboard");return inputData$$module$dist$littlejs_esm_min_js_tmp[b]&&!!(inputData$$module$dist$littlejs_esm_min_js_tmp[b][a]&1)}function keyWasPressed$$module$dist$littlejs_esm_min_js_tmp(a,b=0){ASSERT$$module$dist$littlejs_esm_min_js_tmp(0<b||"number"!==typeof a||3>a,"use code string for keyboard");return inputData$$module$dist$littlejs_esm_min_js_tmp[b]&&!!(inputData$$module$dist$littlejs_esm_min_js_tmp[b][a]&2)}function keyWasReleased$$module$dist$littlejs_esm_min_js_tmp(a,b=0){ASSERT$$module$dist$littlejs_esm_min_js_tmp(0<b||"number"!==typeof a||3>a,"use code string for keyboard");return inputData$$module$dist$littlejs_esm_min_js_tmp[b]&&!!(inputData$$module$dist$littlejs_esm_min_js_tmp[b][a]&4)}function keyDirection$$module$dist$littlejs_esm_min_js_tmp(a="ArrowUp",b="ArrowDown",c="ArrowLeft",d="ArrowRight"){return vec2$$module$dist$littlejs_esm_min_js_tmp((keyIsDown$$module$dist$littlejs_esm_min_js_tmp(d)?1:0)-(keyIsDown$$module$dist$littlejs_esm_min_js_tmp(c)?1:0),(keyIsDown$$module$dist$littlejs_esm_min_js_tmp(a)?1:0)-(keyIsDown$$module$dist$littlejs_esm_min_js_tmp(b)?1:0))}function clearInput$$module$dist$littlejs_esm_min_js_tmp(){inputData$$module$dist$littlejs_esm_min_js_tmp=[[]];touchGamepadButtons$$module$dist$littlejs_esm_min_js_tmp=[]}const mouseIsDown$$module$dist$littlejs_esm_min_js_tmp=keyIsDown$$module$dist$littlejs_esm_min_js_tmp,mouseWasPressed$$module$dist$littlejs_esm_min_js_tmp=keyWasPressed$$module$dist$littlejs_esm_min_js_tmp,mouseWasReleased$$module$dist$littlejs_esm_min_js_tmp=keyWasReleased$$module$dist$littlejs_esm_min_js_tmp;let mousePos$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp(),mousePosScreen$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp(),mouseWheel$$module$dist$littlejs_esm_min_js_tmp=0,isUsingGamepad$$module$dist$littlejs_esm_min_js_tmp=!1,inputPreventDefault$$module$dist$littlejs_esm_min_js_tmp=!0;function setInputPreventDefault$$module$dist$littlejs_esm_min_js_tmp(a){inputPreventDefault$$module$dist$littlejs_esm_min_js_tmp=a}function gamepadIsDown$$module$dist$littlejs_esm_min_js_tmp(a,b=0){return keyIsDown$$module$dist$littlejs_esm_min_js_tmp(a,b+1)}function gamepadWasPressed$$module$dist$littlejs_esm_min_js_tmp(a,b=0){return keyWasPressed$$module$dist$littlejs_esm_min_js_tmp(a,b+1)}function gamepadWasReleased$$module$dist$littlejs_esm_min_js_tmp(a,b=0){return keyWasReleased$$module$dist$littlejs_esm_min_js_tmp(a,b+1)}function gamepadStick$$module$dist$littlejs_esm_min_js_tmp(a,b=0){return gamepadStickData$$module$dist$littlejs_esm_min_js_tmp[b]?gamepadStickData$$module$dist$littlejs_esm_min_js_tmp[b][a]||vec2$$module$dist$littlejs_esm_min_js_tmp():vec2$$module$dist$littlejs_esm_min_js_tmp()}let inputData$$module$dist$littlejs_esm_min_js_tmp=[[]];function inputUpdate$$module$dist$littlejs_esm_min_js_tmp(){headlessMode$$module$dist$littlejs_esm_min_js_tmp||(touchInputEnable$$module$dist$littlejs_esm_min_js_tmp&&isTouchDevice$$module$dist$littlejs_esm_min_js_tmp||document.hasFocus()||clearInput$$module$dist$littlejs_esm_min_js_tmp(),mousePos$$module$dist$littlejs_esm_min_js_tmp=screenToWorld$$module$dist$littlejs_esm_min_js_tmp(mousePosScreen$$module$dist$littlejs_esm_min_js_tmp),gamepadsUpdate$$module$dist$littlejs_esm_min_js_tmp())}function inputUpdatePost$$module$dist$littlejs_esm_min_js_tmp(){if(!headlessMode$$module$dist$littlejs_esm_min_js_tmp){for(const a of inputData$$module$dist$littlejs_esm_min_js_tmp)for(const b in a)a[b]&=1;mouseWheel$$module$dist$littlejs_esm_min_js_tmp=0}}function inputInit$$module$dist$littlejs_esm_min_js_tmp(){function a(b){return inputWASDEmulateDirection$$module$dist$littlejs_esm_min_js_tmp?"KeyW"==b?"ArrowUp":"KeyS"==b?"ArrowDown":"KeyA"==b?"ArrowLeft":"KeyD"==b?"ArrowRight":b:b}headlessMode$$module$dist$littlejs_esm_min_js_tmp||(onkeydown=b=>{b.repeat||(isUsingGamepad$$module$dist$littlejs_esm_min_js_tmp=!1,inputData$$module$dist$littlejs_esm_min_js_tmp[0][b.code]=3,inputWASDEmulateDirection$$module$dist$littlejs_esm_min_js_tmp&&(inputData$$module$dist$littlejs_esm_min_js_tmp[0][a(b.code)]=3))},onkeyup=b=>{inputData$$module$dist$littlejs_esm_min_js_tmp[0][b.code]=4;inputWASDEmulateDirection$$module$dist$littlejs_esm_min_js_tmp&&(inputData$$module$dist$littlejs_esm_min_js_tmp[0][a(b.code)]=4)},onmousedown=b=>{soundEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&audioContext$$module$dist$littlejs_esm_min_js_tmp&&"running"!=audioContext$$module$dist$littlejs_esm_min_js_tmp.state&&audioContext$$module$dist$littlejs_esm_min_js_tmp.resume();isUsingGamepad$$module$dist$littlejs_esm_min_js_tmp=!1;inputData$$module$dist$littlejs_esm_min_js_tmp[0][b.button]=3;mousePosScreen$$module$dist$littlejs_esm_min_js_tmp=mouseEventToScreen$$module$dist$littlejs_esm_min_js_tmp(b);inputPreventDefault$$module$dist$littlejs_esm_min_js_tmp&&b.button&&b.preventDefault()},onmouseup=b=>inputData$$module$dist$littlejs_esm_min_js_tmp[0][b.button]=inputData$$module$dist$littlejs_esm_min_js_tmp[0][b.button]&2|4,onmousemove=b=>mousePosScreen$$module$dist$littlejs_esm_min_js_tmp=mouseEventToScreen$$module$dist$littlejs_esm_min_js_tmp(b),onwheel=b=>mouseWheel$$module$dist$littlejs_esm_min_js_tmp=b.ctrlKey?0:sign$$module$dist$littlejs_esm_min_js_tmp(b.deltaY),oncontextmenu=b=>!1,onblur=b=>clearInput$$module$dist$littlejs_esm_min_js_tmp(),isTouchDevice$$module$dist$littlejs_esm_min_js_tmp&&touchInputEnable$$module$dist$littlejs_esm_min_js_tmp&&touchInputInit$$module$dist$littlejs_esm_min_js_tmp())}function mouseEventToScreen$$module$dist$littlejs_esm_min_js_tmp(a){const b=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.getBoundingClientRect(),c=percent$$module$dist$littlejs_esm_min_js_tmp(a.x,b.left,b.right);a=percent$$module$dist$littlejs_esm_min_js_tmp(a.y,b.top,b.bottom);return vec2$$module$dist$littlejs_esm_min_js_tmp(c*mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width,a*mainCanvas$$module$dist$littlejs_esm_min_js_tmp.height)}const gamepadStickData$$module$dist$littlejs_esm_min_js_tmp=[];function gamepadsUpdate$$module$dist$littlejs_esm_min_js_tmp(){const a=g=>{const h=k=>.3<k?percent$$module$dist$littlejs_esm_min_js_tmp(k,.3,.8):-.3>k?-percent$$module$dist$littlejs_esm_min_js_tmp(-k,.3,.8):0;return vec2$$module$dist$littlejs_esm_min_js_tmp(h(g.x),h(-g.y)).clampLength()};if(touchGamepadEnable$$module$dist$littlejs_esm_min_js_tmp&&isTouchDevice$$module$dist$littlejs_esm_min_js_tmp&&(ASSERT$$module$dist$littlejs_esm_min_js_tmp(touchGamepadButtons$$module$dist$littlejs_esm_min_js_tmp,"set touchGamepadEnable before calling init!"),touchGamepadTimer$$module$dist$littlejs_esm_min_js_tmp.isSet())){var b=gamepadStickData$$module$dist$littlejs_esm_min_js_tmp[0]||(gamepadStickData$$module$dist$littlejs_esm_min_js_tmp[0]=[]);b[0]=vec2$$module$dist$littlejs_esm_min_js_tmp();touchGamepadAnalog$$module$dist$littlejs_esm_min_js_tmp?b[0]=a(touchGamepadStick$$module$dist$littlejs_esm_min_js_tmp):.3<touchGamepadStick$$module$dist$littlejs_esm_min_js_tmp.lengthSquared()&&(b[0].x=Math.round(touchGamepadStick$$module$dist$littlejs_esm_min_js_tmp.x),b[0].y=-Math.round(touchGamepadStick$$module$dist$littlejs_esm_min_js_tmp.y),b[0]=b[0].clampLength());b=inputData$$module$dist$littlejs_esm_min_js_tmp[1]||(inputData$$module$dist$littlejs_esm_min_js_tmp[1]=[]);for(var c=10;c--;){var d=3==c?2:2==c?3:c,e=gamepadIsDown$$module$dist$littlejs_esm_min_js_tmp(d,0);b[d]=touchGamepadButtons$$module$dist$littlejs_esm_min_js_tmp[c]?e?1:3:e?4:0}}if(gamepadsEnable$$module$dist$littlejs_esm_min_js_tmp&&navigator&&navigator.getGamepads&&(debug$$module$dist$littlejs_esm_min_js_tmp||document.hasFocus()))for(b=navigator.getGamepads(),c=b.length;c--;){e=b[c];const g=inputData$$module$dist$littlejs_esm_min_js_tmp[c+1]||(inputData$$module$dist$littlejs_esm_min_js_tmp[c+1]=[]);d=gamepadStickData$$module$dist$littlejs_esm_min_js_tmp[c]||(gamepadStickData$$module$dist$littlejs_esm_min_js_tmp[c]=[]);if(e){for(var f=0;f<e.axes.length-1;f+=2)d[f>>1]=a(vec2$$module$dist$littlejs_esm_min_js_tmp(e.axes[f],e.axes[f+1]));for(f=e.buttons.length;f--;){const h=e.buttons[f],k=gamepadIsDown$$module$dist$littlejs_esm_min_js_tmp(f,c);g[f]=h.pressed?k?1:3:k?4:0;isUsingGamepad$$module$dist$littlejs_esm_min_js_tmp||=!c&&h.pressed}gamepadDirectionEmulateStick$$module$dist$littlejs_esm_min_js_tmp&&(e=vec2$$module$dist$littlejs_esm_min_js_tmp((gamepadIsDown$$module$dist$littlejs_esm_min_js_tmp(15,c)&&1)-(gamepadIsDown$$module$dist$littlejs_esm_min_js_tmp(14,c)&&1),(gamepadIsDown$$module$dist$littlejs_esm_min_js_tmp(12,c)&&1)-(gamepadIsDown$$module$dist$littlejs_esm_min_js_tmp(13,c)&&1)),e.lengthSquared()&&(d[0]=e.clampLength()));touchGamepadEnable$$module$dist$littlejs_esm_min_js_tmp&&isUsingGamepad$$module$dist$littlejs_esm_min_js_tmp&&touchGamepadTimer$$module$dist$littlejs_esm_min_js_tmp.unset()}}}function vibrate$$module$dist$littlejs_esm_min_js_tmp(a=100){vibrateEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&navigator&&navigator.vibrate&&navigator.vibrate(a)}function vibrateStop$$module$dist$littlejs_esm_min_js_tmp(){vibrate$$module$dist$littlejs_esm_min_js_tmp(0)}const isTouchDevice$$module$dist$littlejs_esm_min_js_tmp=!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&void 0!==window.ontouchstart;let touchGamepadTimer$$module$dist$littlejs_esm_min_js_tmp=new Timer$$module$dist$littlejs_esm_min_js_tmp,touchGamepadButtons$$module$dist$littlejs_esm_min_js_tmp,touchGamepadStick$$module$dist$littlejs_esm_min_js_tmp;function touchInputInit$$module$dist$littlejs_esm_min_js_tmp(){function a(e){soundEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&audioContext$$module$dist$littlejs_esm_min_js_tmp&&"running"!=audioContext$$module$dist$littlejs_esm_min_js_tmp.state&&audioContext$$module$dist$littlejs_esm_min_js_tmp.resume();const f=e.touches.length;if(f){const g=vec2$$module$dist$littlejs_esm_min_js_tmp(e.touches[0].clientX,e.touches[0].clientY);mousePosScreen$$module$dist$littlejs_esm_min_js_tmp=mouseEventToScreen$$module$dist$littlejs_esm_min_js_tmp(g);d?isUsingGamepad$$module$dist$littlejs_esm_min_js_tmp=touchGamepadEnable$$module$dist$littlejs_esm_min_js_tmp:inputData$$module$dist$littlejs_esm_min_js_tmp[0][0]=3}else d&&(inputData$$module$dist$littlejs_esm_min_js_tmp[0][0]=inputData$$module$dist$littlejs_esm_min_js_tmp[0][0]&2|4);d=f;inputPreventDefault$$module$dist$littlejs_esm_min_js_tmp&&document.hasFocus()&&e.preventDefault();return!0}function b(e){touchGamepadStick$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp();touchGamepadButtons$$module$dist$littlejs_esm_min_js_tmp=[];isUsingGamepad$$module$dist$littlejs_esm_min_js_tmp=!0;if(e.touches.length&&(touchGamepadTimer$$module$dist$littlejs_esm_min_js_tmp.set(),paused$$module$dist$littlejs_esm_min_js_tmp&&!d)){touchGamepadButtons$$module$dist$littlejs_esm_min_js_tmp[9]=1;a(e);return}const f=vec2$$module$dist$littlejs_esm_min_js_tmp(touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp,mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.y-touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp),g=mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.subtract(vec2$$module$dist$littlejs_esm_min_js_tmp(touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp,touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp)),h=mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.scale(.5);for(const n of e.touches){var k=mouseEventToScreen$$module$dist$littlejs_esm_min_js_tmp(vec2$$module$dist$littlejs_esm_min_js_tmp(n.clientX,n.clientY));k.distance(f)<touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp?touchGamepadStick$$module$dist$littlejs_esm_min_js_tmp=k.subtract(f).scale(2/touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp).clampLength():k.distance(g)<touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp?(k=k.subtract(g).direction(),touchGamepadButtons$$module$dist$littlejs_esm_min_js_tmp[k]=1):k.distance(h)<touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp&&!d&&(touchGamepadButtons$$module$dist$littlejs_esm_min_js_tmp[9]=1)}a(e);return!0}let c=a;touchGamepadEnable$$module$dist$littlejs_esm_min_js_tmp&&(c=b,touchGamepadButtons$$module$dist$littlejs_esm_min_js_tmp=[],touchGamepadStick$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp());document.addEventListener("touchstart",e=>c(e),{passive:!1});document.addEventListener("touchmove",e=>c(e),{passive:!1});document.addEventListener("touchend",e=>c(e),{passive:!1});onmousedown=onmouseup=()=>0;let d}function touchGamepadRender$$module$dist$littlejs_esm_min_js_tmp(){if(touchInputEnable$$module$dist$littlejs_esm_min_js_tmp&&isTouchDevice$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&touchGamepadEnable$$module$dist$littlejs_esm_min_js_tmp&&touchGamepadTimer$$module$dist$littlejs_esm_min_js_tmp.isSet()){var a=percent$$module$dist$littlejs_esm_min_js_tmp(touchGamepadTimer$$module$dist$littlejs_esm_min_js_tmp.get(),4,3);if(a&&!paused$$module$dist$littlejs_esm_min_js_tmp){var b=overlayContext$$module$dist$littlejs_esm_min_js_tmp;b.save();b.globalAlpha=a*touchGamepadAlpha$$module$dist$littlejs_esm_min_js_tmp;b.strokeStyle="#fff";b.lineWidth=3;b.fillStyle=0<touchGamepadStick$$module$dist$littlejs_esm_min_js_tmp.lengthSquared()?"#fff":"#000";b.beginPath();a=vec2$$module$dist$littlejs_esm_min_js_tmp(touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp,mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.y-touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp);if(touchGamepadAnalog$$module$dist$littlejs_esm_min_js_tmp)b.arc(a.x,a.y,touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp/2,0,9),b.fill();else for(var c=10;c--;){var d=c*PI$$module$dist$littlejs_esm_min_js_tmp/4;b.arc(a.x,a.y,.6*touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp,d+PI$$module$dist$littlejs_esm_min_js_tmp/8,d+PI$$module$dist$littlejs_esm_min_js_tmp/8);c%2&&b.arc(a.x,a.y,.33*touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp,d,d);1==c&&b.fill()}b.stroke();a=vec2$$module$dist$littlejs_esm_min_js_tmp(mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.x-touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp,mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.y-touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp);for(c=4;c--;)d=a.add(vec2$$module$dist$littlejs_esm_min_js_tmp().setDirection(c,touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp/2)),b.fillStyle=touchGamepadButtons$$module$dist$littlejs_esm_min_js_tmp[c]?"#fff":"#000",b.beginPath(),b.arc(d.x,d.y,touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp/4,0,9),b.fill(),b.stroke();b.restore()}}}let audioContext$$module$dist$littlejs_esm_min_js_tmp=new AudioContext,audioMasterGain$$module$dist$littlejs_esm_min_js_tmp;function audioInit$$module$dist$littlejs_esm_min_js_tmp(){soundEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&(audioMasterGain$$module$dist$littlejs_esm_min_js_tmp=audioContext$$module$dist$littlejs_esm_min_js_tmp.createGain(),audioMasterGain$$module$dist$littlejs_esm_min_js_tmp.connect(audioContext$$module$dist$littlejs_esm_min_js_tmp.destination),audioMasterGain$$module$dist$littlejs_esm_min_js_tmp.gain.value=soundVolume$$module$dist$littlejs_esm_min_js_tmp)}class Sound$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b=soundDefaultRange$$module$dist$littlejs_esm_min_js_tmp,c=soundDefaultTaper$$module$dist$littlejs_esm_min_js_tmp){soundEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&(this.range=b,this.taper=c,this.randomness=0,a&&(this.randomness=void 0!=a[1]?a[1]:.05,a[1]=0,this.sampleChannels=[zzfxG$$module$dist$littlejs_esm_min_js_tmp(...a)],this.sampleRate=zzfxR$$module$dist$littlejs_esm_min_js_tmp))}play(a,b=1,c=1,d=1,e=!1){if(soundEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&this.sampleChannels){var f;if(a){if(f=this.range){const g=cameraPos$$module$dist$littlejs_esm_min_js_tmp.distanceSquared(a);if(g>f*f)return;b*=percent$$module$dist$littlejs_esm_min_js_tmp(g**.5,f,f*this.taper)}f=2*worldToScreen$$module$dist$littlejs_esm_min_js_tmp(a).x/mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width-1}a=c+c*this.randomness*d*rand$$module$dist$littlejs_esm_min_js_tmp(-1,1);this.gainNode=audioContext$$module$dist$littlejs_esm_min_js_tmp.createGain();return this.source=playSamples$$module$dist$littlejs_esm_min_js_tmp(this.sampleChannels,b,a,f,e,this.sampleRate,this.gainNode)}}setVolume(a=1){this.gainNode&&(this.gainNode.gain.value=a)}stop(){this.source&&this.source.stop();this.source=void 0}getSource(){return this.source}playNote(a,b,c){return this.play(b,c,2**(a/12),0)}getDuration(){return this.sampleChannels&&this.sampleChannels[0].length/this.sampleRate}isLoading(){return!this.sampleChannels}}class SoundWave$$module$dist$littlejs_esm_min_js_tmp extends Sound$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b=0,c,d,e){super(void 0,c,d);soundEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&(this.randomness=b,fetch(a).then(f=>f.arrayBuffer()).then(f=>audioContext$$module$dist$littlejs_esm_min_js_tmp.decodeAudioData(f)).then(f=>{this.sampleChannels=[];for(let g=f.numberOfChannels;g--;)this.sampleChannels[g]=Array.from(f.getChannelData(g));this.sampleRate=f.sampleRate}).then(()=>e&&e(this)))}}function playAudioFile$$module$dist$littlejs_esm_min_js_tmp(a,b=1,c=!1){if(soundEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp)return new SoundWave$$module$dist$littlejs_esm_min_js_tmp(a,0,0,0,d=>d.play(void 0,b,1,1,c))}function speak$$module$dist$littlejs_esm_min_js_tmp(a,b="",c=1,d=1,e=1){if(soundEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&speechSynthesis)return a=new SpeechSynthesisUtterance(a),a.lang=b,a.volume=2*c*soundVolume$$module$dist$littlejs_esm_min_js_tmp,a.rate=d,a.pitch=e,speechSynthesis.speak(a),a}function speakStop$$module$dist$littlejs_esm_min_js_tmp(){speechSynthesis&&speechSynthesis.cancel()}function getNoteFrequency$$module$dist$littlejs_esm_min_js_tmp(a,b=220){return b*2**(a/12)}function playSamples$$module$dist$littlejs_esm_min_js_tmp(a,b=1,c=1,d=0,e=!1,f=zzfxR$$module$dist$littlejs_esm_min_js_tmp,g){if(soundEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp){var h=audioContext$$module$dist$littlejs_esm_min_js_tmp.createBuffer(a.length,a[0].length,f),k=audioContext$$module$dist$littlejs_esm_min_js_tmp.createBufferSource();a.forEach((n,l)=>h.getChannelData(l).set(n));k.buffer=h;k.playbackRate.value=c;k.loop=e;g=g||audioContext$$module$dist$littlejs_esm_min_js_tmp.createGain();g.gain.value=b;g.connect(audioMasterGain$$module$dist$littlejs_esm_min_js_tmp);a=new StereoPannerNode(audioContext$$module$dist$littlejs_esm_min_js_tmp,{pan:clamp$$module$dist$littlejs_esm_min_js_tmp(d,-1,1)});k.connect(a).connect(g);"running"!=audioContext$$module$dist$littlejs_esm_min_js_tmp.state?audioContext$$module$dist$littlejs_esm_min_js_tmp.resume().then(()=>k.start()):k.start();return k}}function zzfx$$module$dist$littlejs_esm_min_js_tmp(...a){return playSamples$$module$dist$littlejs_esm_min_js_tmp([zzfxG$$module$dist$littlejs_esm_min_js_tmp(...a)])}const zzfxR$$module$dist$littlejs_esm_min_js_tmp=44100;function zzfxG$$module$dist$littlejs_esm_min_js_tmp(a=1,b=.05,c=220,d=0,e=0,f=.1,g=0,h=1,k=0,n=0,l=0,m=0,r=0,p=0,q=0,t=0,u=0,A=1,y=0,C=0,B=0){var v=zzfxR$$module$dist$littlejs_esm_min_js_tmp;let w=2*PI$$module$dist$littlejs_esm_min_js_tmp,D=k*=500*w/v/v;b=c*=(1+rand$$module$dist$littlejs_esm_min_js_tmp(b,-b))*w/v;let G=0,J=0,H=0,E=1,K=[],F=0,x=0,z=0,O;var M=w*abs$$module$dist$littlejs_esm_min_js_tmp(B)*2/v,L=Math.cos(M),N=Math.sin(M)/2/2,I=1+N;M=-2*L/I;N=(1-N)/I;let P=(1+sign$$module$dist$littlejs_esm_min_js_tmp(B)*L)/2/I;L=-(sign$$module$dist$littlejs_esm_min_js_tmp(B)+L)/I;let Q=I=0,R=0,S=0;d=d*v||9;y*=v;e*=v;f*=v;u*=v;n*=500*w/v**3;q*=w/v;l*=w/v;m*=v;r=r*v|0;for(v=d+y+e+f+u|0;x<v;K[x++]=z*a)++H%(100*t|0)||(z=g?1<g?2<g?3<g?4<g?F/w%1<h/2?1:-1:Math.sin(F**3):Math.max(Math.min(Math.tan(F),1),-1):1-(2*F/w%2+2)%2:1-4*abs$$module$dist$littlejs_esm_min_js_tmp(Math.round(F/w)-F/w):Math.sin(F),z=(r?1-C+C*Math.sin(w*x/r):1)*(4<g?z:sign$$module$dist$littlejs_esm_min_js_tmp(z)*abs$$module$dist$littlejs_esm_min_js_tmp(z)**h)*(x<d?x/d:x<d+y?1-(x-d)/y*(1-A):x<d+y+e?A:x<v-u?(v-x-u)/f*A:0),z=u?z/2+(u>x?0:(x<v-u?1:(v-x)/u)*K[x-u|0]/2/a):z,B&&(z=S=P*I+L*(I=Q)+P*(Q=z)-N*R-M*(R=S))),O=(c+=k+=n)*Math.cos(q*G++),F+=O+O*p*Math.sin(x**5),E&&++E>m&&(c+=l,b+=l,E=0),!r||++J%r||(c=b,k=D,E||=1);return K}let tileCollision$$module$dist$littlejs_esm_min_js_tmp=[],tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp();function initTileCollision$$module$dist$littlejs_esm_min_js_tmp(a){tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp=a;tileCollision$$module$dist$littlejs_esm_min_js_tmp=[];for(a=tileCollision$$module$dist$littlejs_esm_min_js_tmp.length=tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp.area();a--;)tileCollision$$module$dist$littlejs_esm_min_js_tmp[a]=0}function setTileCollisionData$$module$dist$littlejs_esm_min_js_tmp(a,b=0){a.arrayCheck(tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp)&&(tileCollision$$module$dist$littlejs_esm_min_js_tmp[(a.y|0)*tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp.x+a.x|0]=b)}function getTileCollisionData$$module$dist$littlejs_esm_min_js_tmp(a){return a.arrayCheck(tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp)?tileCollision$$module$dist$littlejs_esm_min_js_tmp[(a.y|0)*tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp.x+a.x|0]:0}function tileCollisionTest$$module$dist$littlejs_esm_min_js_tmp(a,b=vec2$$module$dist$littlejs_esm_min_js_tmp(),c){const d=max$$module$dist$littlejs_esm_min_js_tmp(a.x-b.x/2|0,0);var e=max$$module$dist$littlejs_esm_min_js_tmp(a.y-b.y/2|0,0);const f=min$$module$dist$littlejs_esm_min_js_tmp(a.x+b.x/2,tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp.x);for(a=min$$module$dist$littlejs_esm_min_js_tmp(a.y+b.y/2,tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp.y);e<a;++e)for(b=d;b<f;++b){const g=tileCollision$$module$dist$littlejs_esm_min_js_tmp[e*tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp.x+b];if(g&&(!c||c.collideWithTile(g,vec2$$module$dist$littlejs_esm_min_js_tmp(b,e))))return!0}return!1}function tileCollisionRaycast$$module$dist$littlejs_esm_min_js_tmp(a,b,c){const d=b.subtract(a),e=d.length();var f=d.normalize();f=vec2$$module$dist$littlejs_esm_min_js_tmp(abs$$module$dist$littlejs_esm_min_js_tmp(1/f.x),abs$$module$dist$littlejs_esm_min_js_tmp(1/f.y));let g=a.floor(),h=f.x*(0>d.x?a.x-g.x:g.x-a.x+1),k=f.y*(0>d.y?a.y-g.y:g.y-a.y+1);for(;;){const n=getTileCollisionData$$module$dist$littlejs_esm_min_js_tmp(g);if(n&&(!c||c.collideWithTile(n,g)))return debugRaycast$$module$dist$littlejs_esm_min_js_tmp&&debugLine$$module$dist$littlejs_esm_min_js_tmp(a,b,"#f00",.02),debugRaycast$$module$dist$littlejs_esm_min_js_tmp&&debugPoint$$module$dist$littlejs_esm_min_js_tmp(g.add(vec2$$module$dist$littlejs_esm_min_js_tmp(.5)),"#ff0"),g.add(vec2$$module$dist$littlejs_esm_min_js_tmp(.5));if(h>e&&k>e)break;h>k?(g.y+=sign$$module$dist$littlejs_esm_min_js_tmp(d.y),k+=f.y):(g.x+=sign$$module$dist$littlejs_esm_min_js_tmp(d.x),h+=f.x)}debugRaycast$$module$dist$littlejs_esm_min_js_tmp&&debugLine$$module$dist$littlejs_esm_min_js_tmp(a,b,"#00f",.02)}class TileLayerData$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b=0,c=!1,d=new Color$$module$dist$littlejs_esm_min_js_tmp){this.tile=a;this.direction=b;this.mirror=c;this.color=d}clear(){this.tile=this.direction=0;this.mirror=!1;this.color=new Color$$module$dist$littlejs_esm_min_js_tmp}}class TileLayer$$module$dist$littlejs_esm_min_js_tmp extends EngineObject$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b=tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp,c=tile$$module$dist$littlejs_esm_min_js_tmp(),d=vec2$$module$dist$littlejs_esm_min_js_tmp(1),e=0){super(a,b,c,0,void 0,e);this.canvas=document.createElement("canvas");this.context=this.canvas.getContext("2d");this.scale=d;this.isOverlay=!1;this.data=[];for(a=this.size.area();a--;)this.data.push(new TileLayerData$$module$dist$littlejs_esm_min_js_tmp);headlessMode$$module$dist$littlejs_esm_min_js_tmp&&(this.redraw=()=>{},this.render=()=>{},this.redrawStart=()=>{},this.redrawEnd=()=>{},this.drawTileData=()=>{},this.drawCanvas2D=()=>{})}setData(a,b,c=!1){a.arrayCheck(this.size)&&(this.data[(a.y|0)*this.size.x+a.x|0]=b,c&&this.drawTileData(a))}getData(a){return a.arrayCheck(this.size)&&this.data[(a.y|0)*this.size.x+a.x|0]}update(){}render(){ASSERT$$module$dist$littlejs_esm_min_js_tmp(mainContext$$module$dist$littlejs_esm_min_js_tmp!=this.context,"must call redrawEnd() after drawing tiles");glOverlay$$module$dist$littlejs_esm_min_js_tmp||this.isOverlay||glCopyToContext$$module$dist$littlejs_esm_min_js_tmp(mainContext$$module$dist$littlejs_esm_min_js_tmp);let a=worldToScreen$$module$dist$littlejs_esm_min_js_tmp(this.pos.add(vec2$$module$dist$littlejs_esm_min_js_tmp(0,this.size.y*this.scale.y)));a=a.floor();(this.isOverlay?overlayContext$$module$dist$littlejs_esm_min_js_tmp:mainContext$$module$dist$littlejs_esm_min_js_tmp).drawImage(this.canvas,a.x,a.y,cameraScale$$module$dist$littlejs_esm_min_js_tmp*this.size.x*this.scale.x,cameraScale$$module$dist$littlejs_esm_min_js_tmp*this.size.y*this.scale.y)}redraw(){this.redrawStart(!0);for(let a=this.size.x;a--;)for(let b=this.size.y;b--;)this.drawTileData(vec2$$module$dist$littlejs_esm_min_js_tmp(a,b),!1);this.redrawEnd()}redrawStart(a=!1){this.savedRenderSettings=[mainCanvas$$module$dist$littlejs_esm_min_js_tmp,mainContext$$module$dist$littlejs_esm_min_js_tmp,mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp,cameraPos$$module$dist$littlejs_esm_min_js_tmp,cameraScale$$module$dist$littlejs_esm_min_js_tmp];mainCanvas$$module$dist$littlejs_esm_min_js_tmp=this.canvas;mainContext$$module$dist$littlejs_esm_min_js_tmp=this.context;mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp=this.size.multiply(this.tileInfo.size);cameraPos$$module$dist$littlejs_esm_min_js_tmp=this.size.scale(.5);cameraScale$$module$dist$littlejs_esm_min_js_tmp=this.tileInfo.size.x;a&&(mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width=mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.x,mainCanvas$$module$dist$littlejs_esm_min_js_tmp.height=mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp.y);this.context.imageSmoothingEnabled=!tilesPixelated$$module$dist$littlejs_esm_min_js_tmp;glPreRender$$module$dist$littlejs_esm_min_js_tmp()}redrawEnd(){ASSERT$$module$dist$littlejs_esm_min_js_tmp(mainContext$$module$dist$littlejs_esm_min_js_tmp==this.context,"must call redrawStart() before drawing tiles");glCopyToContext$$module$dist$littlejs_esm_min_js_tmp(mainContext$$module$dist$littlejs_esm_min_js_tmp,!0);[mainCanvas$$module$dist$littlejs_esm_min_js_tmp,mainContext$$module$dist$littlejs_esm_min_js_tmp,mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp,cameraPos$$module$dist$littlejs_esm_min_js_tmp,cameraScale$$module$dist$littlejs_esm_min_js_tmp]=this.savedRenderSettings}drawTileData(a,b=!0){var c=this.tileInfo.size;b&&(b=a.multiply(c),this.context.clearRect(b.x,this.canvas.height-b.y,c.x,-c.y));b=this.getData(a);void 0!=b.tile&&(ASSERT$$module$dist$littlejs_esm_min_js_tmp(mainContext$$module$dist$littlejs_esm_min_js_tmp==this.context,"must call redrawStart() before drawing tiles"),a=a.add(vec2$$module$dist$littlejs_esm_min_js_tmp(.5)),c=tile$$module$dist$littlejs_esm_min_js_tmp(b.tile,c,this.tileInfo.textureIndex,this.tileInfo.padding),drawTile$$module$dist$littlejs_esm_min_js_tmp(a,vec2$$module$dist$littlejs_esm_min_js_tmp(1),c,b.color,b.direction*PI$$module$dist$littlejs_esm_min_js_tmp/2,b.mirror))}drawCanvas2D(a,b,c,d,e){const f=this.context;f.save();a=a.subtract(this.pos).multiply(this.tileInfo.size);b=b.multiply(this.tileInfo.size);f.translate(a.x,this.canvas.height-a.y);f.rotate(c);f.scale(d?-b.x:b.x,b.y);e(f);f.restore()}drawTile(a,b=vec2$$module$dist$littlejs_esm_min_js_tmp(1),c,d=new Color$$module$dist$littlejs_esm_min_js_tmp,e,f){this.drawCanvas2D(a,b,e,f,g=>{const h=c&&c.getTextureInfo();h?(g.globalAlpha=d.a,g.drawImage(h.image,c.pos.x,c.pos.y,c.size.x,c.size.y,-.5,-.5,1,1),g.globalAlpha=1):(g.fillStyle=d,g.fillRect(-.5,-.5,1,1))})}drawRect(a,b,c,d){this.drawTile(a,b,void 0,c,d)}}class ParticleEmitter$$module$dist$littlejs_esm_min_js_tmp extends EngineObject$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c=0,d=0,e=100,f=PI$$module$dist$littlejs_esm_min_js_tmp,g,h=new Color$$module$dist$littlejs_esm_min_js_tmp,k=new Color$$module$dist$littlejs_esm_min_js_tmp,n=new Color$$module$dist$littlejs_esm_min_js_tmp(1,1,1,0),l=new Color$$module$dist$littlejs_esm_min_js_tmp(1,1,1,0),m=.5,r=.1,p=1,q=.1,t=.05,u=1,A=1,y=0,C=PI$$module$dist$littlejs_esm_min_js_tmp,B=.1,v=.2,w=!1,D=!1,G=!0,J=D?1e9:0,H=!1){super(a,vec2$$module$dist$littlejs_esm_min_js_tmp(),g,b,void 0,J);this.emitSize=c;this.emitTime=d;this.emitRate=e;this.emitConeAngle=f;this.colorStartA=h;this.colorStartB=k;this.colorEndA=n;this.colorEndB=l;this.randomColorLinear=G;this.particleTime=m;this.sizeStart=r;this.sizeEnd=p;this.speed=q;this.angleSpeed=t;this.damping=u;this.angleDamping=A;this.gravityScale=y;this.particleConeAngle=C;this.fadeRate=B;this.randomness=v;this.collideTiles=w;this.additive=D;this.localSpace=H;this.trailScale=0;this.particleCreateCallback=this.particleDestroyCallback=void 0;this.emitTimeBuffer=0}update(){this.parent&&super.update();if(!this.emitTime||this.getAliveTime()<=this.emitTime){if(this.emitRate*particleEmitRateScale$$module$dist$littlejs_esm_min_js_tmp){var a=1/this.emitRate/particleEmitRateScale$$module$dist$littlejs_esm_min_js_tmp;for(this.emitTimeBuffer+=timeDelta$$module$dist$littlejs_esm_min_js_tmp;0<this.emitTimeBuffer;this.emitTimeBuffer-=a)this.emitParticle()}}else this.destroy();debugParticles$$module$dist$littlejs_esm_min_js_tmp&&(a="number"===typeof this.emitSize?vec2$$module$dist$littlejs_esm_min_js_tmp(this.emitSize):this.emitSize,debugRect$$module$dist$littlejs_esm_min_js_tmp(this.pos,a,"#0f0",0,this.angle))}emitParticle(){var a="number"===typeof this.emitSize?randInCircle$$module$dist$littlejs_esm_min_js_tmp(this.emitSize/2):vec2$$module$dist$littlejs_esm_min_js_tmp(rand$$module$dist$littlejs_esm_min_js_tmp(-.5,.5),rand$$module$dist$littlejs_esm_min_js_tmp(-.5,.5)).multiply(this.emitSize).rotate(this.angle);let b=rand$$module$dist$littlejs_esm_min_js_tmp(this.particleConeAngle,-this.particleConeAngle);this.localSpace||(a=this.pos.add(a),b+=this.angle);const c=this.randomness;var d=m=>m+m*rand$$module$dist$littlejs_esm_min_js_tmp(c,-c);const e=d(this.particleTime),f=d(this.sizeStart),g=d(this.sizeEnd),h=d(this.speed);d=d(this.angleSpeed)*randSign$$module$dist$littlejs_esm_min_js_tmp();var k=rand$$module$dist$littlejs_esm_min_js_tmp(this.emitConeAngle,-this.emitConeAngle);const n=randColor$$module$dist$littlejs_esm_min_js_tmp(this.colorStartA,this.colorStartB,this.randomColorLinear),l=randColor$$module$dist$littlejs_esm_min_js_tmp(this.colorEndA,this.colorEndB,this.randomColorLinear);k=this.localSpace?k:this.angle+k;a=new Particle$$module$dist$littlejs_esm_min_js_tmp(a,this.tileInfo,b,n,l,e,f,g,this.fadeRate,this.additive,this.trailScale,this.localSpace&&this,this.particleDestroyCallback);a.velocity=vec2$$module$dist$littlejs_esm_min_js_tmp().setAngle(k,h);a.angleVelocity=d;a.fadeRate=this.fadeRate;a.damping=this.damping;a.angleDamping=this.angleDamping;a.elasticity=this.elasticity;a.friction=this.friction;a.gravityScale=this.gravityScale;a.collideTiles=this.collideTiles;a.renderOrder=this.renderOrder;a.mirror=!!randInt$$module$dist$littlejs_esm_min_js_tmp(2);this.particleCreateCallback&&this.particleCreateCallback(a);return a}render(){}}class Particle$$module$dist$littlejs_esm_min_js_tmp extends EngineObject$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d,e,f,g,h,k,n,l,m,r){super(a,vec2$$module$dist$littlejs_esm_min_js_tmp(),b,c);this.colorStart=d;this.colorEndDelta=e.subtract(d);this.lifeTime=f;this.sizeStart=g;this.sizeEndDelta=h-g;this.fadeRate=k;this.additive=n;this.trailScale=l;this.localSpaceEmitter=m;this.destroyCallback=r;this.clampSpeedLinear=!1}render(){const a=0<this.lifeTime?min$$module$dist$littlejs_esm_min_js_tmp((time$$module$dist$littlejs_esm_min_js_tmp-this.spawnTime)/this.lifeTime,1):1,b=vec2$$module$dist$littlejs_esm_min_js_tmp(this.sizeStart+a*this.sizeEndDelta);var c=this.fadeRate/2;c=new Color$$module$dist$littlejs_esm_min_js_tmp(this.colorStart.r+a*this.colorEndDelta.r,this.colorStart.g+a*this.colorEndDelta.g,this.colorStart.b+a*this.colorEndDelta.b,(this.colorStart.a+a*this.colorEndDelta.a)*(a<c?a/c:a>1-c?(1-a)/c:1));this.additive&&setBlendMode$$module$dist$littlejs_esm_min_js_tmp(!0);let d=this.pos,e=this.angle;this.localSpaceEmitter&&(d=this.localSpaceEmitter.pos.add(d.rotate(-this.localSpaceEmitter.angle)),e+=this.localSpaceEmitter.angle);if(this.trailScale){var f=this.velocity;this.localSpaceEmitter&&(f=f.rotate(-this.localSpaceEmitter.angle));var g=f.length();g&&(f=f.scale(1/g),g*=this.trailScale,b.y=max$$module$dist$littlejs_esm_min_js_tmp(b.x,g),e=f.angle(),drawTile$$module$dist$littlejs_esm_min_js_tmp(d.add(f.multiply(vec2$$module$dist$littlejs_esm_min_js_tmp(0,-g/2))),b,this.tileInfo,c,e,this.mirror))}else drawTile$$module$dist$littlejs_esm_min_js_tmp(d,b,this.tileInfo,c,e,this.mirror);this.additive&&setBlendMode$$module$dist$littlejs_esm_min_js_tmp();debugParticles$$module$dist$littlejs_esm_min_js_tmp&&debugRect$$module$dist$littlejs_esm_min_js_tmp(d,b,"#f005",0,e);1==a&&(this.color=c,this.size=b,this.destroyCallback&&this.destroyCallback(this),this.destroyed=1)}}const medals$$module$dist$littlejs_esm_min_js_tmp={};let medalsDisplayQueue$$module$dist$littlejs_esm_min_js_tmp=[],medalsSaveName$$module$dist$littlejs_esm_min_js_tmp,medalsDisplayTimeLast$$module$dist$littlejs_esm_min_js_tmp;function medalsInit$$module$dist$littlejs_esm_min_js_tmp(a){medalsSaveName$$module$dist$littlejs_esm_min_js_tmp=a;debugMedals$$module$dist$littlejs_esm_min_js_tmp||medalsForEach$$module$dist$littlejs_esm_min_js_tmp(b=>b.unlocked=!!localStorage[b.storageKey()]);engineAddPlugin$$module$dist$littlejs_esm_min_js_tmp(void 0,function(){if(medalsDisplayQueue$$module$dist$littlejs_esm_min_js_tmp.length){var b=medalsDisplayQueue$$module$dist$littlejs_esm_min_js_tmp[0],c=timeReal$$module$dist$littlejs_esm_min_js_tmp-medalsDisplayTimeLast$$module$dist$littlejs_esm_min_js_tmp;if(medalsDisplayTimeLast$$module$dist$littlejs_esm_min_js_tmp)if(c>medalDisplayTime$$module$dist$littlejs_esm_min_js_tmp)medalsDisplayTimeLast$$module$dist$littlejs_esm_min_js_tmp=0,medalsDisplayQueue$$module$dist$littlejs_esm_min_js_tmp.shift();else{const d=medalDisplayTime$$module$dist$littlejs_esm_min_js_tmp-medalDisplaySlideTime$$module$dist$littlejs_esm_min_js_tmp;b.render(c<medalDisplaySlideTime$$module$dist$littlejs_esm_min_js_tmp?1-c/medalDisplaySlideTime$$module$dist$littlejs_esm_min_js_tmp:c>d?(c-d)/medalDisplaySlideTime$$module$dist$littlejs_esm_min_js_tmp:0)}else medalsDisplayTimeLast$$module$dist$littlejs_esm_min_js_tmp=timeReal$$module$dist$littlejs_esm_min_js_tmp}})}function medalsForEach$$module$dist$littlejs_esm_min_js_tmp(a){Object.values(medals$$module$dist$littlejs_esm_min_js_tmp).forEach(b=>a(b))}class Medal$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c="",d="🏆",e){ASSERT$$module$dist$littlejs_esm_min_js_tmp(0<=a&&!medals$$module$dist$littlejs_esm_min_js_tmp[a]);this.id=a;this.name=b;this.description=c;this.icon=d;this.unlocked=!1;e&&((this.image=new Image).src=e);medals$$module$dist$littlejs_esm_min_js_tmp[a]=this}unlock(){medalsPreventUnlock$$module$dist$littlejs_esm_min_js_tmp||this.unlocked||(ASSERT$$module$dist$littlejs_esm_min_js_tmp(medalsSaveName$$module$dist$littlejs_esm_min_js_tmp,"save name must be set"),localStorage[this.storageKey()]=this.unlocked=!0,medalsDisplayQueue$$module$dist$littlejs_esm_min_js_tmp.push(this))}render(a=0){const b=overlayContext$$module$dist$littlejs_esm_min_js_tmp;var c=min$$module$dist$littlejs_esm_min_js_tmp(medalDisplaySize$$module$dist$littlejs_esm_min_js_tmp.x,mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width);const d=medalDisplaySize$$module$dist$littlejs_esm_min_js_tmp.y;var e=overlayCanvas$$module$dist$littlejs_esm_min_js_tmp.width-c;a*=-d;b.save();b.beginPath();b.fillStyle=new Color$$module$dist$littlejs_esm_min_js_tmp(.9,.9,.9).toString();b.strokeStyle=new Color$$module$dist$littlejs_esm_min_js_tmp(0,0,0).toString();b.lineWidth=3;b.rect(e,a,c,d);b.fill();b.stroke();b.clip();const f=vec2$$module$dist$littlejs_esm_min_js_tmp(.1,.05).scale(d),g=d-2*f.x;this.renderIcon(vec2$$module$dist$littlejs_esm_min_js_tmp(e+f.x+g/2,a+d/2),g);const h=.5*d,k=.3*d;e=vec2$$module$dist$littlejs_esm_min_js_tmp(e+g+2*f.x,a+2*f.y+h/2);c=c-g-3*f.x;drawTextScreen$$module$dist$littlejs_esm_min_js_tmp(this.name,e,h,new Color$$module$dist$littlejs_esm_min_js_tmp(0,0,0),0,void 0,"left",void 0,c);e.y=a+d-2*f.y-k/2;drawTextScreen$$module$dist$littlejs_esm_min_js_tmp(this.description,e,k,new Color$$module$dist$littlejs_esm_min_js_tmp(0,0,0),0,void 0,"left",void 0,c);b.restore()}renderIcon(a,b){this.image?overlayContext$$module$dist$littlejs_esm_min_js_tmp.drawImage(this.image,a.x-b/2,a.y-b/2,b,b):drawTextScreen$$module$dist$littlejs_esm_min_js_tmp(this.icon,a,.7*b,new Color$$module$dist$littlejs_esm_min_js_tmp(0,0,0))}storageKey(){return medalsSaveName$$module$dist$littlejs_esm_min_js_tmp+"_"+this.id}}let glCanvas$$module$dist$littlejs_esm_min_js_tmp,glContext$$module$dist$littlejs_esm_min_js_tmp,glAntialias$$module$dist$littlejs_esm_min_js_tmp=!0,glShader$$module$dist$littlejs_esm_min_js_tmp,glActiveTexture$$module$dist$littlejs_esm_min_js_tmp,glArrayBuffer$$module$dist$littlejs_esm_min_js_tmp,glGeometryBuffer$$module$dist$littlejs_esm_min_js_tmp,glPositionData$$module$dist$littlejs_esm_min_js_tmp,glColorData$$module$dist$littlejs_esm_min_js_tmp,glInstanceCount$$module$dist$littlejs_esm_min_js_tmp,glAdditive$$module$dist$littlejs_esm_min_js_tmp,glBatchAdditive$$module$dist$littlejs_esm_min_js_tmp;const gl_MAX_INSTANCES$$module$dist$littlejs_esm_min_js_tmp=1e4,gl_INDICES_PER_INSTANCE$$module$dist$littlejs_esm_min_js_tmp=11,gl_INSTANCE_BYTE_STRIDE$$module$dist$littlejs_esm_min_js_tmp=4*gl_INDICES_PER_INSTANCE$$module$dist$littlejs_esm_min_js_tmp,gl_INSTANCE_BUFFER_SIZE$$module$dist$littlejs_esm_min_js_tmp=gl_MAX_INSTANCES$$module$dist$littlejs_esm_min_js_tmp*gl_INSTANCE_BYTE_STRIDE$$module$dist$littlejs_esm_min_js_tmp;function glInit$$module$dist$littlejs_esm_min_js_tmp(){if(glEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp){glCanvas$$module$dist$littlejs_esm_min_js_tmp=document.createElement("canvas");glContext$$module$dist$littlejs_esm_min_js_tmp=glCanvas$$module$dist$littlejs_esm_min_js_tmp.getContext("webgl2",{antialias:glAntialias$$module$dist$littlejs_esm_min_js_tmp});var a=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.parentElement;glOverlay$$module$dist$littlejs_esm_min_js_tmp&&a.appendChild(glCanvas$$module$dist$littlejs_esm_min_js_tmp);glShader$$module$dist$littlejs_esm_min_js_tmp=glCreateProgram$$module$dist$littlejs_esm_min_js_tmp("#version 300 es\nprecision highp float;uniform mat4 m;in vec2 g;in vec4 p,u,c,a;in float r;out vec2 v;out vec4 d,e;void main(){vec2 s=(g-.5)*p.zw;gl_Position=m*vec4(p.xy+s*cos(r)-vec2(-s.y,s)*sin(r),1,1);v=mix(u.xw,u.zy,g);d=c;e=a;}","#version 300 es\nprecision highp float;uniform sampler2D s;in vec2 v;in vec4 d,e;out vec4 c;void main(){c=texture(s,v)*d+e;}");a=new ArrayBuffer(gl_INSTANCE_BUFFER_SIZE$$module$dist$littlejs_esm_min_js_tmp);glPositionData$$module$dist$littlejs_esm_min_js_tmp=new Float32Array(a);glColorData$$module$dist$littlejs_esm_min_js_tmp=new Uint32Array(a);glArrayBuffer$$module$dist$littlejs_esm_min_js_tmp=glContext$$module$dist$littlejs_esm_min_js_tmp.createBuffer();glGeometryBuffer$$module$dist$littlejs_esm_min_js_tmp=glContext$$module$dist$littlejs_esm_min_js_tmp.createBuffer();a=new Float32Array([glInstanceCount$$module$dist$littlejs_esm_min_js_tmp=0,0,1,0,0,1,1,1]);glContext$$module$dist$littlejs_esm_min_js_tmp.bindBuffer(glContext$$module$dist$littlejs_esm_min_js_tmp.ARRAY_BUFFER,glGeometryBuffer$$module$dist$littlejs_esm_min_js_tmp);glContext$$module$dist$littlejs_esm_min_js_tmp.bufferData(glContext$$module$dist$littlejs_esm_min_js_tmp.ARRAY_BUFFER,a,glContext$$module$dist$littlejs_esm_min_js_tmp.STATIC_DRAW)}}function glPreRender$$module$dist$littlejs_esm_min_js_tmp(){if(glEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp){glClearCanvas$$module$dist$littlejs_esm_min_js_tmp();glContext$$module$dist$littlejs_esm_min_js_tmp.useProgram(glShader$$module$dist$littlejs_esm_min_js_tmp);glContext$$module$dist$littlejs_esm_min_js_tmp.activeTexture(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE0);textureInfos$$module$dist$littlejs_esm_min_js_tmp[0]&&glContext$$module$dist$littlejs_esm_min_js_tmp.bindTexture(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_2D,glActiveTexture$$module$dist$littlejs_esm_min_js_tmp=textureInfos$$module$dist$littlejs_esm_min_js_tmp[0].glTexture);var a=glAdditive$$module$dist$littlejs_esm_min_js_tmp=glBatchAdditive$$module$dist$littlejs_esm_min_js_tmp=0,b=(d,e,f,g)=>{d=glContext$$module$dist$littlejs_esm_min_js_tmp.getAttribLocation(glShader$$module$dist$littlejs_esm_min_js_tmp,d);const h=f&&gl_INSTANCE_BYTE_STRIDE$$module$dist$littlejs_esm_min_js_tmp,k=f&&1,n=1==f;glContext$$module$dist$littlejs_esm_min_js_tmp.enableVertexAttribArray(d);glContext$$module$dist$littlejs_esm_min_js_tmp.vertexAttribPointer(d,g,e,n,h,a);glContext$$module$dist$littlejs_esm_min_js_tmp.vertexAttribDivisor(d,k);a+=g*f};glContext$$module$dist$littlejs_esm_min_js_tmp.bindBuffer(glContext$$module$dist$littlejs_esm_min_js_tmp.ARRAY_BUFFER,glGeometryBuffer$$module$dist$littlejs_esm_min_js_tmp);b("g",glContext$$module$dist$littlejs_esm_min_js_tmp.FLOAT,0,2);glContext$$module$dist$littlejs_esm_min_js_tmp.bindBuffer(glContext$$module$dist$littlejs_esm_min_js_tmp.ARRAY_BUFFER,glArrayBuffer$$module$dist$littlejs_esm_min_js_tmp);glContext$$module$dist$littlejs_esm_min_js_tmp.bufferData(glContext$$module$dist$littlejs_esm_min_js_tmp.ARRAY_BUFFER,gl_INSTANCE_BUFFER_SIZE$$module$dist$littlejs_esm_min_js_tmp,glContext$$module$dist$littlejs_esm_min_js_tmp.DYNAMIC_DRAW);b("p",glContext$$module$dist$littlejs_esm_min_js_tmp.FLOAT,4,4);b("u",glContext$$module$dist$littlejs_esm_min_js_tmp.FLOAT,4,4);b("c",glContext$$module$dist$littlejs_esm_min_js_tmp.UNSIGNED_BYTE,1,4);b("a",glContext$$module$dist$littlejs_esm_min_js_tmp.UNSIGNED_BYTE,1,4);b("r",glContext$$module$dist$littlejs_esm_min_js_tmp.FLOAT,4,1);b=vec2$$module$dist$littlejs_esm_min_js_tmp(2*cameraScale$$module$dist$littlejs_esm_min_js_tmp).divide(mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp);var c=vec2$$module$dist$littlejs_esm_min_js_tmp(-1).subtract(cameraPos$$module$dist$littlejs_esm_min_js_tmp.multiply(b));glContext$$module$dist$littlejs_esm_min_js_tmp.uniformMatrix4fv(glContext$$module$dist$littlejs_esm_min_js_tmp.getUniformLocation(glShader$$module$dist$littlejs_esm_min_js_tmp,"m"),!1,[b.x,0,0,0,0,b.y,0,0,1,1,1,1,c.x,c.y,0,0])}}function glClearCanvas$$module$dist$littlejs_esm_min_js_tmp(){glContext$$module$dist$littlejs_esm_min_js_tmp.viewport(0,0,glCanvas$$module$dist$littlejs_esm_min_js_tmp.width=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width,glCanvas$$module$dist$littlejs_esm_min_js_tmp.height=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.height);glContext$$module$dist$littlejs_esm_min_js_tmp.clear(glContext$$module$dist$littlejs_esm_min_js_tmp.COLOR_BUFFER_BIT)}function glSetTexture$$module$dist$littlejs_esm_min_js_tmp(a){headlessMode$$module$dist$littlejs_esm_min_js_tmp||a==glActiveTexture$$module$dist$littlejs_esm_min_js_tmp||(glFlush$$module$dist$littlejs_esm_min_js_tmp(),glContext$$module$dist$littlejs_esm_min_js_tmp.bindTexture(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_2D,glActiveTexture$$module$dist$littlejs_esm_min_js_tmp=a))}function glCompileShader$$module$dist$littlejs_esm_min_js_tmp(a,b){b=glContext$$module$dist$littlejs_esm_min_js_tmp.createShader(b);glContext$$module$dist$littlejs_esm_min_js_tmp.shaderSource(b,a);glContext$$module$dist$littlejs_esm_min_js_tmp.compileShader(b);if(debug$$module$dist$littlejs_esm_min_js_tmp&&!glContext$$module$dist$littlejs_esm_min_js_tmp.getShaderParameter(b,glContext$$module$dist$littlejs_esm_min_js_tmp.COMPILE_STATUS))throw glContext$$module$dist$littlejs_esm_min_js_tmp.getShaderInfoLog(b);return b}function glCreateProgram$$module$dist$littlejs_esm_min_js_tmp(a,b){const c=glContext$$module$dist$littlejs_esm_min_js_tmp.createProgram();glContext$$module$dist$littlejs_esm_min_js_tmp.attachShader(c,glCompileShader$$module$dist$littlejs_esm_min_js_tmp(a,glContext$$module$dist$littlejs_esm_min_js_tmp.VERTEX_SHADER));glContext$$module$dist$littlejs_esm_min_js_tmp.attachShader(c,glCompileShader$$module$dist$littlejs_esm_min_js_tmp(b,glContext$$module$dist$littlejs_esm_min_js_tmp.FRAGMENT_SHADER));glContext$$module$dist$littlejs_esm_min_js_tmp.linkProgram(c);if(debug$$module$dist$littlejs_esm_min_js_tmp&&!glContext$$module$dist$littlejs_esm_min_js_tmp.getProgramParameter(c,glContext$$module$dist$littlejs_esm_min_js_tmp.LINK_STATUS))throw glContext$$module$dist$littlejs_esm_min_js_tmp.getProgramInfoLog(c);return c}function glCreateTexture$$module$dist$littlejs_esm_min_js_tmp(a){const b=glContext$$module$dist$littlejs_esm_min_js_tmp.createTexture();glContext$$module$dist$littlejs_esm_min_js_tmp.bindTexture(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_2D,b);a&&a.width?glSetTextureData$$module$dist$littlejs_esm_min_js_tmp(b,a):(a=new Uint8Array([255,255,255,255]),glContext$$module$dist$littlejs_esm_min_js_tmp.texImage2D(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_2D,0,glContext$$module$dist$littlejs_esm_min_js_tmp.RGBA,1,1,0,glContext$$module$dist$littlejs_esm_min_js_tmp.RGBA,glContext$$module$dist$littlejs_esm_min_js_tmp.UNSIGNED_BYTE,a));a=tilesPixelated$$module$dist$littlejs_esm_min_js_tmp?glContext$$module$dist$littlejs_esm_min_js_tmp.NEAREST:glContext$$module$dist$littlejs_esm_min_js_tmp.LINEAR;glContext$$module$dist$littlejs_esm_min_js_tmp.texParameteri(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_2D,glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_MIN_FILTER,a);glContext$$module$dist$littlejs_esm_min_js_tmp.texParameteri(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_2D,glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_MAG_FILTER,a);return b}function glSetTextureData$$module$dist$littlejs_esm_min_js_tmp(a,b){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!!b&&0<b.width,"Invalid image data.");glContext$$module$dist$littlejs_esm_min_js_tmp.bindTexture(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_2D,a);glContext$$module$dist$littlejs_esm_min_js_tmp.texImage2D(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_2D,0,glContext$$module$dist$littlejs_esm_min_js_tmp.RGBA,glContext$$module$dist$littlejs_esm_min_js_tmp.RGBA,glContext$$module$dist$littlejs_esm_min_js_tmp.UNSIGNED_BYTE,b)}function glFlush$$module$dist$littlejs_esm_min_js_tmp(){if(glInstanceCount$$module$dist$littlejs_esm_min_js_tmp){var a=glBatchAdditive$$module$dist$littlejs_esm_min_js_tmp?glContext$$module$dist$littlejs_esm_min_js_tmp.ONE:glContext$$module$dist$littlejs_esm_min_js_tmp.ONE_MINUS_SRC_ALPHA;glContext$$module$dist$littlejs_esm_min_js_tmp.blendFuncSeparate(glContext$$module$dist$littlejs_esm_min_js_tmp.SRC_ALPHA,a,glContext$$module$dist$littlejs_esm_min_js_tmp.ONE,a);glContext$$module$dist$littlejs_esm_min_js_tmp.enable(glContext$$module$dist$littlejs_esm_min_js_tmp.BLEND);glContext$$module$dist$littlejs_esm_min_js_tmp.bufferSubData(glContext$$module$dist$littlejs_esm_min_js_tmp.ARRAY_BUFFER,0,glPositionData$$module$dist$littlejs_esm_min_js_tmp);glContext$$module$dist$littlejs_esm_min_js_tmp.drawArraysInstanced(glContext$$module$dist$littlejs_esm_min_js_tmp.TRIANGLE_STRIP,0,4,glInstanceCount$$module$dist$littlejs_esm_min_js_tmp);showWatermark$$module$dist$littlejs_esm_min_js_tmp&&(drawCount$$module$dist$littlejs_esm_min_js_tmp+=glInstanceCount$$module$dist$littlejs_esm_min_js_tmp);glInstanceCount$$module$dist$littlejs_esm_min_js_tmp=0;glBatchAdditive$$module$dist$littlejs_esm_min_js_tmp=glAdditive$$module$dist$littlejs_esm_min_js_tmp}}function glCopyToContext$$module$dist$littlejs_esm_min_js_tmp(a,b=!1){glEnable$$module$dist$littlejs_esm_min_js_tmp&&(glInstanceCount$$module$dist$littlejs_esm_min_js_tmp||b)&&(glFlush$$module$dist$littlejs_esm_min_js_tmp(),glOverlay$$module$dist$littlejs_esm_min_js_tmp&&!b||a.drawImage(glCanvas$$module$dist$littlejs_esm_min_js_tmp,0,0))}function glSetAntialias$$module$dist$littlejs_esm_min_js_tmp(a=!0){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!glCanvas$$module$dist$littlejs_esm_min_js_tmp,"must be called before engineInit");glAntialias$$module$dist$littlejs_esm_min_js_tmp=a}function glDraw$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d,e,f,g,h,k,n=-1,l=0){ASSERT$$module$dist$littlejs_esm_min_js_tmp("number"==typeof n&&"number"==typeof l,"invalid color");(glInstanceCount$$module$dist$littlejs_esm_min_js_tmp>=gl_MAX_INSTANCES$$module$dist$littlejs_esm_min_js_tmp||glBatchAdditive$$module$dist$littlejs_esm_min_js_tmp!=glAdditive$$module$dist$littlejs_esm_min_js_tmp)&&glFlush$$module$dist$littlejs_esm_min_js_tmp();let m=glInstanceCount$$module$dist$littlejs_esm_min_js_tmp++*gl_INDICES_PER_INSTANCE$$module$dist$littlejs_esm_min_js_tmp;glPositionData$$module$dist$littlejs_esm_min_js_tmp[m++]=a;glPositionData$$module$dist$littlejs_esm_min_js_tmp[m++]=b;glPositionData$$module$dist$littlejs_esm_min_js_tmp[m++]=c;glPositionData$$module$dist$littlejs_esm_min_js_tmp[m++]=d;glPositionData$$module$dist$littlejs_esm_min_js_tmp[m++]=f;glPositionData$$module$dist$littlejs_esm_min_js_tmp[m++]=g;glPositionData$$module$dist$littlejs_esm_min_js_tmp[m++]=h;glPositionData$$module$dist$littlejs_esm_min_js_tmp[m++]=k;glColorData$$module$dist$littlejs_esm_min_js_tmp[m++]=n;glColorData$$module$dist$littlejs_esm_min_js_tmp[m++]=l;glPositionData$$module$dist$littlejs_esm_min_js_tmp[m++]=e}const engineName$$module$dist$littlejs_esm_min_js_tmp="LittleJS",engineVersion$$module$dist$littlejs_esm_min_js_tmp="1.11.17",frameRate$$module$dist$littlejs_esm_min_js_tmp=60,timeDelta$$module$dist$littlejs_esm_min_js_tmp=1/frameRate$$module$dist$littlejs_esm_min_js_tmp;let engineObjects$$module$dist$littlejs_esm_min_js_tmp=[],engineObjectsCollide$$module$dist$littlejs_esm_min_js_tmp=[],frame$$module$dist$littlejs_esm_min_js_tmp=0,time$$module$dist$littlejs_esm_min_js_tmp=0,timeReal$$module$dist$littlejs_esm_min_js_tmp=0,paused$$module$dist$littlejs_esm_min_js_tmp=!1;function setPaused$$module$dist$littlejs_esm_min_js_tmp(a){paused$$module$dist$littlejs_esm_min_js_tmp=a}let frameTimeLastMS$$module$dist$littlejs_esm_min_js_tmp=0,frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp=0,averageFPS$$module$dist$littlejs_esm_min_js_tmp=0;const pluginUpdateList$$module$dist$littlejs_esm_min_js_tmp=[],pluginRenderList$$module$dist$littlejs_esm_min_js_tmp=[];function engineAddPlugin$$module$dist$littlejs_esm_min_js_tmp(a,b){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!pluginUpdateList$$module$dist$littlejs_esm_min_js_tmp.includes(a));ASSERT$$module$dist$littlejs_esm_min_js_tmp(!pluginRenderList$$module$dist$littlejs_esm_min_js_tmp.includes(b));a&&pluginUpdateList$$module$dist$littlejs_esm_min_js_tmp.push(a);b&&pluginRenderList$$module$dist$littlejs_esm_min_js_tmp.push(b)}function engineInit$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d,e,f=[],g=document.body){function h(l=0){var m=l-frameTimeLastMS$$module$dist$littlejs_esm_min_js_tmp;frameTimeLastMS$$module$dist$littlejs_esm_min_js_tmp=l;if(debug$$module$dist$littlejs_esm_min_js_tmp||showWatermark$$module$dist$littlejs_esm_min_js_tmp)averageFPS$$module$dist$littlejs_esm_min_js_tmp=lerp$$module$dist$littlejs_esm_min_js_tmp(.05,averageFPS$$module$dist$littlejs_esm_min_js_tmp,1e3/(m||1));l=debug$$module$dist$littlejs_esm_min_js_tmp&&keyIsDown$$module$dist$littlejs_esm_min_js_tmp("Equal");const r=debug$$module$dist$littlejs_esm_min_js_tmp&&keyIsDown$$module$dist$littlejs_esm_min_js_tmp("Minus");debug$$module$dist$littlejs_esm_min_js_tmp&&(m*=l?10:r?.1:1);timeReal$$module$dist$littlejs_esm_min_js_tmp+=m/1e3;frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp+=paused$$module$dist$littlejs_esm_min_js_tmp?0:m;l||(frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp=min$$module$dist$littlejs_esm_min_js_tmp(frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp,50));debug$$module$dist$littlejs_esm_min_js_tmp&&debugVideoCaptureIsActive$$module$dist$littlejs_esm_min_js_tmp()&&(frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp=0);k();if(paused$$module$dist$littlejs_esm_min_js_tmp){for(const q of engineObjects$$module$dist$littlejs_esm_min_js_tmp)q.parent||q.updateTransforms();inputUpdate$$module$dist$littlejs_esm_min_js_tmp();pluginUpdateList$$module$dist$littlejs_esm_min_js_tmp.forEach(q=>q());debugUpdate$$module$dist$littlejs_esm_min_js_tmp();c();inputUpdatePost$$module$dist$littlejs_esm_min_js_tmp()}else{m=0;0>frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp&&-9<frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp&&(m=frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp,frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp=0);for(;0<=frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp;frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp-=1e3/frameRate$$module$dist$littlejs_esm_min_js_tmp)time$$module$dist$littlejs_esm_min_js_tmp=frame$$module$dist$littlejs_esm_min_js_tmp++/frameRate$$module$dist$littlejs_esm_min_js_tmp,inputUpdate$$module$dist$littlejs_esm_min_js_tmp(),b(),pluginUpdateList$$module$dist$littlejs_esm_min_js_tmp.forEach(q=>q()),engineObjectsUpdate$$module$dist$littlejs_esm_min_js_tmp(),debugUpdate$$module$dist$littlejs_esm_min_js_tmp(),c(),inputUpdatePost$$module$dist$littlejs_esm_min_js_tmp();frameTimeBufferMS$$module$dist$littlejs_esm_min_js_tmp+=m}if(!headlessMode$$module$dist$littlejs_esm_min_js_tmp){mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp(mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width,mainCanvas$$module$dist$littlejs_esm_min_js_tmp.height);overlayContext$$module$dist$littlejs_esm_min_js_tmp.imageSmoothingEnabled=mainContext$$module$dist$littlejs_esm_min_js_tmp.imageSmoothingEnabled=!tilesPixelated$$module$dist$littlejs_esm_min_js_tmp;glPreRender$$module$dist$littlejs_esm_min_js_tmp();d();engineObjects$$module$dist$littlejs_esm_min_js_tmp.sort((q,t)=>q.renderOrder-t.renderOrder);for(var p of engineObjects$$module$dist$littlejs_esm_min_js_tmp)p.destroyed||p.render();e();pluginRenderList$$module$dist$littlejs_esm_min_js_tmp.forEach(q=>q());touchGamepadRender$$module$dist$littlejs_esm_min_js_tmp();debugRender$$module$dist$littlejs_esm_min_js_tmp();glCopyToContext$$module$dist$littlejs_esm_min_js_tmp(mainContext$$module$dist$littlejs_esm_min_js_tmp);showWatermark$$module$dist$littlejs_esm_min_js_tmp&&(overlayContext$$module$dist$littlejs_esm_min_js_tmp.textAlign="right",overlayContext$$module$dist$littlejs_esm_min_js_tmp.textBaseline="top",overlayContext$$module$dist$littlejs_esm_min_js_tmp.font="1em monospace",overlayContext$$module$dist$littlejs_esm_min_js_tmp.fillStyle="#000",p=engineName$$module$dist$littlejs_esm_min_js_tmp+" v"+engineVersion$$module$dist$littlejs_esm_min_js_tmp+" / "+drawCount$$module$dist$littlejs_esm_min_js_tmp+" / "+engineObjects$$module$dist$littlejs_esm_min_js_tmp.length+" / "+averageFPS$$module$dist$littlejs_esm_min_js_tmp.toFixed(1)+(glEnable$$module$dist$littlejs_esm_min_js_tmp?" GL":" 2D"),overlayContext$$module$dist$littlejs_esm_min_js_tmp.fillText(p,mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width-3,3),overlayContext$$module$dist$littlejs_esm_min_js_tmp.fillStyle="#fff",overlayContext$$module$dist$littlejs_esm_min_js_tmp.fillText(p,mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width-2,2),drawCount$$module$dist$littlejs_esm_min_js_tmp=0)}debugVideoCaptureUpdate$$module$dist$littlejs_esm_min_js_tmp();requestAnimationFrame(h)}function k(){if(!headlessMode$$module$dist$littlejs_esm_min_js_tmp){if(canvasFixedSize$$module$dist$littlejs_esm_min_js_tmp.x){mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width=canvasFixedSize$$module$dist$littlejs_esm_min_js_tmp.x;mainCanvas$$module$dist$littlejs_esm_min_js_tmp.height=canvasFixedSize$$module$dist$littlejs_esm_min_js_tmp.y;const l=innerWidth/innerHeight,m=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width/mainCanvas$$module$dist$littlejs_esm_min_js_tmp.height;(glCanvas$$module$dist$littlejs_esm_min_js_tmp||mainCanvas$$module$dist$littlejs_esm_min_js_tmp).style.width=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.style.width=overlayCanvas$$module$dist$littlejs_esm_min_js_tmp.style.width=l<m?"100%":"";(glCanvas$$module$dist$littlejs_esm_min_js_tmp||mainCanvas$$module$dist$littlejs_esm_min_js_tmp).style.height=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.style.height=overlayCanvas$$module$dist$littlejs_esm_min_js_tmp.style.height=l<m?"":"100%"}else mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width=min$$module$dist$littlejs_esm_min_js_tmp(innerWidth,canvasMaxSize$$module$dist$littlejs_esm_min_js_tmp.x),mainCanvas$$module$dist$littlejs_esm_min_js_tmp.height=min$$module$dist$littlejs_esm_min_js_tmp(innerHeight,canvasMaxSize$$module$dist$littlejs_esm_min_js_tmp.y);overlayCanvas$$module$dist$littlejs_esm_min_js_tmp.width=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width;overlayCanvas$$module$dist$littlejs_esm_min_js_tmp.height=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.height;mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp=vec2$$module$dist$littlejs_esm_min_js_tmp(mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width,mainCanvas$$module$dist$littlejs_esm_min_js_tmp.height)}}function n(){new Promise(l=>l(a())).then(h)}ASSERT$$module$dist$littlejs_esm_min_js_tmp(!mainContext$$module$dist$littlejs_esm_min_js_tmp,"engine already initialized");ASSERT$$module$dist$littlejs_esm_min_js_tmp(Array.isArray(f),"pass in images as array");a||=()=>{};b||=()=>{};c||=()=>{};d||=()=>{};e||=()=>{};headlessMode$$module$dist$littlejs_esm_min_js_tmp?n():(g.style.cssText="margin:0;background:#000;"+(canvasPixelated$$module$dist$littlejs_esm_min_js_tmp?"image-rendering:pixelated;":"")+"user-select:none;-webkit-user-select:none;"+(touchInputEnable$$module$dist$littlejs_esm_min_js_tmp?"touch-action:none;-webkit-touch-callout:none":""),g.appendChild(mainCanvas$$module$dist$littlejs_esm_min_js_tmp=document.createElement("canvas")),mainContext$$module$dist$littlejs_esm_min_js_tmp=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.getContext("2d"),inputInit$$module$dist$littlejs_esm_min_js_tmp(),audioInit$$module$dist$littlejs_esm_min_js_tmp(),debugInit$$module$dist$littlejs_esm_min_js_tmp(),glInit$$module$dist$littlejs_esm_min_js_tmp(),g.appendChild(overlayCanvas$$module$dist$littlejs_esm_min_js_tmp=document.createElement("canvas")),overlayContext$$module$dist$littlejs_esm_min_js_tmp=overlayCanvas$$module$dist$littlejs_esm_min_js_tmp.getContext("2d"),mainCanvas$$module$dist$littlejs_esm_min_js_tmp.style.cssText=overlayCanvas$$module$dist$littlejs_esm_min_js_tmp.style.cssText="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)",glCanvas$$module$dist$littlejs_esm_min_js_tmp&&(glCanvas$$module$dist$littlejs_esm_min_js_tmp.style.cssText="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)"),k(),g=f.map((l,m)=>new Promise(r=>{const p=new Image;p.onerror=p.onload=()=>{textureInfos$$module$dist$littlejs_esm_min_js_tmp[m]=new TextureInfo$$module$dist$littlejs_esm_min_js_tmp(p);r()};p.crossOrigin="anonymous";p.src=l})),f.length||g.push(new Promise(l=>{textureInfos$$module$dist$littlejs_esm_min_js_tmp[0]=new TextureInfo$$module$dist$littlejs_esm_min_js_tmp(new Image);l()})),showSplashScreen$$module$dist$littlejs_esm_min_js_tmp&&g.push(new Promise(l=>{function m(){clearInput$$module$dist$littlejs_esm_min_js_tmp();drawEngineSplashScreen$$module$dist$littlejs_esm_min_js_tmp(r+=.01);1<r?l():setTimeout(m,16)}let r=0;console.log(`${engineName$$module$dist$littlejs_esm_min_js_tmp} Engine v${engineVersion$$module$dist$littlejs_esm_min_js_tmp}`);m()})),Promise.all(g).then(n))}function engineObjectsUpdate$$module$dist$littlejs_esm_min_js_tmp(){function a(b){if(!b.destroyed){b.update();for(const c of b.children)a(c)}}engineObjectsCollide$$module$dist$littlejs_esm_min_js_tmp=engineObjects$$module$dist$littlejs_esm_min_js_tmp.filter(b=>b.collideSolidObjects);for(const b of engineObjects$$module$dist$littlejs_esm_min_js_tmp)b.parent||(a(b),b.updateTransforms());engineObjects$$module$dist$littlejs_esm_min_js_tmp=engineObjects$$module$dist$littlejs_esm_min_js_tmp.filter(b=>!b.destroyed)}function engineObjectsDestroy$$module$dist$littlejs_esm_min_js_tmp(){for(const a of engineObjects$$module$dist$littlejs_esm_min_js_tmp)a.parent||a.destroy();engineObjects$$module$dist$littlejs_esm_min_js_tmp=engineObjects$$module$dist$littlejs_esm_min_js_tmp.filter(a=>!a.destroyed)}function engineObjectsCollect$$module$dist$littlejs_esm_min_js_tmp(a,b,c=engineObjects$$module$dist$littlejs_esm_min_js_tmp){const d=[];if(a)if(b instanceof Vector2$$module$dist$littlejs_esm_min_js_tmp)for(const e of c)isOverlapping$$module$dist$littlejs_esm_min_js_tmp(a,b,e.pos,e.size)&&d.push(e);else{b*=b;for(const e of c)a.distanceSquared(e.pos)<b&&d.push(e)}else for(const e of c)d.push(e);return d}function engineObjectsCallback$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d=engineObjects$$module$dist$littlejs_esm_min_js_tmp){engineObjectsCollect$$module$dist$littlejs_esm_min_js_tmp(a,b,d).forEach(e=>c(e))}function engineObjectsRaycast$$module$dist$littlejs_esm_min_js_tmp(a,b,c=engineObjects$$module$dist$littlejs_esm_min_js_tmp){const d=[];for(const e of c)e.collideRaycast&&isIntersecting$$module$dist$littlejs_esm_min_js_tmp(a,b,e.pos,e.size)&&(debugRaycast$$module$dist$littlejs_esm_min_js_tmp&&debugRect$$module$dist$littlejs_esm_min_js_tmp(e.pos,e.size,"#f00"),d.push(e));debugRaycast$$module$dist$littlejs_esm_min_js_tmp&&debugLine$$module$dist$littlejs_esm_min_js_tmp(a,b,d.length?"#f00":"#00f",.02);return d}function drawEngineSplashScreen$$module$dist$littlejs_esm_min_js_tmp(a){const b=overlayContext$$module$dist$littlejs_esm_min_js_tmp;var c=overlayCanvas$$module$dist$littlejs_esm_min_js_tmp.width=innerWidth,d=overlayCanvas$$module$dist$littlejs_esm_min_js_tmp.height=innerHeight,e=percent$$module$dist$littlejs_esm_min_js_tmp(a,1,.8),f=percent$$module$dist$littlejs_esm_min_js_tmp(a,0,.5),g=b.createRadialGradient(c/2,d/2,0,c/2,d/2,.7*Math.hypot(c,d));g.addColorStop(0,hsl$$module$dist$littlejs_esm_min_js_tmp(0,0,lerp$$module$dist$littlejs_esm_min_js_tmp(f,0,e/2),e).toString());g.addColorStop(1,hsl$$module$dist$littlejs_esm_min_js_tmp(0,0,0,e).toString());b.save();b.fillStyle=g;b.fillRect(0,0,c,d);g=(k,n,l,m,r)=>{b.beginPath();b.rect(k,n,l,r?m*h:m);(b.fillStyle=r)?b.fill():b.stroke()};f=(k,n,l,m=0,r=2*PI$$module$dist$littlejs_esm_min_js_tmp,p,q)=>{const t=(m+r)/2;m=h*(r-m)/2;b.beginPath();q&&b.lineTo(k,n);b.arc(k,n,l,t-m,t+m);(b.fillStyle=p)?b.fill():b.stroke()};e=(k=0,n=0)=>hsl$$module$dist$littlejs_esm_min_js_tmp([.98,.3,.57,.14][k%4]-10,.8,[0,.3,.5,.8,.9][n]).toString();a=wave$$module$dist$littlejs_esm_min_js_tmp(1,1,a);const h=percent$$module$dist$littlejs_esm_min_js_tmp(a,.1,.5);b.translate(c/2,d/2);c=min$$module$dist$littlejs_esm_min_js_tmp(6,min$$module$dist$littlejs_esm_min_js_tmp(c,d)/99);b.scale(c,c);b.translate(-40,-35);b.lineJoin=b.lineCap="round";b.lineWidth=.1+1.9*h;c=percent$$module$dist$littlejs_esm_min_js_tmp(a,.1,1);b.setLineDash([99*c,99]);g(7,16,18,-8,e(2,2));g(7,8,18,4,e(2,3));g(25,8,8,8,e(2,1));g(25,8,-18,8);g(25,8,8,8);g(25,16,7,23,e());g(11,39,14,-23,e(1,1));g(11,16,14,18,e(1,2));g(11,16,14,8,e(1,3));g(25,16,-14,24);g(15,29,6,-9,e(2,2));f(15,21,5,0,PI$$module$dist$littlejs_esm_min_js_tmp/2,e(2,4),1);g(21,21,-6,9);g(37,14,9,6,e(3,2));g(37,14,4.5,6,e(3,3));g(37,14,9,6);g(50,20,10,-8,e(0,1));g(50,20,6.5,-8,e(0,2));g(50,20,3.5,-8,e(0,3));g(50,20,10,-8);f(55,2,11.4,.5,PI$$module$dist$littlejs_esm_min_js_tmp-.5,e(3,3));f(55,2,11.4,.5,PI$$module$dist$littlejs_esm_min_js_tmp/2,e(3,2),1);f(55,2,11.4,.5,PI$$module$dist$littlejs_esm_min_js_tmp-.5);g(45,7,20,-7,e(0,2));g(45,-1,20,4,e(0,3));g(45,-1,20,8);for(c=5;c--;)f(60-6*c,30,9.9,0,2*PI$$module$dist$littlejs_esm_min_js_tmp,e(c+2,3)),f(60-6*c,30,10,-.5,PI$$module$dist$littlejs_esm_min_js_tmp+.5,e(c+2,2)),f(60-6*c,30,10.1,.5,PI$$module$dist$littlejs_esm_min_js_tmp-.5,e(c+2,1));f(36,30,10,PI$$module$dist$littlejs_esm_min_js_tmp/2,3*PI$$module$dist$littlejs_esm_min_js_tmp/2);f(48,30,10,PI$$module$dist$littlejs_esm_min_js_tmp/2,3*PI$$module$dist$littlejs_esm_min_js_tmp/2);f(60,30,10);b.beginPath();b.lineTo(36,20);b.lineTo(60,20);b.stroke();f(60,30,4,PI$$module$dist$littlejs_esm_min_js_tmp,3*PI$$module$dist$littlejs_esm_min_js_tmp,e(3,2));f(60,30,4,PI$$module$dist$littlejs_esm_min_js_tmp,2*PI$$module$dist$littlejs_esm_min_js_tmp,e(3,3));f(60,30,4,PI$$module$dist$littlejs_esm_min_js_tmp,3*PI$$module$dist$littlejs_esm_min_js_tmp);for(c=6;c--;)b.beginPath(),b.lineTo(53,54),b.lineTo(53,40),b.lineTo(53+(1+2.9*c)*h,40),b.lineTo(53+(4+3.5*c)*h,54),b.fillStyle=e(0,c%2+2),b.fill(),c%2&&b.stroke();g(6,40,5,5);g(6,40,5,5,e());g(15,54,38,-14,e());for(g=3;g--;)for(c=2;c--;)f(15*g+15,47,c?7:1,PI$$module$dist$littlejs_esm_min_js_tmp,3*PI$$module$dist$littlejs_esm_min_js_tmp,e(g,3)),b.stroke(),f(15*g+15,47,c?7:1,0,PI$$module$dist$littlejs_esm_min_js_tmp,e(g,2)),b.stroke();b.beginPath();b.lineTo(6,40);b.lineTo(68,40);b.stroke();b.beginPath();b.lineTo(77,54);b.lineTo(4,54);b.stroke();f=engineName$$module$dist$littlejs_esm_min_js_tmp;b.font="900 16px arial";b.textAlign="center";b.textBaseline="top";b.lineWidth=.1+3.9*h;g=0;for(c=0;c<f.length;++c)g+=b.measureText(f[c]).width;for(c=2;c--;)for(let k=0,n=41-g/2;k<f.length;++k)b.fillStyle=e(k,2),d=b.measureText(f[k]).width,b[c?"strokeText":"fillText"](f[k],n+d/2,55.5,17*h),n+=d;b.restore()}"use strict";"use strict";let newgrounds$$module$dist$littlejs_esm_min_js_tmp;class NewgroundsMedal$$module$dist$littlejs_esm_min_js_tmp extends Medal$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d,e){super(a,b,c,d,e)}unlock(){super.unlock();newgrounds$$module$dist$littlejs_esm_min_js_tmp&&newgrounds$$module$dist$littlejs_esm_min_js_tmp.unlockMedal(this.id)}}class NewgroundsPlugin$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!newgrounds$$module$dist$littlejs_esm_min_js_tmp,"there can only be one newgrounds object");ASSERT$$module$dist$littlejs_esm_min_js_tmp(!b||c,"must provide cryptojs if there is a cipher");newgrounds$$module$dist$littlejs_esm_min_js_tmp=this;this.app_id=a;this.cipher=b;this.cryptoJS=c;this.host=location?location.hostname:"";if(this.session_id=new URL(location.href).searchParams.get("ngio_session_id")){this.medals=(a=this.call("Medal.getList"))?a.result.data.medals:[];debugMedals$$module$dist$littlejs_esm_min_js_tmp&&console.log(this.medals);for(var d of this.medals)if(a=medals$$module$dist$littlejs_esm_min_js_tmp[d.id])a.image=new Image,a.image.src=d.icon,a.name=d.name,a.description=d.description,a.unlocked=d.unlocked,a.difficulty=d.difficulty,a.value=d.value,a.value&&(a.description+=` (${a.value})`);this.scoreboards=(d=this.call("ScoreBoard.getBoards"))?d.result.data.scoreboards:[];debugMedals$$module$dist$littlejs_esm_min_js_tmp&&console.log(this.scoreboards);setInterval(()=>this.call("Gateway.ping",0,!0),6e4)}}unlockMedal(a){return this.call("Medal.unlock",{id:a},!0)}postScore(a,b){return this.call("ScoreBoard.postScore",{id:a,value:b},!0)}getScores(a,b,c=0,d=0,e=10){return this.call("ScoreBoard.getScores",{id:a,user:b,social:c,skip:d,limit:e})}logView(){return this.call("App.logView",{host:this.host},!0)}call(a,b,c=!1){a={component:a,parameters:b};if(this.cipher){b=this.cryptoJS;var d=b.enc.Base64.parse(this.cipher);const e=b.lib.WordArray.random(16);d=b.AES.encrypt(JSON.stringify(a),d,{iv:e});a.secure=b.enc.Base64.stringify(e.concat(d.ciphertext));a.parameters=0}b={app_id:this.app_id,session_id:this.session_id,call:a};a=new FormData;a.append("input",JSON.stringify(b));b=new XMLHttpRequest;b.open("POST","https://newgrounds.io/gateway_v3.php",!debugMedals$$module$dist$littlejs_esm_min_js_tmp&&c);try{b.send(a)}catch(e){debugMedals$$module$dist$littlejs_esm_min_js_tmp&&console.log("newgrounds call failed",e);return}debugMedals$$module$dist$littlejs_esm_min_js_tmp&&console.log(b.responseText);return b.responseText&&JSON.parse(b.responseText)}}"use strict";let postProcess$$module$dist$littlejs_esm_min_js_tmp;class PostProcessPlugin$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b=!1){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!postProcess$$module$dist$littlejs_esm_min_js_tmp,"Post process already initialized");postProcess$$module$dist$littlejs_esm_min_js_tmp=this;headlessMode$$module$dist$littlejs_esm_min_js_tmp||(a||="void mainImage(out vec4 c,vec2 p){c=texture(iChannel0,p/iResolution.xy);}",this.shader=glCreateProgram$$module$dist$littlejs_esm_min_js_tmp("#version 300 es\nprecision highp float;in vec2 p;void main(){gl_Position=vec4(p+p-1.,1,1);}","#version 300 es\nprecision highp float;uniform sampler2D iChannel0;uniform vec3 iResolution;uniform float iTime;out vec4 c;\n"+a+"\nvoid main(){mainImage(c,gl_FragCoord.xy);c.a=1.;}"),this.texture=glCreateTexture$$module$dist$littlejs_esm_min_js_tmp(),this.includeOverlay=b,engineAddPlugin$$module$dist$littlejs_esm_min_js_tmp(void 0,function(){if(!headlessMode$$module$dist$littlejs_esm_min_js_tmp){glEnable$$module$dist$littlejs_esm_min_js_tmp?(glFlush$$module$dist$littlejs_esm_min_js_tmp(),mainContext$$module$dist$littlejs_esm_min_js_tmp.drawImage(glCanvas$$module$dist$littlejs_esm_min_js_tmp,0,0)):glContext$$module$dist$littlejs_esm_min_js_tmp.viewport(0,0,glCanvas$$module$dist$littlejs_esm_min_js_tmp.width=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width,glCanvas$$module$dist$littlejs_esm_min_js_tmp.height=mainCanvas$$module$dist$littlejs_esm_min_js_tmp.height);postProcess$$module$dist$littlejs_esm_min_js_tmp.includeOverlay&&(mainContext$$module$dist$littlejs_esm_min_js_tmp.drawImage(overlayCanvas$$module$dist$littlejs_esm_min_js_tmp,0,0),overlayCanvas$$module$dist$littlejs_esm_min_js_tmp.width|=0);glContext$$module$dist$littlejs_esm_min_js_tmp.useProgram(postProcess$$module$dist$littlejs_esm_min_js_tmp.shader);glContext$$module$dist$littlejs_esm_min_js_tmp.bindBuffer(glContext$$module$dist$littlejs_esm_min_js_tmp.ARRAY_BUFFER,glGeometryBuffer$$module$dist$littlejs_esm_min_js_tmp);glContext$$module$dist$littlejs_esm_min_js_tmp.pixelStorei(glContext$$module$dist$littlejs_esm_min_js_tmp.UNPACK_FLIP_Y_WEBGL,1);glContext$$module$dist$littlejs_esm_min_js_tmp.disable(glContext$$module$dist$littlejs_esm_min_js_tmp.BLEND);glContext$$module$dist$littlejs_esm_min_js_tmp.activeTexture(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE0);glContext$$module$dist$littlejs_esm_min_js_tmp.bindTexture(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_2D,postProcess$$module$dist$littlejs_esm_min_js_tmp.texture);glContext$$module$dist$littlejs_esm_min_js_tmp.texImage2D(glContext$$module$dist$littlejs_esm_min_js_tmp.TEXTURE_2D,0,glContext$$module$dist$littlejs_esm_min_js_tmp.RGBA,glContext$$module$dist$littlejs_esm_min_js_tmp.RGBA,glContext$$module$dist$littlejs_esm_min_js_tmp.UNSIGNED_BYTE,mainCanvas$$module$dist$littlejs_esm_min_js_tmp);var c=glContext$$module$dist$littlejs_esm_min_js_tmp.getAttribLocation(postProcess$$module$dist$littlejs_esm_min_js_tmp.shader,"p");glContext$$module$dist$littlejs_esm_min_js_tmp.enableVertexAttribArray(c);glContext$$module$dist$littlejs_esm_min_js_tmp.vertexAttribPointer(c,2,glContext$$module$dist$littlejs_esm_min_js_tmp.FLOAT,!1,8,0);glContext$$module$dist$littlejs_esm_min_js_tmp.uniform1i(glContext$$module$dist$littlejs_esm_min_js_tmp.getUniformLocation(postProcess$$module$dist$littlejs_esm_min_js_tmp.shader,"iChannel0"),0);glContext$$module$dist$littlejs_esm_min_js_tmp.uniform1f(glContext$$module$dist$littlejs_esm_min_js_tmp.getUniformLocation(postProcess$$module$dist$littlejs_esm_min_js_tmp.shader,"iTime"),time$$module$dist$littlejs_esm_min_js_tmp);glContext$$module$dist$littlejs_esm_min_js_tmp.uniform3f(glContext$$module$dist$littlejs_esm_min_js_tmp.getUniformLocation(postProcess$$module$dist$littlejs_esm_min_js_tmp.shader,"iResolution"),mainCanvas$$module$dist$littlejs_esm_min_js_tmp.width,mainCanvas$$module$dist$littlejs_esm_min_js_tmp.height,1);glContext$$module$dist$littlejs_esm_min_js_tmp.drawArrays(glContext$$module$dist$littlejs_esm_min_js_tmp.TRIANGLE_STRIP,0,4)}}))}}"use strict";class ZzFXMusic$$module$dist$littlejs_esm_min_js_tmp extends Sound$$module$dist$littlejs_esm_min_js_tmp{constructor(a){super(void 0);soundEnable$$module$dist$littlejs_esm_min_js_tmp&&!headlessMode$$module$dist$littlejs_esm_min_js_tmp&&(this.randomness=0,this.sampleChannels=zzfxM$$module$dist$littlejs_esm_min_js_tmp(...a),this.sampleRate=zzfxR$$module$dist$littlejs_esm_min_js_tmp)}playMusic(a,b=!1){return super.play(void 0,a,1,1,b)}}function zzfxM$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d=125){let e,f,g,h,k,n,l,m,r,p,q,t,u,A=0,y,C=[],B=[],v=[],w=0,D=0,G=1,J={},H=zzfxR$$module$dist$littlejs_esm_min_js_tmp/d*60>>2;for(;G;w++)C=[G=m=t=0],c.forEach((E,K)=>{l=b[E][w]||[0,0,0];G|=b[E][w]&&1;y=t+(b[E][0].length-2-(m?0:1))*H;u=K==c.length-1;e=2;for(g=t;e<l.length+u;m=++e){k=l[e];r=e==l.length+u-1&&u||p!=(l[0]||0)||k|0;for(f=0;f<H&&m;f++>H-99&&r&&1>q?q+=1/99:0)n=(1-q)*C[A++]/2||0,B[g]=(B[g]||0)-n*D+n,v[g]=(v[g++]||0)+n*D+n;k&&(q=k%1,D=l[1]||0,k|=0)&&(C=J[[p=l[A=0]||0,k]]=J[[p,k]]||(h=[...a[p]],h[2]=(h[2]||220)*2**(k/12-1),0<k?zzfxG$$module$dist$littlejs_esm_min_js_tmp(...h):[]))}t=y});return[B,v]}"use strict";let uiSystem$$module$dist$littlejs_esm_min_js_tmp;class UISystemPlugin$$module$dist$littlejs_esm_min_js_tmp{constructor(a=overlayContext$$module$dist$littlejs_esm_min_js_tmp){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!uiSystem$$module$dist$littlejs_esm_min_js_tmp,"UI system already initialized");uiSystem$$module$dist$littlejs_esm_min_js_tmp=this;this.defaultColor=WHITE$$module$dist$littlejs_esm_min_js_tmp;this.defaultTextColor=this.defaultLineColor=BLACK$$module$dist$littlejs_esm_min_js_tmp;this.defaultButtonColor=hsl$$module$dist$littlejs_esm_min_js_tmp(0,0,.5);this.defaultHoverColor=hsl$$module$dist$littlejs_esm_min_js_tmp(0,0,.7);this.defaultLineWidth=4;this.defaultFont="arial";this.uiObjects=[];this.uiContext=a;engineAddPlugin$$module$dist$littlejs_esm_min_js_tmp(function(){function b(c){if(c.visible){c.parent&&(c.pos=c.localPos.add(c.parent.pos));c.update();for(const d of c.children)b(d)}}uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiObjects.forEach(c=>c.parent||b(c))},function(){function b(c){if(c.visible){c.parent&&(c.pos=c.localPos.add(c.parent.pos));c.render();for(const d of c.children)b(d)}}uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiObjects.forEach(c=>c.parent||b(c))})}drawRect(a,b,c=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultColor,d=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultLineWidth,e=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultLineColor){uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.fillStyle=c.toString();uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.beginPath();uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.rect(a.x-b.x/2,a.y-b.y/2,b.x,b.y);uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.fill();d&&(uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.strokeStyle=e.toString(),uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.lineWidth=d,uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.stroke())}drawLine(a,b,c=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultLineWidth,d=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultLineColor){uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.strokeStyle=d.toString();uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.lineWidth=c;uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.beginPath();uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.lineTo(a.x,a.y);uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.lineTo(b.x,b.y);uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext.stroke()}drawTile(a,b,c,d=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultColor,e=0,f=!1){drawTile$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d,e,f,BLACK$$module$dist$littlejs_esm_min_js_tmp,!1,!0,uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext)}drawText(a,b,c,d=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultColor,e=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultLineWidth,f=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultLineColor,g="center",h=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultFont){drawTextScreen$$module$dist$littlejs_esm_min_js_tmp(a,b,c.y,d,e,f,g,h,c.x,uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiContext)}}class UIObject$$module$dist$littlejs_esm_min_js_tmp{constructor(a=vec2$$module$dist$littlejs_esm_min_js_tmp(),b=vec2$$module$dist$littlejs_esm_min_js_tmp()){this.localPos=a.copy();this.pos=a.copy();this.size=b.copy();this.color=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultColor;this.lineColor=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultLineColor;this.textColor=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultTextColor;this.hoverColor=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultHoverColor;this.lineWidth=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultLineWidth;this.font=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultFont;this.visible=!0;this.children=[];this.parent=void 0;uiSystem$$module$dist$littlejs_esm_min_js_tmp.uiObjects.push(this)}addChild(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!a.parent&&!this.children.includes(a));this.children.push(a);a.parent=this}removeChild(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(a.parent==this&&this.children.includes(a));this.children.splice(this.children.indexOf(a),1);a.parent=void 0}update(){const a=this.mouseIsOver,b=keyIsDown$$module$dist$littlejs_esm_min_js_tmp(0);if(!b||isTouchDevice$$module$dist$littlejs_esm_min_js_tmp){this.mouseIsOver=isOverlapping$$module$dist$littlejs_esm_min_js_tmp(this.pos,this.size,mousePosScreen$$module$dist$littlejs_esm_min_js_tmp);!b&&isTouchDevice$$module$dist$littlejs_esm_min_js_tmp&&(this.mouseIsOver=!1);if(this.mouseIsOver&&!a)this.onEnter();if(!this.mouseIsOver&&a)this.onLeave()}keyWasPressed$$module$dist$littlejs_esm_min_js_tmp(0)&&this.mouseIsOver?(this.mouseIsHeld=!0,this.onPress(),isTouchDevice$$module$dist$littlejs_esm_min_js_tmp&&(this.mouseIsOver=!1)):this.mouseIsHeld&&!b&&(this.mouseIsHeld=!1,this.onRelease())}render(){this.size.x&&this.size.y&&uiSystem$$module$dist$littlejs_esm_min_js_tmp.drawRect(this.pos,this.size,this.color,this.lineWidth,this.lineColor)}onEnter(){}onLeave(){}onPress(){}onRelease(){}onChange(){}}class UIText$$module$dist$littlejs_esm_min_js_tmp extends UIObject$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c="",d="center",e=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultFont){super(a,b);this.text=c;this.align=d;this.font=e;this.lineWidth=0}render(){uiSystem$$module$dist$littlejs_esm_min_js_tmp.drawText(this.text,this.pos,this.size,this.textColor,this.lineWidth,this.lineColor,this.align,this.font)}}class UITile$$module$dist$littlejs_esm_min_js_tmp extends UIObject$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d=WHITE$$module$dist$littlejs_esm_min_js_tmp,e=0,f=!1){super(a,b);this.tileInfo=c;this.angle=e;this.mirror=f;this.color=d}render(){uiSystem$$module$dist$littlejs_esm_min_js_tmp.drawTile(this.pos,this.size,this.tileInfo,this.color,this.angle,this.mirror)}}class UIButton$$module$dist$littlejs_esm_min_js_tmp extends UIObject$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c="",d=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultButtonColor){super(a,b);this.text=c;this.color=d}render(){uiSystem$$module$dist$littlejs_esm_min_js_tmp.drawRect(this.pos,this.size,this.mouseIsOver?this.hoverColor:this.color,this.lineWidth,this.mouseIsHeld?this.color:this.lineColor);const a=vec2$$module$dist$littlejs_esm_min_js_tmp(this.size.x,.8*this.size.y);uiSystem$$module$dist$littlejs_esm_min_js_tmp.drawText(this.text,this.pos,a,this.textColor,0,void 0,this.align,this.font)}}class UICheckbox$$module$dist$littlejs_esm_min_js_tmp extends UIObject$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c=!1){super(a,b);this.checked=c}onPress(){this.checked=!this.checked;this.onChange()}render(){uiSystem$$module$dist$littlejs_esm_min_js_tmp.drawRect(this.pos,this.size,this.mouseIsOver?this.hoverColor:this.color,this.lineWidth,this.lineColor);this.checked&&(uiSystem$$module$dist$littlejs_esm_min_js_tmp.drawLine(this.pos.add(this.size.multiply(vec2$$module$dist$littlejs_esm_min_js_tmp(-.5,-.5))),this.pos.add(this.size.multiply(vec2$$module$dist$littlejs_esm_min_js_tmp(.5,.5))),this.lineWidth,this.lineColor),uiSystem$$module$dist$littlejs_esm_min_js_tmp.drawLine(this.pos.add(this.size.multiply(vec2$$module$dist$littlejs_esm_min_js_tmp(-.5,.5))),this.pos.add(this.size.multiply(vec2$$module$dist$littlejs_esm_min_js_tmp(.5,-.5))),this.lineWidth,this.lineColor))}}class UIScrollbar$$module$dist$littlejs_esm_min_js_tmp extends UIObject$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c=.5,d="",e=uiSystem$$module$dist$littlejs_esm_min_js_tmp.defaultButtonColor,f=WHITE$$module$dist$littlejs_esm_min_js_tmp){super(a,b);this.value=c;this.text=d;this.color=e;this.handleColor=f}update(){super.update();if(this.mouseIsHeld){var a=vec2$$module$dist$littlejs_esm_min_js_tmp(this.size.y);a=this.size.x-a.x;const b=this.value;this.value=percent$$module$dist$littlejs_esm_min_js_tmp(mousePosScreen$$module$dist$littlejs_esm_min_js_tmp.x,this.pos.x-a/2,this.pos.x+a/2);this.value==b||this.onChange()}}render(){uiSystem$$module$dist$littlejs_esm_min_js_tmp.drawRect(this.pos,this.size,this.mouseIsOver?this.hoverColor:this.color,this.lineWidth,this.mouseIsHeld?this.color:this.lineColor);var a=vec2$$module$dist$littlejs_esm_min_js_tmp(this.size.y),b=this.size.x-a.x;b=vec2$$module$dist$littlejs_esm_min_js_tmp(lerp$$module$dist$littlejs_esm_min_js_tmp(this.value,this.pos.x-b/2,this.pos.x+b/2),this.pos.y);uiSystem$$module$dist$littlejs_esm_min_js_tmp.drawRect(b,a,this.mouseIsHeld?this.color:this.handleColor,this.lineWidth,this.lineColor);a=vec2$$module$dist$littlejs_esm_min_js_tmp(this.size.x,.8*this.size.y);uiSystem$$module$dist$littlejs_esm_min_js_tmp.drawText(this.text,this.pos,a,this.textColor,0,void 0,this.align,this.font)}}"use strict";let box2d$$module$dist$littlejs_esm_min_js_tmp,box2dDebug$$module$dist$littlejs_esm_min_js_tmp=!1;class Box2dObject$$module$dist$littlejs_esm_min_js_tmp extends EngineObject$$module$dist$littlejs_esm_min_js_tmp{constructor(a=vec2$$module$dist$littlejs_esm_min_js_tmp(),b,c,d=0,e,f=box2d$$module$dist$littlejs_esm_min_js_tmp.bodyTypeDynamic,g=0){super(a,b,c,d,e,g);b=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2BodyDef;b.set_type(f);b.set_position(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a));b.set_angle(-d);this.body=box2d$$module$dist$littlejs_esm_min_js_tmp.world.CreateBody(b);this.body.object=this;this.outlineColor=BLACK$$module$dist$littlejs_esm_min_js_tmp}destroy(){this.body&&box2d$$module$dist$littlejs_esm_min_js_tmp.world.DestroyBody(this.body);this.body=0;super.destroy()}update(){this.pos=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.body.GetPosition());this.angle=-this.body.GetAngle()}render(){this.tileInfo?super.render():this.drawFixtures(this.color,this.outlineColor,this.lineWidth,mainContext$$module$dist$littlejs_esm_min_js_tmp)}renderDebugInfo(){var a=!this.getIsAwake();const b=this.getBodyType()==box2d$$module$dist$littlejs_esm_min_js_tmp.bodyTypeStatic;a=rgb$$module$dist$littlejs_esm_min_js_tmp(a?1:0,a?1:0,b?1:0,.5);this.drawFixtures(a)}drawFixtures(a=WHITE$$module$dist$littlejs_esm_min_js_tmp,b,c=.1,d){this.getFixtureList().forEach(e=>box2d$$module$dist$littlejs_esm_min_js_tmp.drawFixture(e,this.pos,this.angle,a,b,c,d))}beginContact(a){}endContact(a){}addShape(a,b=1,c=.2,d=0,e=!1){const f=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2FixtureDef;f.set_shape(a);f.set_density(b);f.set_friction(c);f.set_restitution(d);f.set_isSensor(e);return this.body.CreateFixture(f)}addBox(a=vec2$$module$dist$littlejs_esm_min_js_tmp(1),b=vec2$$module$dist$littlejs_esm_min_js_tmp(),c=0,d,e,f,g){const h=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2PolygonShape;h.SetAsBox(a.x/2,a.y/2,box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(b),c);return this.addShape(h,d,e,f,g)}addPoly(a,b,c,d,e){ASSERT$$module$dist$littlejs_esm_min_js_tmp(3<=a.length&&8>=a.length);const f=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2PolygonShape;var g=box2d$$module$dist$littlejs_esm_min_js_tmp.instance._malloc(8*a.length);for(let h=0,k=0;h<a.length;++h)box2d$$module$dist$littlejs_esm_min_js_tmp.instance.HEAPF32[g+k>>2]=a[h].x,k+=4,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.HEAPF32[g+k>>2]=a[h].y,k+=4;g=box2d$$module$dist$littlejs_esm_min_js_tmp.instance.wrapPointer(g,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Vec2);f.Set(g,a.length);return this.addShape(f,b,c,d,e)}addRegularPoly(a=1,b=8,c,d,e,f){const g=[];a/=2;for(let h=b;h--;)g.push(vec2$$module$dist$littlejs_esm_min_js_tmp(a,0).rotate((h+.5)/b*PI$$module$dist$littlejs_esm_min_js_tmp*2));return this.addPoly(g,c,d,e,f)}addRandomPoly(a=1,b,c,d,e){const f=randInt$$module$dist$littlejs_esm_min_js_tmp(3,9),g=[];a/=2;for(let h=f;h--;)g.push(vec2$$module$dist$littlejs_esm_min_js_tmp(rand$$module$dist$littlejs_esm_min_js_tmp(a/2,1.5*a),0).rotate(h/f*PI$$module$dist$littlejs_esm_min_js_tmp*2));return this.addPoly(g,b,c,d,e)}addCircle(a=1,b=vec2$$module$dist$littlejs_esm_min_js_tmp(),c,d,e,f){const g=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2CircleShape;g.set_m_p(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(b));g.set_m_radius(a/2);return this.addShape(g,c,d,e,f)}addEdge(a,b,c,d,e,f){const g=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2EdgeShape;g.Set(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a),box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(b));return this.addShape(g,c,d,e,f)}addEdgeLoop(a,b,c,d,e){const f=[];for(let h=0;h<a.length;++h){var g=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2EdgeShape;g.set_m_vertex0(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a[mod$$module$dist$littlejs_esm_min_js_tmp(h-1,a.length)]));g.set_m_vertex1(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a[mod$$module$dist$littlejs_esm_min_js_tmp(h+0,a.length)]));g.set_m_vertex2(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a[mod$$module$dist$littlejs_esm_min_js_tmp(h+1,a.length)]));g.set_m_vertex3(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a[mod$$module$dist$littlejs_esm_min_js_tmp(h+2,a.length)]));g=this.addShape(g,b,c,d,e);f.push(g)}return f}addEdgeList(a,b,c,d,e){const f=[];for(let h=0;h<a.length-1;++h){var g=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2EdgeShape;a[h-1]&&g.set_m_vertex0(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a[h-1]));a[h+0]&&g.set_m_vertex1(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a[h+0]));a[h+1]&&g.set_m_vertex2(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a[h+1]));a[h+2]&&g.set_m_vertex3(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a[h+2]));g=this.addShape(g,b,c,d,e);f.push(g)}return f}getCenterOfMass(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.body.GetWorldCenter())}getLinearVelocity(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.body.GetLinearVelocity())}getAngularVelocity(){return this.body.GetAngularVelocity()}getMass(){return this.body.GetMass()}getInertia(){return this.body.GetInertia()}getIsAwake(){return this.body.IsAwake()}getBodyType(){return this.body.GetType()}setTransform(a,b){this.pos=a;this.angle=b;this.body.SetTransform(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a),b)}setPosition(a){this.setTransform(a,this.body.GetAngle())}setAngle(a){this.setTransform(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.body.GetPosition()),-a)}setLinearVelocity(a){this.body.SetLinearVelocity(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a))}setAngularVelocity(a){this.body.SetAngularVelocity(a)}setLinearDamping(a){this.body.SetLinearDamping(a)}setAngularDamping(a){this.body.SetAngularDamping(a)}setGravityScale(a=1){this.body.SetGravityScale(this.gravityScale=a)}setBullet(a=!0){this.body.SetBullet(a)}setAwake(a=!0){this.body.SetAwake(a)}setBodyType(a){this.body.SetType(a)}setSleepingAllowed(a=!0){this.body.SetSleepingAllowed(a)}setFixedRotation(a=!0){this.body.SetFixedRotation(a)}setCenterOfMass(a){this.setMassData(a)}setMass(a){this.setMassData(void 0,a)}setMomentOfInertia(a){this.setMassData(void 0,void 0,a)}resetMassData(){this.body.ResetMassData()}setMassData(a,b,c){const d=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2MassData;this.body.GetMassData(d);a&&d.set_center(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a));b&&d.set_mass(b);c&&d.set_I(c);this.body.SetMassData(d)}setFilterData(a=0,b=0,c=0){this.getFixtureList().forEach(d=>{d=d.GetFilterData();d.set_categoryBits(a);d.set_maskBits(65535&~b);d.set_groupIndex(c)})}setSensor(a=!0){this.getFixtureList().forEach(b=>b.SetSensor(a))}applyForce(a,b){b||=this.getCenterOfMass();this.setAwake();this.body.ApplyForce(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a),box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(b))}applyAcceleration(a,b){b||=this.getCenterOfMass();this.setAwake();this.body.ApplyLinearImpulse(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a),box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(b))}applyTorque(a){this.setAwake();this.body.ApplyTorque(a)}applyAngularAcceleration(a){this.setAwake();this.body.ApplyAngularImpulse(a)}hasFixtures(){return!box2d$$module$dist$littlejs_esm_min_js_tmp.isNull(this.body.GetFixtureList())}getFixtureList(){const a=[];for(let b=this.body.GetFixtureList();!box2d$$module$dist$littlejs_esm_min_js_tmp.isNull(b);)a.push(b),b=b.GetNext();return a}hasJoints(){return!box2d$$module$dist$littlejs_esm_min_js_tmp.isNull(this.body.GetJointList())}getJointList(){const a=[];for(let b=this.body.GetJointList();!box2d$$module$dist$littlejs_esm_min_js_tmp.isNull(b);)a.push(b),b=b.get_next();return a}}class Box2dRaycastResult$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d){this.object=a.GetBody().object;this.fixture=a;this.point=b;this.normal=c;this.fraction=d}}class Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a){this.box2dJoint=box2d$$module$dist$littlejs_esm_min_js_tmp.castObjectType(box2d$$module$dist$littlejs_esm_min_js_tmp.world.CreateJoint(a))}destroy(){box2d$$module$dist$littlejs_esm_min_js_tmp.world.DestroyJoint(this.box2dJoint);this.box2dJoint=0}getObjectA(){return this.box2dJoint.GetBodyA().object}getObjectB(){return this.box2dJoint.GetBodyB().object}getAnchorA(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetAnchorA())}getAnchorB(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetAnchorB())}getReactionForce(a){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetReactionForce(1/a))}getReactionTorque(a){return this.box2dJoint.GetReactionTorque(1/a)}getCollideConnected(){return this.box2dJoint.getCollideConnected()}isActive(){return this.box2dJoint.IsActive()}}class Box2dTargetJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c){a.setAwake();const d=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2MouseJointDef;d.set_bodyA(b.body);d.set_bodyB(a.body);d.set_target(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(c));d.set_maxForce(2e3*a.getMass());super(d)}setTarget(a){this.box2dJoint.SetTarget(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a))}getTarget(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetTarget())}setMaxForce(a){this.box2dJoint.SetMaxForce(a)}getMaxForce(){return this.box2dJoint.GetMaxForce()}setFrequency(a){this.box2dJoint.SetFrequency(a)}getFrequency(){return this.box2dJoint.GetFrequency()}}class Box2dDistanceJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d,e=!1){c||=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(a.body.GetPosition());d||=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(b.body.GetPosition());const f=a.worldToLocal(c),g=b.worldToLocal(d),h=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2DistanceJointDef;h.set_bodyA(a.body);h.set_bodyB(b.body);h.set_localAnchorA(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(f));h.set_localAnchorB(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(g));h.set_length(c.distance(d));h.set_collideConnected(e);super(h)}getLocalAnchorA(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorB())}setLength(a){this.box2dJoint.SetLength(a)}getLength(){return this.box2dJoint.GetLength()}setFrequency(a){this.box2dJoint.SetFrequency(a)}getFrequency(){return this.box2dJoint.GetFrequency()}setDampingRatio(a){this.box2dJoint.SetDampingRatio(a)}getDampingRatio(){return this.box2dJoint.GetDampingRatio()}}class Box2dPinJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dDistanceJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c=a.pos,d=!1){super(a,b,void 0,c,d)}}class Box2dRopeJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d,e=0,f=!1){c||=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(a.body.GetPosition());d||=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(b.body.GetPosition());const g=a.worldToLocal(c),h=b.worldToLocal(d),k=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2RopeJointDef;k.set_bodyA(a.body);k.set_bodyB(b.body);k.set_localAnchorA(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(g));k.set_localAnchorB(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(h));k.set_maxLength(c.distance(d)+e);k.set_collideConnected(f);super(k)}getLocalAnchorA(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorB())}setMaxLength(a){this.box2dJoint.SetMaxLength(a)}getMaxLength(){return this.box2dJoint.GetMaxLength()}}class Box2dRevoluteJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d=!1){c||=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(b.body.GetPosition());const e=a.worldToLocal(c);c=b.worldToLocal(c);const f=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2RevoluteJointDef;f.set_bodyA(a.body);f.set_bodyB(b.body);f.set_localAnchorA(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(e));f.set_localAnchorB(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(c));f.set_referenceAngle(a.body.GetAngle()-b.body.GetAngle());f.set_collideConnected(d);super(f)}getLocalAnchorA(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorB())}getReferenceAngle(){return this.box2dJoint.GetReferenceAngle()}getJointAngle(){return this.box2dJoint.GetJointAngle()}getJointSpeed(){return this.box2dJoint.GetJointSpeed()}isLimitEnabled(){return this.box2dJoint.IsLimitEnabled()}enableLimit(a=!0){return this.box2dJoint.enableLimit(a)}getLowerLimit(){return this.box2dJoint.GetLowerLimit()}getUpperLimit(){return this.box2dJoint.GetUpperLimit()}setLimits(a,b){return this.box2dJoint.SetLimits(a,b)}isMotorEnabled(){return this.box2dJoint.IsMotorEnabled()}enableMotor(a=!0){return this.box2dJoint.EnableMotor(a)}setMotorSpeed(a){return this.box2dJoint.SetMotorSpeed(a)}getMotorSpeed(){return this.box2dJoint.GetMotorSpeed()}setMaxMotorTorque(a){return this.box2dJoint.SetMaxMotorTorque(a)}getMaxMotorTorque(){return this.box2dJoint.GetMaxMotorTorque()}getMotorTorque(a){return this.box2dJoint.GetMotorTorque(1/a)}}class Box2dGearJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d,e=1){const f=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2GearJointDef;f.set_bodyA(a.body);f.set_bodyB(b.body);f.set_joint1(c.box2dJoint);f.set_joint2(d.box2dJoint);f.set_ratio(e);super(f);this.joint1=c;this.joint2=d}getJoint1(){return this.joint1}getJoint2(){return this.joint2}setRatio(a){return this.box2dJoint.SetRatio(a)}getRatio(){return this.box2dJoint.GetRatio()}}class Box2dPrismaticJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d=vec2$$module$dist$littlejs_esm_min_js_tmp(0,1),e=!1){c||=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(b.body.GetPosition());const f=a.worldToLocal(c);c=b.worldToLocal(c);d=b.worldToLocalVector(d);const g=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2PrismaticJointDef;g.set_bodyA(a.body);g.set_bodyB(b.body);g.set_localAnchorA(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(f));g.set_localAnchorB(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(c));g.set_localAxisA(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(d));g.set_referenceAngle(a.body.GetAngle()-b.body.GetAngle());g.set_collideConnected(e);super(g)}getLocalAnchorA(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorB())}getLocalAxisA(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAxisA())}getReferenceAngle(){return this.box2dJoint.GetReferenceAngle()}getJointTranslation(){return this.box2dJoint.GetJointTranslation()}getJointSpeed(){return this.box2dJoint.GetJointSpeed()}isLimitEnabled(){return this.box2dJoint.IsLimitEnabled()}enableLimit(a=!0){return this.box2dJoint.enableLimit(a)}getLowerLimit(){return this.box2dJoint.GetLowerLimit()}getUpperLimit(){return this.box2dJoint.GetUpperLimit()}setLimits(a,b){return this.box2dJoint.SetLimits(a,b)}isMotorEnabled(){return this.box2dJoint.IsMotorEnabled()}enableMotor(a=!0){return this.box2dJoint.EnableMotor(a)}setMotorSpeed(a){return this.box2dJoint.SetMotorSpeed(a)}getMotorSpeed(){return this.box2dJoint.GetMotorSpeed()}setMaxMotorForce(a){return this.box2dJoint.SetMaxMotorForce(a)}getMaxMotorForce(){return this.box2dJoint.GetMaxMotorForce()}getMotorForce(a){return this.box2dJoint.GetMotorForce(1/a)}}class Box2dWheelJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d=vec2$$module$dist$littlejs_esm_min_js_tmp(0,1),e=!1){c||=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(b.body.GetPosition());const f=a.worldToLocal(c);c=b.worldToLocal(c);d=b.worldToLocalVector(d);const g=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2WheelJointDef;g.set_bodyA(a.body);g.set_bodyB(b.body);g.set_localAnchorA(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(f));g.set_localAnchorB(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(c));g.set_localAxisA(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(d));g.set_collideConnected(e);super(g)}getLocalAnchorA(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorB())}getLocalAxisA(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAxisA())}getJointTranslation(){return this.box2dJoint.GetJointTranslation()}getJointSpeed(){return this.box2dJoint.GetJointSpeed()}isMotorEnabled(){return this.box2dJoint.IsMotorEnabled()}enableMotor(a=!0){return this.box2dJoint.EnableMotor(a)}setMotorSpeed(a){return this.box2dJoint.SetMotorSpeed(a)}getMotorSpeed(){return this.box2dJoint.GetMotorSpeed()}setMaxMotorTorque(a){return this.box2dJoint.SetMaxMotorTorque(a)}getMaxMotorTorque(){return this.box2dJoint.GetMaxMotorTorque()}getMotorTorque(a){return this.box2dJoint.GetMotorTorque(1/a)}setSpringFrequencyHz(a){return this.box2dJoint.SetSpringFrequencyHz(a)}getSpringFrequencyHz(){return this.box2dJoint.GetSpringFrequencyHz()}setSpringDampingRatio(a){return this.box2dJoint.SetSpringDampingRatio(a)}getSpringDampingRatio(){return this.box2dJoint.GetSpringDampingRatio()}}class Box2dWeldJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d=!1){c||=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(b.body.GetPosition());const e=a.worldToLocal(c);c=b.worldToLocal(c);const f=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2WeldJointDef;f.set_bodyA(a.body);f.set_bodyB(b.body);f.set_localAnchorA(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(e));f.set_localAnchorB(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(c));f.set_referenceAngle(a.body.GetAngle()-b.body.GetAngle());f.set_collideConnected(d);super(f)}getLocalAnchorA(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorB())}getReferenceAngle(){return this.box2dJoint.GetReferenceAngle()}setFrequency(a){return this.box2dJoint.SetFrequency(a)}getFrequency(){return this.box2dJoint.GetFrequency()}setSpringDampingRatio(a){return this.box2dJoint.SetSpringDampingRatio(a)}getSpringDampingRatio(){return this.box2dJoint.GetSpringDampingRatio()}}class Box2dFrictionJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d=!1){c||=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(b.body.GetPosition());const e=a.worldToLocal(c);c=b.worldToLocal(c);const f=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2FrictionJointDef;f.set_bodyA(a.body);f.set_bodyB(b.body);f.set_localAnchorA(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(e));f.set_localAnchorB(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(c));f.set_collideConnected(d);super(f)}getLocalAnchorA(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLocalAnchorB())}setMaxForce(a){this.box2dJoint.SetMaxForce(a)}getMaxForce(){return this.box2dJoint.GetMaxForce()}setMaxTorque(a){this.box2dJoint.SetMaxTorque(a)}getMaxTorque(){return this.box2dJoint.GetMaxTorque()}}class Box2dPulleyJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b,c,d,e,f,g=1,h=!1){e||=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(a.body.GetPosition());f||=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(b.body.GetPosition());const k=a.worldToLocal(e),n=b.worldToLocal(f),l=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2PulleyJointDef;l.set_bodyA(a.body);l.set_bodyB(b.body);l.set_groundAnchorA(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(c));l.set_groundAnchorB(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(d));l.set_localAnchorA(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(k));l.set_localAnchorB(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(n));l.set_ratio(g);l.set_lengthA(c.distance(e));l.set_lengthB(d.distance(f));l.set_collideConnected(h);super(l)}getGroundAnchorA(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetGroundAnchorA())}getGroundAnchorB(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetGroundAnchorB())}getLengthA(){return this.box2dJoint.GetLengthA()}getLengthB(){return this.box2dJoint.GetLengthB()}getRatio(){return this.box2dJoint.GetRatio()}getCurrentLengthA(){return this.box2dJoint.GetCurrentLengthA()}getCurrentLengthB(){return this.box2dJoint.GetCurrentLengthB()}}class Box2dMotorJoint$$module$dist$littlejs_esm_min_js_tmp extends Box2dJoint$$module$dist$littlejs_esm_min_js_tmp{constructor(a,b){const c=a.worldToLocal(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(b.body.GetPosition())),d=b.body.GetAngle()-a.body.GetAngle(),e=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2MotorJointDef;e.set_bodyA(a.body);e.set_bodyB(b.body);e.set_linearOffset(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(c));e.set_angularOffset(d);super(e)}setLinearOffset(a){this.box2dJoint.SetLinearOffset(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a))}getLinearOffset(){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(this.box2dJoint.GetLinearOffset())}setAngularOffset(a){this.box2dJoint.SetAngularOffset(a)}getAngularOffset(){return this.box2dJoint.GetAngularOffset()}setMaxForce(a){this.box2dJoint.SetMaxForce(a)}getMaxForce(){return this.box2dJoint.GetMaxForce()}setMaxTorque(a){this.box2dJoint.SetMaxTorque(a)}getMaxTorque(){return this.box2dJoint.GetMaxTorque()}setCorrectionFactor(a){this.box2dJoint.SetCorrectionFactor(a)}getCorrectionFactor(){return this.box2dJoint.GetCorrectionFactor()}}class Box2dPlugin$$module$dist$littlejs_esm_min_js_tmp{constructor(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(!box2d$$module$dist$littlejs_esm_min_js_tmp,"Box2D already initialized");box2d$$module$dist$littlejs_esm_min_js_tmp=this;this.instance=a;this.world=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2World;this.velocityIterations=8;this.positionIterations=3;this.bodyTypeStatic=a.b2_staticBody;this.bodyTypeKinematic=a.b2_kinematicBody;this.bodyTypeDynamic=a.b2_dynamicBody;a=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.JSContactListener;a.BeginContact=function(b){var c=box2d$$module$dist$littlejs_esm_min_js_tmp.instance.wrapPointer(b,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Contact);b=c.GetFixtureA();c=c.GetFixtureB();b=b.GetBody().object;c=c.GetBody().object;b.beginContact(c);c.beginContact(b)};a.EndContact=function(b){var c=box2d$$module$dist$littlejs_esm_min_js_tmp.instance.wrapPointer(b,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Contact);b=c.GetFixtureA();c=c.GetFixtureB();b=b.GetBody().object;c=c.GetBody().object;b.endContact(c);c.endContact(b)};a.PreSolve=function(){};a.PostSolve=function(){};box2d$$module$dist$littlejs_esm_min_js_tmp.world.SetContactListener(a)}step(a=1){for(box2d$$module$dist$littlejs_esm_min_js_tmp.world.SetGravity(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(vec2$$module$dist$littlejs_esm_min_js_tmp(0,gravity$$module$dist$littlejs_esm_min_js_tmp)));a--;)box2d$$module$dist$littlejs_esm_min_js_tmp.world.Step(timeDelta$$module$dist$littlejs_esm_min_js_tmp,this.velocityIterations,this.positionIterations)}raycastAll(a,b){const c=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.JSRayCastCallback;c.ReportFixture=function(e,f,g,h){e=box2d$$module$dist$littlejs_esm_min_js_tmp.instance.wrapPointer(e,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Fixture);f=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2FromPointer(f);g=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2FromPointer(g);d.push(new Box2dRaycastResult$$module$dist$littlejs_esm_min_js_tmp(e,f,g,h));return 1};const d=[];box2d$$module$dist$littlejs_esm_min_js_tmp.world.RayCast(c,box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a),box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(b));debugRaycast$$module$dist$littlejs_esm_min_js_tmp&&debugLine$$module$dist$littlejs_esm_min_js_tmp(a,b,d.length?"#f00":"#00f",.02);return d}raycast(a,b){a=box2d$$module$dist$littlejs_esm_min_js_tmp.raycastAll(a,b);if(a.length)return a.reduce((c,d)=>c.fraction<d.fraction?c:d)}boxCastAll(a,b){const c=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.JSQueryCallback;c.ReportFixture=function(f){f=box2d$$module$dist$littlejs_esm_min_js_tmp.instance.wrapPointer(f,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Fixture).GetBody().object;e.includes(f)||e.push(f);return!0};const d=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2AABB;d.set_lowerBound(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a.subtract(b.scale(.5))));d.set_upperBound(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a.add(b.scale(.5))));let e=[];box2d$$module$dist$littlejs_esm_min_js_tmp.world.QueryAABB(c,d);debugRaycast$$module$dist$littlejs_esm_min_js_tmp&&debugRect$$module$dist$littlejs_esm_min_js_tmp(a,b,e.length?"#f00":"#00f",.02);return e}boxCast(a,b){const c=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.JSQueryCallback;c.ReportFixture=function(f){e=box2d$$module$dist$littlejs_esm_min_js_tmp.instance.wrapPointer(f,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Fixture).GetBody().object;return!1};const d=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2AABB;d.set_lowerBound(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a.subtract(b.scale(.5))));d.set_upperBound(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a.add(b.scale(.5))));let e;box2d$$module$dist$littlejs_esm_min_js_tmp.world.QueryAABB(c,d);debugRaycast$$module$dist$littlejs_esm_min_js_tmp&&debugRect$$module$dist$littlejs_esm_min_js_tmp(a,b,e?"#f00":"#00f",.02);return e}circleCastAll(a,b){const c=(b/2)**2;return box2d$$module$dist$littlejs_esm_min_js_tmp.boxCastAll(a,vec2$$module$dist$littlejs_esm_min_js_tmp(b)).filter(d=>d.pos.distanceSquared(a)<c)}circleCast(a,b){const c=(b/2)**2;b=box2d$$module$dist$littlejs_esm_min_js_tmp.boxCastAll(a,vec2$$module$dist$littlejs_esm_min_js_tmp(b));let d,e;for(const f of b)b=f.pos.distanceSquared(a),b<c&&(!d||b<e)&&(d=f,e=b);return d}pointCast(a,b=!0){const c=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.JSQueryCallback;c.ReportFixture=function(f){f=box2d$$module$dist$littlejs_esm_min_js_tmp.instance.wrapPointer(f,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Fixture);if(b&&f.GetBody().GetType()!=box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2_dynamicBody||!f.TestPoint(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a)))return!0;e=f.GetBody().object;return!1};const d=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2AABB;d.set_lowerBound(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a));d.set_upperBound(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2dTo(a));let e;debugRaycast$$module$dist$littlejs_esm_min_js_tmp&&debugRect$$module$dist$littlejs_esm_min_js_tmp(a,vec2$$module$dist$littlejs_esm_min_js_tmp(),e?"#f00":"#00f",.02);box2d$$module$dist$littlejs_esm_min_js_tmp.world.QueryAABB(c,d);return e}drawFixture(a,b,c,d=WHITE$$module$dist$littlejs_esm_min_js_tmp,e=BLACK$$module$dist$littlejs_esm_min_js_tmp,f=.1,g=mainContext$$module$dist$littlejs_esm_min_js_tmp){a=box2d$$module$dist$littlejs_esm_min_js_tmp.castObjectType(a.GetShape());switch(a.GetType()){case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Shape.e_polygon:let h=[];for(let k=a.GetVertexCount();k--;)h.push(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(a.GetVertex(k)));box2d$$module$dist$littlejs_esm_min_js_tmp.drawPoly(b,c,h,d,e,f,g);break;case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Shape.e_circle:c=a.get_m_radius();box2d$$module$dist$littlejs_esm_min_js_tmp.drawCircle(b,c,d,e,f,g);break;case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Shape.e_edge:e=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(a.get_m_vertex1()),a=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(a.get_m_vertex2()),box2d$$module$dist$littlejs_esm_min_js_tmp.drawLine(b,c,e,a,d,f,g)}}drawCircle(a,b,c=WHITE$$module$dist$littlejs_esm_min_js_tmp,d=BLACK$$module$dist$littlejs_esm_min_js_tmp,e=.1,f=mainContext$$module$dist$littlejs_esm_min_js_tmp){drawCanvas2D$$module$dist$littlejs_esm_min_js_tmp(a,vec2$$module$dist$littlejs_esm_min_js_tmp(1),0,0,g=>{g.beginPath();g.arc(0,0,b,0,9);box2d$$module$dist$littlejs_esm_min_js_tmp.drawFillStroke(c,d,e,g)},0,f)}drawPoly(a,b,c,d=WHITE$$module$dist$littlejs_esm_min_js_tmp,e=BLACK$$module$dist$littlejs_esm_min_js_tmp,f=.1,g=mainContext$$module$dist$littlejs_esm_min_js_tmp){drawCanvas2D$$module$dist$littlejs_esm_min_js_tmp(a,vec2$$module$dist$littlejs_esm_min_js_tmp(1),b,0,h=>{h.beginPath();c.forEach(k=>h.lineTo(k.x,k.y));h.closePath();box2d$$module$dist$littlejs_esm_min_js_tmp.drawFillStroke(d,e,f,h)},0,g)}drawLine(a,b,c,d,e=WHITE$$module$dist$littlejs_esm_min_js_tmp,f=.1,g=mainContext$$module$dist$littlejs_esm_min_js_tmp){drawCanvas2D$$module$dist$littlejs_esm_min_js_tmp(a,vec2$$module$dist$littlejs_esm_min_js_tmp(1),b,0,h=>{h.beginPath();h.lineTo(c.x,c.y);h.lineTo(d.x,d.y);box2d$$module$dist$littlejs_esm_min_js_tmp.drawFillStroke(0,e,f,h)},0,g)}drawFillStroke(a=WHITE$$module$dist$littlejs_esm_min_js_tmp,b=BLACK$$module$dist$littlejs_esm_min_js_tmp,c=.1,d=mainContext$$module$dist$littlejs_esm_min_js_tmp){a&&(d.fillStyle=a.toString(),d.fill());b&&c&&(d.lineWidth=c,d.lineJoin=d.lineCap="round",d.strokeStyle=b.toString(),d.stroke())}vec2From(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(a instanceof box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Vec2);return new Vector2$$module$dist$littlejs_esm_min_js_tmp(a.get_x(),a.get_y())}vec2FromPointer(a){return box2d$$module$dist$littlejs_esm_min_js_tmp.vec2From(box2d$$module$dist$littlejs_esm_min_js_tmp.instance.wrapPointer(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Vec2))}vec2dTo(a){ASSERT$$module$dist$littlejs_esm_min_js_tmp(a instanceof Vector2$$module$dist$littlejs_esm_min_js_tmp);return new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Vec2(a.x,a.y)}isNull(a){return!box2d$$module$dist$littlejs_esm_min_js_tmp.instance.getPointer(a)}castObjectType(a){switch(a.GetType()){case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Shape.e_circle:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2CircleShape);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Shape.e_edge:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2EdgeShape);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Shape.e_polygon:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2PolygonShape);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Shape.e_chain:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2ChainShape);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.e_revoluteJoint:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2RevoluteJoint);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.e_prismaticJoint:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2PrismaticJoint);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.e_distanceJoint:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2DistanceJoint);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.e_pulleyJoint:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2PulleyJoint);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.e_mouseJoint:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2MouseJoint);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.e_gearJoint:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2GearJoint);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.e_wheelJoint:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2WheelJoint);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.e_weldJoint:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2WeldJoint);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.e_frictionJoint:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2FrictionJoint);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.e_ropeJoint:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2RopeJoint);case box2d$$module$dist$littlejs_esm_min_js_tmp.instance.e_motorJoint:return box2d$$module$dist$littlejs_esm_min_js_tmp.instance.castObject(a,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2MotorJoint)}ASSERT$$module$dist$littlejs_esm_min_js_tmp(!1,"Unknown box2d object type")}}function box2dEngineInit$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d,e,f,g){function h(){paused$$module$dist$littlejs_esm_min_js_tmp||box2d$$module$dist$littlejs_esm_min_js_tmp.step()}function k(){(box2dDebug$$module$dist$littlejs_esm_min_js_tmp||debugPhysics$$module$dist$littlejs_esm_min_js_tmp&&debugOverlay$$module$dist$littlejs_esm_min_js_tmp)&&box2d$$module$dist$littlejs_esm_min_js_tmp.world.DrawDebugData()}function n(){const l=new box2d$$module$dist$littlejs_esm_min_js_tmp.instance.JSDraw,m=p=>{p=box2d$$module$dist$littlejs_esm_min_js_tmp.instance.wrapPointer(p,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Color);return new Color$$module$dist$littlejs_esm_min_js_tmp(p.get_r(),p.get_g(),p.get_b())},r=(p,q)=>{const t=[];for(;q--;)t.push(box2d$$module$dist$littlejs_esm_min_js_tmp.vec2FromPointer(p+8*q));return t};l.DrawSegment=function(p,q,t){t=m(t).scale(1,.8);p=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2FromPointer(p);q=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2FromPointer(q);box2d$$module$dist$littlejs_esm_min_js_tmp.drawLine(vec2$$module$dist$littlejs_esm_min_js_tmp(),0,p,q,t,void 0,overlayContext$$module$dist$littlejs_esm_min_js_tmp)};l.DrawPolygon=function(p,q,t){t=m(t).scale(1,.8);p=r(p,q);box2d$$module$dist$littlejs_esm_min_js_tmp.drawPoly(vec2$$module$dist$littlejs_esm_min_js_tmp(),0,p,void 0,t,void 0,overlayContext$$module$dist$littlejs_esm_min_js_tmp)};l.DrawSolidPolygon=function(p,q,t){t=m(t).scale(1,.8);p=r(p,q);box2d$$module$dist$littlejs_esm_min_js_tmp.drawPoly(vec2$$module$dist$littlejs_esm_min_js_tmp(),0,p,t,t,void 0,overlayContext$$module$dist$littlejs_esm_min_js_tmp)};l.DrawCircle=function(p,q,t){t=m(t).scale(1,.8);p=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2FromPointer(p);box2d$$module$dist$littlejs_esm_min_js_tmp.drawCircle(p,q,void 0,t,void 0,overlayContext$$module$dist$littlejs_esm_min_js_tmp)};l.DrawSolidCircle=function(p,q,t,u){u=m(u).scale(1,.8);p=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2FromPointer(p);t=box2d$$module$dist$littlejs_esm_min_js_tmp.vec2FromPointer(t).scale(q);box2d$$module$dist$littlejs_esm_min_js_tmp.drawCircle(p,q,u,u,void 0,overlayContext$$module$dist$littlejs_esm_min_js_tmp);box2d$$module$dist$littlejs_esm_min_js_tmp.drawLine(p,0,vec2$$module$dist$littlejs_esm_min_js_tmp(),t,u,void 0,overlayContext$$module$dist$littlejs_esm_min_js_tmp)};l.DrawTransform=function(p){p=box2d$$module$dist$littlejs_esm_min_js_tmp.instance.wrapPointer(p,box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Transform);const q=vec2$$module$dist$littlejs_esm_min_js_tmp(p.get_p());p=-p.get_q().GetAngle();const t=vec2$$module$dist$littlejs_esm_min_js_tmp(1,0),u=rgb$$module$dist$littlejs_esm_min_js_tmp(.75,0,0,.8),A=vec2$$module$dist$littlejs_esm_min_js_tmp(0,1),y=rgb$$module$dist$littlejs_esm_min_js_tmp(0,.75,0,.8);box2d$$module$dist$littlejs_esm_min_js_tmp.drawLine(q,p,vec2$$module$dist$littlejs_esm_min_js_tmp(),t,u,void 0,overlayContext$$module$dist$littlejs_esm_min_js_tmp);box2d$$module$dist$littlejs_esm_min_js_tmp.drawLine(q,p,vec2$$module$dist$littlejs_esm_min_js_tmp(),A,y,void 0,overlayContext$$module$dist$littlejs_esm_min_js_tmp)};l.AppendFlags(box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Draw.e_shapeBit);l.AppendFlags(box2d$$module$dist$littlejs_esm_min_js_tmp.instance.b2Draw.e_jointBit);box2d$$module$dist$littlejs_esm_min_js_tmp.world.SetDebugDraw(l)}Box2D().then(l=>{new Box2dPlugin$$module$dist$littlejs_esm_min_js_tmp(l);n();engineAddPlugin$$module$dist$littlejs_esm_min_js_tmp(h,k);engineInit$$module$dist$littlejs_esm_min_js_tmp(a,b,c,d,e,f,g)})}"use strict";var module$dist$littlejs_esm_min_js_tmp={get box2d(){return box2d$$module$dist$littlejs_esm_min_js_tmp},get cameraPos(){return cameraPos$$module$dist$littlejs_esm_min_js_tmp},get cameraScale(){return cameraScale$$module$dist$littlejs_esm_min_js_tmp},get canvasFixedSize(){return canvasFixedSize$$module$dist$littlejs_esm_min_js_tmp},get canvasMaxSize(){return canvasMaxSize$$module$dist$littlejs_esm_min_js_tmp},get canvasPixelated(){return canvasPixelated$$module$dist$littlejs_esm_min_js_tmp},get enablePhysicsSolver(){return enablePhysicsSolver$$module$dist$littlejs_esm_min_js_tmp},get engineFontImage(){return engineFontImage$$module$dist$littlejs_esm_min_js_tmp},get engineObjects(){return engineObjects$$module$dist$littlejs_esm_min_js_tmp},get fontDefault(){return fontDefault$$module$dist$littlejs_esm_min_js_tmp},get frame(){return frame$$module$dist$littlejs_esm_min_js_tmp},get gamepadDirectionEmulateStick(){return gamepadDirectionEmulateStick$$module$dist$littlejs_esm_min_js_tmp},get gamepadsEnable(){return gamepadsEnable$$module$dist$littlejs_esm_min_js_tmp},get glActiveTexture(){return glActiveTexture$$module$dist$littlejs_esm_min_js_tmp},get glAdditive(){return glAdditive$$module$dist$littlejs_esm_min_js_tmp},get glAntialias(){return glAntialias$$module$dist$littlejs_esm_min_js_tmp},get glArrayBuffer(){return glArrayBuffer$$module$dist$littlejs_esm_min_js_tmp},get glBatchAdditive(){return glBatchAdditive$$module$dist$littlejs_esm_min_js_tmp},get glCanvas(){return glCanvas$$module$dist$littlejs_esm_min_js_tmp},get glColorData(){return glColorData$$module$dist$littlejs_esm_min_js_tmp},get glContext(){return glContext$$module$dist$littlejs_esm_min_js_tmp},get glEnable(){return glEnable$$module$dist$littlejs_esm_min_js_tmp},get glGeometryBuffer(){return glGeometryBuffer$$module$dist$littlejs_esm_min_js_tmp},get glInstanceCount(){return glInstanceCount$$module$dist$littlejs_esm_min_js_tmp},get glOverlay(){return glOverlay$$module$dist$littlejs_esm_min_js_tmp},get glPositionData(){return glPositionData$$module$dist$littlejs_esm_min_js_tmp},get glShader(){return glShader$$module$dist$littlejs_esm_min_js_tmp},get gravity(){return gravity$$module$dist$littlejs_esm_min_js_tmp},get headlessMode(){return headlessMode$$module$dist$littlejs_esm_min_js_tmp},get inputPreventDefault(){return inputPreventDefault$$module$dist$littlejs_esm_min_js_tmp},get inputWASDEmulateDirection(){return inputWASDEmulateDirection$$module$dist$littlejs_esm_min_js_tmp},get isUsingGamepad(){return isUsingGamepad$$module$dist$littlejs_esm_min_js_tmp},get mainCanvas(){return mainCanvas$$module$dist$littlejs_esm_min_js_tmp},get mainCanvasSize(){return mainCanvasSize$$module$dist$littlejs_esm_min_js_tmp},get mainContext(){return mainContext$$module$dist$littlejs_esm_min_js_tmp},get medalDisplaySize(){return medalDisplaySize$$module$dist$littlejs_esm_min_js_tmp},get medalDisplaySlideTime(){return medalDisplaySlideTime$$module$dist$littlejs_esm_min_js_tmp},get medalDisplayTime(){return medalDisplayTime$$module$dist$littlejs_esm_min_js_tmp},get medalsPreventUnlock(){return medalsPreventUnlock$$module$dist$littlejs_esm_min_js_tmp},get mousePos(){return mousePos$$module$dist$littlejs_esm_min_js_tmp},get mousePosScreen(){return mousePosScreen$$module$dist$littlejs_esm_min_js_tmp},get mouseWheel(){return mouseWheel$$module$dist$littlejs_esm_min_js_tmp},get newgrounds(){return newgrounds$$module$dist$littlejs_esm_min_js_tmp},get objectDefaultAngleDamping(){return objectDefaultAngleDamping$$module$dist$littlejs_esm_min_js_tmp},get objectDefaultDamping(){return objectDefaultDamping$$module$dist$littlejs_esm_min_js_tmp},get objectDefaultElasticity(){return objectDefaultElasticity$$module$dist$littlejs_esm_min_js_tmp},get objectDefaultFriction(){return objectDefaultFriction$$module$dist$littlejs_esm_min_js_tmp},get objectDefaultMass(){return objectDefaultMass$$module$dist$littlejs_esm_min_js_tmp},get objectMaxSpeed(){return objectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp},get overlayCanvas(){return overlayCanvas$$module$dist$littlejs_esm_min_js_tmp},get overlayContext(){return overlayContext$$module$dist$littlejs_esm_min_js_tmp},get particleEmitRateScale(){return particleEmitRateScale$$module$dist$littlejs_esm_min_js_tmp},get paused(){return paused$$module$dist$littlejs_esm_min_js_tmp},get postProcess(){return postProcess$$module$dist$littlejs_esm_min_js_tmp},get showSplashScreen(){return showSplashScreen$$module$dist$littlejs_esm_min_js_tmp},get showWatermark(){return showWatermark$$module$dist$littlejs_esm_min_js_tmp},get soundDefaultRange(){return soundDefaultRange$$module$dist$littlejs_esm_min_js_tmp},get soundDefaultTaper(){return soundDefaultTaper$$module$dist$littlejs_esm_min_js_tmp},get soundEnable(){return soundEnable$$module$dist$littlejs_esm_min_js_tmp},get soundVolume(){return soundVolume$$module$dist$littlejs_esm_min_js_tmp},get tileCollision(){return tileCollision$$module$dist$littlejs_esm_min_js_tmp},get tileCollisionSize(){return tileCollisionSize$$module$dist$littlejs_esm_min_js_tmp},get tileFixBleedScale(){return tileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp},get tileSizeDefault(){return tileSizeDefault$$module$dist$littlejs_esm_min_js_tmp},get tilesPixelated(){return tilesPixelated$$module$dist$littlejs_esm_min_js_tmp},get time(){return time$$module$dist$littlejs_esm_min_js_tmp},get timeReal(){return timeReal$$module$dist$littlejs_esm_min_js_tmp},get touchGamepadAlpha(){return touchGamepadAlpha$$module$dist$littlejs_esm_min_js_tmp},get touchGamepadAnalog(){return touchGamepadAnalog$$module$dist$littlejs_esm_min_js_tmp},get touchGamepadEnable(){return touchGamepadEnable$$module$dist$littlejs_esm_min_js_tmp},get touchGamepadSize(){return touchGamepadSize$$module$dist$littlejs_esm_min_js_tmp},get uiSystem(){return uiSystem$$module$dist$littlejs_esm_min_js_tmp},get vibrateEnable(){return vibrateEnable$$module$dist$littlejs_esm_min_js_tmp}};module$dist$littlejs_esm_min_js_tmp.ASSERT=ASSERT$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.BLACK=BLACK$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.BLUE=BLUE$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dDistanceJoint=Box2dDistanceJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dFrictionJoint=Box2dFrictionJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dGearJoint=Box2dGearJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dJoint=Box2dJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dMotorJoint=Box2dMotorJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dObject=Box2dObject$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dPinJoint=Box2dPinJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dPlugin=Box2dPlugin$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dPrismaticJoint=Box2dPrismaticJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dPulleyJoint=Box2dPulleyJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dRaycastResult=Box2dRaycastResult$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dRevoluteJoint=Box2dRevoluteJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dRopeJoint=Box2dRopeJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dTargetJoint=Box2dTargetJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dWeldJoint=Box2dWeldJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Box2dWheelJoint=Box2dWheelJoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.CYAN=CYAN$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Color=Color$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.EngineObject=EngineObject$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.FontImage=FontImage$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.GRAY=GRAY$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.GREEN=GREEN$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.MAGENTA=MAGENTA$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Medal=Medal$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.NewgroundsMedal=NewgroundsMedal$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.NewgroundsPlugin=NewgroundsPlugin$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.ORANGE=ORANGE$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.PI=PI$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.PURPLE=PURPLE$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Particle=Particle$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.ParticleEmitter=ParticleEmitter$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.PostProcessPlugin=PostProcessPlugin$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.RED=RED$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.RandomGenerator=RandomGenerator$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Sound=Sound$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.SoundWave=SoundWave$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.TextureInfo=TextureInfo$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.TileInfo=TileInfo$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.TileLayer=TileLayer$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.TileLayerData=TileLayerData$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Timer=Timer$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.UIButton=UIButton$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.UICheckbox=UICheckbox$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.UIObject=UIObject$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.UIScrollbar=UIScrollbar$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.UISystemPlugin=UISystemPlugin$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.UIText=UIText$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.UITile=UITile$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.Vector2=Vector2$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.WHITE=WHITE$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.YELLOW=YELLOW$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.ZzFXMusic=ZzFXMusic$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.abs=abs$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.audioContext=audioContext$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.box2dDebug=box2dDebug$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.box2dEngineInit=box2dEngineInit$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.clamp=clamp$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.clearInput=clearInput$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.combineCanvases=combineCanvases$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debug=debug$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugCircle=debugCircle$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugClear=debugClear$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugLine=debugLine$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugOverlap=debugOverlap$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugOverlay=debugOverlay$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugPoint=debugPoint$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugPoly=debugPoly$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugRect=debugRect$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugSaveCanvas=debugSaveCanvas$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugSaveDataURL=debugSaveDataURL$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugSaveText=debugSaveText$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugScreenshot=debugScreenshot$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugShowErrors=debugShowErrors$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugText=debugText$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugVideoCaptureIsActive=debugVideoCaptureIsActive$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugVideoCaptureStart=debugVideoCaptureStart$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.debugVideoCaptureStop=debugVideoCaptureStop$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.distanceAngle=distanceAngle$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.distanceWrap=distanceWrap$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.drawCanvas2D=drawCanvas2D$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.drawCircle=drawCircle$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.drawEllipse=drawEllipse$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.drawLine=drawLine$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.drawPoly=drawPoly$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.drawRect=drawRect$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.drawText=drawText$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.drawTextOverlay=drawTextOverlay$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.drawTextScreen=drawTextScreen$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.drawTile=drawTile$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.engineAddPlugin=engineAddPlugin$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.engineInit=engineInit$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.engineName=engineName$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.engineObjectsCallback=engineObjectsCallback$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.engineObjectsCollect=engineObjectsCollect$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.engineObjectsDestroy=engineObjectsDestroy$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.engineObjectsRaycast=engineObjectsRaycast$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.engineObjectsUpdate=engineObjectsUpdate$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.engineVersion=engineVersion$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.formatTime=formatTime$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.frameRate=frameRate$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.gamepadIsDown=gamepadIsDown$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.gamepadStick=gamepadStick$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.gamepadWasPressed=gamepadWasPressed$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.gamepadWasReleased=gamepadWasReleased$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.gamepadsUpdate=gamepadsUpdate$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.getCameraSize=getCameraSize$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.getNoteFrequency=getNoteFrequency$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.getTileCollisionData=getTileCollisionData$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.glClearCanvas=glClearCanvas$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.glCompileShader=glCompileShader$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.glCopyToContext=glCopyToContext$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.glCreateProgram=glCreateProgram$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.glCreateTexture=glCreateTexture$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.glDraw=glDraw$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.glFlush=glFlush$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.glSetAntialias=glSetAntialias$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.glSetTexture=glSetTexture$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.glSetTextureData=glSetTextureData$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.hsl=hsl$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.initTileCollision=initTileCollision$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.isColor=isColor$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.isFullscreen=isFullscreen$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.isIntersecting=isIntersecting$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.isOverlapping=isOverlapping$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.isTouchDevice=isTouchDevice$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.keyDirection=keyDirection$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.keyIsDown=keyIsDown$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.keyWasPressed=keyWasPressed$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.keyWasReleased=keyWasReleased$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.lerp=lerp$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.lerpAngle=lerpAngle$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.lerpWrap=lerpWrap$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.max=max$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.medals=medals$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.medalsInit=medalsInit$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.min=min$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.mod=mod$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.mouseIsDown=keyIsDown$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.mouseWasPressed=keyWasPressed$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.mouseWasReleased=keyWasReleased$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.nearestPowerOfTwo=nearestPowerOfTwo$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.percent=percent$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.playAudioFile=playAudioFile$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.playSamples=playSamples$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.rand=rand$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.randColor=randColor$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.randInCircle=randInCircle$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.randInt=randInt$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.randSign=randSign$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.randVector=randVector$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.rgb=rgb$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.screenToWorld=screenToWorld$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setBlendMode=setBlendMode$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setCameraPos=setCameraPos$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setCameraScale=setCameraScale$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setCanvasFixedSize=setCanvasFixedSize$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setCanvasMaxSize=setCanvasMaxSize$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setCanvasPixelated=setCanvasPixelated$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setCursor=setCursor$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setDebugKey=setDebugKey$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setEnablePhysicsSolver=setEnablePhysicsSolver$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setFontDefault=setFontDefault$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setGamepadDirectionEmulateStick=setGamepadDirectionEmulateStick$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setGamepadsEnable=setGamepadsEnable$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setGlEnable=setGlEnable$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setGlOverlay=setGlOverlay$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setGravity=setGravity$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setHeadlessMode=setHeadlessMode$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setInputPreventDefault=setInputPreventDefault$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setInputWASDEmulateDirection=setInputWASDEmulateDirection$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setMedalDisplaySize=setMedalDisplaySize$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setMedalDisplaySlideTime=setMedalDisplaySlideTime$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setMedalDisplayTime=setMedalDisplayTime$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setMedalsPreventUnlock=setMedalsPreventUnlock$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setObjectDefaultAngleDamping=setObjectDefaultAngleDamping$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setObjectDefaultDamping=setObjectDefaultDamping$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setObjectDefaultElasticity=setObjectDefaultElasticity$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setObjectDefaultFriction=setObjectDefaultFriction$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setObjectDefaultMass=setObjectDefaultMass$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setObjectMaxSpeed=setObjectMaxSpeed$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setParticleEmitRateScale=setParticleEmitRateScale$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setPaused=setPaused$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setShowSplashScreen=setShowSplashScreen$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setShowWatermark=setShowWatermark$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setSoundDefaultRange=setSoundDefaultRange$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setSoundDefaultTaper=setSoundDefaultTaper$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setSoundEnable=setSoundEnable$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setSoundVolume=setSoundVolume$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setTileCollisionData=setTileCollisionData$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setTileFixBleedScale=setTileFixBleedScale$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setTileSizeDefault=setTileSizeDefault$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setTilesPixelated=setTilesPixelated$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setTouchGamepadAlpha=setTouchGamepadAlpha$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setTouchGamepadAnalog=setTouchGamepadAnalog$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setTouchGamepadEnable=setTouchGamepadEnable$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setTouchGamepadSize=setTouchGamepadSize$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setTouchInputEnable=setTouchInputEnable$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.setVibrateEnable=setVibrateEnable$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.sign=sign$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.smoothStep=smoothStep$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.speak=speak$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.speakStop=speakStop$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.textureInfos=textureInfos$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.tile=tile$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.tileCollisionRaycast=tileCollisionRaycast$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.tileCollisionTest=tileCollisionTest$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.timeDelta=timeDelta$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.toggleFullscreen=toggleFullscreen$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.vec2=vec2$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.vibrate=vibrate$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.vibrateStop=vibrateStop$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.wave=wave$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.worldToScreen=worldToScreen$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.zzfx=zzfx$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.zzfxG=zzfxG$$module$dist$littlejs_esm_min_js_tmp;module$dist$littlejs_esm_min_js_tmp.zzfxR=zzfxR$$module$dist$littlejs_esm_min_js_tmp;
1
+ "use strict";let showWatermark=0;let debugKey="";const debug=0;const debugOverlay=0;const debugPhysics=0;const debugParticles=0;const debugRaycast=0;const debugGamepads=0;const debugMedals=0;function ASSERT(){}function debugInit(){}function debugUpdate(){}function debugRender(){}function debugRect(){}function debugPoly(){}function debugCircle(){}function debugPoint(){}function debugLine(){}function debugOverlap(){}function debugText(){}function debugClear(){}function debugScreenshot(){}function debugSaveCanvas(){}function debugSaveText(){}function debugSaveDataURL(){}function debugShowErrors(){}function debugVideoCaptureIsActive(){return false}function debugVideoCaptureStart(){}function debugVideoCaptureStop(){}function debugVideoCaptureUpdate(){}const PI=Math.PI;function abs(value){return Math.abs(value)}function min(valueA,valueB){return Math.min(valueA,valueB)}function max(valueA,valueB){return Math.max(valueA,valueB)}function sign(value){return Math.sign(value)}function mod(dividend,divisor=1){return(dividend%divisor+divisor)%divisor}function clamp(value,min=0,max=1){return value<min?min:value>max?max:value}function percent(value,valueA,valueB){return(valueB-=valueA)?clamp((value-valueA)/valueB):0}function lerp(percent,valueA,valueB){return valueA+clamp(percent)*(valueB-valueA)}function distanceWrap(valueA,valueB,wrapSize=1){const d=(valueA-valueB)%wrapSize;return d*2%wrapSize-d}function lerpWrap(percent,valueA,valueB,wrapSize=1){return valueA+clamp(percent)*distanceWrap(valueB,valueA,wrapSize)}function distanceAngle(angleA,angleB){return distanceWrap(angleA,angleB,2*PI)}function lerpAngle(percent,angleA,angleB){return lerpWrap(percent,angleA,angleB,2*PI)}function smoothStep(percent){return percent*percent*(3-2*percent)}function nearestPowerOfTwo(value){return 2**Math.ceil(Math.log2(value))}function isOverlapping(posA,sizeA,posB,sizeB=vec2()){return abs(posA.x-posB.x)*2<sizeA.x+sizeB.x&&abs(posA.y-posB.y)*2<sizeA.y+sizeB.y}function isIntersecting(start,end,pos,size){const boxMin=pos.subtract(size.scale(.5));const boxMax=boxMin.add(size);const delta=end.subtract(start);const a=start.subtract(boxMin);const b=start.subtract(boxMax);const p=[-delta.x,delta.x,-delta.y,delta.y];const q=[a.x,-b.x,a.y,-b.y];let tMin=0,tMax=1;for(let i=4;i--;){if(p[i]){const t=q[i]/p[i];if(p[i]<0){if(t>tMax)return false;tMin=max(t,tMin)}else{if(t<tMin)return false;tMax=min(t,tMax)}}else if(q[i]<0)return false}return true}function wave(frequency=1,amplitude=1,t=time){return amplitude/2*(1-Math.cos(t*frequency*2*PI))}function formatTime(t){return(t/60|0)+":"+(t%60<10?"0":"")+(t%60|0)}function rand(valueA=1,valueB=0){return valueB+Math.random()*(valueA-valueB)}function randInt(valueA,valueB=0){return Math.floor(rand(valueA,valueB))}function randSign(){return randInt(2)*2-1}function randVector(length=1){return(new Vector2).setAngle(rand(2*PI),length)}function randInCircle(radius=1,minRadius=0){return radius>0?randVector(radius*rand(minRadius/radius,1)**.5):new Vector2}function randColor(colorA=new Color,colorB=new Color(0,0,0,1),linear=false){return linear?colorA.lerp(colorB,rand()):new Color(rand(colorA.r,colorB.r),rand(colorA.g,colorB.g),rand(colorA.b,colorB.b),rand(colorA.a,colorB.a))}class RandomGenerator{constructor(seed){this.seed=seed}float(valueA=1,valueB=0){this.seed^=this.seed<<13;this.seed^=this.seed>>>17;this.seed^=this.seed<<5;return valueB+(valueA-valueB)*((this.seed>>>0)/2**32)}int(valueA,valueB=0){return Math.floor(this.float(valueA,valueB))}sign(){return this.float()>.5?1:-1}}function vec2(x=0,y){return new Vector2(x,y==undefined?x:y)}function isVector2(v){return v instanceof Vector2}class Vector2{constructor(x=0,y=0){this.x=x;this.y=y;ASSERT(this.isValid())}set(x=0,y=0){this.x=x;this.y=y;ASSERT(this.isValid());return this}copy(){return new Vector2(this.x,this.y)}add(v){ASSERT(isVector2(v));return new Vector2(this.x+v.x,this.y+v.y)}subtract(v){ASSERT(isVector2(v));return new Vector2(this.x-v.x,this.y-v.y)}multiply(v){ASSERT(isVector2(v));return new Vector2(this.x*v.x,this.y*v.y)}divide(v){ASSERT(isVector2(v));return new Vector2(this.x/v.x,this.y/v.y)}scale(s){ASSERT(!isVector2(s));return new Vector2(this.x*s,this.y*s)}length(){return this.lengthSquared()**.5}lengthSquared(){return this.x**2+this.y**2}distance(v){ASSERT(isVector2(v));return this.distanceSquared(v)**.5}distanceSquared(v){ASSERT(isVector2(v));return(this.x-v.x)**2+(this.y-v.y)**2}normalize(length=1){const l=this.length();return l?this.scale(length/l):new Vector2(0,length)}clampLength(length=1){const l=this.length();return l>length?this.scale(length/l):this}dot(v){ASSERT(isVector2(v));return this.x*v.x+this.y*v.y}cross(v){ASSERT(isVector2(v));return this.x*v.y-this.y*v.x}angle(){return Math.atan2(this.x,this.y)}setAngle(angle=0,length=1){this.x=length*Math.sin(angle);this.y=length*Math.cos(angle);return this}rotate(angle){const c=Math.cos(-angle),s=Math.sin(-angle);return new Vector2(this.x*c-this.y*s,this.x*s+this.y*c)}setDirection(direction,length=1){direction=mod(direction,4);ASSERT(direction==0||direction==1||direction==2||direction==3);return vec2(direction%2?direction-1?-length:length:0,direction%2?0:direction?-length:length)}direction(){return abs(this.x)>abs(this.y)?this.x<0?3:1:this.y<0?2:0}invert(){return new Vector2(this.y,-this.x)}floor(){return new Vector2(Math.floor(this.x),Math.floor(this.y))}area(){return abs(this.x*this.y)}lerp(v,percent){ASSERT(isVector2(v));return this.add(v.subtract(this).scale(clamp(percent)))}arrayCheck(arraySize){ASSERT(isVector2(arraySize));return this.x>=0&&this.y>=0&&this.x<arraySize.x&&this.y<arraySize.y}toString(digits=3){if(debug)return`(${(this.x<0?"":" ")+this.x.toFixed(digits)},${(this.y<0?"":" ")+this.y.toFixed(digits)} )`}isValid(){return typeof this.x=="number"&&!isNaN(this.x)&&typeof this.y=="number"&&!isNaN(this.y)}}function rgb(r,g,b,a){return new Color(r,g,b,a)}function hsl(h,s,l,a){return(new Color).setHSLA(h,s,l,a)}function isColor(c){return c instanceof Color}class Color{constructor(r=1,g=1,b=1,a=1){this.r=r;this.g=g;this.b=b;this.a=a;ASSERT(this.isValid())}set(r=1,g=1,b=1,a=1){this.r=r;this.g=g;this.b=b;this.a=a;ASSERT(this.isValid());return this}copy(){return new Color(this.r,this.g,this.b,this.a)}add(c){ASSERT(isColor(c));return new Color(this.r+c.r,this.g+c.g,this.b+c.b,this.a+c.a)}subtract(c){ASSERT(isColor(c));return new Color(this.r-c.r,this.g-c.g,this.b-c.b,this.a-c.a)}multiply(c){ASSERT(isColor(c));return new Color(this.r*c.r,this.g*c.g,this.b*c.b,this.a*c.a)}divide(c){ASSERT(isColor(c));return new Color(this.r/c.r,this.g/c.g,this.b/c.b,this.a/c.a)}scale(scale,alphaScale=scale){return new Color(this.r*scale,this.g*scale,this.b*scale,this.a*alphaScale)}clamp(){return new Color(clamp(this.r),clamp(this.g),clamp(this.b),clamp(this.a))}lerp(c,percent){ASSERT(isColor(c));return this.add(c.subtract(this).scale(clamp(percent)))}setHSLA(h=0,s=0,l=1,a=1){h=mod(h,1);s=clamp(s);l=clamp(l);const q=l<.5?l*(1+s):l+s-l*s,p=2*l-q,f=(p,q,t)=>(t=mod(t,1))*6<1?p+(q-p)*6*t:t*2<1?q:t*3<2?p+(q-p)*(4-t*6):p;this.r=f(p,q,h+1/3);this.g=f(p,q,h);this.b=f(p,q,h-1/3);this.a=a;ASSERT(this.isValid());return this}HSLA(){const r=clamp(this.r);const g=clamp(this.g);const b=clamp(this.b);const a=clamp(this.a);const max=Math.max(r,g,b);const min=Math.min(r,g,b);const l=(max+min)/2;let h=0,s=0;if(max!=min){let d=max-min;s=l>.5?d/(2-max-min):d/(max+min);if(r==max)h=(g-b)/d+(g<b?6:0);else if(g==max)h=(b-r)/d+2;else if(b==max)h=(r-g)/d+4}return[h/6,s,l,a]}mutate(amount=.05,alphaAmount=0){return new Color(this.r+rand(amount,-amount),this.g+rand(amount,-amount),this.b+rand(amount,-amount),this.a+rand(alphaAmount,-alphaAmount)).clamp()}toString(useAlpha=true){const toHex=c=>((c=clamp(c)*255|0)<16?"0":"")+c.toString(16);return"#"+toHex(this.r)+toHex(this.g)+toHex(this.b)+(useAlpha?toHex(this.a):"")}setHex(hex){ASSERT(typeof hex=="string"&&hex[0]=="#");ASSERT([4,5,7,9].includes(hex.length),"Invalid hex");if(hex.length<6){const fromHex=c=>clamp(parseInt(hex[c],16)/15);this.r=fromHex(1);this.g=fromHex(2),this.b=fromHex(3);this.a=hex.length==5?fromHex(4):1}else{const fromHex=c=>clamp(parseInt(hex.slice(c,c+2),16)/255);this.r=fromHex(1);this.g=fromHex(3),this.b=fromHex(5);this.a=hex.length==9?fromHex(7):1}ASSERT(this.isValid());return this}rgbaInt(){const r=clamp(this.r)*255|0;const g=clamp(this.g)*255<<8;const b=clamp(this.b)*255<<16;const a=clamp(this.a)*255<<24;return r+g+b+a}isValid(){return typeof this.r=="number"&&!isNaN(this.r)&&typeof this.g=="number"&&!isNaN(this.g)&&typeof this.b=="number"&&!isNaN(this.b)&&typeof this.a=="number"&&!isNaN(this.a)}}const WHITE=rgb();const BLACK=rgb(0,0,0);const GRAY=rgb(.5,.5,.5);const RED=rgb(1,0,0);const ORANGE=rgb(1,.5,0);const YELLOW=rgb(1,1,0);const GREEN=rgb(0,1,0);const CYAN=rgb(0,1,1);const BLUE=rgb(0,0,1);const PURPLE=rgb(.5,0,1);const MAGENTA=rgb(1,0,1);class Timer{constructor(timeLeft){this.time=timeLeft==undefined?undefined:time+timeLeft;this.setTime=timeLeft}set(timeLeft=0){this.time=time+timeLeft;this.setTime=timeLeft}unset(){this.time=undefined}isSet(){return this.time!=undefined}active(){return time<this.time}elapsed(){return time>=this.time}get(){return this.isSet()?time-this.time:0}getPercent(){return this.isSet()?1-percent(this.time-time,0,this.setTime):0}toString(){if(debug){return this.isSet()?Math.abs(this.get())+" seconds "+(this.get()<0?"before":"after"):"unset"}}valueOf(){return this.get()}}let cameraPos=vec2();let cameraScale=32;let canvasMaxSize=vec2(1920,1080);let canvasFixedSize=vec2();let canvasPixelated=true;let tilesPixelated=true;let fontDefault="arial";let showSplashScreen=false;let headlessMode=false;let glEnable=true;let glOverlay=true;let tileSizeDefault=vec2(16);let tileFixBleedScale=0;let enablePhysicsSolver=true;let objectDefaultMass=1;let objectDefaultDamping=1;let objectDefaultAngleDamping=1;let objectDefaultElasticity=0;let objectDefaultFriction=.8;let objectMaxSpeed=1;let gravity=vec2();let particleEmitRateScale=1;let gamepadsEnable=true;let gamepadDirectionEmulateStick=true;let inputWASDEmulateDirection=true;let touchInputEnable=true;let touchGamepadEnable=false;let touchGamepadAnalog=true;let touchGamepadSize=99;let touchGamepadAlpha=.3;let vibrateEnable=true;let soundEnable=true;let soundVolume=.3;let soundDefaultRange=40;let soundDefaultTaper=.7;let medalDisplayTime=5;let medalDisplaySlideTime=.5;let medalDisplaySize=vec2(640,80);let medalsPreventUnlock=false;function setCameraPos(pos){cameraPos=pos}function setCameraScale(scale){cameraScale=scale}function setCanvasMaxSize(size){canvasMaxSize=size}function setCanvasFixedSize(size){canvasFixedSize=size}function setCanvasPixelated(pixelated){canvasPixelated=pixelated}function setTilesPixelated(pixelated){tilesPixelated=pixelated}function setFontDefault(font){fontDefault=font}function setShowSplashScreen(show){showSplashScreen=show}function setHeadlessMode(headless){headlessMode=headless}function setGlEnable(enable){glEnable=enable}function setGlOverlay(overlay){glOverlay=overlay}function setTileSizeDefault(size){tileSizeDefault=size}function setTileFixBleedScale(scale){tileFixBleedScale=scale}function setEnablePhysicsSolver(enable){enablePhysicsSolver=enable}function setObjectDefaultMass(mass){objectDefaultMass=mass}function setObjectDefaultDamping(damp){objectDefaultDamping=damp}function setObjectDefaultAngleDamping(damp){objectDefaultAngleDamping=damp}function setObjectDefaultElasticity(elasticity){objectDefaultElasticity=elasticity}function setObjectDefaultFriction(friction){objectDefaultFriction=friction}function setObjectMaxSpeed(speed){objectMaxSpeed=speed}function setGravity(newGravity){gravity=newGravity}function setParticleEmitRateScale(scale){particleEmitRateScale=scale}function setGamepadsEnable(enable){gamepadsEnable=enable}function setGamepadDirectionEmulateStick(enable){gamepadDirectionEmulateStick=enable}function setInputWASDEmulateDirection(enable){inputWASDEmulateDirection=enable}function setTouchInputEnable(enable){touchInputEnable=enable}function setTouchGamepadEnable(enable){touchGamepadEnable=enable}function setTouchGamepadAnalog(analog){touchGamepadAnalog=analog}function setTouchGamepadSize(size){touchGamepadSize=size}function setTouchGamepadAlpha(alpha){touchGamepadAlpha=alpha}function setVibrateEnable(enable){vibrateEnable=enable}function setSoundEnable(enable){soundEnable=enable}function setSoundVolume(volume){soundVolume=volume;if(soundEnable&&!headlessMode&&audioMasterGain)audioMasterGain.gain.value=volume}function setSoundDefaultRange(range){soundDefaultRange=range}function setSoundDefaultTaper(taper){soundDefaultTaper=taper}function setMedalDisplayTime(time){medalDisplayTime=time}function setMedalDisplaySlideTime(time){medalDisplaySlideTime=time}function setMedalDisplaySize(size){medalDisplaySize=size}function setMedalsPreventUnlock(preventUnlock){medalsPreventUnlock=preventUnlock}function setShowWatermark(show){showWatermark=show}function setDebugKey(key){debugKey=key}class EngineObject{constructor(pos=vec2(),size=vec2(1),tileInfo,angle=0,color=new Color,renderOrder=0){ASSERT(isVector2(pos)&&isVector2(size),"ensure pos and size are vec2s");ASSERT(typeof tileInfo!=="number"||!tileInfo,"old style tile setup");this.pos=pos.copy();this.size=size;this.drawSize=undefined;this.tileInfo=tileInfo;this.angle=angle;this.color=color;this.additiveColor=undefined;this.mirror=false;this.mass=objectDefaultMass;this.damping=objectDefaultDamping;this.angleDamping=objectDefaultAngleDamping;this.elasticity=objectDefaultElasticity;this.friction=objectDefaultFriction;this.gravityScale=1;this.renderOrder=renderOrder;this.velocity=vec2();this.angleVelocity=0;this.spawnTime=time;this.children=[];this.clampSpeedLinear=true;this.groundObject=undefined;this.parent=undefined;this.localPos=vec2();this.localAngle=0;this.collideTiles=false;this.collideSolidObjects=false;this.isSolid=false;this.collideRaycast=false;engineObjects.push(this)}updateTransforms(){const parent=this.parent;if(parent){const mirror=parent.getMirrorSign();this.pos=this.localPos.multiply(vec2(mirror,1)).rotate(parent.angle).add(parent.pos);this.angle=mirror*this.localAngle+parent.angle}for(const child of this.children)child.updateTransforms()}update(){if(this.parent)return;if(this.clampSpeedLinear){this.velocity.x=clamp(this.velocity.x,-objectMaxSpeed,objectMaxSpeed);this.velocity.y=clamp(this.velocity.y,-objectMaxSpeed,objectMaxSpeed)}else{const length2=this.velocity.lengthSquared();if(length2>objectMaxSpeed*objectMaxSpeed){const s=objectMaxSpeed/length2**.5;this.velocity.x*=s;this.velocity.y*=s}}const oldPos=this.pos.copy();this.velocity.x*=this.damping;this.velocity.y*=this.damping;if(this.mass){this.velocity.x+=gravity.x*this.gravityScale;this.velocity.y+=gravity.y*this.gravityScale}this.pos.x+=this.velocity.x;this.pos.y+=this.velocity.y;this.angle+=this.angleVelocity*=this.angleDamping;ASSERT(this.angleDamping>=0&&this.angleDamping<=1);ASSERT(this.damping>=0&&this.damping<=1);if(!enablePhysicsSolver||!this.mass)return;const wasMovingDown=this.velocity.y<0;if(this.groundObject){const friction=max(this.friction,this.groundObject.friction);const groundSpeed=this.groundObject.velocity?this.groundObject.velocity.x:0;this.velocity.x=groundSpeed+(this.velocity.x-groundSpeed)*friction;this.groundObject=undefined}if(this.collideSolidObjects){const epsilon=.001;for(const o of engineObjectsCollide){if(!this.isSolid&&!o.isSolid||o.destroyed||o.parent||o==this)continue;if(!isOverlapping(this.pos,this.size,o.pos,o.size))continue;const collide1=this.collideWithObject(o);const collide2=o.collideWithObject(this);if(!collide1||!collide2)continue;if(isOverlapping(oldPos,this.size,o.pos,o.size)){const deltaPos=oldPos.subtract(o.pos);const length=deltaPos.length();const pushAwayAccel=.001;const velocity=length<.01?randVector(pushAwayAccel):deltaPos.scale(pushAwayAccel/length);this.velocity=this.velocity.add(velocity);if(o.mass)o.velocity=o.velocity.subtract(velocity);debugOverlay&&debugPhysics&&debugOverlap(this.pos,this.size,o.pos,o.size,"#f00");continue}const sizeBoth=this.size.add(o.size);const smallStepUp=(oldPos.y-o.pos.y)*2>sizeBoth.y+gravity.y;const isBlockedX=abs(oldPos.y-o.pos.y)*2<sizeBoth.y;const isBlockedY=abs(oldPos.x-o.pos.x)*2<sizeBoth.x;const elasticity=max(this.elasticity,o.elasticity);if(smallStepUp||isBlockedY||!isBlockedX){this.pos.y=o.pos.y+(sizeBoth.y/2+epsilon)*sign(oldPos.y-o.pos.y);if(o.groundObject&&wasMovingDown||!o.mass){if(wasMovingDown)this.groundObject=o;this.velocity.y*=-elasticity}else if(o.mass){const inelastic=(this.mass*this.velocity.y+o.mass*o.velocity.y)/(this.mass+o.mass);const elastic0=this.velocity.y*(this.mass-o.mass)/(this.mass+o.mass)+o.velocity.y*2*o.mass/(this.mass+o.mass);const elastic1=o.velocity.y*(o.mass-this.mass)/(this.mass+o.mass)+this.velocity.y*2*this.mass/(this.mass+o.mass);this.velocity.y=lerp(elasticity,inelastic,elastic0);o.velocity.y=lerp(elasticity,inelastic,elastic1)}}if(!smallStepUp&&isBlockedX){this.pos.x=o.pos.x+(sizeBoth.x/2+epsilon)*sign(oldPos.x-o.pos.x);if(o.mass){const inelastic=(this.mass*this.velocity.x+o.mass*o.velocity.x)/(this.mass+o.mass);const elastic0=this.velocity.x*(this.mass-o.mass)/(this.mass+o.mass)+o.velocity.x*2*o.mass/(this.mass+o.mass);const elastic1=o.velocity.x*(o.mass-this.mass)/(this.mass+o.mass)+this.velocity.x*2*this.mass/(this.mass+o.mass);this.velocity.x=lerp(elasticity,inelastic,elastic0);o.velocity.x=lerp(elasticity,inelastic,elastic1)}else this.velocity.x*=-elasticity}debugOverlay&&debugPhysics&&debugOverlap(this.pos,this.size,o.pos,o.size,"#f0f")}}if(this.collideTiles){const hitLayer=tileCollisionTest(this.pos,this.size,this);if(hitLayer){if(!tileCollisionTest(oldPos,this.size,this)){const blockedLayerY=tileCollisionTest(vec2(oldPos.x,this.pos.y),this.size,this);const blockedLayerX=tileCollisionTest(vec2(this.pos.x,oldPos.y),this.size,this);if(blockedLayerY||!blockedLayerX){const elasticity=max(this.elasticity,hitLayer.elasticity);this.velocity.y*=-elasticity;if(wasMovingDown){const epsilon=1e-4;this.pos.y=(oldPos.y-this.size.y/2|0)+this.size.y/2+epsilon;this.groundObject=hitLayer}else{this.pos.y=oldPos.y;this.groundObject=undefined}}if(blockedLayerX){this.pos.x=oldPos.x;this.velocity.x*=-this.elasticity}debugOverlay&&debugPhysics&&debugRect(this.pos,this.size,"#f00")}}}}render(){drawTile(this.pos,this.drawSize||this.size,this.tileInfo,this.color,this.angle,this.mirror,this.additiveColor)}destroy(){if(this.destroyed)return;this.destroyed=1;this.parent&&this.parent.removeChild(this);for(const child of this.children)child.destroy(child.parent=0)}localToWorld(pos){return this.pos.add(pos.rotate(this.angle))}worldToLocal(pos){return pos.subtract(this.pos).rotate(-this.angle)}localToWorldVector(vec){return vec.rotate(this.angle)}worldToLocalVector(vec){return vec.rotate(-this.angle)}collideWithTile(tileData,pos){return tileData>0}collideWithObject(object){return true}getAliveTime(){return time-this.spawnTime}applyAcceleration(acceleration){if(this.mass)this.velocity=this.velocity.add(acceleration)}applyForce(force){this.applyAcceleration(force.scale(1/this.mass))}getMirrorSign(){return this.mirror?-1:1}addChild(child,localPos=vec2(),localAngle=0){ASSERT(!child.parent&&!this.children.includes(child));this.children.push(child);child.parent=this;child.localPos=localPos.copy();child.localAngle=localAngle}removeChild(child){ASSERT(child.parent==this&&this.children.includes(child));this.children.splice(this.children.indexOf(child),1);child.parent=0}setCollision(collideSolidObjects=true,isSolid=true,collideTiles=true,collideRaycast=true){ASSERT(collideSolidObjects||!isSolid,"solid objects must be set to collide");this.collideSolidObjects=collideSolidObjects;this.isSolid=isSolid;this.collideTiles=collideTiles;this.collideRaycast=collideRaycast}toString(){if(debug){let text="type = "+this.constructor.name;if(this.pos.x||this.pos.y)text+="\npos = "+this.pos;if(this.velocity.x||this.velocity.y)text+="\nvelocity = "+this.velocity;if(this.size.x||this.size.y)text+="\nsize = "+this.size;if(this.angle)text+="\nangle = "+this.angle.toFixed(3);if(this.color)text+="\ncolor = "+this.color;return text}}renderDebugInfo(){if(debug){const size=vec2(max(this.size.x,.2),max(this.size.y,.2));const color1=rgb(this.collideTiles?1:0,this.collideSolidObjects?1:0,this.isSolid?1:0,this.parent?.2:.5);const color2=this.parent?rgb(1,1,1,.5):rgb(0,0,0,.8);drawRect(this.pos,size,color1,this.angle,false);drawRect(this.pos,size.scale(.8),color2,this.angle,false);this.parent&&drawLine(this.pos,this.parent.pos,.1,rgb(0,0,1,.5),false)}}}let mainCanvas;let mainContext;let overlayCanvas;let overlayContext;let mainCanvasSize=vec2();let textureInfos=[];let drawCount;function tile(pos=vec2(),size=tileSizeDefault,textureIndex=0,padding=0){if(headlessMode)return new TileInfo;if(typeof size==="number"){ASSERT(size>0);size=vec2(size)}const textureInfo=textureInfos[textureIndex];ASSERT(!!textureInfo,"Texture not loaded");const sizePadded=size.add(vec2(padding*2));if(typeof pos==="number"){const cols=textureInfo.size.x/sizePadded.x|0;pos=cols>0?vec2(pos%cols,pos/cols|0):vec2()}pos=vec2(pos.x*sizePadded.x+padding,pos.y*sizePadded.y+padding);return new TileInfo(pos,size,textureIndex,padding)}class TileInfo{constructor(pos=vec2(),size=tileSizeDefault,textureIndex=0,padding=0){this.pos=pos.copy();this.size=size.copy();this.textureIndex=textureIndex;this.padding=padding}offset(offset){return new TileInfo(this.pos.add(offset),this.size,this.textureIndex)}frame(frame){ASSERT(typeof frame=="number");return this.offset(vec2(frame*(this.size.x+this.padding*2),0))}getTextureInfo(){return textureInfos[this.textureIndex]}}class TextureInfo{constructor(image){this.image=image;this.size=vec2(image.width,image.height);this.sizeInverse=vec2(1/image.width,1/image.height);this.glTexture=glEnable&&glCreateTexture(image)}}function screenToWorld(screenPos){return new Vector2((screenPos.x-mainCanvasSize.x/2+.5)/cameraScale+cameraPos.x,(screenPos.y-mainCanvasSize.y/2+.5)/-cameraScale+cameraPos.y)}function worldToScreen(worldPos){return new Vector2((worldPos.x-cameraPos.x)*cameraScale+mainCanvasSize.x/2-.5,(worldPos.y-cameraPos.y)*-cameraScale+mainCanvasSize.y/2-.5)}function getCameraSize(){return mainCanvasSize.scale(1/cameraScale)}function drawTile(pos,size=vec2(1),tileInfo,color=new Color,angle=0,mirror,additiveColor,useWebGL=glEnable,screenSpace,context){ASSERT(!context||!useWebGL,"context only supported in canvas 2D mode");ASSERT(typeof tileInfo!=="number"||!tileInfo,"this is an old style calls, to fix replace it with tile(tileIndex, tileSize)");ASSERT(isVector2(pos)&&isVector2(size));ASSERT(isColor(color)&&(!additiveColor||isColor(additiveColor)));const textureInfo=tileInfo&&tileInfo.getTextureInfo();if(useWebGL){if(screenSpace){pos=screenToWorld(pos);size=size.scale(1/cameraScale)}if(textureInfo){const sizeInverse=textureInfo.sizeInverse;const x=tileInfo.pos.x*sizeInverse.x;const y=tileInfo.pos.y*sizeInverse.y;const w=tileInfo.size.x*sizeInverse.x;const h=tileInfo.size.y*sizeInverse.y;glSetTexture(textureInfo.glTexture);if(tileFixBleedScale){const tileImageFixBleedX=sizeInverse.x*tileFixBleedScale;const tileImageFixBleedY=sizeInverse.y*tileFixBleedScale;glDraw(pos.x,pos.y,mirror?-size.x:size.x,size.y,angle,x+tileImageFixBleedX,y+tileImageFixBleedY,x-tileImageFixBleedX+w,y-tileImageFixBleedY+h,color.rgbaInt(),additiveColor&&additiveColor.rgbaInt())}else{glDraw(pos.x,pos.y,mirror?-size.x:size.x,size.y,angle,x,y,x+w,y+h,color.rgbaInt(),additiveColor&&additiveColor.rgbaInt())}}else{glDraw(pos.x,pos.y,size.x,size.y,angle,0,0,0,0,0,color.rgbaInt())}}else{showWatermark&&++drawCount;size=vec2(size.x,-size.y);drawCanvas2D(pos,size,angle,mirror,context=>{if(textureInfo){const x=tileInfo.pos.x+tileFixBleedScale;const y=tileInfo.pos.y+tileFixBleedScale;const w=tileInfo.size.x-2*tileFixBleedScale;const h=tileInfo.size.y-2*tileFixBleedScale;context.globalAlpha=color.a;context.drawImage(textureInfo.image,x,y,w,h,-.5,-.5,1,1);context.globalAlpha=1}else{context.fillStyle=color.toString();context.fillRect(-.5,-.5,1,1)}},screenSpace,context)}}function drawRect(pos,size,color,angle,useWebGL,screenSpace,context){drawTile(pos,size,undefined,color,angle,false,undefined,useWebGL,screenSpace,context)}function drawLine(posA,posB,thickness=.1,color,useWebGL,screenSpace,context){const halfDelta=vec2((posB.x-posA.x)/2,(posB.y-posA.y)/2);const size=vec2(thickness,halfDelta.length()*2);drawRect(posA.add(halfDelta),size,color,halfDelta.angle(),useWebGL,screenSpace,context)}function drawPoly(points,color=new Color,lineWidth=0,lineColor=new Color(0,0,0),screenSpace,context=mainContext){ASSERT(isColor(color)&&isColor(lineColor));context.fillStyle=color.toString();context.beginPath();for(const point of screenSpace?points:points.map(worldToScreen))context.lineTo(point.x,point.y);context.closePath();context.fill();if(lineWidth){context.strokeStyle=lineColor.toString();context.lineWidth=screenSpace?lineWidth:lineWidth*cameraScale;context.stroke()}}function drawEllipse(pos,width=1,height=1,angle=0,color=new Color,lineWidth=0,lineColor=new Color(0,0,0),screenSpace,context=mainContext){ASSERT(isColor(color)&&isColor(lineColor));if(!screenSpace){pos=worldToScreen(pos);width*=cameraScale;height*=cameraScale;lineWidth*=cameraScale}context.fillStyle=color.toString();context.beginPath();context.ellipse(pos.x,pos.y,width,height,angle,0,9);context.fill();if(lineWidth){context.strokeStyle=lineColor.toString();context.lineWidth=lineWidth;context.stroke()}}function drawCircle(pos,radius=1,color=new Color,lineWidth=0,lineColor=new Color(0,0,0),screenSpace,context=mainContext){drawEllipse(pos,radius,radius,0,color,lineWidth,lineColor,screenSpace,context)}function drawCanvas2D(pos,size,angle,mirror,drawFunction,screenSpace,context=mainContext){if(!screenSpace){pos=worldToScreen(pos);size=size.scale(cameraScale)}context.save();context.translate(pos.x+.5,pos.y+.5);context.rotate(angle);context.scale(mirror?-size.x:size.x,-size.y);drawFunction(context);context.restore()}function drawText(text,pos,size=1,color,lineWidth=0,lineColor,textAlign,font,maxWidth,context=mainContext){drawTextScreen(text,worldToScreen(pos),size*cameraScale,color,lineWidth*cameraScale,lineColor,textAlign,font,maxWidth,context)}function drawTextOverlay(text,pos,size=1,color,lineWidth=0,lineColor,textAlign,font,maxWidth){drawText(text,pos,size,color,lineWidth,lineColor,textAlign,font,maxWidth,overlayContext)}function drawTextScreen(text,pos,size=1,color=new Color,lineWidth=0,lineColor=new Color(0,0,0),textAlign="center",font=fontDefault,maxWidth=undefined,context=overlayContext){context.fillStyle=color.toString();context.strokeStyle=lineColor.toString();context.lineWidth=lineWidth;context.textAlign=textAlign;context.font=size+"px "+font;context.textBaseline="middle";context.lineJoin="round";const lines=(text+"").split("\n");pos=pos.copy();pos.y-=(lines.length-1)*size/2;lines.forEach(line=>{lineWidth&&context.strokeText(line,pos.x,pos.y,maxWidth);context.fillText(line,pos.x,pos.y,maxWidth);pos.y+=size})}function setBlendMode(additive,useWebGL=glEnable,context){ASSERT(!context||!useWebGL,"context only supported in canvas 2D mode");if(useWebGL)glAdditive=additive;else{if(!context)context=mainContext;context.globalCompositeOperation=additive?"lighter":"source-over"}}function combineCanvases(){glCopyToContext(mainContext,true);mainContext.drawImage(overlayCanvas,0,0);glClearCanvas();overlayCanvas.width|=0}let engineFontImage;class FontImage{constructor(image,tileSize=vec2(8),paddingSize=vec2(0,1),context=overlayContext){if(!engineFontImage){engineFontImage=new Image;engineFontImage.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAAYAQAAAAA9+x6JAAAAAnRSTlMAAHaTzTgAAAGiSURBVHjaZZABhxxBEIUf6ECLBdFY+Q0PMNgf0yCgsSAGZcT9sgIPtBWwIA5wgAPEoHUyJeeSlW+gjK+fegWwtROWpVQEyWh2npdpBmTUFVhb29RINgLIukoXr5LIAvYQ5ve+1FqWEMqNKTX3FAJHyQDRZvmKWubAACcv5z5Gtg2oyCWE+Yk/8JZQX1jTTCpKAFGIgza+dJCNBF2UskRlsgwitHbSV0QLgt9sTPtsRlvJjEr8C/FARWA2bJ/TtJ7lko34dNDn6usJUMzuErP89UUBJbWeozrwLLncXczd508deAjLWipLO4Q5XGPcJvPu92cNDaN0P5G1FL0nSOzddZOrJ6rNhbXGmeDvO3TF7DeJWl4bvaYQTNHCTeuqKZmbjHaSOFes+IX/+IhHrnAkXOAsfn24EM68XieIECoccD4KZLk/odiwzeo2rovYdhvb2HYFgyznJyDpYJdYOmfXgVdJTaUi4xA2uWYNYec9BLeqdl9EsoTw582mSFDX2DxVLbNt9U3YYoeatBad1c2Tj8t2akrjaIGJNywKB/7h75/gN3vCMSaadIUTAAAAAElFTkSuQmCC"}this.image=image||engineFontImage;this.tileSize=tileSize;this.paddingSize=paddingSize;this.context=context}drawText(text,pos,scale=1,center){this.drawTextScreen(text,worldToScreen(pos).floor(),scale*cameraScale|0,center)}drawTextScreen(text,pos,scale=4,center){const context=this.context;context.save();const size=this.tileSize;const drawSize=size.add(this.paddingSize).scale(scale);const cols=this.image.width/this.tileSize.x|0;(text+"").split("\n").forEach((line,i)=>{const centerOffset=center?line.length*size.x*scale/2|0:0;for(let j=line.length;j--;){let charCode=line[j].charCodeAt(0);if(charCode<32||charCode>127)charCode=127;const tile=charCode-32;const x=tile%cols;const y=tile/cols|0;const drawPos=pos.add(vec2(j,i).multiply(drawSize));context.drawImage(this.image,x*size.x,y*size.y,size.x,size.y,drawPos.x-centerOffset,drawPos.y,size.x*scale,size.y*scale)}});context.restore()}}function isFullscreen(){return!!document.fullscreenElement}function toggleFullscreen(){const rootElement=mainCanvas.parentElement;if(isFullscreen()){if(document.exitFullscreen)document.exitFullscreen()}else if(rootElement.requestFullscreen)rootElement.requestFullscreen()}function setCursor(cursorStyle="auto"){const rootElement=mainCanvas.parentElement;rootElement.style.cursor=cursorStyle}function keyIsDown(key,device=0){ASSERT(device>0||typeof key!=="number"||key<3,"use code string for keyboard");return inputData[device]&&!!(inputData[device][key]&1)}function keyWasPressed(key,device=0){ASSERT(device>0||typeof key!=="number"||key<3,"use code string for keyboard");return inputData[device]&&!!(inputData[device][key]&2)}function keyWasReleased(key,device=0){ASSERT(device>0||typeof key!=="number"||key<3,"use code string for keyboard");return inputData[device]&&!!(inputData[device][key]&4)}function keyDirection(up="ArrowUp",down="ArrowDown",left="ArrowLeft",right="ArrowRight"){const k=key=>keyIsDown(key)?1:0;return vec2(k(right)-k(left),k(up)-k(down))}function clearInput(){inputData=[[]];touchGamepadButtons=[]}const mouseIsDown=keyIsDown;const mouseWasPressed=keyWasPressed;const mouseWasReleased=keyWasReleased;let mousePos=vec2();let mousePosScreen=vec2();let mouseWheel=0;let isUsingGamepad=false;let inputPreventDefault=true;function setInputPreventDefault(preventDefault){inputPreventDefault=preventDefault}function gamepadIsDown(button,gamepad=0){return keyIsDown(button,gamepad+1)}function gamepadWasPressed(button,gamepad=0){return keyWasPressed(button,gamepad+1)}function gamepadWasReleased(button,gamepad=0){return keyWasReleased(button,gamepad+1)}function gamepadStick(stick,gamepad=0){return gamepadStickData[gamepad]?gamepadStickData[gamepad][stick]||vec2():vec2()}let inputData=[[]];function inputUpdate(){if(headlessMode)return;if(!(touchInputEnable&&isTouchDevice)&&!document.hasFocus())clearInput();mousePos=screenToWorld(mousePosScreen);gamepadsUpdate()}function inputUpdatePost(){if(headlessMode)return;for(const deviceInputData of inputData)for(const i in deviceInputData)deviceInputData[i]&=1;mouseWheel=0}function inputInit(){if(headlessMode)return;onkeydown=e=>{if(!e.repeat){isUsingGamepad=false;inputData[0][e.code]=3;if(inputWASDEmulateDirection)inputData[0][remapKey(e.code)]=3}};onkeyup=e=>{inputData[0][e.code]=4;if(inputWASDEmulateDirection)inputData[0][remapKey(e.code)]=4};function remapKey(c){return inputWASDEmulateDirection?c=="KeyW"?"ArrowUp":c=="KeyS"?"ArrowDown":c=="KeyA"?"ArrowLeft":c=="KeyD"?"ArrowRight":c:c}onmousedown=e=>{if(soundEnable&&!headlessMode&&audioContext&&audioContext.state!="running")audioContext.resume();isUsingGamepad=false;inputData[0][e.button]=3;mousePosScreen=mouseEventToScreen(e);inputPreventDefault&&e.button&&e.preventDefault()};onmouseup=e=>inputData[0][e.button]=inputData[0][e.button]&2|4;onmousemove=e=>mousePosScreen=mouseEventToScreen(e);onwheel=e=>mouseWheel=e.ctrlKey?0:sign(e.deltaY);oncontextmenu=e=>false;onblur=e=>clearInput();if(isTouchDevice&&touchInputEnable)touchInputInit()}function mouseEventToScreen(mousePos){const rect=mainCanvas.getBoundingClientRect();const px=percent(mousePos.x,rect.left,rect.right);const py=percent(mousePos.y,rect.top,rect.bottom);return vec2(px*mainCanvas.width,py*mainCanvas.height)}const gamepadStickData=[];function gamepadsUpdate(){const applyDeadZones=v=>{const min=.3,max=.8;const deadZone=v=>v>min?percent(v,min,max):v<-min?-percent(-v,min,max):0;return vec2(deadZone(v.x),deadZone(-v.y)).clampLength()};if(touchGamepadEnable&&isTouchDevice){ASSERT(touchGamepadButtons,"set touchGamepadEnable before calling init!");if(touchGamepadTimer.isSet()){const sticks=gamepadStickData[0]||(gamepadStickData[0]=[]);sticks[0]=vec2();if(touchGamepadAnalog)sticks[0]=applyDeadZones(touchGamepadStick);else if(touchGamepadStick.lengthSquared()>.3){sticks[0].x=Math.round(touchGamepadStick.x);sticks[0].y=-Math.round(touchGamepadStick.y);sticks[0]=sticks[0].clampLength()}const data=inputData[1]||(inputData[1]=[]);for(let i=10;i--;){const j=i==3?2:i==2?3:i;const wasDown=gamepadIsDown(j,0);data[j]=touchGamepadButtons[i]?wasDown?1:3:wasDown?4:0}}}if(!gamepadsEnable||!navigator||!navigator.getGamepads)return;if(!debug&&!document.hasFocus())return;const gamepads=navigator.getGamepads();for(let i=gamepads.length;i--;){const gamepad=gamepads[i];const data=inputData[i+1]||(inputData[i+1]=[]);const sticks=gamepadStickData[i]||(gamepadStickData[i]=[]);if(gamepad){for(let j=0;j<gamepad.axes.length-1;j+=2)sticks[j>>1]=applyDeadZones(vec2(gamepad.axes[j],gamepad.axes[j+1]));for(let j=gamepad.buttons.length;j--;){const button=gamepad.buttons[j];const wasDown=gamepadIsDown(j,i);data[j]=button.pressed?wasDown?1:3:wasDown?4:0;if(!button.value||button.value>.9)if(!i&&button.pressed)isUsingGamepad=true}if(gamepadDirectionEmulateStick){const dpad=vec2((gamepadIsDown(15,i)&&1)-(gamepadIsDown(14,i)&&1),(gamepadIsDown(12,i)&&1)-(gamepadIsDown(13,i)&&1));if(dpad.lengthSquared())sticks[0]=dpad.clampLength()}touchGamepadEnable&&isUsingGamepad&&touchGamepadTimer.unset()}}}function vibrate(pattern=100){vibrateEnable&&!headlessMode&&navigator&&navigator.vibrate&&navigator.vibrate(pattern)}function vibrateStop(){vibrate(0)}const isTouchDevice=!headlessMode&&window.ontouchstart!==undefined;let touchGamepadTimer=new Timer,touchGamepadButtons,touchGamepadStick;function touchInputInit(){let handleTouch=handleTouchDefault;if(touchGamepadEnable){handleTouch=handleTouchGamepad;touchGamepadButtons=[];touchGamepadStick=vec2()}document.addEventListener("touchstart",e=>handleTouch(e),{passive:false});document.addEventListener("touchmove",e=>handleTouch(e),{passive:false});document.addEventListener("touchend",e=>handleTouch(e),{passive:false});onmousedown=onmouseup=()=>0;let wasTouching;function handleTouchDefault(e){if(soundEnable&&!headlessMode&&audioContext&&audioContext.state!="running")audioContext.resume();const touching=e.touches.length;const button=0;if(touching){const p=vec2(e.touches[0].clientX,e.touches[0].clientY);mousePosScreen=mouseEventToScreen(p);wasTouching?isUsingGamepad=touchGamepadEnable:inputData[0][button]=3}else if(wasTouching)inputData[0][button]=inputData[0][button]&2|4;wasTouching=touching;if(inputPreventDefault&&document.hasFocus())e.preventDefault();return true}function handleTouchGamepad(e){touchGamepadStick=vec2();touchGamepadButtons=[];isUsingGamepad=true;const touching=e.touches.length;if(touching){touchGamepadTimer.set();if(paused&&!wasTouching){touchGamepadButtons[9]=1;handleTouchDefault(e);return}}const stickCenter=vec2(touchGamepadSize,mainCanvasSize.y-touchGamepadSize);const buttonCenter=mainCanvasSize.subtract(vec2(touchGamepadSize,touchGamepadSize));const startCenter=mainCanvasSize.scale(.5);for(const touch of e.touches){const touchPos=mouseEventToScreen(vec2(touch.clientX,touch.clientY));if(touchPos.distance(stickCenter)<touchGamepadSize){touchGamepadStick=touchPos.subtract(stickCenter).scale(2/touchGamepadSize).clampLength()}else if(touchPos.distance(buttonCenter)<touchGamepadSize){const button=touchPos.subtract(buttonCenter).direction();touchGamepadButtons[button]=1}else if(touchPos.distance(startCenter)<touchGamepadSize&&!wasTouching){touchGamepadButtons[9]=1}}handleTouchDefault(e);return true}}function touchGamepadRender(){if(!touchInputEnable||!isTouchDevice||headlessMode)return;if(!touchGamepadEnable||!touchGamepadTimer.isSet())return;const alpha=percent(touchGamepadTimer.get(),4,3);if(!alpha||paused)return;const context=overlayContext;context.save();context.globalAlpha=alpha*touchGamepadAlpha;context.strokeStyle="#fff";context.lineWidth=3;context.fillStyle=touchGamepadStick.lengthSquared()>0?"#fff":"#000";context.beginPath();const leftCenter=vec2(touchGamepadSize,mainCanvasSize.y-touchGamepadSize);if(touchGamepadAnalog){context.arc(leftCenter.x,leftCenter.y,touchGamepadSize/2,0,9);context.fill();context.stroke()}else{for(let i=10;i--;){const angle=i*PI/4;context.arc(leftCenter.x,leftCenter.y,touchGamepadSize*.6,angle+PI/8,angle+PI/8);i%2&&context.arc(leftCenter.x,leftCenter.y,touchGamepadSize*.33,angle,angle);i==1&&context.fill()}context.stroke()}const rightCenter=vec2(mainCanvasSize.x-touchGamepadSize,mainCanvasSize.y-touchGamepadSize);for(let i=4;i--;){const pos=rightCenter.add(vec2().setDirection(i,touchGamepadSize/2));context.fillStyle=touchGamepadButtons[i]?"#fff":"#000";context.beginPath();context.arc(pos.x,pos.y,touchGamepadSize/4,0,9);context.fill();context.stroke()}context.restore()}let audioContext=new AudioContext;let audioMasterGain;function audioInit(){if(!soundEnable||headlessMode)return;audioMasterGain=audioContext.createGain();audioMasterGain.connect(audioContext.destination);audioMasterGain.gain.value=soundVolume}class Sound{constructor(zzfxSound,range=soundDefaultRange,taper=soundDefaultTaper){if(!soundEnable||headlessMode)return;this.range=range;this.taper=taper;this.randomness=0;if(zzfxSound){const defaultRandomness=.05;this.randomness=zzfxSound[1]!=undefined?zzfxSound[1]:defaultRandomness;zzfxSound[1]=0;this.sampleChannels=[zzfxG(...zzfxSound)];this.sampleRate=zzfxR}}play(pos,volume=1,pitch=1,randomnessScale=1,loop=false){if(!soundEnable||headlessMode)return;if(!this.sampleChannels)return;let pan;if(pos){const range=this.range;if(range){const lengthSquared=cameraPos.distanceSquared(pos);if(lengthSquared>range*range)return;volume*=percent(lengthSquared**.5,range,range*this.taper)}pan=worldToScreen(pos).x*2/mainCanvas.width-1}const playbackRate=pitch+pitch*this.randomness*randomnessScale*rand(-1,1);this.gainNode=audioContext.createGain();this.source=playSamples(this.sampleChannels,volume,playbackRate,pan,loop,this.sampleRate,this.gainNode);return this.source}setVolume(volume=1){if(this.gainNode)this.gainNode.gain.value=volume}stop(){if(this.source)this.source.stop();this.source=undefined}getSource(){return this.source}playNote(semitoneOffset,pos,volume){return this.play(pos,volume,2**(semitoneOffset/12),0)}getDuration(){return this.sampleChannels&&this.sampleChannels[0].length/this.sampleRate}isLoading(){return!this.sampleChannels}}class SoundWave extends Sound{constructor(filename,randomness=0,range,taper,onloadCallback){super(undefined,range,taper);if(!soundEnable||headlessMode)return;this.randomness=randomness;fetch(filename).then(response=>response.arrayBuffer()).then(arrayBuffer=>audioContext.decodeAudioData(arrayBuffer)).then(audioBuffer=>{this.sampleChannels=[];for(let i=audioBuffer.numberOfChannels;i--;)this.sampleChannels[i]=Array.from(audioBuffer.getChannelData(i));this.sampleRate=audioBuffer.sampleRate}).then(()=>onloadCallback&&onloadCallback(this))}}function playAudioFile(filename,volume=1,loop=false){if(!soundEnable||headlessMode)return;return new SoundWave(filename,0,0,0,s=>s.play(undefined,volume,1,1,loop))}function speak(text,language="",volume=1,rate=1,pitch=1){if(!soundEnable||headlessMode)return;if(!speechSynthesis)return;const utterance=new SpeechSynthesisUtterance(text);utterance.lang=language;utterance.volume=2*volume*soundVolume;utterance.rate=rate;utterance.pitch=pitch;speechSynthesis.speak(utterance);return utterance}function speakStop(){speechSynthesis&&speechSynthesis.cancel()}function getNoteFrequency(semitoneOffset,rootFrequency=220){return rootFrequency*2**(semitoneOffset/12)}function playSamples(sampleChannels,volume=1,rate=1,pan=0,loop=false,sampleRate=zzfxR,gainNode){if(!soundEnable||headlessMode)return;const channelCount=sampleChannels.length;const sampleLength=sampleChannels[0].length;const buffer=audioContext.createBuffer(channelCount,sampleLength,sampleRate);const source=audioContext.createBufferSource();sampleChannels.forEach((c,i)=>buffer.getChannelData(i).set(c));source.buffer=buffer;source.playbackRate.value=rate;source.loop=loop;gainNode=gainNode||audioContext.createGain();gainNode.gain.value=volume;gainNode.connect(audioMasterGain);const pannerNode=new StereoPannerNode(audioContext,{pan:clamp(pan,-1,1)});source.connect(pannerNode).connect(gainNode);if(audioContext.state!="running"){audioContext.resume().then(()=>source.start())}else source.start();return source}function zzfx(...zzfxSound){return playSamples([zzfxG(...zzfxSound)])}const zzfxR=44100;function zzfxG(volume=1,randomness=.05,frequency=220,attack=0,sustain=0,release=.1,shape=0,shapeCurve=1,slide=0,deltaSlide=0,pitchJump=0,pitchJumpTime=0,repeatTime=0,noise=0,modulation=0,bitCrush=0,delay=0,sustainVolume=1,decay=0,tremolo=0,filter=0){let sampleRate=zzfxR,PI2=PI*2,startSlide=slide*=500*PI2/sampleRate/sampleRate,startFrequency=frequency*=(1+rand(randomness,-randomness))*PI2/sampleRate,modOffset=0,repeat=0,crush=0,jump=1,length,b=[],t=0,i=0,s=0,f,quality=2,w=PI2*abs(filter)*2/sampleRate,cos=Math.cos(w),alpha=Math.sin(w)/2/quality,a0=1+alpha,a1=-2*cos/a0,a2=(1-alpha)/a0,b0=(1+sign(filter)*cos)/2/a0,b1=-(sign(filter)+cos)/a0,b2=b0,x2=0,x1=0,y2=0,y1=0;const minAttack=9;attack=attack*sampleRate||minAttack;decay*=sampleRate;sustain*=sampleRate;release*=sampleRate;delay*=sampleRate;deltaSlide*=500*PI2/sampleRate**3;modulation*=PI2/sampleRate;pitchJump*=PI2/sampleRate;pitchJumpTime*=sampleRate;repeatTime=repeatTime*sampleRate|0;for(length=attack+decay+sustain+release+delay|0;i<length;b[i++]=s*volume){if(!(++crush%(bitCrush*100|0))){s=shape?shape>1?shape>2?shape>3?shape>4?t/PI2%1<shapeCurve/2?1:-1:Math.sin(t**3):Math.max(Math.min(Math.tan(t),1),-1):1-(2*t/PI2%2+2)%2:1-4*abs(Math.round(t/PI2)-t/PI2):Math.sin(t);s=(repeatTime?1-tremolo+tremolo*Math.sin(PI2*i/repeatTime):1)*(shape>4?s:sign(s)*abs(s)**shapeCurve)*(i<attack?i/attack:i<attack+decay?1-(i-attack)/decay*(1-sustainVolume):i<attack+decay+sustain?sustainVolume:i<length-delay?(length-i-delay)/release*sustainVolume:0);s=delay?s/2+(delay>i?0:(i<length-delay?1:(length-i)/delay)*b[i-delay|0]/2/volume):s;if(filter)s=y1=b2*x2+b1*(x2=x1)+b0*(x1=s)-a2*y2-a1*(y2=y1)}f=(frequency+=slide+=deltaSlide)*Math.cos(modulation*modOffset++);t+=f+f*noise*Math.sin(i**5);if(jump&&++jump>pitchJumpTime){frequency+=pitchJump;startFrequency+=pitchJump;jump=0}if(repeatTime&&!(++repeat%repeatTime)){frequency=startFrequency;slide=startSlide;jump||=1}}return b}let tileCollisionLayers=[];function getTileCollisionData(pos){for(const layer of tileCollisionLayers)if(pos.arrayCheck(layer.size))return layer.getCollisionData(pos);return 0}function tileCollisionTest(pos,size=vec2(),object){for(const layer of tileCollisionLayers)if(layer.collisionTest(pos,size,object))return layer}function tileCollisionRaycast(posStart,posEnd,object){for(const layer of tileCollisionLayers){const hitPos=layer.collisionRaycast(posStart,posEnd,object);if(hitPos)return hitPos}}class TileLayerData{constructor(tile,direction=0,mirror=false,color=new Color){this.tile=tile;this.direction=direction;this.mirror=mirror;this.color=color}clear(){this.tile=this.direction=0;this.mirror=false;this.color=new Color}}class TileLayer extends EngineObject{constructor(position,size,tileInfo=tile(),scale=vec2(1),renderOrder=0){super(position,size,tileInfo,0,undefined,renderOrder);this.canvas=document.createElement("canvas");this.context=this.canvas.getContext("2d");this.scale=scale;this.isOverlay=false;this.friction=0;this.elasticity=0;this.data=[];for(let j=this.size.area();j--;)this.data.push(new TileLayerData);if(headlessMode){this.redraw=()=>{};this.render=()=>{};this.redrawStart=()=>{};this.redrawEnd=()=>{};this.drawTileData=()=>{};this.drawCanvas2D=()=>{}}}setData(layerPos,data,redraw=false){if(layerPos.arrayCheck(this.size)){this.data[(layerPos.y|0)*this.size.x+layerPos.x|0]=data;redraw&&this.drawTileData(layerPos)}}getData(layerPos){return layerPos.arrayCheck(this.size)&&this.data[(layerPos.y|0)*this.size.x+layerPos.x|0]}update(){}render(){ASSERT(mainContext!=this.context,"must call redrawEnd() after drawing tiles");!glOverlay&&!this.isOverlay&&glCopyToContext(mainContext);let pos=worldToScreen(this.pos.add(vec2(0,this.size.y*this.scale.y)));pos=pos.floor();(this.isOverlay?overlayContext:mainContext).drawImage(this.canvas,pos.x,pos.y,cameraScale*this.size.x*this.scale.x,cameraScale*this.size.y*this.scale.y)}redraw(){this.redrawStart(true);for(let x=this.size.x;x--;)for(let y=this.size.y;y--;)this.drawTileData(vec2(x,y),false);this.redrawEnd()}redrawStart(clear=false){this.savedRenderSettings=[mainCanvas,mainContext,mainCanvasSize,cameraPos,cameraScale];mainCanvas=this.canvas;mainContext=this.context;mainCanvasSize=this.size.multiply(this.tileInfo.size);cameraPos=this.size.scale(.5);cameraScale=this.tileInfo.size.x;if(clear){mainCanvas.width=mainCanvasSize.x;mainCanvas.height=mainCanvasSize.y}this.context.imageSmoothingEnabled=!tilesPixelated;glPreRender()}redrawEnd(){ASSERT(mainContext==this.context,"must call redrawStart() before drawing tiles");glCopyToContext(mainContext,true);[mainCanvas,mainContext,mainCanvasSize,cameraPos,cameraScale]=this.savedRenderSettings}drawTileData(layerPos,clear=true){const s=this.tileInfo.size;if(clear){const pos=layerPos.multiply(s);this.context.clearRect(pos.x,this.canvas.height-pos.y,s.x,-s.y)}const d=this.getData(layerPos);if(d.tile!=undefined){ASSERT(mainContext==this.context,"must call redrawStart() before drawing tiles");const pos=layerPos.add(vec2(.5));const tileInfo=tile(d.tile,s,this.tileInfo.textureIndex,this.tileInfo.padding);drawTile(pos,vec2(1),tileInfo,d.color,d.direction*PI/2,d.mirror)}}drawCanvas2D(pos,size,angle,mirror,drawFunction){const context=this.context;context.save();pos=pos.subtract(this.pos).multiply(this.tileInfo.size);size=size.multiply(this.tileInfo.size);context.translate(pos.x,this.canvas.height-pos.y);context.rotate(angle);context.scale(mirror?-size.x:size.x,size.y);drawFunction(context);context.restore()}drawTile(pos,size=vec2(1),tileInfo,color=new Color,angle,mirror){this.drawCanvas2D(pos,size,angle,mirror,context=>{const textureInfo=tileInfo&&tileInfo.getTextureInfo();if(textureInfo){context.globalAlpha=color.a;context.drawImage(textureInfo.image,tileInfo.pos.x,tileInfo.pos.y,tileInfo.size.x,tileInfo.size.y,-.5,-.5,1,1);context.globalAlpha=1}else{context.fillStyle=color;context.fillRect(-.5,-.5,1,1)}})}drawRect(pos,size,color,angle){this.drawTile(pos,size,undefined,color,angle)}}class TileCollisionLayer extends TileLayer{constructor(position,size,tileInfo=tile(),renderOrder=0){const scale=vec2(1);super(position,size.floor(),tileInfo,scale,renderOrder);this.collisionData=[];this.initCollision(this.size);tileCollisionLayers.push(this)}destroy(){if(this.destroyed)return;const index=tileCollisionLayers.indexOf(this);ASSERT(index>=0,"tile collision layer not found in array");tileCollisionLayers.splice(index,1);super.destroy()}initCollision(size){this.size=size.floor();this.collisionData=[];this.collisionData.length=size.area();this.collisionData.fill(0)}setCollisionData(pos,data=1){const i=(pos.y|0)*this.size.x+pos.x|0;pos.arrayCheck(this.size)&&(this.collisionData[i]=data)}getCollisionData(pos){const i=(pos.y|0)*this.size.x+pos.x|0;return pos.arrayCheck(this.size)?this.collisionData[i]:0}collisionTest(pos,size=vec2(),object){const minX=max(pos.x-size.x/2|0,0);const minY=max(pos.y-size.y/2|0,0);const maxX=min(pos.x+size.x/2,this.size.x);const maxY=min(pos.y+size.y/2,this.size.y);for(let y=minY;y<maxY;++y)for(let x=minX;x<maxX;++x){const tileData=this.collisionData[y*this.size.x+x];if(tileData&&(!object||object.collideWithTile(tileData,vec2(x,y))))return true}return false}collisionRaycast(posStart,posEnd,object){const delta=posEnd.subtract(posStart);const totalLength=delta.length();const normalizedDelta=delta.normalize();const unit=vec2(abs(1/normalizedDelta.x),abs(1/normalizedDelta.y));const flooredPosStart=posStart.floor();let pos=flooredPosStart;let xi=unit.x*(delta.x<0?posStart.x-pos.x:pos.x-posStart.x+1);let yi=unit.y*(delta.y<0?posStart.y-pos.y:pos.y-posStart.y+1);while(true){const tileData=this.getCollisionData(pos);if(tileData&&(!object||object.collideWithTile(tileData,pos))){debugRaycast&&debugLine(posStart,posEnd,"#f00",.02);debugRaycast&&debugPoint(pos.add(vec2(.5)),"#ff0");return pos.add(vec2(.5))}if(xi>totalLength&&yi>totalLength)break;if(xi>yi)pos.y+=sign(delta.y),yi+=unit.y;else pos.x+=sign(delta.x),xi+=unit.x}debugRaycast&&debugLine(posStart,posEnd,"#00f",.02)}}class ParticleEmitter extends EngineObject{constructor(position,angle,emitSize=0,emitTime=0,emitRate=100,emitConeAngle=PI,tileInfo,colorStartA=new Color,colorStartB=new Color,colorEndA=new Color(1,1,1,0),colorEndB=new Color(1,1,1,0),particleTime=.5,sizeStart=.1,sizeEnd=1,speed=.1,angleSpeed=.05,damping=1,angleDamping=1,gravityScale=0,particleConeAngle=PI,fadeRate=.1,randomness=.2,collideTiles=false,additive=false,randomColorLinear=true,renderOrder=additive?1e9:0,localSpace=false){super(position,vec2(),tileInfo,angle,undefined,renderOrder);this.emitSize=emitSize;this.emitTime=emitTime;this.emitRate=emitRate;this.emitConeAngle=emitConeAngle;this.colorStartA=colorStartA;this.colorStartB=colorStartB;this.colorEndA=colorEndA;this.colorEndB=colorEndB;this.randomColorLinear=randomColorLinear;this.particleTime=particleTime;this.sizeStart=sizeStart;this.sizeEnd=sizeEnd;this.speed=speed;this.angleSpeed=angleSpeed;this.damping=damping;this.angleDamping=angleDamping;this.gravityScale=gravityScale;this.particleConeAngle=particleConeAngle;this.fadeRate=fadeRate;this.randomness=randomness;this.collideTiles=collideTiles;this.additive=additive;this.localSpace=localSpace;this.trailScale=0;this.particleDestroyCallback=undefined;this.particleCreateCallback=undefined;this.emitTimeBuffer=0}update(){this.parent&&super.update();if(!this.emitTime||this.getAliveTime()<=this.emitTime){if(this.emitRate*particleEmitRateScale){const rate=1/this.emitRate/particleEmitRateScale;for(this.emitTimeBuffer+=timeDelta;this.emitTimeBuffer>0;this.emitTimeBuffer-=rate)this.emitParticle()}}else this.destroy();if(debugParticles){const emitSize=typeof this.emitSize==="number"?vec2(this.emitSize):this.emitSize;debugRect(this.pos,emitSize,"#0f0",0,this.angle)}}emitParticle(){let pos=typeof this.emitSize==="number"?randInCircle(this.emitSize/2):vec2(rand(-.5,.5),rand(-.5,.5)).multiply(this.emitSize).rotate(this.angle);let angle=rand(this.particleConeAngle,-this.particleConeAngle);if(!this.localSpace){pos=this.pos.add(pos);angle+=this.angle}const randomness=this.randomness;const randomizeScale=v=>v+v*rand(randomness,-randomness);const particleTime=randomizeScale(this.particleTime);const sizeStart=randomizeScale(this.sizeStart);const sizeEnd=randomizeScale(this.sizeEnd);const speed=randomizeScale(this.speed);const angleSpeed=randomizeScale(this.angleSpeed)*randSign();const coneAngle=rand(this.emitConeAngle,-this.emitConeAngle);const colorStart=randColor(this.colorStartA,this.colorStartB,this.randomColorLinear);const colorEnd=randColor(this.colorEndA,this.colorEndB,this.randomColorLinear);const velocityAngle=this.localSpace?coneAngle:this.angle+coneAngle;const particle=new Particle(pos,this.tileInfo,angle,colorStart,colorEnd,particleTime,sizeStart,sizeEnd,this.fadeRate,this.additive,this.trailScale,this.localSpace&&this,this.particleDestroyCallback);particle.velocity=vec2().setAngle(velocityAngle,speed);particle.angleVelocity=angleSpeed;particle.fadeRate=this.fadeRate;particle.damping=this.damping;particle.angleDamping=this.angleDamping;particle.elasticity=this.elasticity;particle.friction=this.friction;particle.gravityScale=this.gravityScale;particle.collideTiles=this.collideTiles;particle.renderOrder=this.renderOrder;particle.mirror=!!randInt(2);this.particleCreateCallback&&this.particleCreateCallback(particle);return particle}render(){}}class Particle extends EngineObject{constructor(position,tileInfo,angle,colorStart,colorEnd,lifeTime,sizeStart,sizeEnd,fadeRate,additive,trailScale,localSpaceEmitter,destroyCallback){super(position,vec2(),tileInfo,angle);this.colorStart=colorStart;this.colorEndDelta=colorEnd.subtract(colorStart);this.lifeTime=lifeTime;this.sizeStart=sizeStart;this.sizeEndDelta=sizeEnd-sizeStart;this.fadeRate=fadeRate;this.additive=additive;this.trailScale=trailScale;this.localSpaceEmitter=localSpaceEmitter;this.destroyCallback=destroyCallback;this.clampSpeedLinear=false}render(){const p=this.lifeTime>0?min((time-this.spawnTime)/this.lifeTime,1):1;const radius=this.sizeStart+p*this.sizeEndDelta;const size=vec2(radius);const fadeRate=this.fadeRate/2;const color=new Color(this.colorStart.r+p*this.colorEndDelta.r,this.colorStart.g+p*this.colorEndDelta.g,this.colorStart.b+p*this.colorEndDelta.b,(this.colorStart.a+p*this.colorEndDelta.a)*(p<fadeRate?p/fadeRate:p>1-fadeRate?(1-p)/fadeRate:1));this.additive&&setBlendMode(true);let pos=this.pos,angle=this.angle;if(this.localSpaceEmitter){pos=this.localSpaceEmitter.pos.add(pos.rotate(-this.localSpaceEmitter.angle));angle+=this.localSpaceEmitter.angle}if(this.trailScale){let velocity=this.velocity;if(this.localSpaceEmitter)velocity=velocity.rotate(-this.localSpaceEmitter.angle);const speed=velocity.length();if(speed){const direction=velocity.scale(1/speed);const trailLength=speed*this.trailScale;size.y=max(size.x,trailLength);angle=direction.angle();drawTile(pos.add(direction.multiply(vec2(0,-trailLength/2))),size,this.tileInfo,color,angle,this.mirror)}}else drawTile(pos,size,this.tileInfo,color,angle,this.mirror);this.additive&&setBlendMode();debugParticles&&debugRect(pos,size,"#f005",0,angle);if(p==1){this.color=color;this.size=size;this.destroyCallback&&this.destroyCallback(this);this.destroyed=1}}}const medals={};let medalsDisplayQueue=[],medalsSaveName,medalsDisplayTimeLast;function medalsInit(saveName){medalsSaveName=saveName;if(!debugMedals)medalsForEach(medal=>medal.unlocked=!!localStorage[medal.storageKey()]);engineAddPlugin(undefined,medalsRender);function medalsRender(){if(!medalsDisplayQueue.length)return;const medal=medalsDisplayQueue[0];const time=timeReal-medalsDisplayTimeLast;if(!medalsDisplayTimeLast)medalsDisplayTimeLast=timeReal;else if(time>medalDisplayTime){medalsDisplayTimeLast=0;medalsDisplayQueue.shift()}else{const slideOffTime=medalDisplayTime-medalDisplaySlideTime;const hidePercent=time<medalDisplaySlideTime?1-time/medalDisplaySlideTime:time>slideOffTime?(time-slideOffTime)/medalDisplaySlideTime:0;medal.render(hidePercent)}}}function medalsForEach(callback){Object.values(medals).forEach(medal=>callback(medal))}class Medal{constructor(id,name,description="",icon="🏆",src){ASSERT(id>=0&&!medals[id]);this.id=id;this.name=name;this.description=description;this.icon=icon;this.unlocked=false;if(src)(this.image=new Image).src=src;medals[id]=this}unlock(){if(medalsPreventUnlock||this.unlocked)return;ASSERT(medalsSaveName,"save name must be set");localStorage[this.storageKey()]=this.unlocked=true;medalsDisplayQueue.push(this)}render(hidePercent=0){const context=overlayContext;const width=min(medalDisplaySize.x,mainCanvas.width);const height=medalDisplaySize.y;const x=overlayCanvas.width-width;const y=-height*hidePercent;context.save();context.beginPath();context.fillStyle=new Color(.9,.9,.9).toString();context.strokeStyle=new Color(0,0,0).toString();context.lineWidth=3;context.rect(x,y,width,height);context.fill();context.stroke();context.clip();const gap=vec2(.1,.05).scale(height);const medalDisplayIconSize=height-2*gap.x;this.renderIcon(vec2(x+gap.x+medalDisplayIconSize/2,y+height/2),medalDisplayIconSize);const nameSize=height*.5;const descriptionSize=height*.3;const pos=vec2(x+medalDisplayIconSize+2*gap.x,y+gap.y*2+nameSize/2);const textWidth=width-medalDisplayIconSize-3*gap.x;drawTextScreen(this.name,pos,nameSize,new Color(0,0,0),0,undefined,"left",undefined,textWidth);pos.y=y+height-gap.y*2-descriptionSize/2;drawTextScreen(this.description,pos,descriptionSize,new Color(0,0,0),0,undefined,"left",undefined,textWidth);context.restore()}renderIcon(pos,size){if(this.image)overlayContext.drawImage(this.image,pos.x-size/2,pos.y-size/2,size,size);else drawTextScreen(this.icon,pos,size*.7,new Color(0,0,0))}storageKey(){return medalsSaveName+"_"+this.id}}let glCanvas;let glContext;let glAntialias=true;let glShader,glActiveTexture,glArrayBuffer,glGeometryBuffer,glPositionData,glColorData,glInstanceCount,glAdditive,glBatchAdditive;const gl_MAX_INSTANCES=1e4;const gl_INDICES_PER_INSTANCE=11;const gl_INSTANCE_BYTE_STRIDE=gl_INDICES_PER_INSTANCE*4;const gl_INSTANCE_BUFFER_SIZE=gl_MAX_INSTANCES*gl_INSTANCE_BYTE_STRIDE;function glInit(){if(!glEnable||headlessMode)return;glCanvas=document.createElement("canvas");glContext=glCanvas.getContext("webgl2",{antialias:glAntialias});const rootElement=mainCanvas.parentElement;glOverlay&&rootElement.appendChild(glCanvas);glShader=glCreateProgram("#version 300 es\n"+"precision highp float;"+"uniform mat4 m;"+"in vec2 g;"+"in vec4 p,u,c,a;"+"in float r;"+"out vec2 v;"+"out vec4 d,e;"+"void main(){"+"vec2 s=(g-.5)*p.zw;"+"gl_Position=m*vec4(p.xy+s*cos(r)-vec2(-s.y,s)*sin(r),1,1);"+"v=mix(u.xw,u.zy,g);"+"d=c;e=a;"+"}","#version 300 es\n"+"precision highp float;"+"uniform sampler2D s;"+"in vec2 v;"+"in vec4 d,e;"+"out vec4 c;"+"void main(){"+"c=texture(s,v)*d+e;"+"}");const glInstanceData=new ArrayBuffer(gl_INSTANCE_BUFFER_SIZE);glPositionData=new Float32Array(glInstanceData);glColorData=new Uint32Array(glInstanceData);glArrayBuffer=glContext.createBuffer();glGeometryBuffer=glContext.createBuffer();const geometry=new Float32Array([glInstanceCount=0,0,1,0,0,1,1,1]);glContext.bindBuffer(glContext.ARRAY_BUFFER,glGeometryBuffer);glContext.bufferData(glContext.ARRAY_BUFFER,geometry,glContext.STATIC_DRAW)}function glPreRender(){if(!glEnable||headlessMode)return;glClearCanvas();glContext.useProgram(glShader);glContext.activeTexture(glContext.TEXTURE0);if(textureInfos[0])glContext.bindTexture(glContext.TEXTURE_2D,glActiveTexture=textureInfos[0].glTexture);let offset=glAdditive=glBatchAdditive=0;const initVertexAttribArray=(name,type,typeSize,size)=>{const location=glContext.getAttribLocation(glShader,name);const stride=typeSize&&gl_INSTANCE_BYTE_STRIDE;const divisor=typeSize&&1;const normalize=typeSize==1;glContext.enableVertexAttribArray(location);glContext.vertexAttribPointer(location,size,type,normalize,stride,offset);glContext.vertexAttribDivisor(location,divisor);offset+=size*typeSize};glContext.bindBuffer(glContext.ARRAY_BUFFER,glGeometryBuffer);initVertexAttribArray("g",glContext.FLOAT,0,2);glContext.bindBuffer(glContext.ARRAY_BUFFER,glArrayBuffer);glContext.bufferData(glContext.ARRAY_BUFFER,gl_INSTANCE_BUFFER_SIZE,glContext.DYNAMIC_DRAW);initVertexAttribArray("p",glContext.FLOAT,4,4);initVertexAttribArray("u",glContext.FLOAT,4,4);initVertexAttribArray("c",glContext.UNSIGNED_BYTE,1,4);initVertexAttribArray("a",glContext.UNSIGNED_BYTE,1,4);initVertexAttribArray("r",glContext.FLOAT,4,1);const s=vec2(2*cameraScale).divide(mainCanvasSize);const p=vec2(-1).subtract(cameraPos.multiply(s));glContext.uniformMatrix4fv(glContext.getUniformLocation(glShader,"m"),false,[s.x,0,0,0,0,s.y,0,0,1,1,1,1,p.x,p.y,0,0])}function glClearCanvas(){glContext.viewport(0,0,glCanvas.width=mainCanvas.width,glCanvas.height=mainCanvas.height);glContext.clear(glContext.COLOR_BUFFER_BIT)}function glSetTexture(texture){if(headlessMode||texture==glActiveTexture)return;glFlush();glContext.bindTexture(glContext.TEXTURE_2D,glActiveTexture=texture)}function glCompileShader(source,type){const shader=glContext.createShader(type);glContext.shaderSource(shader,source);glContext.compileShader(shader);if(debug&&!glContext.getShaderParameter(shader,glContext.COMPILE_STATUS))throw glContext.getShaderInfoLog(shader);return shader}function glCreateProgram(vsSource,fsSource){const program=glContext.createProgram();glContext.attachShader(program,glCompileShader(vsSource,glContext.VERTEX_SHADER));glContext.attachShader(program,glCompileShader(fsSource,glContext.FRAGMENT_SHADER));glContext.linkProgram(program);if(debug&&!glContext.getProgramParameter(program,glContext.LINK_STATUS))throw glContext.getProgramInfoLog(program);return program}function glCreateTexture(image){const texture=glContext.createTexture();glContext.bindTexture(glContext.TEXTURE_2D,texture);if(image&&image.width)glSetTextureData(texture,image);else{const whitePixel=new Uint8Array([255,255,255,255]);glContext.texImage2D(glContext.TEXTURE_2D,0,glContext.RGBA,1,1,0,glContext.RGBA,glContext.UNSIGNED_BYTE,whitePixel)}const filter=tilesPixelated?glContext.NEAREST:glContext.LINEAR;glContext.texParameteri(glContext.TEXTURE_2D,glContext.TEXTURE_MIN_FILTER,filter);glContext.texParameteri(glContext.TEXTURE_2D,glContext.TEXTURE_MAG_FILTER,filter);return texture}function glSetTextureData(texture,image){ASSERT(!!image&&image.width>0,"Invalid image data.");glContext.bindTexture(glContext.TEXTURE_2D,texture);glContext.texImage2D(glContext.TEXTURE_2D,0,glContext.RGBA,glContext.RGBA,glContext.UNSIGNED_BYTE,image)}function glFlush(){if(!glInstanceCount)return;const destBlend=glBatchAdditive?glContext.ONE:glContext.ONE_MINUS_SRC_ALPHA;glContext.blendFuncSeparate(glContext.SRC_ALPHA,destBlend,glContext.ONE,destBlend);glContext.enable(glContext.BLEND);glContext.bufferSubData(glContext.ARRAY_BUFFER,0,glPositionData);glContext.drawArraysInstanced(glContext.TRIANGLE_STRIP,0,4,glInstanceCount);if(showWatermark)drawCount+=glInstanceCount;glInstanceCount=0;glBatchAdditive=glAdditive}function glCopyToContext(context,forceDraw=false){if(!glEnable||!glInstanceCount&&!forceDraw)return;glFlush();if(!glOverlay||forceDraw)context.drawImage(glCanvas,0,0)}function glSetAntialias(antialias=true){ASSERT(!glCanvas,"must be called before engineInit");glAntialias=antialias}function glDraw(x,y,sizeX,sizeY,angle,uv0X,uv0Y,uv1X,uv1Y,rgba=-1,rgbaAdditive=0){ASSERT(typeof rgba=="number"&&typeof rgbaAdditive=="number","invalid color");if(glInstanceCount>=gl_MAX_INSTANCES||glBatchAdditive!=glAdditive)glFlush();let offset=glInstanceCount++*gl_INDICES_PER_INSTANCE;glPositionData[offset++]=x;glPositionData[offset++]=y;glPositionData[offset++]=sizeX;glPositionData[offset++]=sizeY;glPositionData[offset++]=uv0X;glPositionData[offset++]=uv0Y;glPositionData[offset++]=uv1X;glPositionData[offset++]=uv1Y;glColorData[offset++]=rgba;glColorData[offset++]=rgbaAdditive;glPositionData[offset++]=angle}const engineName="LittleJS";const engineVersion="1.12.4";const frameRate=60;const timeDelta=1/frameRate;let engineObjects=[];let engineObjectsCollide=[];let frame=0;let time=0;let timeReal=0;let paused=false;function setPaused(isPaused){paused=isPaused}let frameTimeLastMS=0,frameTimeBufferMS=0,averageFPS=0;const pluginUpdateList=[],pluginRenderList=[];function engineAddPlugin(updateFunction,renderFunction){ASSERT(!pluginUpdateList.includes(updateFunction));ASSERT(!pluginRenderList.includes(renderFunction));updateFunction&&pluginUpdateList.push(updateFunction);renderFunction&&pluginRenderList.push(renderFunction)}function engineInit(gameInit,gameUpdate,gameUpdatePost,gameRender,gameRenderPost,imageSources=[],rootElement=document.body){ASSERT(!mainContext,"engine already initialized");ASSERT(Array.isArray(imageSources),"pass in images as array");gameInit||=()=>{};gameUpdate||=()=>{};gameUpdatePost||=()=>{};gameRender||=()=>{};gameRenderPost||=()=>{};function enginePreRender(){mainCanvasSize=vec2(mainCanvas.width,mainCanvas.height);overlayContext.imageSmoothingEnabled=mainContext.imageSmoothingEnabled=!tilesPixelated;glPreRender()}function engineUpdate(frameTimeMS=0){let frameTimeDeltaMS=frameTimeMS-frameTimeLastMS;frameTimeLastMS=frameTimeMS;if(debug||showWatermark)averageFPS=lerp(.05,averageFPS,1e3/(frameTimeDeltaMS||1));const debugSpeedUp=debug&&keyIsDown("Equal");const debugSpeedDown=debug&&keyIsDown("Minus");if(debug)frameTimeDeltaMS*=debugSpeedUp?10:debugSpeedDown?.1:1;timeReal+=frameTimeDeltaMS/1e3;frameTimeBufferMS+=paused?0:frameTimeDeltaMS;if(!debugSpeedUp)frameTimeBufferMS=min(frameTimeBufferMS,50);if(debug&&debugVideoCaptureIsActive())frameTimeBufferMS=0;updateCanvas();if(paused){for(const o of engineObjects)o.parent||o.updateTransforms();inputUpdate();pluginUpdateList.forEach(f=>f());debugUpdate();gameUpdatePost();inputUpdatePost()}else{let deltaSmooth=0;if(frameTimeBufferMS<0&&frameTimeBufferMS>-9){deltaSmooth=frameTimeBufferMS;frameTimeBufferMS=0}for(;frameTimeBufferMS>=0;frameTimeBufferMS-=1e3/frameRate){time=frame++/frameRate;inputUpdate();gameUpdate();pluginUpdateList.forEach(f=>f());engineObjectsUpdate();debugUpdate();gameUpdatePost();inputUpdatePost()}frameTimeBufferMS+=deltaSmooth}if(!headlessMode){enginePreRender();gameRender();engineObjects.sort((a,b)=>a.renderOrder-b.renderOrder);for(const o of engineObjects)o.destroyed||o.render();gameRenderPost();pluginRenderList.forEach(f=>f());touchGamepadRender();debugRender();glCopyToContext(mainContext);if(showWatermark){overlayContext.textAlign="right";overlayContext.textBaseline="top";overlayContext.font="1em monospace";overlayContext.fillStyle="#000";const text=engineName+" "+"v"+engineVersion+" / "+drawCount+" / "+engineObjects.length+" / "+averageFPS.toFixed(1)+(glEnable?" GL":" 2D");overlayContext.fillText(text,mainCanvas.width-3,3);overlayContext.fillStyle="#fff";overlayContext.fillText(text,mainCanvas.width-2,2);drawCount=0}}debugVideoCaptureUpdate();requestAnimationFrame(engineUpdate)}function updateCanvas(){if(headlessMode)return;if(canvasFixedSize.x){mainCanvas.width=canvasFixedSize.x;mainCanvas.height=canvasFixedSize.y;const aspect=innerWidth/innerHeight;const fixedAspect=mainCanvas.width/mainCanvas.height;(glCanvas||mainCanvas).style.width=mainCanvas.style.width=overlayCanvas.style.width=aspect<fixedAspect?"100%":"";(glCanvas||mainCanvas).style.height=mainCanvas.style.height=overlayCanvas.style.height=aspect<fixedAspect?"":"100%"}else{mainCanvas.width=min(innerWidth,canvasMaxSize.x);mainCanvas.height=min(innerHeight,canvasMaxSize.y)}overlayCanvas.width=mainCanvas.width;overlayCanvas.height=mainCanvas.height;mainCanvasSize=vec2(mainCanvas.width,mainCanvas.height)}function startEngine(){new Promise(resolve=>resolve(gameInit())).then(engineUpdate)}if(headlessMode){startEngine();return}const styleRoot="margin:0;"+"background:#000;"+(canvasPixelated?"image-rendering:pixelated;":"")+"user-select:none;"+"-webkit-user-select:none;"+(!touchInputEnable?"":"touch-action:none;"+"-webkit-touch-callout:none");rootElement.style.cssText=styleRoot;rootElement.appendChild(mainCanvas=document.createElement("canvas"));mainContext=mainCanvas.getContext("2d");inputInit();audioInit();debugInit();glInit();rootElement.appendChild(overlayCanvas=document.createElement("canvas"));overlayContext=overlayCanvas.getContext("2d");const styleCanvas="position:absolute;"+"top:50%;left:50%;transform:translate(-50%,-50%)";mainCanvas.style.cssText=overlayCanvas.style.cssText=styleCanvas;if(glCanvas)glCanvas.style.cssText=styleCanvas;updateCanvas();const promises=imageSources.map((src,textureIndex)=>new Promise(resolve=>{const image=new Image;image.onerror=image.onload=()=>{textureInfos[textureIndex]=new TextureInfo(image);resolve()};image.crossOrigin="anonymous";image.src=src}));if(!imageSources.length){promises.push(new Promise(resolve=>{textureInfos[0]=new TextureInfo(new Image);resolve()}))}if(showSplashScreen){promises.push(new Promise(resolve=>{let t=0;console.log(`${engineName} Engine v${engineVersion}`);updateSplash();function updateSplash(){clearInput();drawEngineSplashScreen(t+=.01);t>1?resolve():setTimeout(updateSplash,16)}}))}Promise.all(promises).then(startEngine)}function engineObjectsUpdate(){engineObjectsCollide=engineObjects.filter(o=>o.collideSolidObjects);function updateObject(o){if(!o.destroyed){o.update();for(const child of o.children)updateObject(child)}}for(const o of engineObjects){if(!o.parent){updateObject(o);o.updateTransforms()}}engineObjects=engineObjects.filter(o=>!o.destroyed)}function engineObjectsDestroy(){for(const o of engineObjects)o.parent||o.destroy();engineObjects=engineObjects.filter(o=>!o.destroyed)}function engineObjectsCollect(pos,size,objects=engineObjects){const collectedObjects=[];if(!pos){for(const o of objects)collectedObjects.push(o)}else if(size instanceof Vector2){for(const o of objects)isOverlapping(pos,size,o.pos,o.size)&&collectedObjects.push(o)}else{const sizeSquared=size*size;for(const o of objects)pos.distanceSquared(o.pos)<sizeSquared&&collectedObjects.push(o)}return collectedObjects}function engineObjectsCallback(pos,size,callbackFunction,objects=engineObjects){engineObjectsCollect(pos,size,objects).forEach(o=>callbackFunction(o))}function engineObjectsRaycast(start,end,objects=engineObjects){const hitObjects=[];for(const o of objects){if(o.collideRaycast&&isIntersecting(start,end,o.pos,o.size)){debugRaycast&&debugRect(o.pos,o.size,"#f00");hitObjects.push(o)}}debugRaycast&&debugLine(start,end,hitObjects.length?"#f00":"#00f",.02);return hitObjects}function drawEngineSplashScreen(t){const x=overlayContext;const w=overlayCanvas.width=innerWidth;const h=overlayCanvas.height=innerHeight;{const p3=percent(t,1,.8);const p4=percent(t,0,.5);const g=x.createRadialGradient(w/2,h/2,0,w/2,h/2,Math.hypot(w,h)*.7);g.addColorStop(0,hsl(0,0,lerp(p4,0,p3/2),p3).toString());g.addColorStop(1,hsl(0,0,0,p3).toString());x.save();x.fillStyle=g;x.fillRect(0,0,w,h)}const rect=(X,Y,W,H,C)=>{x.beginPath();x.rect(X,Y,W,C?H*p:H);x.fillStyle=C;C?x.fill():x.stroke()};const line=(X,Y,Z,W)=>{x.beginPath();x.lineTo(X,Y);x.lineTo(Z,W);x.stroke()};const circle=(X,Y,R,A=0,B=2*PI,C,F)=>{const D=(A+B)/2,E=p*(B-A)/2;x.beginPath();F&&x.lineTo(X,Y);x.arc(X,Y,R,D-E,D+E);x.fillStyle=C;C?x.fill():x.stroke()};const color=(c=0,l=0)=>hsl([.98,.3,.57,.14][c%4]-10,.8,[0,.3,.5,.8,.9][l]).toString();const alpha=wave(1,1,t);const p=percent(alpha,.1,.5);x.translate(w/2,h/2);const size=min(6,min(w,h)/99);x.scale(size,size);x.translate(-40,-35);x.lineJoin=x.lineCap="round";x.lineWidth=.1+p*1.9;const p2=percent(alpha,.1,1);x.setLineDash([99*p2,99]);rect(7,16,18,-8,color(2,2));rect(7,8,18,4,color(2,3));rect(25,8,8,8,color(2,1));rect(25,8,-18,8);rect(25,8,8,8);rect(25,16,7,23,color());rect(11,39,14,-23,color(1,1));rect(11,16,14,18,color(1,2));rect(11,16,14,8,color(1,3));rect(25,16,-14,24);rect(15,29,6,-9,color(2,2));circle(15,21,5,0,PI/2,color(2,4),1);rect(21,21,-6,9);rect(37,14,9,6,color(3,2));rect(37,14,4.5,6,color(3,3));rect(37,14,9,6);rect(50,20,10,-8,color(0,1));rect(50,20,6.5,-8,color(0,2));rect(50,20,3.5,-8,color(0,3));rect(50,20,10,-8);circle(55,2,11.4,.5,PI-.5,color(3,3));circle(55,2,11.4,.5,PI/2,color(3,2),1);circle(55,2,11.4,.5,PI-.5);rect(45,7,20,-7,color(0,2));rect(45,-1,20,4,color(0,3));rect(45,-1,20,8);for(let i=5;i--;){circle(60-i*6,30,9.9,0,2*PI,color(i+2,3));circle(60-i*6,30,10,-.5,PI+.5,color(i+2,2));circle(60-i*6,30,10.1,.5,PI-.5,color(i+2,1))}circle(36,30,10,PI/2,PI*3/2);circle(48,30,10,PI/2,PI*3/2);circle(60,30,10);line(36,20,60,20);circle(60,30,4,PI,3*PI,color(3,2));circle(60,30,4,PI,2*PI,color(3,3));circle(60,30,4,PI,3*PI);for(let i=6;i--;){x.beginPath();x.lineTo(53,54);x.lineTo(53,40);x.lineTo(53+(1+i*2.9)*p,40);x.lineTo(53+(4+i*3.5)*p,54);x.fillStyle=color(0,i%2+2);x.fill();i%2&&x.stroke()}rect(6,40,5,5);rect(6,40,5,5,color());rect(15,54,38,-14,color());for(let i=3;i--;)for(let j=2;j--;){circle(15*i+15,47,j?7:1,PI,3*PI,color(i,3));x.stroke();circle(15*i+15,47,j?7:1,0,PI,color(i,2));x.stroke()}line(6,40,68,40);line(77,54,4,54);const s=engineName;x.font="900 16px arial";x.textAlign="center";x.textBaseline="top";x.lineWidth=.1+p*3.9;let w2=0;for(let i=0;i<s.length;++i)w2+=x.measureText(s[i]).width;for(let j=2;j--;)for(let i=0,X=41-w2/2;i<s.length;++i){x.fillStyle=color(i,2);const w=x.measureText(s[i]).width;x[j?"strokeText":"fillText"](s[i],X+w/2,55.5,17*p);X+=w}x.restore()}let newgrounds;class NewgroundsMedal extends Medal{constructor(id,name,description,icon,src){super(id,name,description,icon,src)}unlock(){super.unlock();newgrounds&&newgrounds.unlockMedal(this.id)}}class NewgroundsPlugin{constructor(app_id,cipher,cryptoJS){ASSERT(!newgrounds,"there can only be one newgrounds object");ASSERT(!cipher||cryptoJS,"must provide cryptojs if there is a cipher");newgrounds=this;this.app_id=app_id;this.cipher=cipher;this.cryptoJS=cryptoJS;this.host=location?location.hostname:"";const url=new URL(location.href);this.session_id=url.searchParams.get("ngio_session_id");if(!this.session_id)return;const medalsResult=this.call("Medal.getList");this.medals=medalsResult?medalsResult.result.data["medals"]:[];debugMedals&&console.log(this.medals);for(const newgroundsMedal of this.medals){const medal=medals[newgroundsMedal["id"]];if(medal){medal.image=new Image;medal.image.src=newgroundsMedal["icon"];medal.name=newgroundsMedal["name"];medal.description=newgroundsMedal["description"];medal.unlocked=newgroundsMedal["unlocked"];medal.difficulty=newgroundsMedal["difficulty"];medal.value=newgroundsMedal["value"];if(medal.value)medal.description=medal.description+` (${medal.value})`}}const scoreboardResult=this.call("ScoreBoard.getBoards");this.scoreboards=scoreboardResult?scoreboardResult.result.data.scoreboards:[];debugMedals&&console.log(this.scoreboards);const keepAliveMS=60*1e3;setInterval(()=>this.call("Gateway.ping",0,true),keepAliveMS)}unlockMedal(id){return this.call("Medal.unlock",{id:id},true)}postScore(id,value){return this.call("ScoreBoard.postScore",{id:id,value:value},true)}getScores(id,user,social=0,skip=0,limit=10){return this.call("ScoreBoard.getScores",{id:id,user:user,social:social,skip:skip,limit:limit})}logView(){return this.call("App.logView",{host:this.host},true)}call(component,parameters,async=false){const call={component:component,parameters:parameters};if(this.cipher){const cryptoJS=this.cryptoJS;const aesKey=cryptoJS["enc"]["Base64"]["parse"](this.cipher);const iv=cryptoJS["lib"]["WordArray"]["random"](16);const encrypted=cryptoJS["AES"]["encrypt"](JSON.stringify(call),aesKey,{iv:iv});call["secure"]=cryptoJS["enc"]["Base64"]["stringify"](iv.concat(encrypted["ciphertext"]));call["parameters"]=0}const input={app_id:this.app_id,session_id:this.session_id,call:call};const formData=new FormData;formData.append("input",JSON.stringify(input));const xmlHttp=new XMLHttpRequest;const url="https://newgrounds.io/gateway_v3.php";xmlHttp.open("POST",url,!debugMedals&&async);try{xmlHttp.send(formData)}catch(e){debugMedals&&console.log("newgrounds call failed",e);return}debugMedals&&console.log(xmlHttp.responseText);return xmlHttp.responseText&&JSON.parse(xmlHttp.responseText)}}let postProcess;class PostProcessPlugin{constructor(shaderCode,includeOverlay=false){ASSERT(!postProcess,"Post process already initialized");postProcess=this;if(headlessMode)return;if(!shaderCode)shaderCode="void mainImage(out vec4 c,vec2 p){c=texture(iChannel0,p/iResolution.xy);}";this.shader=glCreateProgram("#version 300 es\n"+"precision highp float;"+"in vec2 p;"+"void main(){"+"gl_Position=vec4(p+p-1.,1,1);"+"}","#version 300 es\n"+"precision highp float;"+"uniform sampler2D iChannel0;"+"uniform vec3 iResolution;"+"uniform float iTime;"+"out vec4 c;"+"\n"+shaderCode+"\n"+"void main(){"+"mainImage(c,gl_FragCoord.xy);"+"c.a=1.;"+"}");this.texture=glCreateTexture();this.includeOverlay=includeOverlay;engineAddPlugin(undefined,postProcessRender);function postProcessRender(){if(headlessMode)return;if(glEnable){glFlush();mainContext.drawImage(glCanvas,0,0)}else{glContext.viewport(0,0,glCanvas.width=mainCanvas.width,glCanvas.height=mainCanvas.height)}if(postProcess.includeOverlay){mainContext.drawImage(overlayCanvas,0,0);overlayCanvas.width|=0}glContext.useProgram(postProcess.shader);glContext.bindBuffer(glContext.ARRAY_BUFFER,glGeometryBuffer);glContext.pixelStorei(glContext.UNPACK_FLIP_Y_WEBGL,1);glContext.disable(glContext.BLEND);glContext.activeTexture(glContext.TEXTURE0);glContext.bindTexture(glContext.TEXTURE_2D,postProcess.texture);glContext.texImage2D(glContext.TEXTURE_2D,0,glContext.RGBA,glContext.RGBA,glContext.UNSIGNED_BYTE,mainCanvas);const vertexByteStride=8;const pLocation=glContext.getAttribLocation(postProcess.shader,"p");glContext.enableVertexAttribArray(pLocation);glContext.vertexAttribPointer(pLocation,2,glContext.FLOAT,false,vertexByteStride,0);const uniformLocation=name=>glContext.getUniformLocation(postProcess.shader,name);glContext.uniform1i(uniformLocation("iChannel0"),0);glContext.uniform1f(uniformLocation("iTime"),time);glContext.uniform3f(uniformLocation("iResolution"),mainCanvas.width,mainCanvas.height,1);glContext.drawArrays(glContext.TRIANGLE_STRIP,0,4)}}}class ZzFXMusic extends Sound{constructor(zzfxMusic){super(undefined);if(!soundEnable||headlessMode)return;this.randomness=0;this.sampleChannels=zzfxM(...zzfxMusic);this.sampleRate=zzfxR}playMusic(volume,loop=false){return super.play(undefined,volume,1,1,loop)}}function zzfxM(instruments,patterns,sequence,BPM=125){let i,j,k;let instrumentParameters;let note;let sample;let patternChannel;let notFirstBeat;let stop;let instrument;let attenuation;let outSampleOffset;let isSequenceEnd;let sampleOffset=0;let nextSampleOffset;let sampleBuffer=[];let leftChannelBuffer=[];let rightChannelBuffer=[];let channelIndex=0;let panning=0;let hasMore=1;let sampleCache={};let beatLength=zzfxR/BPM*60>>2;for(;hasMore;channelIndex++){sampleBuffer=[hasMore=notFirstBeat=outSampleOffset=0];sequence.forEach((patternIndex,sequenceIndex)=>{patternChannel=patterns[patternIndex][channelIndex]||[0,0,0];hasMore|=patterns[patternIndex][channelIndex]&&1;nextSampleOffset=outSampleOffset+(patterns[patternIndex][0].length-2-(notFirstBeat?0:1))*beatLength;isSequenceEnd=sequenceIndex==sequence.length-1;for(i=2,k=outSampleOffset;i<patternChannel.length+isSequenceEnd;notFirstBeat=++i){note=patternChannel[i];stop=i==patternChannel.length+isSequenceEnd-1&&isSequenceEnd||instrument!=(patternChannel[0]||0)||note|0;for(j=0;j<beatLength&&notFirstBeat;j++>beatLength-99&&stop&&attenuation<1?attenuation+=1/99:0){sample=(1-attenuation)*sampleBuffer[sampleOffset++]/2||0;leftChannelBuffer[k]=(leftChannelBuffer[k]||0)-sample*panning+sample;rightChannelBuffer[k]=(rightChannelBuffer[k++]||0)+sample*panning+sample}if(note){attenuation=note%1;panning=patternChannel[1]||0;if(note|=0){sampleBuffer=sampleCache[[instrument=patternChannel[sampleOffset=0]||0,note]]=sampleCache[[instrument,note]]||(instrumentParameters=[...instruments[instrument]],instrumentParameters[2]=(instrumentParameters[2]||220)*2**(note/12-1),note>0?zzfxG(...instrumentParameters):[])}}}outSampleOffset=nextSampleOffset})}return[leftChannelBuffer,rightChannelBuffer]}let uiSystem;class UISystemPlugin{constructor(context=overlayContext){ASSERT(!uiSystem,"UI system already initialized");uiSystem=this;this.defaultColor=WHITE;this.defaultLineColor=BLACK;this.defaultTextColor=BLACK;this.defaultButtonColor=hsl(0,0,.5);this.defaultHoverColor=hsl(0,0,.7);this.defaultLineWidth=4;this.defaultFont="arial";this.uiObjects=[];this.uiContext=context;engineAddPlugin(uiUpdate,uiRender);function uiUpdate(){function updateObject(o){if(!o.visible)return;if(o.parent)o.pos=o.localPos.add(o.parent.pos);o.update();for(const c of o.children)updateObject(c)}uiSystem.uiObjects.forEach(o=>o.parent||updateObject(o))}function uiRender(){function renderObject(o){if(!o.visible)return;if(o.parent)o.pos=o.localPos.add(o.parent.pos);o.render();for(const c of o.children)renderObject(c)}uiSystem.uiObjects.forEach(o=>o.parent||renderObject(o))}}drawRect(pos,size,color=uiSystem.defaultColor,lineWidth=uiSystem.defaultLineWidth,lineColor=uiSystem.defaultLineColor){uiSystem.uiContext.fillStyle=color.toString();uiSystem.uiContext.beginPath();uiSystem.uiContext.rect(pos.x-size.x/2,pos.y-size.y/2,size.x,size.y);uiSystem.uiContext.fill();if(lineWidth){uiSystem.uiContext.strokeStyle=lineColor.toString();uiSystem.uiContext.lineWidth=lineWidth;uiSystem.uiContext.stroke()}}drawLine(posA,posB,lineWidth=uiSystem.defaultLineWidth,lineColor=uiSystem.defaultLineColor){uiSystem.uiContext.strokeStyle=lineColor.toString();uiSystem.uiContext.lineWidth=lineWidth;uiSystem.uiContext.beginPath();uiSystem.uiContext.lineTo(posA.x,posA.y);uiSystem.uiContext.lineTo(posB.x,posB.y);uiSystem.uiContext.stroke()}drawTile(pos,size,tileInfo,color=uiSystem.defaultColor,angle=0,mirror=false){drawTile(pos,size,tileInfo,color,angle,mirror,BLACK,false,true,uiSystem.uiContext)}drawText(text,pos,size,color=uiSystem.defaultColor,lineWidth=uiSystem.defaultLineWidth,lineColor=uiSystem.defaultLineColor,align="center",font=uiSystem.defaultFont){drawTextScreen(text,pos,size.y,color,lineWidth,lineColor,align,font,size.x,uiSystem.uiContext)}}class UIObject{constructor(pos=vec2(),size=vec2()){this.localPos=pos.copy();this.pos=pos.copy();this.size=size.copy();this.color=uiSystem.defaultColor;this.lineColor=uiSystem.defaultLineColor;this.textColor=uiSystem.defaultTextColor;this.hoverColor=uiSystem.defaultHoverColor;this.lineWidth=uiSystem.defaultLineWidth;this.font=uiSystem.defaultFont;this.visible=true;this.children=[];this.parent=undefined;uiSystem.uiObjects.push(this)}addChild(child){ASSERT(!child.parent&&!this.children.includes(child));this.children.push(child);child.parent=this}removeChild(child){ASSERT(child.parent==this&&this.children.includes(child));this.children.splice(this.children.indexOf(child),1);child.parent=undefined}update(){const mouseWasOver=this.mouseIsOver;const mouseDown=mouseIsDown(0);if(!mouseDown||isTouchDevice){this.mouseIsOver=isOverlapping(this.pos,this.size,mousePosScreen);if(!mouseDown&&isTouchDevice)this.mouseIsOver=false;if(this.mouseIsOver&&!mouseWasOver)this.onEnter();if(!this.mouseIsOver&&mouseWasOver)this.onLeave()}if(mouseWasPressed(0)&&this.mouseIsOver){this.mouseIsHeld=true;this.onPress();if(isTouchDevice)this.mouseIsOver=false}else if(this.mouseIsHeld&&!mouseDown){this.mouseIsHeld=false;this.onRelease()}}render(){if(this.size.x&&this.size.y)uiSystem.drawRect(this.pos,this.size,this.color,this.lineWidth,this.lineColor)}onEnter(){}onLeave(){}onPress(){}onRelease(){}onChange(){}}class UIText extends UIObject{constructor(pos,size,text="",align="center",font=uiSystem.defaultFont){super(pos,size);this.text=text;this.align=align;this.font=font;this.lineWidth=0}render(){uiSystem.drawText(this.text,this.pos,this.size,this.textColor,this.lineWidth,this.lineColor,this.align,this.font)}}class UITile extends UIObject{constructor(pos,size,tileInfo,color=WHITE,angle=0,mirror=false){super(pos,size);this.tileInfo=tileInfo;this.angle=angle;this.mirror=mirror;this.color=color}render(){uiSystem.drawTile(this.pos,this.size,this.tileInfo,this.color,this.angle,this.mirror)}}class UIButton extends UIObject{constructor(pos,size,text="",color=uiSystem.defaultButtonColor){super(pos,size);this.text=text;this.color=color}render(){const lineColor=this.mouseIsHeld?this.color:this.lineColor;const color=this.mouseIsOver?this.hoverColor:this.color;uiSystem.drawRect(this.pos,this.size,color,this.lineWidth,lineColor);const textSize=vec2(this.size.x,this.size.y*.8);uiSystem.drawText(this.text,this.pos,textSize,this.textColor,0,undefined,this.align,this.font)}}class UICheckbox extends UIObject{constructor(pos,size,checked=false){super(pos,size);this.checked=checked}onPress(){this.checked=!this.checked;this.onChange()}render(){const color=this.mouseIsOver?this.hoverColor:this.color;uiSystem.drawRect(this.pos,this.size,color,this.lineWidth,this.lineColor);if(this.checked){uiSystem.drawLine(this.pos.add(this.size.multiply(vec2(-.5,-.5))),this.pos.add(this.size.multiply(vec2(.5,.5))),this.lineWidth,this.lineColor);uiSystem.drawLine(this.pos.add(this.size.multiply(vec2(-.5,.5))),this.pos.add(this.size.multiply(vec2(.5,-.5))),this.lineWidth,this.lineColor)}}}class UIScrollbar extends UIObject{constructor(pos,size,value=.5,text="",color=uiSystem.defaultButtonColor,handleColor=WHITE){super(pos,size);this.value=value;this.text=text;this.color=color;this.handleColor=handleColor}update(){super.update();if(this.mouseIsHeld){const handleSize=vec2(this.size.y);const handleWidth=this.size.x-handleSize.x;const p1=this.pos.x-handleWidth/2;const p2=this.pos.x+handleWidth/2;const oldValue=this.value;this.value=percent(mousePosScreen.x,p1,p2);this.value==oldValue||this.onChange()}}render(){const lineColor=this.mouseIsHeld?this.color:this.lineColor;const color=this.mouseIsOver?this.hoverColor:this.color;uiSystem.drawRect(this.pos,this.size,color,this.lineWidth,lineColor);const handleSize=vec2(this.size.y);const handleWidth=this.size.x-handleSize.x;const p1=this.pos.x-handleWidth/2;const p2=this.pos.x+handleWidth/2;const handlePos=vec2(lerp(this.value,p1,p2),this.pos.y);const barColor=this.mouseIsHeld?this.color:this.handleColor;uiSystem.drawRect(handlePos,handleSize,barColor,this.lineWidth,this.lineColor);const textSize=vec2(this.size.x,this.size.y*.8);uiSystem.drawText(this.text,this.pos,textSize,this.textColor,0,undefined,this.align,this.font)}}let box2d;let box2dDebug=false;function box2dSetDebug(enable){box2dDebug=enable}class Box2dObject extends EngineObject{constructor(pos=vec2(),size,tileInfo,angle=0,color,bodyType=box2d.bodyTypeDynamic,renderOrder=0){super(pos,size,tileInfo,angle,color,renderOrder);const bodyDef=new box2d.instance.b2BodyDef;bodyDef.set_type(bodyType);bodyDef.set_position(box2d.vec2dTo(pos));bodyDef.set_angle(-angle);this.body=box2d.world.CreateBody(bodyDef);this.body.object=this;this.outlineColor=BLACK}destroy(){this.body&&box2d.world.DestroyBody(this.body);this.body=0;super.destroy()}update(){this.pos=box2d.vec2From(this.body.GetPosition());this.angle=-this.body.GetAngle()}render(){if(this.tileInfo)super.render();else this.drawFixtures(this.color,this.outlineColor,this.lineWidth,mainContext)}renderDebugInfo(){const isAsleep=!this.getIsAwake();const isStatic=this.getBodyType()==box2d.bodyTypeStatic;const color=rgb(isAsleep?1:0,isAsleep?1:0,isStatic?1:0,.5);this.drawFixtures(color)}drawFixtures(color=WHITE,outlineColor,lineWidth=.1,context){this.getFixtureList().forEach(fixture=>box2d.drawFixture(fixture,this.pos,this.angle,color,outlineColor,lineWidth,context))}beginContact(otherObject){}endContact(otherObject){}addShape(shape,density=1,friction=.2,restitution=0,isSensor=false){const fd=new box2d.instance.b2FixtureDef;fd.set_shape(shape);fd.set_density(density);fd.set_friction(friction);fd.set_restitution(restitution);fd.set_isSensor(isSensor);return this.body.CreateFixture(fd)}addBox(size=vec2(1),offset=vec2(),angle=0,density,friction,restitution,isSensor){const shape=new box2d.instance.b2PolygonShape;shape.SetAsBox(size.x/2,size.y/2,box2d.vec2dTo(offset),angle);return this.addShape(shape,density,friction,restitution,isSensor)}addPoly(points,density,friction,restitution,isSensor){function box2dCreatePolygonShape(points){function box2dCreatePointList(points){const buffer=box2d.instance._malloc(points.length*8);for(let i=0,offset=0;i<points.length;++i){box2d.instance.HEAPF32[buffer+offset>>2]=points[i].x;offset+=4;box2d.instance.HEAPF32[buffer+offset>>2]=points[i].y;offset+=4}return box2d.instance.wrapPointer(buffer,box2d.instance.b2Vec2)}ASSERT(3<=points.length&&points.length<=8);const shape=new box2d.instance.b2PolygonShape;const box2dPoints=box2dCreatePointList(points);shape.Set(box2dPoints,points.length);return shape}const shape=box2dCreatePolygonShape(points);return this.addShape(shape,density,friction,restitution,isSensor)}addRegularPoly(diameter=1,sides=8,density,friction,restitution,isSensor){const points=[];const radius=diameter/2;for(let i=sides;i--;)points.push(vec2(radius,0).rotate((i+.5)/sides*PI*2));return this.addPoly(points,density,friction,restitution,isSensor)}addRandomPoly(diameter=1,density,friction,restitution,isSensor){const sides=randInt(3,9);const points=[];const radius=diameter/2;for(let i=sides;i--;)points.push(vec2(rand(radius/2,radius*1.5),0).rotate(i/sides*PI*2));return this.addPoly(points,density,friction,restitution,isSensor)}addCircle(diameter=1,offset=vec2(),density,friction,restitution,isSensor){const shape=new box2d.instance.b2CircleShape;shape.set_m_p(box2d.vec2dTo(offset));shape.set_m_radius(diameter/2);return this.addShape(shape,density,friction,restitution,isSensor)}addEdge(point1,point2,density,friction,restitution,isSensor){const shape=new box2d.instance.b2EdgeShape;shape.Set(box2d.vec2dTo(point1),box2d.vec2dTo(point2));return this.addShape(shape,density,friction,restitution,isSensor)}addEdgeLoop(points,density,friction,restitution,isSensor){const fixtures=[];const getPoint=i=>points[mod(i,points.length)];for(let i=0;i<points.length;++i){const shape=new box2d.instance.b2EdgeShape;shape.set_m_vertex0(box2d.vec2dTo(getPoint(i-1)));shape.set_m_vertex1(box2d.vec2dTo(getPoint(i+0)));shape.set_m_vertex2(box2d.vec2dTo(getPoint(i+1)));shape.set_m_vertex3(box2d.vec2dTo(getPoint(i+2)));const f=this.addShape(shape,density,friction,restitution,isSensor);fixtures.push(f)}return fixtures}addEdgeList(points,density,friction,restitution,isSensor){const fixtures=[];for(let i=0;i<points.length-1;++i){const shape=new box2d.instance.b2EdgeShape;points[i-1]&&shape.set_m_vertex0(box2d.vec2dTo(points[i-1]));points[i+0]&&shape.set_m_vertex1(box2d.vec2dTo(points[i+0]));points[i+1]&&shape.set_m_vertex2(box2d.vec2dTo(points[i+1]));points[i+2]&&shape.set_m_vertex3(box2d.vec2dTo(points[i+2]));const f=this.addShape(shape,density,friction,restitution,isSensor);fixtures.push(f)}return fixtures}getCenterOfMass(){return box2d.vec2From(this.body.GetWorldCenter())}getLinearVelocity(){return box2d.vec2From(this.body.GetLinearVelocity())}getAngularVelocity(){return this.body.GetAngularVelocity()}getMass(){return this.body.GetMass()}getInertia(){return this.body.GetInertia()}getIsAwake(){return this.body.IsAwake()}getBodyType(){return this.body.GetType()}setTransform(pos,angle){this.pos=pos;this.angle=angle;this.body.SetTransform(box2d.vec2dTo(pos),angle)}setPosition(pos){this.setTransform(pos,this.body.GetAngle())}setAngle(angle){this.setTransform(box2d.vec2From(this.body.GetPosition()),-angle)}setLinearVelocity(velocity){this.body.SetLinearVelocity(box2d.vec2dTo(velocity))}setAngularVelocity(angularVelocity){this.body.SetAngularVelocity(angularVelocity)}setLinearDamping(damping){this.body.SetLinearDamping(damping)}setAngularDamping(damping){this.body.SetAngularDamping(damping)}setGravityScale(scale=1){this.body.SetGravityScale(this.gravityScale=scale)}setBullet(isBullet=true){this.body.SetBullet(isBullet)}setAwake(isAwake=true){this.body.SetAwake(isAwake)}setBodyType(type){this.body.SetType(type)}setSleepingAllowed(isAllowed=true){this.body.SetSleepingAllowed(isAllowed)}setFixedRotation(isFixed=true){this.body.SetFixedRotation(isFixed)}setCenterOfMass(center){this.setMassData(center)}setMass(mass){this.setMassData(undefined,mass)}setMomentOfInertia(momentOfInertia){this.setMassData(undefined,undefined,momentOfInertia)}resetMassData(){this.body.ResetMassData()}setMassData(localCenter,mass,momentOfInertia){const data=new box2d.instance.b2MassData;this.body.GetMassData(data);localCenter&&data.set_center(box2d.vec2dTo(localCenter));mass&&data.set_mass(mass);momentOfInertia&&data.set_I(momentOfInertia);this.body.SetMassData(data)}setFilterData(categoryBits=0,ignoreCategoryBits=0,groupIndex=0){this.getFixtureList().forEach(fixture=>{const filter=fixture.GetFilterData();filter.set_categoryBits(categoryBits);filter.set_maskBits(65535&~ignoreCategoryBits);filter.set_groupIndex(groupIndex)})}setSensor(isSensor=true){this.getFixtureList().forEach(f=>f.SetSensor(isSensor))}applyForce(force,pos){pos||=this.getCenterOfMass();this.setAwake();this.body.ApplyForce(box2d.vec2dTo(force),box2d.vec2dTo(pos))}applyAcceleration(acceleration,pos){pos||=this.getCenterOfMass();this.setAwake();this.body.ApplyLinearImpulse(box2d.vec2dTo(acceleration),box2d.vec2dTo(pos))}applyTorque(torque){this.setAwake();this.body.ApplyTorque(torque)}applyAngularAcceleration(acceleration){this.setAwake();this.body.ApplyAngularImpulse(acceleration)}hasFixtures(){return!box2d.isNull(this.body.GetFixtureList())}getFixtureList(){const fixtures=[];for(let fixture=this.body.GetFixtureList();!box2d.isNull(fixture);){fixtures.push(fixture);fixture=fixture.GetNext()}return fixtures}hasJoints(){return!box2d.isNull(this.body.GetJointList())}getJointList(){const joints=[];for(let joint=this.body.GetJointList();!box2d.isNull(joint);){joints.push(joint);joint=joint.get_next()}return joints}}class Box2dRaycastResult{constructor(fixture,point,normal,fraction){this.object=fixture.GetBody().object;this.fixture=fixture;this.point=point;this.normal=normal;this.fraction=fraction}}class Box2dJoint{constructor(jointDef){this.box2dJoint=box2d.castObjectType(box2d.world.CreateJoint(jointDef))}destroy(){box2d.world.DestroyJoint(this.box2dJoint);this.box2dJoint=0}getObjectA(){return this.box2dJoint.GetBodyA().object}getObjectB(){return this.box2dJoint.GetBodyB().object}getAnchorA(){return box2d.vec2From(this.box2dJoint.GetAnchorA())}getAnchorB(){return box2d.vec2From(this.box2dJoint.GetAnchorB())}getReactionForce(time){return box2d.vec2From(this.box2dJoint.GetReactionForce(1/time))}getReactionTorque(time){return this.box2dJoint.GetReactionTorque(1/time)}getCollideConnected(){return this.box2dJoint.getCollideConnected()}isActive(){return this.box2dJoint.IsActive()}}class Box2dTargetJoint extends Box2dJoint{constructor(object,fixedObject,worldPos){object.setAwake();const jointDef=new box2d.instance.b2MouseJointDef;jointDef.set_bodyA(fixedObject.body);jointDef.set_bodyB(object.body);jointDef.set_target(box2d.vec2dTo(worldPos));jointDef.set_maxForce(2e3*object.getMass());super(jointDef)}setTarget(pos){this.box2dJoint.SetTarget(box2d.vec2dTo(pos))}getTarget(){return box2d.vec2From(this.box2dJoint.GetTarget())}setMaxForce(force){this.box2dJoint.SetMaxForce(force)}getMaxForce(){return this.box2dJoint.GetMaxForce()}setFrequency(hz){this.box2dJoint.SetFrequency(hz)}getFrequency(){return this.box2dJoint.GetFrequency()}}class Box2dDistanceJoint extends Box2dJoint{constructor(objectA,objectB,anchorA,anchorB,collide=false){anchorA||=box2d.vec2From(objectA.body.GetPosition());anchorB||=box2d.vec2From(objectB.body.GetPosition());const localAnchorA=objectA.worldToLocal(anchorA);const localAnchorB=objectB.worldToLocal(anchorB);const jointDef=new box2d.instance.b2DistanceJointDef;jointDef.set_bodyA(objectA.body);jointDef.set_bodyB(objectB.body);jointDef.set_localAnchorA(box2d.vec2dTo(localAnchorA));jointDef.set_localAnchorB(box2d.vec2dTo(localAnchorB));jointDef.set_length(anchorA.distance(anchorB));jointDef.set_collideConnected(collide);super(jointDef)}getLocalAnchorA(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorB())}setLength(length){this.box2dJoint.SetLength(length)}getLength(){return this.box2dJoint.GetLength()}setFrequency(hz){this.box2dJoint.SetFrequency(hz)}getFrequency(){return this.box2dJoint.GetFrequency()}setDampingRatio(ratio){this.box2dJoint.SetDampingRatio(ratio)}getDampingRatio(){return this.box2dJoint.GetDampingRatio()}}class Box2dPinJoint extends Box2dDistanceJoint{constructor(objectA,objectB,pos=objectA.pos,collide=false){super(objectA,objectB,undefined,pos,collide)}}class Box2dRopeJoint extends Box2dJoint{constructor(objectA,objectB,anchorA,anchorB,extraLength=0,collide=false){anchorA||=box2d.vec2From(objectA.body.GetPosition());anchorB||=box2d.vec2From(objectB.body.GetPosition());const localAnchorA=objectA.worldToLocal(anchorA);const localAnchorB=objectB.worldToLocal(anchorB);const jointDef=new box2d.instance.b2RopeJointDef;jointDef.set_bodyA(objectA.body);jointDef.set_bodyB(objectB.body);jointDef.set_localAnchorA(box2d.vec2dTo(localAnchorA));jointDef.set_localAnchorB(box2d.vec2dTo(localAnchorB));jointDef.set_maxLength(anchorA.distance(anchorB)+extraLength);jointDef.set_collideConnected(collide);super(jointDef)}getLocalAnchorA(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorB())}setMaxLength(length){this.box2dJoint.SetMaxLength(length)}getMaxLength(){return this.box2dJoint.GetMaxLength()}}class Box2dRevoluteJoint extends Box2dJoint{constructor(objectA,objectB,anchor,collide=false){anchor||=box2d.vec2From(objectB.body.GetPosition());const localAnchorA=objectA.worldToLocal(anchor);const localAnchorB=objectB.worldToLocal(anchor);const jointDef=new box2d.instance.b2RevoluteJointDef;jointDef.set_bodyA(objectA.body);jointDef.set_bodyB(objectB.body);jointDef.set_localAnchorA(box2d.vec2dTo(localAnchorA));jointDef.set_localAnchorB(box2d.vec2dTo(localAnchorB));jointDef.set_referenceAngle(objectA.body.GetAngle()-objectB.body.GetAngle());jointDef.set_collideConnected(collide);super(jointDef)}getLocalAnchorA(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorB())}getReferenceAngle(){return this.box2dJoint.GetReferenceAngle()}getJointAngle(){return this.box2dJoint.GetJointAngle()}getJointSpeed(){return this.box2dJoint.GetJointSpeed()}isLimitEnabled(){return this.box2dJoint.IsLimitEnabled()}enableLimit(enable=true){return this.box2dJoint.enableLimit(enable)}getLowerLimit(){return this.box2dJoint.GetLowerLimit()}getUpperLimit(){return this.box2dJoint.GetUpperLimit()}setLimits(min,max){return this.box2dJoint.SetLimits(min,max)}isMotorEnabled(){return this.box2dJoint.IsMotorEnabled()}enableMotor(enable=true){return this.box2dJoint.EnableMotor(enable)}setMotorSpeed(speed){return this.box2dJoint.SetMotorSpeed(speed)}getMotorSpeed(){return this.box2dJoint.GetMotorSpeed()}setMaxMotorTorque(torque){return this.box2dJoint.SetMaxMotorTorque(torque)}getMaxMotorTorque(){return this.box2dJoint.GetMaxMotorTorque()}getMotorTorque(time){return this.box2dJoint.GetMotorTorque(1/time)}}class Box2dGearJoint extends Box2dJoint{constructor(objectA,objectB,joint1,joint2,ratio=1){const jointDef=new box2d.instance.b2GearJointDef;jointDef.set_bodyA(objectA.body);jointDef.set_bodyB(objectB.body);jointDef.set_joint1(joint1.box2dJoint);jointDef.set_joint2(joint2.box2dJoint);jointDef.set_ratio(ratio);super(jointDef);this.joint1=joint1;this.joint2=joint2}getJoint1(){return this.joint1}getJoint2(){return this.joint2}setRatio(ratio){return this.box2dJoint.SetRatio(ratio)}getRatio(){return this.box2dJoint.GetRatio()}}class Box2dPrismaticJoint extends Box2dJoint{constructor(objectA,objectB,anchor,worldAxis=vec2(0,1),collide=false){anchor||=box2d.vec2From(objectB.body.GetPosition());const localAnchorA=objectA.worldToLocal(anchor);const localAnchorB=objectB.worldToLocal(anchor);const localAxisA=objectB.worldToLocalVector(worldAxis);const jointDef=new box2d.instance.b2PrismaticJointDef;jointDef.set_bodyA(objectA.body);jointDef.set_bodyB(objectB.body);jointDef.set_localAnchorA(box2d.vec2dTo(localAnchorA));jointDef.set_localAnchorB(box2d.vec2dTo(localAnchorB));jointDef.set_localAxisA(box2d.vec2dTo(localAxisA));jointDef.set_referenceAngle(objectA.body.GetAngle()-objectB.body.GetAngle());jointDef.set_collideConnected(collide);super(jointDef)}getLocalAnchorA(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorB())}getLocalAxisA(){return box2d.vec2From(this.box2dJoint.GetLocalAxisA())}getReferenceAngle(){return this.box2dJoint.GetReferenceAngle()}getJointTranslation(){return this.box2dJoint.GetJointTranslation()}getJointSpeed(){return this.box2dJoint.GetJointSpeed()}isLimitEnabled(){return this.box2dJoint.IsLimitEnabled()}enableLimit(enable=true){return this.box2dJoint.enableLimit(enable)}getLowerLimit(){return this.box2dJoint.GetLowerLimit()}getUpperLimit(){return this.box2dJoint.GetUpperLimit()}setLimits(min,max){return this.box2dJoint.SetLimits(min,max)}isMotorEnabled(){return this.box2dJoint.IsMotorEnabled()}enableMotor(enable=true){return this.box2dJoint.EnableMotor(enable)}setMotorSpeed(speed){return this.box2dJoint.SetMotorSpeed(speed)}getMotorSpeed(){return this.box2dJoint.GetMotorSpeed()}setMaxMotorForce(force){return this.box2dJoint.SetMaxMotorForce(force)}getMaxMotorForce(){return this.box2dJoint.GetMaxMotorForce()}getMotorForce(time){return this.box2dJoint.GetMotorForce(1/time)}}class Box2dWheelJoint extends Box2dJoint{constructor(objectA,objectB,anchor,worldAxis=vec2(0,1),collide=false){anchor||=box2d.vec2From(objectB.body.GetPosition());const localAnchorA=objectA.worldToLocal(anchor);const localAnchorB=objectB.worldToLocal(anchor);const localAxisA=objectB.worldToLocalVector(worldAxis);const jointDef=new box2d.instance.b2WheelJointDef;jointDef.set_bodyA(objectA.body);jointDef.set_bodyB(objectB.body);jointDef.set_localAnchorA(box2d.vec2dTo(localAnchorA));jointDef.set_localAnchorB(box2d.vec2dTo(localAnchorB));jointDef.set_localAxisA(box2d.vec2dTo(localAxisA));jointDef.set_collideConnected(collide);super(jointDef)}getLocalAnchorA(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorB())}getLocalAxisA(){return box2d.vec2From(this.box2dJoint.GetLocalAxisA())}getJointTranslation(){return this.box2dJoint.GetJointTranslation()}getJointSpeed(){return this.box2dJoint.GetJointSpeed()}isMotorEnabled(){return this.box2dJoint.IsMotorEnabled()}enableMotor(enable=true){return this.box2dJoint.EnableMotor(enable)}setMotorSpeed(speed){return this.box2dJoint.SetMotorSpeed(speed)}getMotorSpeed(){return this.box2dJoint.GetMotorSpeed()}setMaxMotorTorque(torque){return this.box2dJoint.SetMaxMotorTorque(torque)}getMaxMotorTorque(){return this.box2dJoint.GetMaxMotorTorque()}getMotorTorque(time){return this.box2dJoint.GetMotorTorque(1/time)}setSpringFrequencyHz(hz){return this.box2dJoint.SetSpringFrequencyHz(hz)}getSpringFrequencyHz(){return this.box2dJoint.GetSpringFrequencyHz()}setSpringDampingRatio(ratio){return this.box2dJoint.SetSpringDampingRatio(ratio)}getSpringDampingRatio(){return this.box2dJoint.GetSpringDampingRatio()}}class Box2dWeldJoint extends Box2dJoint{constructor(objectA,objectB,anchor,collide=false){anchor||=box2d.vec2From(objectB.body.GetPosition());const localAnchorA=objectA.worldToLocal(anchor);const localAnchorB=objectB.worldToLocal(anchor);const jointDef=new box2d.instance.b2WeldJointDef;jointDef.set_bodyA(objectA.body);jointDef.set_bodyB(objectB.body);jointDef.set_localAnchorA(box2d.vec2dTo(localAnchorA));jointDef.set_localAnchorB(box2d.vec2dTo(localAnchorB));jointDef.set_referenceAngle(objectA.body.GetAngle()-objectB.body.GetAngle());jointDef.set_collideConnected(collide);super(jointDef)}getLocalAnchorA(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorB())}getReferenceAngle(){return this.box2dJoint.GetReferenceAngle()}setFrequency(hz){return this.box2dJoint.SetFrequency(hz)}getFrequency(){return this.box2dJoint.GetFrequency()}setSpringDampingRatio(ratio){return this.box2dJoint.SetSpringDampingRatio(ratio)}getSpringDampingRatio(){return this.box2dJoint.GetSpringDampingRatio()}}class Box2dFrictionJoint extends Box2dJoint{constructor(objectA,objectB,anchor,collide=false){anchor||=box2d.vec2From(objectB.body.GetPosition());const localAnchorA=objectA.worldToLocal(anchor);const localAnchorB=objectB.worldToLocal(anchor);const jointDef=new box2d.instance.b2FrictionJointDef;jointDef.set_bodyA(objectA.body);jointDef.set_bodyB(objectB.body);jointDef.set_localAnchorA(box2d.vec2dTo(localAnchorA));jointDef.set_localAnchorB(box2d.vec2dTo(localAnchorB));jointDef.set_collideConnected(collide);super(jointDef)}getLocalAnchorA(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorA())}getLocalAnchorB(){return box2d.vec2From(this.box2dJoint.GetLocalAnchorB())}setMaxForce(force){this.box2dJoint.SetMaxForce(force)}getMaxForce(){return this.box2dJoint.GetMaxForce()}setMaxTorque(torque){this.box2dJoint.SetMaxTorque(torque)}getMaxTorque(){return this.box2dJoint.GetMaxTorque()}}class Box2dPulleyJoint extends Box2dJoint{constructor(objectA,objectB,groundAnchorA,groundAnchorB,anchorA,anchorB,ratio=1,collide=false){anchorA||=box2d.vec2From(objectA.body.GetPosition());anchorB||=box2d.vec2From(objectB.body.GetPosition());const localAnchorA=objectA.worldToLocal(anchorA);const localAnchorB=objectB.worldToLocal(anchorB);const jointDef=new box2d.instance.b2PulleyJointDef;jointDef.set_bodyA(objectA.body);jointDef.set_bodyB(objectB.body);jointDef.set_groundAnchorA(box2d.vec2dTo(groundAnchorA));jointDef.set_groundAnchorB(box2d.vec2dTo(groundAnchorB));jointDef.set_localAnchorA(box2d.vec2dTo(localAnchorA));jointDef.set_localAnchorB(box2d.vec2dTo(localAnchorB));jointDef.set_ratio(ratio);jointDef.set_lengthA(groundAnchorA.distance(anchorA));jointDef.set_lengthB(groundAnchorB.distance(anchorB));jointDef.set_collideConnected(collide);super(jointDef)}getGroundAnchorA(){return box2d.vec2From(this.box2dJoint.GetGroundAnchorA())}getGroundAnchorB(){return box2d.vec2From(this.box2dJoint.GetGroundAnchorB())}getLengthA(){return this.box2dJoint.GetLengthA()}getLengthB(){return this.box2dJoint.GetLengthB()}getRatio(){return this.box2dJoint.GetRatio()}getCurrentLengthA(){return this.box2dJoint.GetCurrentLengthA()}getCurrentLengthB(){return this.box2dJoint.GetCurrentLengthB()}}class Box2dMotorJoint extends Box2dJoint{constructor(objectA,objectB){const linearOffset=objectA.worldToLocal(box2d.vec2From(objectB.body.GetPosition()));const angularOffset=objectB.body.GetAngle()-objectA.body.GetAngle();const jointDef=new box2d.instance.b2MotorJointDef;jointDef.set_bodyA(objectA.body);jointDef.set_bodyB(objectB.body);jointDef.set_linearOffset(box2d.vec2dTo(linearOffset));jointDef.set_angularOffset(angularOffset);super(jointDef)}setLinearOffset(offset){this.box2dJoint.SetLinearOffset(box2d.vec2dTo(offset))}getLinearOffset(){return box2d.vec2From(this.box2dJoint.GetLinearOffset())}setAngularOffset(offset){this.box2dJoint.SetAngularOffset(offset)}getAngularOffset(){return this.box2dJoint.GetAngularOffset()}setMaxForce(force){this.box2dJoint.SetMaxForce(force)}getMaxForce(){return this.box2dJoint.GetMaxForce()}setMaxTorque(torque){this.box2dJoint.SetMaxTorque(torque)}getMaxTorque(){return this.box2dJoint.GetMaxTorque()}setCorrectionFactor(factor){this.box2dJoint.SetCorrectionFactor(factor)}getCorrectionFactor(){return this.box2dJoint.GetCorrectionFactor()}}class Box2dPlugin{constructor(instance){ASSERT(!box2d,"Box2D already initialized");box2d=this;this.instance=instance;this.world=new box2d.instance.b2World;this.velocityIterations=8;this.positionIterations=3;this.bodyTypeStatic=instance.b2_staticBody;this.bodyTypeKinematic=instance.b2_kinematicBody;this.bodyTypeDynamic=instance.b2_dynamicBody;const listener=new box2d.instance.JSContactListener;listener.BeginContact=function(contactPtr){const contact=box2d.instance.wrapPointer(contactPtr,box2d.instance.b2Contact);const fixtureA=contact.GetFixtureA();const fixtureB=contact.GetFixtureB();const objectA=fixtureA.GetBody().object;const objectB=fixtureB.GetBody().object;objectA.beginContact(objectB);objectB.beginContact(objectA)};listener.EndContact=function(contactPtr){const contact=box2d.instance.wrapPointer(contactPtr,box2d.instance.b2Contact);const fixtureA=contact.GetFixtureA();const fixtureB=contact.GetFixtureB();const objectA=fixtureA.GetBody().object;const objectB=fixtureB.GetBody().object;objectA.endContact(objectB);objectB.endContact(objectA)};listener.PreSolve=function(){};listener.PostSolve=function(){};box2d.world.SetContactListener(listener)}step(frames=1){box2d.world.SetGravity(box2d.vec2dTo(gravity));for(let i=frames;i--;)box2d.world.Step(timeDelta,this.velocityIterations,this.positionIterations)}raycastAll(start,end){const raycastCallback=new box2d.instance.JSRayCastCallback;raycastCallback.ReportFixture=function(fixturePointer,point,normal,fraction){const fixture=box2d.instance.wrapPointer(fixturePointer,box2d.instance.b2Fixture);point=box2d.vec2FromPointer(point);normal=box2d.vec2FromPointer(normal);raycastResults.push(new Box2dRaycastResult(fixture,point,normal,fraction));return 1};const raycastResults=[];box2d.world.RayCast(raycastCallback,box2d.vec2dTo(start),box2d.vec2dTo(end));debugRaycast&&debugLine(start,end,raycastResults.length?"#f00":"#00f",.02);return raycastResults}raycast(start,end){const raycastResults=box2d.raycastAll(start,end);if(!raycastResults.length)return undefined;return raycastResults.reduce((a,b)=>a.fraction<b.fraction?a:b)}boxCastAll(pos,size){const queryCallback=new box2d.instance.JSQueryCallback;queryCallback.ReportFixture=function(fixturePointer){const fixture=box2d.instance.wrapPointer(fixturePointer,box2d.instance.b2Fixture);const o=fixture.GetBody().object;if(!queryObjects.includes(o))queryObjects.push(o);return true};const aabb=new box2d.instance.b2AABB;aabb.set_lowerBound(box2d.vec2dTo(pos.subtract(size.scale(.5))));aabb.set_upperBound(box2d.vec2dTo(pos.add(size.scale(.5))));let queryObjects=[];box2d.world.QueryAABB(queryCallback,aabb);debugRaycast&&debugRect(pos,size,queryObjects.length?"#f00":"#00f",.02);return queryObjects}boxCast(pos,size){const queryCallback=new box2d.instance.JSQueryCallback;queryCallback.ReportFixture=function(fixturePointer){const fixture=box2d.instance.wrapPointer(fixturePointer,box2d.instance.b2Fixture);queryObject=fixture.GetBody().object;return false};const aabb=new box2d.instance.b2AABB;aabb.set_lowerBound(box2d.vec2dTo(pos.subtract(size.scale(.5))));aabb.set_upperBound(box2d.vec2dTo(pos.add(size.scale(.5))));let queryObject;box2d.world.QueryAABB(queryCallback,aabb);debugRaycast&&debugRect(pos,size,queryObject?"#f00":"#00f",.02);return queryObject}circleCastAll(pos,diameter){const radius2=(diameter/2)**2;const results=box2d.boxCastAll(pos,vec2(diameter));return results.filter(o=>o.pos.distanceSquared(pos)<radius2)}circleCast(pos,diameter){const radius2=(diameter/2)**2;let results=box2d.boxCastAll(pos,vec2(diameter));let bestResult,bestDistance2;for(const result of results){const distance2=result.pos.distanceSquared(pos);if(distance2<radius2&&(!bestResult||distance2<bestDistance2)){bestResult=result;bestDistance2=distance2}}return bestResult}pointCast(pos,dynamicOnly=true){const queryCallback=new box2d.instance.JSQueryCallback;queryCallback.ReportFixture=function(fixturePointer){const fixture=box2d.instance.wrapPointer(fixturePointer,box2d.instance.b2Fixture);if(dynamicOnly&&fixture.GetBody().GetType()!=box2d.instance.b2_dynamicBody)return true;if(!fixture.TestPoint(box2d.vec2dTo(pos)))return true;queryObject=fixture.GetBody().object;return false};const aabb=new box2d.instance.b2AABB;aabb.set_lowerBound(box2d.vec2dTo(pos));aabb.set_upperBound(box2d.vec2dTo(pos));let queryObject;box2d.world.QueryAABB(queryCallback,aabb);debugRaycast&&debugRect(pos,vec2(),queryObject?"#f00":"#00f",.02);return queryObject}drawFixture(fixture,pos,angle,color=WHITE,outlineColor=BLACK,lineWidth=.1,context=mainContext){const shape=box2d.castObjectType(fixture.GetShape());switch(shape.GetType()){case box2d.instance.b2Shape.e_polygon:{let points=[];for(let i=shape.GetVertexCount();i--;)points.push(box2d.vec2From(shape.GetVertex(i)));box2d.drawPoly(pos,angle,points,color,outlineColor,lineWidth,context);break}case box2d.instance.b2Shape.e_circle:{const radius=shape.get_m_radius();box2d.drawCircle(pos,radius,color,outlineColor,lineWidth,context);break}case box2d.instance.b2Shape.e_edge:{const v1=box2d.vec2From(shape.get_m_vertex1());const v2=box2d.vec2From(shape.get_m_vertex2());box2d.drawLine(pos,angle,v1,v2,color,lineWidth,context);break}}}drawCircle(pos,radius,color=WHITE,outlineColor=BLACK,lineWidth=.1,context=mainContext){drawCanvas2D(pos,vec2(1),0,0,context=>{context.beginPath();context.arc(0,0,radius,0,9);box2d.drawFillStroke(color,outlineColor,lineWidth,context)},0,context)}drawPoly(pos,angle,points,color=WHITE,outlineColor=BLACK,lineWidth=.1,context=mainContext){drawCanvas2D(pos,vec2(1),angle,0,context=>{context.beginPath();points.forEach(p=>context.lineTo(p.x,p.y));context.closePath();box2d.drawFillStroke(color,outlineColor,lineWidth,context)},0,context)}drawLine(pos,angle,posA,posB,color=WHITE,lineWidth=.1,context=mainContext){drawCanvas2D(pos,vec2(1),angle,0,context=>{context.beginPath();context.lineTo(posA.x,posA.y);context.lineTo(posB.x,posB.y);box2d.drawFillStroke(0,color,lineWidth,context)},0,context)}drawFillStroke(color=WHITE,outlineColor=BLACK,lineWidth=.1,context=mainContext){if(color){context.fillStyle=color.toString();context.fill()}if(outlineColor&&lineWidth){context.lineWidth=lineWidth;context.lineJoin=context.lineCap="round";context.strokeStyle=outlineColor.toString();context.stroke()}}vec2From(v){ASSERT(v instanceof box2d.instance.b2Vec2);return new Vector2(v.get_x(),v.get_y())}vec2FromPointer(v){return box2d.vec2From(box2d.instance.wrapPointer(v,box2d.instance.b2Vec2))}vec2dTo(v){ASSERT(v instanceof Vector2);return new box2d.instance.b2Vec2(v.x,v.y)}isNull(o){return!box2d.instance.getPointer(o)}castObjectType(o){switch(o.GetType()){case box2d.instance.b2Shape.e_circle:return box2d.instance.castObject(o,box2d.instance.b2CircleShape);case box2d.instance.b2Shape.e_edge:return box2d.instance.castObject(o,box2d.instance.b2EdgeShape);case box2d.instance.b2Shape.e_polygon:return box2d.instance.castObject(o,box2d.instance.b2PolygonShape);case box2d.instance.b2Shape.e_chain:return box2d.instance.castObject(o,box2d.instance.b2ChainShape);case box2d.instance.e_revoluteJoint:return box2d.instance.castObject(o,box2d.instance.b2RevoluteJoint);case box2d.instance.e_prismaticJoint:return box2d.instance.castObject(o,box2d.instance.b2PrismaticJoint);case box2d.instance.e_distanceJoint:return box2d.instance.castObject(o,box2d.instance.b2DistanceJoint);case box2d.instance.e_pulleyJoint:return box2d.instance.castObject(o,box2d.instance.b2PulleyJoint);case box2d.instance.e_mouseJoint:return box2d.instance.castObject(o,box2d.instance.b2MouseJoint);case box2d.instance.e_gearJoint:return box2d.instance.castObject(o,box2d.instance.b2GearJoint);case box2d.instance.e_wheelJoint:return box2d.instance.castObject(o,box2d.instance.b2WheelJoint);case box2d.instance.e_weldJoint:return box2d.instance.castObject(o,box2d.instance.b2WeldJoint);case box2d.instance.e_frictionJoint:return box2d.instance.castObject(o,box2d.instance.b2FrictionJoint);case box2d.instance.e_ropeJoint:return box2d.instance.castObject(o,box2d.instance.b2RopeJoint);case box2d.instance.e_motorJoint:return box2d.instance.castObject(o,box2d.instance.b2MotorJoint)}ASSERT(false,"Unknown box2d object type")}}function box2dEngineInit(gameInit,gameUpdate,gameUpdatePost,gameRender,gameRenderPost,imageSources,rootElement){Box2D().then(box2dInstance=>{new Box2dPlugin(box2dInstance);setupDebugDraw();engineAddPlugin(box2dUpdate,box2dRender);engineInit(gameInit,gameUpdate,gameUpdatePost,gameRender,gameRenderPost,imageSources,rootElement)});function box2dUpdate(){if(!paused)box2d.step()}function box2dRender(){if(box2dDebug||debugPhysics&&debugOverlay)box2d.world.DrawDebugData()}function setupDebugDraw(){const debugDraw=new box2d.instance.JSDraw;const box2dColor=c=>new Color(c.get_r(),c.get_g(),c.get_b());const box2dColorPointer=c=>box2dColor(box2d.instance.wrapPointer(c,box2d.instance.b2Color));const getDebugColor=color=>box2dColorPointer(color).scale(1,.8);const getPointsList=(vertices,vertexCount)=>{const points=[];for(let i=vertexCount;i--;)points.push(box2d.vec2FromPointer(vertices+i*8));return points};debugDraw.DrawSegment=function(point1,point2,color){color=getDebugColor(color);point1=box2d.vec2FromPointer(point1);point2=box2d.vec2FromPointer(point2);box2d.drawLine(vec2(),0,point1,point2,color,undefined,overlayContext)};debugDraw.DrawPolygon=function(vertices,vertexCount,color){color=getDebugColor(color);const points=getPointsList(vertices,vertexCount);box2d.drawPoly(vec2(),0,points,undefined,color,undefined,overlayContext)};debugDraw.DrawSolidPolygon=function(vertices,vertexCount,color){color=getDebugColor(color);const points=getPointsList(vertices,vertexCount);box2d.drawPoly(vec2(),0,points,color,color,undefined,overlayContext)};debugDraw.DrawCircle=function(center,radius,color){color=getDebugColor(color);center=box2d.vec2FromPointer(center);box2d.drawCircle(center,radius,undefined,color,undefined,overlayContext)};debugDraw.DrawSolidCircle=function(center,radius,axis,color){color=getDebugColor(color);center=box2d.vec2FromPointer(center);axis=box2d.vec2FromPointer(axis).scale(radius);box2d.drawCircle(center,radius,color,color,undefined,overlayContext);box2d.drawLine(center,0,vec2(),axis,color,undefined,overlayContext)};debugDraw.DrawTransform=function(transform){transform=box2d.instance.wrapPointer(transform,box2d.instance.b2Transform);const pos=vec2(transform.get_p());const angle=-transform.get_q().GetAngle();const p1=vec2(1,0),c1=rgb(.75,0,0,.8);const p2=vec2(0,1),c2=rgb(0,.75,0,.8);box2d.drawLine(pos,angle,vec2(),p1,c1,undefined,overlayContext);box2d.drawLine(pos,angle,vec2(),p2,c2,undefined,overlayContext)};debugDraw.AppendFlags(box2d.instance.b2Draw.e_shapeBit);debugDraw.AppendFlags(box2d.instance.b2Draw.e_jointBit);box2d.world.SetDebugDraw(debugDraw)}}export{engineName,engineVersion,frameRate,timeDelta,engineObjects,frame,time,timeReal,paused,setPaused,engineInit,engineObjectsUpdate,engineObjectsDestroy,engineObjectsCollect,engineObjectsCallback,engineObjectsRaycast,engineAddPlugin,debug,debugOverlay,showWatermark,ASSERT,debugRect,debugPoly,debugCircle,debugPoint,debugLine,debugOverlap,debugText,debugClear,debugScreenshot,debugSaveCanvas,debugSaveText,debugSaveDataURL,debugShowErrors,debugVideoCaptureIsActive,debugVideoCaptureStart,debugVideoCaptureStop,cameraPos,cameraScale,canvasMaxSize,canvasFixedSize,canvasPixelated,tilesPixelated,fontDefault,showSplashScreen,headlessMode,tileSizeDefault,tileFixBleedScale,enablePhysicsSolver,objectDefaultMass,objectDefaultDamping,objectDefaultAngleDamping,objectDefaultElasticity,objectDefaultFriction,objectMaxSpeed,gravity,particleEmitRateScale,glEnable,glOverlay,gamepadsEnable,gamepadDirectionEmulateStick,inputWASDEmulateDirection,touchGamepadEnable,touchGamepadAnalog,touchGamepadSize,touchGamepadAlpha,vibrateEnable,soundEnable,soundVolume,soundDefaultRange,soundDefaultTaper,medalDisplayTime,medalDisplaySlideTime,medalDisplaySize,setCameraPos,setCameraScale,setCanvasMaxSize,setCanvasFixedSize,setCanvasPixelated,setTilesPixelated,setFontDefault,setShowSplashScreen,setHeadlessMode,setGlEnable,setGlOverlay,setTileSizeDefault,setTileFixBleedScale,setEnablePhysicsSolver,setObjectDefaultMass,setObjectDefaultDamping,setObjectDefaultAngleDamping,setObjectDefaultElasticity,setObjectDefaultFriction,setObjectMaxSpeed,setGravity,setParticleEmitRateScale,setTouchInputEnable,setGamepadsEnable,setGamepadDirectionEmulateStick,setInputWASDEmulateDirection,setTouchGamepadEnable,setTouchGamepadAnalog,setTouchGamepadSize,setTouchGamepadAlpha,setVibrateEnable,setSoundEnable,setSoundVolume,setSoundDefaultRange,setSoundDefaultTaper,setMedalDisplayTime,setMedalDisplaySlideTime,setMedalDisplaySize,setMedalsPreventUnlock,setShowWatermark,setDebugKey,PI,abs,min,max,sign,mod,clamp,percent,distanceWrap,lerpWrap,distanceAngle,lerpAngle,lerp,smoothStep,nearestPowerOfTwo,isOverlapping,isIntersecting,wave,formatTime,rand,randInt,randSign,randInCircle,randVector,randColor,RandomGenerator,Vector2,Color,Timer,vec2,rgb,hsl,isColor,WHITE,BLACK,GRAY,RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,MAGENTA,textureInfos,tile,TileInfo,TextureInfo,mainCanvas,mainContext,overlayCanvas,overlayContext,mainCanvasSize,screenToWorld,worldToScreen,drawTile,drawRect,drawLine,drawPoly,drawEllipse,drawCircle,drawCanvas2D,drawText,drawTextOverlay,drawTextScreen,setBlendMode,combineCanvases,engineFontImage,FontImage,isFullscreen,toggleFullscreen,setCursor,getCameraSize,glCanvas,glContext,glCompileShader,glCopyToContext,glCreateProgram,glCreateTexture,glSetTextureData,glDraw,glFlush,glSetTexture,glSetAntialias,glClearCanvas,glAntialias,glShader,glActiveTexture,glArrayBuffer,glGeometryBuffer,glPositionData,glColorData,glInstanceCount,glAdditive,glBatchAdditive,keyIsDown,keyWasPressed,keyWasReleased,keyDirection,clearInput,mouseIsDown,mouseWasPressed,mouseWasReleased,mousePos,mousePosScreen,mouseWheel,isUsingGamepad,inputPreventDefault,setInputPreventDefault,gamepadIsDown,gamepadWasPressed,gamepadWasReleased,gamepadStick,gamepadsUpdate,vibrate,vibrateStop,isTouchDevice,Sound,SoundWave,playAudioFile,speak,speakStop,getNoteFrequency,playSamples,zzfx,zzfxG,zzfxR,audioContext,EngineObject,tileCollisionLayers,getTileCollisionData,tileCollisionTest,tileCollisionRaycast,TileLayerData,TileLayer,TileCollisionLayer,ParticleEmitter,Particle,medals,medalsPreventUnlock,medalsInit,Medal};export{newgrounds,NewgroundsPlugin,NewgroundsMedal,postProcess,PostProcessPlugin,ZzFXMusic,uiSystem,UISystemPlugin,UIObject,UIText,UITile,UIButton,UICheckbox,UIScrollbar,box2d,box2dDebug,box2dSetDebug,box2dEngineInit,Box2dPlugin,Box2dObject,Box2dRaycastResult,Box2dJoint,Box2dTargetJoint,Box2dDistanceJoint,Box2dPinJoint,Box2dRopeJoint,Box2dRevoluteJoint,Box2dGearJoint,Box2dPrismaticJoint,Box2dWheelJoint,Box2dWeldJoint,Box2dFrictionJoint,Box2dPulleyJoint,Box2dMotorJoint};