@knopkem/little-game-engine-ts
Version:
LittleGameEngineTS - Tiny and Fast HTML5 Game Engine typescript port of LittleJS
2 lines • 41.4 kB
JavaScript
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["@knopkem/little-game-engine-ts"]=t():e["@knopkem/little-game-engine-ts"]=t()}(self,(function(){return(()=>{"use strict";var e={d:(t,i)=>{for(var s in i)e.o(i,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:i[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{ASSERT:()=>vi,Color:()=>A,EngineObject:()=>et,FPS:()=>hs,Medal:()=>Je,Music:()=>ge,Newgrounds:()=>Ze,PI:()=>i,ParticleEmitter:()=>tt,Sound:()=>ue,TileLayer:()=>ut,TileLayerData:()=>dt,Timer:()=>R,Vector2:()=>z,abs:()=>n,audioVolume:()=>ne,cameraPos:()=>V,cameraScale:()=>$,clamp:()=>c,clearInput:()=>Ae,copyGamepadDirectionToStick:()=>te,copyWASDToDpad:()=>ie,debug:()=>li,debugAABB:()=>Ei,debugCircle:()=>Ti,debugClear:()=>Ri,debugFPS:()=>zs,debugGamepads:()=>Si,debugInit:()=>Mi,debugLine:()=>zi,debugMedals:()=>bi,debugOverlay:()=>pi,debugParticleSettings:()=>Li,debugParticles:()=>xi,debugPhysics:()=>yi,debugPoint:()=>Ci,debugPointSize:()=>ci,debugPrimitives:()=>fi,debugRaycast:()=>mi,debugRect:()=>wi,debugRender:()=>Pi,debugSaveCanvas:()=>Di,debugTakeScreenshot:()=>ui,debugText:()=>Ai,debugToggleParticleEditor:()=>Fi,debugUpdate:()=>_i,defaultFont:()=>I,defaultObjectAngleDamping:()=>N,defaultObjectDamping:()=>W,defaultObjectElasticity:()=>U,defaultObjectFriction:()=>G,defaultObjectMass:()=>j,defaultObjectSize:()=>L,defaultSoundRange:()=>oe,defaultSoundTaper:()=>ae,defaultTileSize:()=>k,downloadLink:()=>gi,drawCanvas2D:()=>ss,drawCount:()=>fs,drawLine:()=>is,drawRect:()=>Zi,drawRectScreenSpace:()=>ts,drawText:()=>ns,drawTile:()=>Qi,drawTileScreenSpace:()=>es,enableAsserts:()=>ri,engineCollideObjects:()=>xs,engineInit:()=>As,engineName:()=>rs,engineObjects:()=>ms,engineObjectsCallback:()=>Ms,engineObjectsDestroy:()=>Ds,engineObjectsUpdate:()=>Rs,engineVersion:()=>cs,fixedFitToWindow:()=>O,fixedHeight:()=>P,fixedWidth:()=>_,formatTime:()=>u,frame:()=>Ss,frameTimeBufferMS:()=>Cs,frameTimeLastMS:()=>Ts,gamepadIsDown:()=>ke,gamepadStick:()=>Le,gamepadWasPressed:()=>Be,gamepadWasReleased:()=>Fe,gamepadsEnable:()=>Z,gamepadsUpdate:()=>qe,getNoteFrequency:()=>me,getTileCollisionData:()=>lt,glActiveTexture:()=>yt,glAdditive:()=>wt,glBatchCount:()=>bt,glCanvas:()=>gt,glColorData:()=>St,glCompileShader:()=>Et,glContext:()=>ft,glCopyToContext:()=>Pt,glCreateBuffer:()=>Rt,glCreateProgram:()=>At,glCreateTexture:()=>Dt,glDirty:()=>vt,glDraw:()=>Ot,glEnable:()=>J,glFlush:()=>_t,glInit:()=>Tt,glOverlay:()=>Q,glPositionData:()=>xt,glPreRender:()=>Mt,glSetBlendMode:()=>Ct,glSetTexture:()=>zt,glShader:()=>mt,glTileTexture:()=>pt,gl_ARRAY_BUFFER:()=>Jt,gl_BLEND:()=>Lt,gl_CLAMP_TO_EDGE:()=>Kt,gl_COLOR_BUFFER_BIT:()=>$t,gl_COMPILE_STATUS:()=>ti,gl_DYNAMIC_DRAW:()=>Qt,gl_FLOAT:()=>Nt,gl_FRAGMENT_SHADER:()=>Zt,gl_INDICIES_PER_VERT:()=>ni,gl_LINEAR:()=>qt,gl_LINK_STATUS:()=>ii,gl_MAX_BATCH:()=>oi,gl_NEAREST:()=>Gt,gl_ONE:()=>It,gl_ONE_MINUS_SRC_ALPHA:()=>Ft,gl_RGBA:()=>Ut,gl_SRC_ALPHA:()=>Bt,gl_TEXTURE_2D:()=>jt,gl_TEXTURE_MAG_FILTER:()=>Xt,gl_TEXTURE_MIN_FILTER:()=>Ht,gl_TEXTURE_WRAP_S:()=>Vt,gl_TEXTURE_WRAP_T:()=>Yt,gl_TRIANGLES:()=>kt,gl_UNSIGNED_BYTE:()=>Wt,gl_VERTEX_BYTE_STRIDE:()=>ai,gl_VERTEX_SHADER:()=>ei,gl_VERTICES_PER_QUAD:()=>si,godMode:()=>di,gravity:()=>X,initTileCollision:()=>ot,inputUpdate:()=>We,inputUpdatePost:()=>Ne,isChrome:()=>s,isFullscreen:()=>as,isOverlapping:()=>p,isTouchDevice:()=>Xe,keyIsDown:()=>Ce,keyWasPressed:()=>ze,keyWasReleased:()=>Ee,lerp:()=>d,mainCanvas:()=>Wi,mainCanvasSize:()=>Yi,mainContext:()=>Ni,max:()=>l,maxHeight:()=>M,maxObjectSpeed:()=>q,maxWidth:()=>D,medalDisplayHeight:()=>he,medalDisplayIconSize:()=>de,medalDisplaySlideTime:()=>re,medalDisplayTime:()=>le,medalDisplayWidth:()=>ce,medals:()=>He,medalsInit:()=>Ke,medalsPreventUnlock:()=>{},medalsRender:()=>Qe,min:()=>a,mod:()=>r,mouseIsDown:()=>Re,mousePos:()=>_e,mousePosScreen:()=>Pe,mouseWasPressed:()=>De,mouseWasReleased:()=>Me,mouseWheel:()=>Oe,nearestPowerOfTwo:()=>g,newgrounds:()=>{},overlayCanvas:()=>Ui,overlayContext:()=>Gi,paused:()=>ws,percent:()=>h,pixelated:()=>F,playAudioFile:()=>fe,playSamples:()=>Se,rand:()=>m,randColor:()=>w,randInCircle:()=>b,randInt:()=>x,randSeed:()=>T,randSeeded:()=>C,randSign:()=>S,randVector:()=>v,screenToWorld:()=>Ki,setBlendMode:()=>os,setCameraPos:()=>Y,setCameraScale:()=>K,setDrawCount:()=>Es,setGravity:()=>H,setMainCanvas:()=>qi,setMainCanvasSize:()=>$i,setMainContext:()=>Xi,setOverlayCanvas:()=>Hi,setOverlayContext:()=>Vi,setTileCollisionData:()=>at,showWatermark:()=>hi,shrinkTilesX:()=>us,shrinkTilesY:()=>gs,sign:()=>o,smoothStep:()=>f,soundEnable:()=>se,speak:()=>pe,stickData:()=>Ge,stopSpeech:()=>ye,tileBleedShrinkFix:()=>B,tileCollision:()=>st,tileCollisionRaycast:()=>ct,tileCollisionSize:()=>nt,tileCollisionTest:()=>rt,tileImage:()=>ji,tileImageSize:()=>ps,tileImageSizeInverse:()=>ys,tileLayerCanvasCache:()=>ht,time:()=>bs,timeDelta:()=>ds,timeReal:()=>vs,toggleFullscreen:()=>ls,touchInputEnable:()=>ee,usingGamepad:()=>Ie,vec2:()=>E,wave:()=>y,worldToScreen:()=>Ji,zzfx:()=>be,zzfxG:()=>we,zzfxM:()=>Te,zzfxR:()=>ve});const i=Math.PI,s=window.chrome,n=e=>e<0?-e:e,o=e=>e<0?-1:1,a=(e,t)=>e<t?e:t,l=(e,t)=>e>t?e:t,r=(e,t)=>(e%t+t)%t,c=(e,t=1,i=0)=>(vi(t>i),e<i?i:e>t?t:e),h=(e,t=1,i=0)=>t-i?c((e-i)/(t-i)):0,d=(e,t=1,i=0)=>i+c(e)*(t-i),u=e=>(e/60|0)+":"+(e%60<10?"0":"")+(e%60|0),g=e=>Math.pow(2,Math.ceil(Math.log2(e))),f=e=>e*e*(3-2*e),p=(e,t,i,s)=>2*n(e.x-i.x)<t.x+s.x&2*n(e.y-i.y)<t.y+s.y,y=(e=1,t=1,s=bs)=>t/2*(1-Math.cos(s*e*2*i)),m=(e=1,t=0)=>t+(e-t)*Math.random(),x=(e=1,t=0)=>0|m(e,t),S=()=>2*(0|m(2))-1,b=(e=1,t=0)=>e>0?v(e*Math.pow(m(t/e,1),.5)):new z,v=(e=1)=>(new z).setAngle(m(2*i),e),w=(e=new A,t=new A(0,0,0,1),i=!1)=>i?e.lerp(t,m()):new A(m(e.r,t.r),m(e.g,t.g),m(e.b,t.b),m(e.a,t.a));let T=1;const C=(e=1,t=0)=>(T^=T<<13,T^=T>>>17,T^=T<<5,t+(e-t)*n(T%1e9)/1e9);class z{constructor(e=0,t=0){this.x=e,this.y=t}copy(){return new z(this.x,this.y)}add(e){return vi(null!=e.x),new z(this.x+e.x,this.y+e.y)}subtract(e){return vi(null!=e.x),new z(this.x-e.x,this.y-e.y)}multiply(e){return vi(null!=e.x),new z(this.x*e.x,this.y*e.y)}divide(e){return vi(null!=e.x),new z(this.x/e.x,this.y/e.y)}scale(e){return vi(null==e.x),new z(this.x*e,this.y*e)}length(){return Math.pow(this.lengthSquared(),.5)}lengthSquared(){return Math.pow(this.x,2)+Math.pow(this.y,2)}distance(e){return Math.pow(this.distanceSquared(e),.5)}distanceSquared(e){return Math.pow(this.x-e.x,2)+Math.pow(this.y-e.y,2)}normalize(e=1){const t=this.length();return t?this.scale(e/t):new z(e)}clampLength(e=1){const t=this.length();return t>e?this.scale(e/t):this}dot(e){return vi(null!=e.x),this.x*e.x+this.y*e.y}cross(e){return vi(null!=e.x),this.x*e.y-this.y*e.x}angle(){return Math.atan2(this.x,this.y)}setAngle(e=0,t=1){return this.x=t*Math.sin(e),this.y=t*Math.cos(e),this}rotate(e){const t=Math.cos(e),i=Math.sin(e);return new z(this.x*t-this.y*i,this.x*i+this.y*t)}direction(){return n(this.x)>n(this.y)?this.x<0?3:1:this.y<0?2:0}invert(){return new z(this.y,-this.x)}flip(){return new z(this.y,this.x)}floor(){return new z(Math.floor(this.x),Math.floor(this.y))}area(){return this.x*this.y}lerp(e,t){return vi(null!=e.x),this.add(e.subtract(this).scale(c(t)))}arrayCheck(e){return this.x>=0&&this.y>=0&&this.x<e.x&&this.y<e.y}}function E(e,t){return void 0===e||null==e.x?new z(e,null==t?e:t):new z(e.x,e.y)}class A{constructor(e=1,t=1,i=1,s=1){this.r=e,this.g=t,this.b=i,this.a=s}copy(){return new A(this.r,this.g,this.b,this.a)}add(e){return new A(this.r+e.r,this.g+e.g,this.b+e.b,this.a+e.a)}subtract(e){return new A(this.r-e.r,this.g-e.g,this.b-e.b,this.a-e.a)}multiply(e){return new A(this.r*e.r,this.g*e.g,this.b*e.b,this.a*e.a)}divide(e){return new A(this.r/e.r,this.g/e.g,this.b/e.b,this.a/e.a)}scale(e,t=e){return new A(this.r*e,this.g*e,this.b*e,this.a*t)}clamp(){return new A(c(this.r),c(this.g),c(this.b),c(this.a))}lerp(e,t){return this.add(e.subtract(this).scale(c(t)))}setHSLA(e=0,t=0,i=1,s=1){const n=i<.5?i*(1+t):i+t-i*t,o=2*i-n,a=(e,t,i)=>(i=(i%1+1)%1)<1/6?e+6*(t-e)*i:i<.5?t:i<2/3?e+(t-e)*(2/3-i)*6:e;return this.r=a(o,n,e+1/3),this.g=a(o,n,e),this.b=a(o,n,e-1/3),this.a=s,this}mutate(e=.05,t=0){return new A(this.r+m(e,-e),this.g+m(e,-e),this.b+m(e,-e),this.a+m(t,-t)).clamp()}rgba(){return vi(this.r>=0&&this.r<=1&&this.g>=0&&this.g<=1&&this.b>=0&&this.b<=1&&this.a>=0&&this.a<=1),`rgb(${255*this.r|0},${255*this.g|0},${255*this.b|0},${this.a})`}rgbaInt(){return vi(this.r>=0&&this.r<=1&&this.g>=0&&this.g<=1&&this.b>=0&&this.b<=1&&this.a>=0&&this.a<=1),(255*this.r|0)+(255*this.g<<8)+(255*this.b<<16)+(255*this.a<<24)}}class R{constructor(e){this.time=null==e?void 0:bs+e,this.setTime=e}set(e=0){this.time=bs+e,this.setTime=e}unset(){this.time=void 0}isSet(){return null!=this.time}active(){return bs<=this.time}elapsed(){return bs>this.time}get(){return this.isSet()?bs-this.time:0}getPercent(){return this.isSet()?h(this.time-bs,0,this.setTime):0}}const D=1920,M=1200,_=0,P=0,O=1,I="arial",k=E(16),B=.3,F=1,L=E(1),j=1,W=.99,N=.99,U=0,G=.8,q=1;let X=0;function H(e){return X=e}let V=E();function Y(e){return V=e}let $=l(k.x,k.y);function K(e){return $=e}const J=1,Q=1,Z=1,ee=1,te=1,ie=1,se=1,ne=.5,oe=30,ae=.7,le=5,re=.5,ce=640,he=99,de=80;class ue{constructor(e,t=oe,i=ae){se&&(this.range=t,this.taper=i,this.randomness=e[1]||0,e[1]=0,this.cachedSamples=we(...e))}play(e,t=1,i=1,s=1){if(!se)return;let n=0;if(e){const i=this.range;if(i){const s=V.distanceSquared(e);if(s>i*i)return;t*=h(Math.pow(s,.5),i*this.taper,i)}n=2*Ji(e).x/Wi.width-1}const o=i+i*this.randomness*s*m(-1,1);return Se([this.cachedSamples],t,o,n)}playNote(e,t,i=1){if(se)return this.play(t,i,Math.pow(2,e/12),0)}}class ge{constructor(e){se&&(this.cachedSamples=Te(...e))}play(e=1,t=1){if(se)return Se(this.cachedSamples,e,1,0,t)}}function fe(e,t=1,i=!0){if(!se)return;const s=new Audio(e);return s.volume=ne*t,s.loop=i,s.play(),s}function pe(e,t="",i=1,s=1,n=1){if(!se||!speechSynthesis)return;const o=new SpeechSynthesisUtterance(e);return o.lang=t,o.volume=2*i*ne,o.rate=s,o.pitch=n,speechSynthesis.speak(o),o}const ye=()=>speechSynthesis&&speechSynthesis.cancel(),me=(e,t=220)=>t*Math.pow(2,e/12);let xe;function Se(e,t=1,i=1,s=0,n=0){if(!se)return;xe||(xe=new(window.AudioContext||webkitAudioContext));const o=xe.createBuffer(e.length,e[0].length,ve),a=xe.createBufferSource();return e.forEach(((e,t)=>o.getChannelData(t).set(e))),a.buffer=o,a.playbackRate.value=i,a.loop=n,a.connect(new StereoPannerNode(xe,{pan:c(s,1,-1)})).connect(new GainNode(xe,{gain:ne*t})).connect(xe.destination),a.start(),a}const be=(...e)=>Se([we(...e)]),ve=44100;function we(e=1,t=.05,s=220,o=0,a=0,l=.1,r=0,c=1,h=0,d=0,u=0,g=0,f=0,p=0,y=0,x=0,S=0,b=1,v=0,w=0){let T,C,z=2*i,E=h*=500*z/ve/ve,A=[],R=s*=(1+t*m(-1,1))*z/ve,D=0,M=0,_=0,P=1,O=0,I=0,k=0;for(o=o*ve+9,v*=ve,a*=ve,l*=ve,S*=ve,d*=500*z/Math.pow(ve,3),y*=z/ve,u*=z/ve,g*=ve,f=f*ve|0,C=o+v+a+l+S|0;_<C;A[_++]=k)++I%(100*x|0)||(k=r?r>1?r>2?r>3?Math.sin(Math.pow(D%z,3)):Math.max(Math.min(Math.tan(D),1),-1):1-(2*D/z%2+2)%2:1-4*n(Math.round(D/z)-D/z):Math.sin(D),k=(f?1-w+w*Math.sin(z*_/f):1)*(k>0?1:-1)*Math.pow(n(k),c)*e*ne*(_<o?_/o:_<o+v?1-(_-o)/v*(1-b):_<o+v+a?b:_<C-S?(C-_-S)/l*b:0),k=S?k/2+(S>_?0:(_<C-S?1:(C-_)/S)*A[_-S|0]/2):k),T=(s+=h+=d)*Math.cos(y*M++),D+=T-T*p*(1-1e9*(Math.sin(_)+1)%2),P&&++P>g&&(s+=u,R+=u,P=0),!f||++O%f||(s=R,h=E,P=P||1);return A}function Te(e,t,i,s=125){let n,o,a,l,r,c,h,d,u,g,f,p,y,m,x=0,S=[],b=[],v=[],w=0,T=0,C=1,z={},E=ve/s*60>>2;for(;C;w++)S=[C=d=p=0],i.forEach(((s,A)=>{for(h=t[s][w]||[0,0,0],C|=!!t[s][w],m=p+(t[s][0].length-2-!d)*E,y=A==i.length-1,o=2,l=p;o<h.length+y;d=++o){for(r=h[o],u=o==h.length+y-1&&y||g!=(h[0]||0)|r|0,a=0;a<E&&d;a++>E-99&&u?f+=(f<1)/99:0)c=(1-f)*S[x++]/2||0,b[l]=(b[l]||0)-c*T+c,v[l]=(v[l++]||0)+c*T+c;r&&(f=r%1,T=h[1]||0,(r|=0)&&(S=z[[g=h[x=0]||0,r]]=z[[g,r]]||(n=[...e[g]],n[2]*=Math.pow(2,(r-12)/12),r>0?we(...n):[])))}p=m}));return[b,v]}const Ce=(e,t=0)=>je[t]&&1&je[t][e]?1:0,ze=(e,t=0)=>je[t]&&2&je[t][e]?1:0,Ee=(e,t=0)=>je[t]&&4&je[t][e]?1:0,Ae=()=>je[0]=[],Re=Ce,De=ze,Me=Ee;let _e=E(),Pe=E(),Oe=0,Ie=0;const ke=(e,t=0)=>Ce(e,t+1),Be=(e,t=0)=>ze(e,t+1),Fe=(e,t=0)=>Ee(e,t+1),Le=(e,t=0)=>Ge[t]&&Ge[t][e]||E(),je=[[]];function We(){document.hasFocus()||Ae(),_e=Ki(Pe),qe()}function Ne(){for(const e of je)for(const t in e)e[t]&=1;Oe=0}onkeydown=e=>{li&&e.target!=document.body||(e.repeat||(je[Ie=0][Ue(e.keyCode)]=3),li||e.preventDefault())},onkeyup=e=>{li&&e.target!=document.body||(je[0][Ue(e.keyCode)]=4)};const Ue=e=>ie?87==e?38:83==e?40:65==e?37:68==e?39:e:e;onmousedown=e=>{je[Ie=0][e.button]=3,onmousemove(e),e.button&&e.preventDefault()},onmouseup=e=>je[0][e.button]=2&je[0][e.button]|4,onmousemove=e=>{const t=Wi;if(!t)return void console.error("no canvas");const i=t.getBoundingClientRect();Pe.x=Yi.x*h(e.x,i.right,i.left),Pe.y=Yi.y*h(e.y,i.bottom,i.top)},onwheel=e=>e.ctrlKey||(Oe=o(e.deltaY)),oncontextmenu=e=>!1;const Ge=[];function qe(){if(!Z||!navigator.getGamepads||!document.hasFocus()&&!li)return;const e=navigator.getGamepads();for(let t=e.length;t--;){const i=e[t],s=je[t+1]||(je[t+1]=[]),n=Ge[t]||(Ge[t]=[]);if(i){const e=.3,o=.8,a=t=>t>e?h(t,o,e):t<-e?-h(-t,o,e):0;for(let e=0;e<i.axes.length-1;e+=2)n[e>>1]=E(a(i.axes[e]),a(-i.axes[e+1])).clampLength();for(let e=i.buttons.length;e--;){const n=i.buttons[e];s[e]=n.pressed?1+2*!ke(e,t):4*ke(e,t),Ie|=!t&&n.pressed}if(te){const e=E(ke(15,t)-ke(14,t),ke(12,t)-ke(13,t));e.lengthSquared()&&(n[0]=e.clampLength())}}}}const Xe=ee&&void 0!==window.ontouchstart;if(Xe){let e,t;ontouchstart=ontouchmove=ontouchend=i=>{i.button=0;const s=i.touches.length;return s?(t||be(0,t=1),i.x=i.touches[0].clientX,i.y=i.touches[0].clientY,e?onmousemove(i):onmousedown(i)):e&&onmouseup(i),e=s,!i.cancelable}}const He=[];let Ve,Ye,$e=[];function Ke(e){Ve=e,bi||He.forEach((e=>e.unlocked=localStorage[e.storageKey()]))}class Je{constructor(e,t,i="",s="🏆",n){vi(e>=0&&!He[e]),He[this.id=e]=this,this.name=t,this.description=i,this.icon=s,n&&(this.image=new Image,this.image.src=n)}unlock(){this.unlocked||(vi(Ve),localStorage[this.storageKey()]=this.unlocked=1,$e.push(this),localStorage["OS13kTrophy,"+this.icon+","+Ve+","+this.name]=this.description)}render(e=0){const t=Gi,i=Ui.width-ce,s=-he*e;t.save(),t.beginPath(),t.fillStyle="#ddd",t.rect(i,s,ce,he),t.fill(),t.strokeStyle=t.fillStyle="#000",t.lineWidth=2,t.stroke(),t.clip(),this.renderIcon(i+15+de/2,s+he/2),t.textAlign="left",t.font="3em "+I,t.fillText(this.name,i+de+25,s+35),t.font="1.5em "+I,t.fillText(this.description,i+de+25,s+70),t.restore()}renderIcon(e,t,i=de){const s=Gi;s.textAlign="center",s.textBaseline="middle",s.font=.6*i+"px "+I,s.fillStyle="#000",this.image?s.drawImage(this.image,e-i/2,t-i/2,i,i):s.fillText(this.icon,e,t)}storageKey(){return Ve+"_medal_"+this.id}}function Qe(){if(!$e.length)return;const e=$e[0],t=vs-Ye;if(Ye)if(t>le)$e.shift(Ye=0);else{const i=le-re,s=t<re?1-t/re:t>i?(t-i)/re:0;e.render(s)}else Ye=vs}class Ze{constructor(e,t){vi(e),this.app_id=e,this.cipher=t,this.host=location?location.hostname:"";const i=new URL(window.location.href);if(this.session_id=i.searchParams.get("ngio_session_id")||0,0==this.session_id)return;const s=this.call("Medal.getList");this.medals=s?s.result.data.medals:[],bi&&console.log(this.medals);for(const e of this.medals){const t=He[e.id];t&&(t.image=new Image,t.image.src=e.icon,t.name=e.name,t.description=e.description,t.unlocked=e.unlocked,t.difficulty=e.difficulty,t.value=e.value,t.value&&(t.description=t.description+" ("+t.value+")"))}const n=this.call("ScoreBoard.getBoards");this.scoreboards=n?n.result.data.scoreboards:[],bi&&console.log(this.scoreboards)}unlockMedal(e){return this.call("Medal.unlock",{id:e},1)}postScore(e,t){return this.call("ScoreBoard.postScore",{id:e,value:t},1)}logView(){return this.call("App.logView",{host:this.host},1)}getScores(e,t=0,i=0,s=0,n=10){return this.call("ScoreBoard.getScores",{id:e,user:t,social:i,skip:s,limit:n})}call(e,t=0,i=0){const s={component:e,parameters:t};this.cipher;const n={app_id:this.app_id,session_id:this.session_id,call:s},o=new FormData;o.append("input",JSON.stringify(n));const a=new XMLHttpRequest;return a.open("POST","https://newgrounds.io/gateway_v3.php",!bi&&i),a.send(o),bi&&console.log(a.responseText),a.responseText&&JSON.parse(a.responseText)}}class et{constructor(e=E(),t=L,i=-1,s=k,n=0,o){vi(e&&null!=e.x&&null!=t.x),this.pos=e.copy(),this.size=t,this.tileIndex=i,this.tileSize=s,this.angle=n,this.color=o,this.mass=j,this.damping=W,this.angleDamping=N,this.elasticity=U,this.friction=G,this.spawnTime=bs,this.velocity=E(this.collideSolidObjects=this.renderOrder=this.angleVelocity=0),this.collideTiles=this.gravityScale=1,this.children=[],ms.push(this)}update(){const e=this.parent;if(e)return this.pos=this.localPos.multiply(E(e.getMirrorSign(),1)).rotate(-e.angle).add(e.pos),void(this.angle=e.getMirrorSign()*this.localAngle+e.angle);this.velocity.x=c(this.velocity.x,q,-q),this.velocity.y=c(this.velocity.y,q,-q);const t=this.pos.copy();if(this.pos.x+=this.velocity.x=this.damping*this.velocity.x,this.pos.y+=this.velocity.y=this.damping*this.velocity.y+X*this.gravityScale,this.angle+=this.angleVelocity*=this.angleDamping,vi(this.angleDamping>=0&&this.angleDamping<=1),vi(this.damping>=0&&this.damping<=1),!this.mass)return;const i=this.velocity.y<0;if(this.groundObject){const e=this.groundObject.velocity?this.groundObject.velocity.x:0;this.velocity.x=e+(this.velocity.x-e)*this.friction,this.groundObject=0}if(this.collideSolidObjects){const e=.001;for(const s of xs){if(!this.isSolid&!s.isSolid||s.destroyed||s.parent)continue;if(!p(this.pos,this.size,s.pos,s.size)||s==this)continue;if(!this.collideWithObject(s)|!s.collideWithObject(this))continue;if(p(t,this.size,s.pos,s.size)){const e=t.subtract(s.pos),i=e.length(),n=.001,o=i<.01?v(n):e.scale(n/i);this.velocity=this.velocity.add(o),s.mass&&(s.velocity=s.velocity.subtract(o)),yi&&Ei(this.pos,this.size,s.pos,s.size,"#f00");continue}const a=this.size.x+s.size.x,r=this.size.y+s.size.y,c=2*(t.y-s.pos.y)>r+X,h=2*n(t.y-s.pos.y)<r,u=2*n(t.x-s.pos.x)<a;if(c||u||!h){if(this.pos.y=s.pos.y+(r/2+e)*o(t.y-s.pos.y),s.groundObject&&i||!s.mass)i&&(this.groundObject=s),this.velocity.y*=-this.elasticity;else if(s.mass){const e=(this.mass*this.velocity.y+s.mass*s.velocity.y)/(this.mass+s.mass),t=this.velocity.y*(this.mass-s.mass)/(this.mass+s.mass)+2*s.velocity.y*s.mass/(this.mass+s.mass),i=s.velocity.y*(s.mass-this.mass)/(this.mass+s.mass)+2*this.velocity.y*this.mass/(this.mass+s.mass),n=l(this.elasticity,s.elasticity);this.velocity.y=d(n,t,e),s.velocity.y=d(n,i,e)}yi&&c&&2*n(t.x-s.pos.x)>a&&console.log("stepUp",t.y-s.pos.y)}if(!c&&(h||!u))if(this.pos.x=s.pos.x+(a/2+e)*o(t.x-s.pos.x),s.mass){const e=(this.mass*this.velocity.x+s.mass*s.velocity.x)/(this.mass+s.mass),t=this.velocity.x*(this.mass-s.mass)/(this.mass+s.mass)+2*s.velocity.x*s.mass/(this.mass+s.mass),i=s.velocity.x*(s.mass-this.mass)/(this.mass+s.mass)+2*this.velocity.x*this.mass/(this.mass+s.mass),n=l(this.elasticity,s.elasticity);this.velocity.x=d(n,t,e),s.velocity.x=d(n,i,e)}else this.velocity.x*=-this.elasticity;yi&&Ei(this.pos,this.size,s.pos,s.size,"#f0f")}}if(this.collideTiles&&rt(this.pos,this.size,this)&&!rt(t,this.size,this)){const e=rt(new z(t.x,this.pos.y),this.size,this),s=rt(new z(this.pos.x,t.y),this.size,this);if(e||!s){this.groundObject=i,this.velocity.y*=-this.elasticity;const e=(t.y-this.size.y/2|0)-(t.y-this.size.y/2);e<0&&e>-1&&e>this.damping*this.velocity.y+X*this.gravityScale&&(this.velocity.y=this.damping?(e-X*this.gravityScale)/this.damping:0),this.pos.y=t.y}s&&(this.pos.x=t.x,this.velocity.x*=-this.elasticity)}}render(){Qi(this.pos,this.drawSize||this.size,this.tileIndex,this.tileSize,this.color,this.angle,this.mirror,this.additiveColor)}destroy(){if(!this.destroyed){this.destroyed=1,this.parent&&this.parent.removeChild(this);for(const e of this.children)e.destroy(e.parent=0)}}collideWithTile(e,t){return e>0}collideWithTileRaycast(e,t){return e>0}collideWithObject(e){return!0}getAliveTime(){return bs-this.spawnTime}applyAcceleration(e){this.mass&&(this.velocity=this.velocity.add(e))}applyForce(e){this.applyAcceleration(e.scale(1/this.mass))}getMirrorSign(){return this.mirror?-1:1}addChild(e,t=E(),i=0){vi(!e.parent&&!this.children.includes(e)),this.children.push(e),e.parent=this,e.localPos=t.copy(),e.localAngle=i}removeChild(e){vi(e.parent==this&&this.children.includes(e)),this.children.splice(this.children.indexOf(e),1),e.parent=0}setCollision(e=0,t=0,i=1){vi(e||!t),e&&!this.collideSolidObjects?(vi(!xs.includes(this)),xs.push(this)):!e&&this.collideSolidObjects&&(vi(xs.includes(this)),xs.splice(xs.indexOf(this),1)),this.collideSolidObjects=e,this.isSolid=t,this.collideTiles=i}}class tt extends et{constructor(e,t=0,s=0,n=100,o=i,a=-1,l=k,r=new A,c=new A,h=new A(1,1,1,0),d=new A(1,1,1,0),u=.5,g=.1,f=1,p=.1,y=.05,m=1,x=1,S=0,b=i,v=.1,w=.2,T,C,E=1,R=(C?1e9:0)){super(e,new z,a,l),this.emitSize=t,this.emitTime=s,this.emitRate=n,this.emitConeAngle=o,this.colorStartA=r,this.colorStartB=c,this.colorEndA=h,this.colorEndB=d,this.randomColorLinear=E,this.particleTime=u,this.sizeStart=g,this.sizeEnd=f,this.speed=p,this.angleSpeed=y,this.damping=m,this.angleDamping=x,this.gravityScale=S,this.particleConeAngle=b,this.fadeRate=v,this.randomness=w,this.collideTiles=T,this.additive=C,this.renderOrder=R,this.trailScale=this.emitTimeBuffer=0}update(){if(this.parent&&super.update(),!this.emitTime||this.getAliveTime()<=this.emitTime){if(this.emitRate){const e=1/this.emitRate;for(this.emitTimeBuffer+=ds;this.emitTimeBuffer>0;this.emitTimeBuffer-=e)this.emitParticle()}}else this.destroy();xi&&wi(this.pos,E(this.emitSize),"#0f0",0,this.angle)}emitParticle(){const e=null!=this.emitSize.x?new z(m(-.5,.5),m(-.5,.5)).multiply(this.emitSize).rotate(this.angle):b(.5*this.emitSize),t=new it(this.pos.add(e),this.tileIndex,this.tileSize,this.angle+m(this.particleConeAngle,-this.particleConeAngle)),i=this.randomness,s=e=>e+e*m(i,-i),n=s(this.particleTime),o=s(this.sizeStart),a=s(this.sizeEnd),l=s(this.speed),r=s(this.angleSpeed)*S(),c=m(this.emitConeAngle,-this.emitConeAngle),h=w(this.colorStartA,this.colorStartB,this.randomColorLinear),d=w(this.colorEndA,this.colorEndB,this.randomColorLinear);return t.colorStart=h,t.colorEndDelta=d.subtract(h),t.velocity=(new z).setAngle(this.angle+c,l),t.angleVelocity=r,t.lifeTime=n,t.sizeStart=o,t.sizeEndDelta=a-o,t.fadeRate=this.fadeRate,t.damping=this.damping,t.angleDamping=this.angleDamping,t.elasticity=this.elasticity,t.friction=this.friction,t.gravityScale=this.gravityScale,t.collideTiles=this.collideTiles,t.additive=this.additive,t.renderOrder=this.renderOrder,t.trailScale=this.trailScale,t.mirror=m()<.5,t.destroyCallback=this.particleDestroyCallback,this.particleCreateCallback&&this.particleCreateCallback(t),t}render(){}}class it extends et{constructor(e,t,i,s){super(e,new z,t,i,s)}render(){const e=a((bs-this.spawnTime)/this.lifeTime,1),t=this.sizeStart+e*this.sizeEndDelta,i=new z(t,t),s=this.fadeRate/2,n=new A(this.colorStart.r+e*this.colorEndDelta.r,this.colorStart.g+e*this.colorEndDelta.g,this.colorStart.b+e*this.colorEndDelta.b,(this.colorStart.a+e*this.colorEndDelta.a)*(e<s?e/s:e>1-s?(1-e)/s:1));if(this.additive&&os(1),this.trailScale){const e=this.velocity.length(),t=this.velocity.scale(1/e),s=e*this.trailScale;i.y=l(i.x,s),this.angle=t.angle(),Qi(this.pos.add(t.multiply(E(0,-s/2))),i,this.tileIndex,this.tileSize,n,this.angle,this.mirror)}else Qi(this.pos,i,this.tileIndex,this.tileSize,n,this.angle,this.mirror);this.additive&&os(),xi&&wi(this.pos,i,"#f005",0,this.angle),1==e&&(this.color=n,this.size=i,this.destroyCallback&&this.destroyCallback(this),this.destroyed=1)}}let st=[],nt=E();function ot(e){nt=e,st=[];for(let e=st.length=nt.area();e--;)st[e]=0}const at=(e,t=0)=>e.arrayCheck(nt)&&(st[(0|e.y)*nt.x+e.x|0]=t),lt=e=>e.arrayCheck(nt)?st[(0|e.y)*nt.x+e.x|0]:0;function rt(e,t=E(),i){const s=l(Math.floor(e.x-t.x/2),0),n=l(Math.floor(e.y-t.y/2),0),o=a(e.x+t.x/2,nt.x-1),r=a(e.y+t.y/2,nt.y-1);for(let e=n;e<r;++e)for(let t=s;t<o;++t){const s=st[e*nt.x+t];if(s&&(!i||i.collideWithTile(s,new z(t,e))))return!0}return!1}function ct(e,t,i){e=e.floor();const s=(t=t.floor()).subtract(e),a=n(s.x),l=-n(s.y),r=o(s.x),c=o(s.y);let h=a+l;for(let s=e.x,n=e.y;;){const o=lt(E(s,n));if(o&&(i?i.collideWithTileRaycast(o,new z(s,n)):o>0))return mi&&zi(e,t,"#f00",.02,1),mi&&debugPoint(new z(s+.5,n+.5),"#ff0",1),new z(s+.5,n+.5);if(s==t.x&n==t.y)break;const d=2*h;d>=l&&(h+=l,s+=r),d<=a&&(h+=a,n+=c)}mi&&zi(e,t,"#00f",.02,1)}const ht=[];class dt{constructor(e,t=0,i=0,s=new A){this.tile=e,this.direction=t,this.mirror=i,this.color=s}clear(){this.tile=this.direction=this.mirror=0,color=new A}}class ut extends et{constructor(e,t,i=E(1),s=0){super(e,t),this.canvas=ht.length?ht.pop():document.createElement("canvas"),this.context=this.canvas.getContext("2d"),this.scale=i,this.tileSize=k.copy(),this.renderOrder=s,this.flushGLBeforeRender=1,this.data=[];for(let e=this.size.area();e--;)this.data.push(new dt)}destroy(){ht.push(this.canvas),super.destroy()}setData(e,t,i){e.arrayCheck(this.size)&&(this.data[(0|e.y)*this.size.x+e.x|0]=t,i&&this.drawTileData(e))}getData(e){return e.arrayCheck(this.size)&&this.data[(0|e.y)*this.size.x+e.x|0]}update(){}render(){vi(Ni!=this.context),this.flushGLBeforeRender&&glEnable&&Pt(Ni);const e=Ji(this.pos.add(E(0,this.size.y*this.scale.y)));Ni.drawImage(this.canvas,e.x,e.y,$*this.size.x*this.scale.x,$*this.size.y*this.scale.y)}redraw(){this.redrawStart(),this.drawAllTileData(),this.redrawEnd()}redrawStart(e=1){const t=this.size.x*this.tileSize.x,i=this.size.y*this.tileSize.y;e&&(this.canvas.width=t,this.canvas.height=i),this.savedRenderSettings=[Yi,Wi,Ni,$,V],K(this.tileSize.x),Y(this.size.scale(.5)),qi(this.canvas),Xi(this.context),Ni.imageSmoothingEnabled=!F,$i(E(t,i)),Mt(t,i)}redrawEnd(){vi(Ni==this.context),Pt(Ni,1),K(this.savedRenderSettings.cameraScale),Y(this.savedRenderSettings.setCameraPos),qi(this.savedRenderSettings.setMainCanvas),Xi(this.savedRenderSettings.setMainContext),$i(this.savedRenderSettings.setMainCanvasSize)}drawTileData(e){const t=e.floor().add(this.pos).add(E(.5));this.drawCanvas2D(t,E(1),0,0,(e=>e.clearRect(-.5,-.5,1,1)));const s=this.getData(e);null!=s.tile&&(vi(Ni==this.context),Qi(t,E(1),s.tile,this.tileSize,s.color,s.direction*i/2,s.mirror))}drawAllTileData(){for(let e=this.size.x;e--;)for(let t=this.size.y;t--;)this.drawTileData(E(e,t))}drawCanvas2D(e,t,i,s,n){const o=this.context;o.save(),e=e.subtract(this.pos).multiply(this.tileSize),t=t.multiply(this.tileSize),o.translate(e.x,this.canvas.height-e.y),o.rotate(i),o.scale(s?-t.x:t.x,t.y),n(o),o.restore()}drawTile(e,t=E(1),i=-1,s=k,n=new A,o=0,a){this.drawCanvas2D(e,t,o,a,(e=>{if(i<0)e.fillStyle=n.rgba(),e.fillRect(-.5,-.5,1,1);else{const t=ji.width/s.x;e.globalAlpha=n.a,e.drawImage(ji,i%t*s.x,(i/t|0)*s.x,s.x,s.y,-.5,-.5,1,1)}}))}drawRect(e,t,i,s){this.drawTile(e,t,-1,void 0,i,s,0)}}let gt,ft,pt,yt,mt,xt,St,bt=0,vt=0,wt=0;function Tt(){if(!J)return;gt=document.createElement("canvas"),ft=gt.getContext("webgl",{antialias:!F}),pt=Dt(ji),Q&&(document.body.appendChild(gt),gt.style=Wi.style.cssText),mt=At("precision lowp float;uniform mat4 m;attribute float a;attribute vec2 p,s,t;attribute vec4 c,b;varying vec2 v;varying vec4 d,e;void main(){gl_Position=m*vec4((s*cos(a)-vec2(-s.y,s)*sin(a))*.5+p,1,1);v=t;d=c;e=b;}","precision lowp float;varying vec2 v;varying vec4 d,e;uniform sampler2D j;void main(){gl_FragColor=texture2D(j,v)*d+e;}");const e=new ArrayBuffer(oi*si*ai);Rt(Jt,e.byteLength,Qt),xt=new Float32Array(e),St=new Uint32Array(e);const t=(e,t,s,n,o=0)=>{const a=ft.getAttribLocation(mt,e);ft.enableVertexAttribArray(a),ft.vertexAttribPointer(a,n,t,o,ai,i),i+=n*s};let i=vt=bt=0;t("a",Nt,4,1),t("p",Nt,4,2),t("s",Nt,4,2),t("t",Nt,4,2),t("c",Wt,1,4,1),t("b",Wt,1,4,1)}function Ct(e=0){if(!J)return;e!=wt&&_t(),wt=e;const t=e?It:Ft;ft.blendFuncSeparate(Bt,t,It,t),ft.enable(Lt)}function zt(e=pt){J&&(e!=yt&&_t(),ft.bindTexture(jt,yt=e))}function Et(e,t){if(!J)return;const i=ft.createShader(t);if(ft.shaderSource(i,e),ft.compileShader(i),li&&!ft.getShaderParameter(i,ti))throw ft.getShaderInfoLog(i);return i}function At(e,t){if(!J)return;const i=ft.createProgram();if(ft.attachShader(i,Et(e,ei)),ft.attachShader(i,Et(t,Zt)),ft.linkProgram(i),li&&!ft.getProgramParameter(i,ii))throw ft.getProgramInfoLog(i);return i}function Rt(e,t,i){if(!J)return;const s=ft.createBuffer();return ft.bindBuffer(e,s),ft.bufferData(e,t,i),s}function Dt(e){if(!J)return;const t=ft.createTexture();return ft.bindTexture(jt,t),ft.texImage2D(jt,0,Ut,Ut,Wt,e),ft.texParameteri(jt,Ht,F?Gt:qt),ft.texParameteri(jt,Xt,F?Gt:qt),ft.texParameteri(jt,Vt,Kt),ft.texParameteri(jt,Yt,Kt),t}function Mt(e,t){if(!J)return;gt.width=e,gt.height=t,ft.viewport(0,0,e,t),ft.bindTexture(jt,yt=pt),ft.useProgram(mt),Ct();const i=2*$/e,s=2*$/t;ft.uniformMatrix4fv(ft.getUniformLocation(mt,"m"),0,new Float32Array([i,0,0,0,0,s,0,0,1,1,-1,1,-1-i*V.x,-1-s*V.y,0,0]))}function _t(){J&&bt&&(ft.bufferSubData(Jt,0,xt.subarray(0,bt*si*ni)),ft.drawArrays(kt,0,bt*si),bt=0)}function Pt(e,t){J&&vt&&(_t(),Q&&!t||(e.drawImage(gt,0,wt=vt=0),ft.clear($t)))}function Ot(e,t,i,s,n=0,o=0,a=0,l=1,r=1,c=4294967295,h=0){if(!J)return;bt==oi&&_t();let d=bt++*si*ni;vt=1,xt[d++]=n,xt[d++]=e,xt[d++]=t,xt[d++]=-i,xt[d++]=-s,xt[d++]=o,xt[d++]=r,St[d++]=c,St[d++]=h,xt[d++]=n,xt[d++]=e,xt[d++]=t,xt[d++]=i,xt[d++]=s,xt[d++]=l,xt[d++]=a,St[d++]=c,St[d++]=h,xt[d++]=n,xt[d++]=e,xt[d++]=t,xt[d++]=-i,xt[d++]=s,xt[d++]=o,xt[d++]=a,St[d++]=c,St[d++]=h,xt[d++]=n,xt[d++]=e,xt[d++]=t,xt[d++]=-i,xt[d++]=-s,xt[d++]=o,xt[d++]=r,St[d++]=c,St[d++]=h,xt[d++]=n,xt[d++]=e,xt[d++]=t,xt[d++]=i,xt[d++]=-s,xt[d++]=l,xt[d++]=r,St[d++]=c,St[d++]=h,xt[d++]=n,xt[d++]=e,xt[d++]=t,xt[d++]=i,xt[d++]=s,xt[d++]=l,xt[d++]=a,St[d++]=c,St[d++]=h}const It=1,kt=4,Bt=770,Ft=771,Lt=3042,jt=3553,Wt=5121,Nt=5126,Ut=6408,Gt=9728,qt=9729,Xt=10240,Ht=10241,Vt=10242,Yt=10243,$t=16384,Kt=33071,Jt=34962,Qt=35048,Zt=35632,ei=35633,ti=35713,ii=35714,si=6,ni=9,oi=65536,ai=36,li=1,ri=1,ci=.5,hi=1,di=0;let ui,gi,fi=[],pi=0,yi=0,mi=0,xi=0,Si=0,bi=0;const vi=ri?(...e)=>console.assert(...e):()=>{},wi=(e,t=E(),i="#fff",s=0,n=0,o=0)=>{vi("string"==typeof i),fi.push({pos:e,size:E(t.x,t.y),color:i,time:new R(s),angle:n,fill:o})},Ti=(e,t=0,i="#fff",s=0,n=0)=>{vi("string"==typeof i),fi.push({pos:e,size:t,color:i,time:new R(s),angle:0,fill:n})},Ci=(e,t,i,s)=>wi(e,0,t,i,s),zi=(e,t,i,s=.1,n)=>{const o=E((t.x-e.x)/2,(t.y-e.y)/2),a=E(s,2*o.length());wi(e.add(o),a,i,n,o.angle(),1)},Ei=(e,t,i,s,n)=>{const o=E(a(e.x-t.x/2,i.x-s.x/2),a(e.y-t.y/2,i.y-s.y/2)),r=E(l(e.x+t.x/2,i.x+s.x/2),l(e.y+t.y/2,i.y+s.y/2));wi(o.lerp(r,.5),r.subtract(o),n)},Ai=(e,t,i=1,s="#fff",n=0,o=0,a="monospace")=>{vi("string"==typeof s),fi.push({text:e,pos:t,size:i,color:s,time:new R(n),angle:o,font:a})},Ri=()=>fi=[],Di=(e,t=rs+".png")=>{gi.download="screenshot.png",gi.href=e.toDataURL("image/png").replace("image/png","image/octet-stream"),gi.click()},Mi=()=>{document.body.appendChild(gi=document.createElement("a")),gi.setAttribute("style","display: none")},_i=()=>{li&&(ze(192)&&(pi=!pi),ze(49)&&(yi=!yi,xi=0),ze(50)&&(xi=!xi,yi=0),ze(51)&&(di=!di),ze(53)&&(ui=1),ze(55)&&(Si=!Si),ze(48)&&(hi=!hi))},Pi=()=>{if(Pt(Ni),ui&&(Pt(Ni,1),Ni.drawImage(Ui,0,0),Ui.width|=0,Di(Wi),ui=0),Si&&Z&&navigator.getGamepads){const e=navigator.getGamepads();for(let t=e.length;t--;){const i=e[t];if(i){const e=1,s=.2,n=V,o=Ge[t];for(let i=o.length;i--;){const s=n.add(E(i*e*2,t*e*3)),a=s.add(o[i].scale(e));Ti(s,e,"#fff7",0,1),zi(s,a,"#f00"),Ci(a,"#f00")}for(let o=i.buttons.length;o--;){const a=n.add(E(o*s*2,t*e*3-e-s)),l=i.buttons[o].pressed;Ti(a,s,l?"#f00":"#fff7",0,1),Ai(o,a,.2)}}}}if(pi){for(const e of ms){if(e.canvas)continue;const t=e.size.copy();t.x=l(t.x,.2),t.y=l(t.y,.2);const i=new A(e.collideTiles?1:0,e.collideSolidObjects?1:0,e.isSolid?1:0,e.parent?.2:.5);drawRect(e.pos,t,i),drawRect(e.pos,t.scale(.8),e.parent?new A(1,1,1,.5):new A(0,0,0,.8)),e.parent&&is(e.pos,e.parent.pos,.1,new A(0,0,1,.5))}let e,t=1/0;for(const i of ms){const s=_e.distanceSquared(i.pos);s<t&&(t=s,e=i)}if(e){const t=Ni;Xi(Gi);const s=tileCollisionRaycast(e.pos,_e);s&&drawRect(s.floor().add(E(.5)),E(1),new A(0,1,1,.3)),drawRect(_e.floor().add(E(.5)),E(1),new A(0,0,1,.5)),is(_e,e.pos,.1,s?new A(1,0,0,.5):new A(0,1,0,.5));let n=_e.copy(),o=E(0,.5);const a=e=>"("+(e.x>0?" ":"")+e.x.toFixed(2)+","+(e.y>0?" ":"")+e.y.toFixed(2)+")",l=[.5,new A,.05,void 0,void 0,"monospace"];ns("pos = "+a(e.pos)+(e.angle>0?" ":" ")+(180*e.angle/i).toFixed(1)+"°",n=n.add(o),...l),ns("vel = "+a(e.velocity),n=n.add(o),...l),ns("size = "+a(e.size),n=n.add(o),...l),ns("collision = "+getTileCollisionData(_e),n=_e.subtract(o),...l),Xi(t)}Pt(Ni)}{Gi.lineWidth=1;const e=ci*$;fi.forEach((t=>{const i=Ji(t.pos);if(Gi.save(),Gi.lineWidth=2,Gi.translate(0|i.x,0|i.y),Gi.rotate(t.angle),Gi.fillStyle=Gi.strokeStyle=t.color,null!=t.text)Gi.font=t.size*$+"px "+t.font,Gi.textAlign="center",Gi.textBaseline="middle",Gi.fillText(t.text,0,0);else if(0==t.size||0===t.size.x&&0===t.size.y)Gi.fillRect(-e/2,-1,e,3),Gi.fillRect(-1,-e/2,3,e);else if(null!=t.size.x){const e=t.size.x*$|0,i=t.size.y*$|0;t.fill&&Gi.fillRect(-e/2|0,-i/2|0,e,i),Gi.strokeRect(-e/2|0,-i/2|0,e,i)}else Gi.beginPath(),Gi.arc(0,0,t.size*$,0,9),t.fill&&Gi.fill(),Gi.stroke();Gi.restore()})),Gi.fillStyle=Gi.strokeStyle="#fff"}{let e=9,t=-20,i=30;Gi.fillStyle="#fff",Gi.textAlign="left",Gi.textBaseline="top",Gi.font="28px monospace",Gi.shadowColor="#000",Gi.shadowBlur=9,pi?(Gi.fillText(rs,e,t+=i),Gi.fillText("Objects: "+ms.length,e,t+=i),Gi.fillText("Time: "+u(bs),e,t+=i),Gi.fillText("---------",e,t+=i),Gi.fillStyle="#f00",Gi.fillText("~: Debug Overlay",e,t+=i),Gi.fillStyle=yi?"#f00":"#fff",Gi.fillText("1: Debug Physics",e,t+=i),Gi.fillStyle=xi?"#f00":"#fff",Gi.fillText("2: Debug Particles",e,t+=i),Gi.fillStyle=di?"#f00":"#fff",Gi.fillText("3: God Mode",e,t+=i),Gi.fillStyle="#fff",Gi.fillText("5: Save Screenshot",e,t+=i),Gi.fillStyle=Si?"#f00":"#fff",Gi.fillText("7: Debug Gamepads",e,t+=i)):(Gi.fillText(yi?"Debug Physics":"",e,t+=i),Gi.fillText(xi?"Debug Particles":"",e,t+=i),Gi.fillText(di?"God Mode":"",e,t+=i),Gi.fillText(Si?"Debug Gamepads":"",e,t+=i)),Gi.shadowBlur=0}fi=fi.filter((e=>e.time.get()<0))};let Oi,Ii,ki,Bi=0;const Fi=()=>{Bi=!Bi,Bi?Oi&&!Oi.destroyed||(Oi=new ParticleEmitter(V)):Oi&&!Oi.destroyed&&Oi.destroy();const e=e=>{const t=e=>{const t=(255*e|0).toString(16);return 1==t.length?"0"+t:t};return"#"+t(e.r)+t(e.g)+t(e.b)};if(!Ii){const t=Ii=document.createElement("div");t.innerHTML="<big><b>Particle Editor",t.style="position:absolute;top:10;left:10;color:#fff",document.body.appendChild(t);for(const i of Li){const n=i[2]=document.createElement("input"),o=i[0],a=i[1];if(a)if("color"==a){n.type=a;const t=Oi[o];n.value=e(t)}else"alpha"==a&&"colorStartAlpha"==o?n.value=Oi.colorStartA.a:"alpha"==a&&"colorEndAlpha"==o?n.value=Oi.colorEndA.a:"tileSizeX"==o?n.value=Oi.tileSize.x:"tileSizeY"==o&&(n.value=Oi.tileSize.y);else n.value=Oi[o]||"0";n.oninput=e=>{const t=parseFloat(n.value)||0;if(a)if("color"==a){const e=(i=n.value,new A(parseInt(i.substr(1,2),16)/255,parseInt(i.substr(3,2),16)/255,parseInt(i.substr(5,2),16)/255));Oi[o].r=e.r,Oi[o].g=e.g,Oi[o].b=e.b}else"alpha"==a&&"colorStartAlpha"==o?(Oi.colorStartA.a=c(t),Oi.colorStartB.a=c(t)):"alpha"==a&&"colorEndAlpha"==o?(Oi.colorEndA.a=c(t),Oi.colorEndB.a=c(t)):"tileSizeX"==o?Oi.tileSize=E(parseInt(n.value),Oi.tileSize.y):"tileSizeY"==o&&(Oi.tileSize.y=E(Oi.tileSize.x,parseInt(n.value)));else Oi[o]=t;var i;s()},t.appendChild(document.createElement("br")),t.appendChild(n),t.appendChild(document.createTextNode(" "+o))}t.appendChild(document.createElement("br")),t.appendChild(document.createElement("br")),t.appendChild(ki=document.createElement("input")),ki.disabled=!0,t.appendChild(document.createTextNode(" code")),t.appendChild(document.createElement("br"));const i=document.createElement("button");t.appendChild(i),i.innerHTML="Copy To Clipboard",i.onclick=e=>navigator.clipboard.writeText(ki.value);const s=()=>{let e="",t=0;for(const i of Li){const s=i[0],n=i[1];let o;if("tileSizeX"!=s&&"alpha"!=n){if(t++&&(e+=", "),"tileSizeY"==s)o=`vec2(${Oi.tileSize.x},${Oi.tileSize.y})`;else if("color"==n){const e=Oi[s];o=`new Color(${e.r},${e.g},${e.b},${e.a})`}else o=Oi[s];e+=o}}ki.value="...["+e+"]"};s()}Ii.style.display=Bi?"":"none"},Li=[["emitSize"],["emitTime"],["emitRate"],["emitConeAngle"],["tileIndex"],["tileSizeX","tileSize"],["tileSizeY","tileSize"],["colorStartA","color"],["colorStartB","color"],["colorStartAlpha","alpha"],["colorEndA","color"],["colorEndB","color"],["colorEndAlpha","alpha"],["particleTime"],["sizeStart"],["sizeEnd"],["speed"],["angleSpeed"],["damping"],["angleDamping"],["gravityScale"],["particleConeAngle"],["fadeRate"],["randomness"],["collideTiles"],["additive"],["randomColorComponents"],["renderOrder"]],ji=new Image;let Wi,Ni,Ui,Gi;function qi(e){return Wi=e}function Xi(e){return e&&(Ni=e),Ni}function Hi(e){return Ui=e}function Vi(e){return e&&(Gi=e),Gi}let Yi=E();function $i(e){return Yi=e}const Ki=e=>e.add(E(.5)).subtract(Yi.scale(.5)).multiply(E(1/$,-1/$)).add(V),Ji=e=>e.subtract(V).multiply(E($,-$)).add(Yi.scale(.5)).subtract(E(.5));function Qi(e,t=E(1),i=-1,s=k,n=new A,o=0,a,l=new A(0,0,0,0)){if(hi&&Es(fs+1),J)if(i<0)Ot(e.x,e.y,t.x,t.y,o,0,0,0,0,0,n.rgbaInt());else{const r=ji.width/s.x|0,c=s.x*ys.x,h=s.y*ys.y,d=i%r*c,u=(i/r|0)*h,g=B*ys.x,f=B*ys.y;Ot(e.x,e.y,a?-t.x:t.x,t.y,o,d+g,u+f,d-g+c,u-g+h,n.rgbaInt(),l.rgbaInt())}else ss(e,t,o,a,(e=>{if(i<0)e.fillStyle=n.rgba(),e.fillRect(-.5,-.5,1,1);else{const t=ji.width/s.x|0,o=i%t*s.x+B,a=(i/t|0)*s.y+B,l=s.x-2*B,r=s.y-2*B;e.globalAlpha=n.a,e.drawImage(ji,o,a,l,r,-.5,-.5,1,1)}}))}function Zi(e,t,i,s){Qi(e,t,-1,k,i,s)}function es(e,t=E(1),i,s,n,o,a,l){Qi(Ki(e),t.scale(1/$),i,s,n,o,a,l)}function ts(e,t,i,s){es(e,t,-1,k,i,s)}function is(e,t,i=.1,s){const n=E((t.x-e.x)/2,(t.y-e.y)/2),o=E(i,2*n.length());Zi(e.add(n),o,s,n.angle())}function ss(e,t,i,s,n,o=Ni){e=Ji(e),t=t.scale($),o.save(),o.translate(e.x+.5|0,e.y-.5|0),o.rotate(i),o.scale(s?-t.x:t.x,t.y),n(o),o.restore()}function ns(e,t,i=1,s=new A,n=0,o=new A(0,0,0),a="center",l=I){t=Ji(t),Gi.font=i*$+"px "+l,Gi.textAlign=a,Gi.textBaseline="middle",n&&(Gi.lineWidth=n*$,Gi.strokeStyle=o.rgba(),Gi.strokeText(e,t.x,t.y)),Gi.fillStyle=s.rgba(),Gi.fillText(e,t.x,t.y)}function os(e){J?Ct(e):Ni.globalCompositeOperation=e?"lighter":"source-over"}const as=()=>document.fullscreenElement;function ls(){as()?document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen&&document.mozCancelFullScreen():document.body.webkitRequestFullScreen?document.body.webkitRequestFullScreen():document.body.mozRequestFullScreen&&document.body.mozRequestFullScreen()}const rs="LittleJS",cs="1.1.2",hs=60,ds=1/hs;let us,gs,fs,ps,ys,ms=[],xs=[],Ss=0,bs=0,vs=0,ws=0,Ts=0,Cs=0,zs=0;function Es(e){return fs=e}function As(e,t,i,s,n,o){ji.onload=()=>{ys=E(1).divide(ps=E(ji.width,ji.height)),li&&(ji.onload=()=>vi(1)),us=B/ps.x,gs=B/ps.y,document.body.appendChild(qi(document.createElement("canvas"))),document.body.setAttribute("style","margin:0;overflow:hidden;background:#000"),Wi.setAttribute("style","position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)"+(F?";image-rendering:crisp-edges;image-rendering:pixelated":"")),Xi(Wi.getContext("2d")),Mi(),Tt(),document.body.appendChild(Hi(document.createElement("canvas"))),Ui.setAttribute("style","position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)"),Vi(Ui.getContext("2d")),e(),l()};const l=(e=0)=>{requestAnimationFrame(l);let o=e-Ts;if(Ts=e,(li||hi)&&(zs=d(.05,1e3/(o||1),zs)),li&&(o*=Ce(107)?5:Ce(109)?.2:1),vs+=o/1e3,Cs=a(Cs+!ws*o,50),ws)We(),_i(),i(),Ne();else{let e=0;for(Cs<0&&Cs>-9&&(e=Cs,Cs=0);Cs>=0;Cs-=1e3/hs)We(),t(),Rs(),_i(),i(),Ne();Cs+=e}if(_){if(Wi.width=_,Wi.height=P,O){const e=innerWidth/innerHeight,t=_/P;Wi.style.width=Ui.style.width=e<t?"100%":"",Wi.style.height=Ui.style.height=e<t?"":"100%",gt&&(gt.style.width=Wi.style.width,gt.style.height=Wi.style.height)}}else Wi.width=a(innerWidth,D),Wi.height=a(innerHeight,M);$i(E(Ui.width=Wi.width,Ui.height=Wi.height)),Ni.imageSmoothingEnabled=!F,Mt(Wi.width,Wi.height),s(),ms.sort(((e,t)=>e.renderOrder-t.renderOrder));for(const e of ms)e.destroyed||e.render();if(n(),Qe(),Pi(),Pt(Ni),hi){Gi.textAlign="right",Gi.textBaseline="top",Gi.font="1em monospace",Gi.fillStyle="#000";const e=rs+" v"+cs+" / "+fs+" / "+ms.length+" / "+zs.toFixed(1);Gi.fillText(e,Wi.width-3,3),Gi.fillStyle="#fff",Gi.fillText(e,Wi.width-2,2),fs=0}};o?ji.src=o:ji.onload}function Rs(){const e=t=>{if(!t.destroyed){t.update();for(const i of t.children)e(i)}};for(const t of ms)t.parent||e(t);ms=ms.filter((e=>!e.destroyed)),xs=xs.filter((e=>!e.destroyed)),bs=++Ss/hs}function Ds(){for(const e of ms)e.persistent||e.parent||e.destroy();ms=ms.filter((e=>!e.destroyed))}function Ms(e,t,i,s=ms){if(e)if(null!=t.x)for(const n of s)p(e,t,n.pos,n.size)&&i(n);else{const n=t*t;for(const t of s)e.distanceSquared(t.pos)<n&&i(t)}else for(const e of s)i(e)}return t})()}));
//# sourceMappingURL=library.umd.js.map