!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).plat={})}(this,(function(e){"use strict";class t{constructor({x:e=0,y:t=0,rotation:i=0,width:s=0,height:r=0,image:n=null,color:a=null,layer:o=0,render:h=null,update:l=(()=>{})}){Object.defineProperty(this,"x",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"y",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"rotation",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"width",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"height",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"image",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"render",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"color",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"layer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_randomId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.x=e,this.y=t,this.rotation=i,this.width=s,this.height=r,this.image=n,this.color=a,this.render=h,this.update=l,this.layer=o,this._randomId=Math.random()}_render(e){if(e.save(),e.translate(this.x,this.y),e.rotate(this.rotation),this.render)try{this.render.apply(this,[e,this])}catch(t){this.render(e,this)}else this.image?e.drawImage(this.image,-this.width/2,-this.height/2,this.width,this.height):this.color&&(e.fillStyle=this.color,e.fillRect(-this.width/2,-this.height/2,this.width,this.height));e.restore()}collides(e){return i=e,(t=this).x-t.width/2<i.x+i.width/2&&t.x+t.width/2>i.x-i.width/2&&t.y-t.height/2<i.y+i.height/2&&t.y+t.height/2>i.y-i.height/2;var t,i}}class i extends t{constructor({x:e=0,y:t=0,rotation:i=0,width:s=0,height:r=0,image:n=null,color:a=null,layer:o=0,mass:h=1,render:l=null,update:d=(()=>{})}){super({x:e,y:t,rotation:i,width:s,height:r,image:n,color:a,layer:o,render:l,update:e=>{d(e,this),this.applyFriction(e)}}),Object.defineProperty(this,"v",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isOnBody",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"friction",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"mass",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.v={x:0,y:0},this.mass=h,this.friction=.3,this.isOnBody=!1}applyFriction(e){this.isOnBody&&(this.keys&&this.getPreventFriction()||(this.friction*e>Math.abs(this.v.x)?this.v.x=0:this.v.x>0?this.v.x-=this.friction*e:this.v.x+=this.friction*e))}}class s extends i{constructor({x:e=0,y:t=0,rotation:i=0,width:s=0,height:r=0,image:n=null,color:a=null,layer:o=0,mass:h=1,render:l=null,update:d=(()=>{}),maxXSpeed:c=5,jumpVel:u=13,maxJumps:b=1,wallJump:y=!1,wallPushOffSpeed:m=3}){super({x:e,y:t,rotation:i,width:s,height:r,image:n,color:a,layer:o,mass:h,render:l,update:e=>{d(this),this.updateHorizontalMovement(e)}}),Object.defineProperty(this,"maxXSpeed",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"jumpVel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"keys",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"xAcceleration",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"jumps",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"maxJumps",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"wallJumps",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"wallPushOffSpeed",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"wallSide",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.maxXSpeed=c,this.jumpVel=u,this.maxJumps=b,this.jumps=0,this.wallJumps=y,this.wallPushOffSpeed=m,this.wallSide=1,this.keys={w:!1,a:!1,s:!1,d:!1,top:!1,bottom:!1,right:!1,left:!1},this.xAcceleration=.3}getPreventFriction(){let e=0;return this.keys.right&&e++,this.keys.left&&e--,this.keys.d&&e++,this.keys.a&&e--,0!==e}jump(){this.jumps<this.maxJumps&&(this.v.y=-this.jumpVel,this.jumps++,0===this.wallSide?this.v.x=-this.wallPushOffSpeed:2===this.wallSide&&(this.v.x=this.wallPushOffSpeed))}bindKeyboardControls({wasd:e=!0,arrowKeys:t=!0,spaceJump:i=!0}){e&&(window.addEventListener("keydown",this.wasdKeyListener.bind(this),!0),window.addEventListener("keyup",this.wasdKeyListener.bind(this),!0)),t&&(window.addEventListener("keydown",this.arrowKeyListener.bind(this),!0),window.addEventListener("keyup",this.arrowKeyListener.bind(this),!0)),i&&(window.addEventListener("keydown",this.spaceKeyListener.bind(this),!0),window.addEventListener("keyup",this.spaceKeyListener.bind(this),!0))}wasdKeyListener({key:e,repeat:t,type:i}){if(t)return;const s="keydown"===i;s&&"w"===e.toLowerCase()&&this.jump(),"d"===e.toLowerCase()&&(this.keys.d=s),"s"===e.toLowerCase()&&(this.keys.left=s),"a"===e.toLowerCase()&&(this.keys.a=s)}arrowKeyListener({key:e,type:t,repeat:i}){if(i)return;const s="keydown"===t;s&&"ArrowUp"===e&&this.jump(),"ArrowRight"===e&&(this.keys.right=s),"ArrowDown"===e&&(this.keys.bottom=s),"ArrowLeft"===e&&(this.keys.left=s)}spaceKeyListener({key:e,repeat:t,type:i}){t||"keydown"===i&&" "===e&&this.jump()}updateHorizontalMovement(e){(this.keys.a||this.keys.left)&&this.v.x>-this.maxXSpeed&&(this.v.x-=this.xAcceleration*e),(this.keys.d||this.keys.right)&&this.v.x<this.maxXSpeed&&(this.v.x+=this.xAcceleration*e)}}class r{constructor(e,t){Object.defineProperty(this,"renderer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"lockedObject",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"defaultPos",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pos",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"minimums",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.renderer=e,this.lockedObject=null,this.defaultPos=t||{x:e.width/2,y:e.height/2},this.pos=this.defaultPos,this.minimums={x:1/0,y:1/0}}lock(e,{minXSpace:t=1/0,minYSpace:i=1/0}={}){this.lockedObject=e,this.minimums={x:t,y:i}}unlock(){this.lockedObject=null,this.pos=this.defaultPos}update(){return this.lockedObject&&(this.minimums.x>=this.renderer.width/2?this.pos.x=this.lockedObject.x:this.lockedObject.x-this.pos.x+this.renderer.width/2<this.minimums.x?this.pos.x=this.lockedObject.x-this.minimums.x+this.renderer.width/2:this.lockedObject.x-this.pos.x>this.renderer.width/2-this.minimums.x&&(this.pos.x=this.lockedObject.x+this.minimums.x-this.renderer.width/2),this.minimums.y>=this.renderer.height/2&&(this.pos.y=this.lockedObject.y)),this.pos}}class n extends t{constructor({x:e=0,y:t=0,rotation:i=0,width:s=0,height:r=0,image:n=null,color:a=null,layer:o=0,render:h=null,update:l=(()=>{})}){super({x:e,y:t,rotation:i,width:s,height:r,image:n,color:a,layer:o,render:h,update:l})}}class a extends HTMLCanvasElement{constructor(){super(),Object.defineProperty(this,"ctx",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"objects",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"physics",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"camera",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.resize(),window.addEventListener("resize",(()=>this.resize())),this.ctx=this.getContext("2d"),this.objects=[],this.render=this.render.bind(this),this.camera=new r(this)}enablePixelated(){return this.ctx.webkitImageSmoothingEnabled=!1,this.ctx.mozImageSmoothingEnabled=!1,this.ctx.imageSmoothingEnabled=!1,this}enablePhysics({gravity:e=.7}){this.physics={gravity:e}}enableFixedPosition(){return this.style.position="fixed",this.style.top="0px",this.style.left="0px",this}resize(){this.width=window.innerWidth,this.height=window.innerHeight}add(e){return this.objects.push(e),e}destroy(e){"number"==typeof e?this.objects.filter((t=>t._randomId===e)):this.objects=this.objects.filter((t=>t!==e))}mount(e){return e.appendChild(this),this}update(e=1){this.objects.forEach((t=>{if(this.physics&&t instanceof i){t.v.y+=this.physics.gravity,t.update(e);const{x:r,y:a}=t;t.x+=t.v.x,t.y+=t.v.y;const o={x:(r+t.x)/2,y:(a+t.y)/2,width:Math.abs(r-t.x)+t.width,height:Math.abs(a-t.y)+t.height};t.isOnBody=!1,t instanceof s&&(t.wallSide=1);for(const e of this.objects)(e instanceof n||e instanceof i)&&e._randomId!==t._randomId&&e.collides(o)&&(a+t.height/2<=e.y-e.height/2?(t.y=e.y-e.height/2-t.height/2,e instanceof i?(e.v.y+=t.v.y*t.mass/e.mass,t.v.y=0):t.v.y=0,t.isOnBody=!0,t instanceof s&&(t.jumps=0)):a-t.height/2>=e.y+e.height/2?(t.y=e.y+e.height/2+t.height/2,e instanceof i?(e.v.y+=t.v.y*t.mass/e.mass,t.v.y=0):t.v.y=0):r+t.width/2<=e.x-e.width/2?(t.x=e.x-e.width/2-t.width/2,e instanceof i?(e.v.x+=t.v.x*t.mass/e.mass,t.v.x=0):t.v.x=0,t instanceof s&&!(e instanceof i)&&t.wallJumps&&(t.jumps=0,t.wallSide=0)):r-t.width/2>=e.x+e.width/2&&(t.x=e.x+e.width/2+t.width/2,e instanceof i?(e.v.x+=t.v.x*t.mass/e.mass,t.v.x=0):t.v.x=0,t instanceof s&&!(e instanceof i)&&t.wallJumps&&(t.jumps=0,t.wallSide=2),t.v.x=0))}}))}render(){const{x:e,y:t}=this.camera.update();this.ctx.clearRect(0,0,this.width,this.height),this.ctx.translate(this.width/2-e,this.height/2-t),this.objects.sort(((e,t)=>e.layer-t.layer)).forEach((e=>e._render(this.ctx))),this.ctx.translate(-this.width/2+e,-this.height/2+t)}}function o(e,t,i,s){return new(i||(i=Promise))((function(r,n){function a(e){try{h(s.next(e))}catch(e){n(e)}}function o(e){try{h(s.throw(e))}catch(e){n(e)}}function h(e){var t;e.done?r(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}h((s=s.apply(e,t||[])).next())}))}customElements.define("game-renderer",a,{extends:"canvas"}),e.ControlledBody=s,e.GameObject=t,e.PhysicalBody=i,e.Renderer=a,e.StaticBody=n,e.loadImages=function(e,t=(()=>{})){return o(this,void 0,void 0,(function*(){console.group("loading progress");const i=Object.keys(e).map((()=>0)),s=Object.keys(e).map((()=>1)),r=Object.keys(e).map(((r,n)=>function(e,t,i=(()=>{})){return new Promise(((s,r)=>{const n=new Image,a=new XMLHttpRequest;a.open("GET",t,!0),a.responseType="arraybuffer",a.addEventListener("load",(()=>{if(200===a.status){const t=new Blob([a.response]);n.src=URL.createObjectURL(t),s({name:e,img:n})}})),a.addEventListener("progress",(e=>{e.lengthComputable?i(e.loaded,e.total):i(0,8100)})),a.addEventListener("error",(()=>{r("Network error or blocked by cors")})),a.send()}))}(r,e[r],((e,r)=>{i[n]=e,s[n]=r,t(i.reduce(((e,t)=>e+t)),s.reduce(((e,t)=>e+t)))})))),n=yield Promise.all(r);console.groupEnd();const a={};return n.forEach((({name:e,img:t})=>{a[e]=t})),a}))},Object.defineProperty(e,"__esModule",{value:!0})}));
