angry-pixel 2.1.6 → 2.1.8

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.
package/lib/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";const t={AssetManager:Symbol.for("AssetManager"),CanvasElement:Symbol.for("CanvasElement"),CollisionRepository:Symbol.for("CollisionRepository"),CollisionBroadphaseResolver:Symbol.for("CollisionBroadphaseResolver"),CollisionResolutionMethod:Symbol.for("CollisionResolutionMethod"),CollisionAABBResolver:Symbol.for("CollisionAABBResolver"),CollisionCircumferenceAABBResolver:Symbol.for("CollisionCircumferenceAABBResolver"),CollisionCircumferenceResolver:Symbol.for("CollisionCircumferenceResolver"),CollisionSatResolver:Symbol.for("CollisionSatResolver"),CollisionMatrix:Symbol.for("CollisionMatrix"),CreateSystemService:Symbol.for("CreateSystemService"),EntityManager:Symbol.for("EntityManager"),GameConfig:Symbol.for("GameConfig"),InputManager:Symbol.for("InputManager"),LoopManager:Symbol.for("LoopManager"),RenderManager:Symbol.for("RenderManager"),SceneManager:Symbol.for("SceneManager"),SystemManager:Symbol.for("SystemManager"),TimeManager:Symbol.for("TimeManager"),WebGLManager:Symbol.for("WebGLManager")};class e{constructor(){this.instances=new Map,this.types=new Map}add(t,e){if(!e&&!t.prototype.__ioc_injectable)throw new Error(`Type ${t.name} is not injectable`);return this.types.set(null!=e?e:t.prototype.__ioc_injectable,t),this}set(t,e){return this.instances.set(t,e),this}get(t){var e,i;if(!this.instances.has(t)){const s=this.types.get(t);if(!s)throw new Error(`${t.toString()} is not a valid type`);const r=new s(...(null!==(e=s.prototype.__ioc_inject_constructor)&&void 0!==e?e:[]).map((t=>this.get(t))));(null!==(i=s.prototype.__ioc_inject_prop)&&void 0!==i?i:[]).forEach((([t,e])=>r[t]=this.get(e))),this.instances.set(t,r)}return this.instances.get(t)}has(t){return this.types.has(t)||this.instances.has(t)}}function i(t){return function(e){e.prototype.__ioc_injectable&&e.prototype.__ioc_injectable===t||(e.prototype.__ioc_injectable=t)}}function s(t){return function(e,i,s){void 0!==s?(e.prototype.__ioc_inject_constructor||(e.prototype.__ioc_inject_constructor=[]),e.prototype.__ioc_inject_constructor[s]=t):void 0!==i&&(e.constructor.prototype.__ioc_inject_prop||(e.constructor.prototype.__ioc_inject_prop=[]),e.constructor.prototype.__ioc_inject_prop.push([i,t]))}}var r;function o(t,e,i,s){var r,o=arguments.length,n=o<3?e:null===s?s=Object.getOwnPropertyDescriptor(e,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,i,s);else for(var a=t.length-1;a>=0;a--)(r=t[a])&&(n=(o<3?r(n):o>3?r(e,i,n):r(e,i))||n);return o>3&&n&&Object.defineProperty(e,i,n),n}function n(t,e){return function(i,s){e(i,s,t)}}function a(t,e,i,s){return new(i||(i=Promise))((function(r,o){function n(t){try{h(s.next(t))}catch(t){o(t)}}function a(t){try{h(s.throw(t))}catch(t){o(t)}}function h(t){var e;t.done?r(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(n,a)}h((s=s.apply(t,e||[])).next())}))}exports.BroadPhaseMethods=void 0,(r=exports.BroadPhaseMethods||(exports.BroadPhaseMethods={}))[r.QuadTree=0]="QuadTree",r[r.SpartialGrid=1]="SpartialGrid","function"==typeof SuppressedError&&SuppressedError;class h{constructor(t=0,e=0){this._x=t,this._y=e}get x(){return this._x}set x(t){this._x=t}get y(){return this._y}set y(t){this._y=t}get magnitude(){return Math.sqrt(Math.pow(this._x,2)+Math.pow(this._y,2))}get direction(){return this._direction||(this._direction=new h),h.unit(this._direction,this)}set(t,e){this._x=t,this._y=e}copy(t){this.set(t.x,t.y)}equals(t){return this._x===t.x&&this._y===t.y}clone(){return new h(this._x,this._y)}distance(t){return Math.sqrt(Math.pow(this._x-t.x,2)+Math.pow(this._y-t.y,2))}static add(t,e,i){return t.set(e.x+i.x,e.y+i.y),t}static subtract(t,e,i){return t.set(e.x-i.x,e.y-i.y),t}static unit(t,e){return 0===e.magnitude?t.set(0,0):t.set(e.x/e.magnitude,e.y/e.magnitude),t}static normal(t,e){return t.set(-e.y,e.x),this.unit(t,t)}static scale(t,e,i){return t.set(e.x*i,e.y*i),t}static dot(t,e){return t.x*e.x+t.y*e.y}static cross(t,e){return t.x*e.y-t.y*e.x}static round(t,e){return t.set(Math.round(e.x),Math.round(e.y)),t}static floor(t,e){return t.set(Math.floor(e.x),Math.floor(e.y)),t}static ceil(t,e){return t.set(Math.ceil(e.x),Math.ceil(e.y)),t}toString(){return`(${this._x}, ${this._y})`}}class l{constructor(t=0,e=0,i=0,s=0){this.width=0,this.height=0,this._position=new h,this._center=new h,this.set(t,e,i,s)}get x(){return this._position.x}set x(t){this._position.set(t,this._position.y)}get y(){return this._position.y}set y(t){this._position.set(this._position.x,t)}get x1(){return this._position.x+this.width}get y1(){return this._position.y+this.height}get position(){return this._position}set position(t){this._position.set(t.x,t.y)}get center(){return this._center.set(this.x+this.width/2,this.y+this.height/2),this._center}set(t,e,i,s){this._position.set(t,e),this.width=i,this.height=s}equals(t){return this.position.equals(t.position)&&this.width===t.width&&this.height===t.height}copy(t){this.set(t.x,t.y,t.width,t.height)}intersects(t){return!(this.x1<t.x||this.x>t.x1||this.y1<t.y||this.y>t.y1)}contains(t){return t instanceof l?t.x1<=this.x1&&t.x>=this.x&&t.y1<=this.y1&&t.y>=this.y:t instanceof h&&!(t.x<this.x||t.y<this.y||t.x>=this.x1||t.y>=this.y1)}toString(){return`(${this.position.x}, ${this.position.y}, ${this.width}, ${this.height})`}}const c=(t,e,i)=>Math.min(i,Math.max(e,t)),d=(t,e)=>Math.round(t*Math.pow(10,e))/Math.pow(10,e),g=(t,e,i=1)=>{const s=[];for(let r=t;r<=e;r+=i)s.push(r);return s},p=(t,e,i)=>t>=e&&t<=i;var m;let u=m=class{constructor(t=new l,e=0){this.rects=new Map,this.children=null,this.minArea=new h,this.maxArea=new h,this.bounds=t,this.depth=e}update(t){this.clear(),0!==t.length&&(this.resize(t),t.forEach((({id:t,boundingBox:e})=>this.insert(t,e))))}clear(){this.rects.clear(),this.children&&(this.children.forEach((t=>t.clear())),this.children=null)}resize(t){this.minArea.set(1/0,1/0),this.maxArea.set(-1/0,-1/0),t.forEach((({boundingBox:t})=>{this.minArea.set(Math.min(t.x,this.minArea.x),Math.min(t.y,this.minArea.y)),this.maxArea.set(Math.max(t.x1,this.maxArea.x),Math.max(t.y1,this.maxArea.y))})),this.bounds.set(this.minArea.x,this.minArea.y,this.maxArea.x-this.minArea.x,this.maxArea.y-this.minArea.y)}insert(t,e){!this.children&&this.rects.size>=16&&this.depth<8&&(this.subdivide(),this.rects.forEach(((t,e)=>this.children.forEach((i=>{i.bounds.intersects(t)&&i.insert(e,t)})))),this.rects.clear()),this.children?this.children.forEach((i=>{i.bounds.intersects(e)&&i.insert(t,e)})):this.rects.set(t,e)}subdivide(){const t=this.bounds.x,e=this.bounds.y,i=this.bounds.width/2,s=this.bounds.height/2;this.children=[new m(new l(t,e,i,s),this.depth+1),new m(new l(t+i,e,i,s),this.depth+1),new m(new l(t,e+s,i,s),this.depth+1),new m(new l(t+i,e+s,i,s),this.depth+1)]}retrieve(t){const e=[];return this.retrieveFromNode(t,e),e}retrieveFromNode(t,e){this.children?this.children.forEach((i=>{i.bounds.intersects(t)&&i.retrieveFromNode(t,e)})):this.rects.forEach(((i,s)=>{i.intersects(t)&&-1===e.indexOf(s)&&e.push(s)}))}};u=m=o([i(t.CollisionBroadphaseResolver)],u);const y=(t,e,i,s)=>Math.min((t-e)/i|0,s-1);let f=class{constructor(){this.area=new l,this.grid=[],this.rects=new Map,this.subdivisions=0,this.minArea=new h,this.maxArea=new h,this.coordinates={x0:0,x1:0,y0:0,y1:0}}update(t){this.clear(),0!==t.length&&(this.resize(t),t.forEach((({id:t,boundingBox:e})=>this.insert(t,e))))}clear(){this.grid=[],this.rects.clear()}resize(t){this.minArea.set(1/0,1/0),this.maxArea.set(-1/0,-1/0),t.forEach((({boundingBox:t})=>{this.minArea.set(Math.min(t.x,this.minArea.x),Math.min(t.y,this.minArea.y)),this.maxArea.set(Math.max(t.x1,this.maxArea.x),Math.max(t.y1,this.maxArea.y))})),this.area.set(this.minArea.x,this.minArea.y,this.maxArea.x-this.minArea.x,this.maxArea.y-this.minArea.y),this.updateSubdivisions(t.length)}updateSubdivisions(t){this.subdivisions=1+(t/16|0),this.cellWidth=Math.ceil(this.area.width/this.subdivisions),this.cellHeight=Math.ceil(this.area.height/this.subdivisions),this.grid=[];for(let t=0;t<this.subdivisions;t++){this.grid[t]=[];for(let e=0;e<this.subdivisions;e++)this.grid[t][e]=[]}}insert(t,e){this.updateCoordinates(e);for(let e=this.coordinates.x0;e<=this.coordinates.x1;e++)for(let i=this.coordinates.y0;i<=this.coordinates.y1;i++)this.grid[e][i].push(t);this.rects.set(t,e)}retrieve(t){const e=new Set;this.updateCoordinates(t);for(let i=this.coordinates.x0;i<=this.coordinates.x1;i++)for(let s=this.coordinates.y0;s<=this.coordinates.y1;s++)this.grid[i][s].forEach((i=>{this.rects.get(i).intersects(t)&&e.add(i)}));return Array.from(e)}updateCoordinates(t){this.coordinates.x0=y(t.x,this.area.x,this.cellWidth,this.subdivisions),this.coordinates.x1=y(t.x1,this.area.x,this.cellWidth,this.subdivisions),this.coordinates.y0=y(t.y,this.area.y,this.cellHeight,this.subdivisions),this.coordinates.y1=y(t.y1,this.area.y,this.cellHeight,this.subdivisions)}};f=o([i(t.CollisionBroadphaseResolver)],f);class x{get vertexModel(){return this._vertexModel}set vertexModel(t){if(this._vertexModel=t,2===t.length)return this.vertices=[new h,new h],void(this.projectionAxes=[new h]);this.vertices=[],this.projectionAxes=[],this._vertexModel.forEach((()=>{this.vertices.push(new h),this.projectionAxes.push(new h)}))}constructor(t,e=0){this.rotation=e,this.boundingBox=new l,this.collider=void 0,this.entity=void 0,this.id=void 0,this.ignoreCollisionsWithLayers=void 0,this.layer=void 0,this.position=new h,this.projectionAxes=[],this.radius=0,this.vertices=[],this.updateCollisions=!0,this._vertexModel=[],this.vertexModel=t}}class M{constructor(t){this.radius=t,this.boundingBox=new l,this.collider=void 0,this.entity=void 0,this.id=void 0,this.ignoreCollisionsWithLayers=void 0,this.layer=void 0,this.position=new h,this.projectionAxes=[new h],this.rotation=0,this.vertexModel=[],this.vertices=[new h,new h],this.updateCollisions=!0}}let v=class{constructor(t,e,i){this.AABBResolver=t,this.circumferenceAABBResolver=e,this.circumferenceResolver=i}findCollision(t,e){return t instanceof x&&e instanceof x?this.AABBResolver.resolve(t,e):t instanceof M&&e instanceof x?this.circumferenceAABBResolver.resolve(t,e):t instanceof x&&e instanceof M?this.circumferenceAABBResolver.resolve(e,t,!0):t instanceof M&&e instanceof M?this.circumferenceResolver.resolve(t,e):void 0}};var C;v=o([i(t.CollisionResolutionMethod),n(0,s(t.CollisionAABBResolver)),n(1,s(t.CollisionCircumferenceAABBResolver)),n(2,s(t.CollisionCircumferenceResolver))],v),exports.CollisionMethods=void 0,(C=exports.CollisionMethods||(exports.CollisionMethods={}))[C.AABB=0]="AABB",C[C.SAT=1]="SAT";let S=class{constructor(t,e){this.circumferenceResolver=t,this.satResolver=e}findCollision(t,e){return t instanceof M&&e instanceof M?this.circumferenceResolver.resolve(t,e):this.satResolver.resolve(t,e)}};S=o([i(t.CollisionResolutionMethod),n(0,s(t.CollisionCircumferenceResolver)),n(1,s(t.CollisionSatResolver))],S);let b=class{constructor(){this.direction=new h,this.resolutionDirection=new h}resolve({boundingBox:t},{boundingBox:e}){if(this.overlapX=Math.min(t.x1,e.x1)-Math.max(t.x,e.x),this.overlapY=Math.min(t.y1,e.y1)-Math.max(t.y,e.y),!(this.overlapX<0||this.overlapY<0))return this.checkOverlapForLines(t,e),this.direction.set(Math.sign(e.center.x-t.center.x),Math.sign(e.center.y-t.center.y)),this.preventContainment(t,e),this.overlapY<this.overlapX?(this.minOverlap=this.overlapY,this.resolutionDirection.set(0,this.direction.y)):(this.minOverlap=this.overlapX,this.resolutionDirection.set(this.direction.x,this.overlapY===this.overlapX?this.direction.y:0)),{direction:h.unit(new h,this.resolutionDirection),penetration:this.minOverlap}}checkOverlapForLines(t,e){0!==t.width&&0!==e.width||0!==this.overlapX||(this.overlapX=Math.min(Math.abs(t.x-e.x),Math.abs(t.x1-e.x1))),0!==t.height&&0!==e.height||0!==this.overlapY||(this.overlapY=Math.min(Math.abs(t.y-e.y),Math.abs(t.y1-e.y1)))}preventContainment(t,e){if(this.overlapY>0&&(t.y1>e.y1&&t.y<e.y||t.y1<e.y1&&t.y>e.y)){const i=Math.abs(t.y-e.y),s=Math.abs(t.y1-e.y1);this.overlapY+=i<s?i:s}if(this.overlapX>0&&(t.x1>e.x1&&t.x<e.x||t.x1<e.x1&&t.x>e.x)){const i=Math.abs(t.x-e.x),s=Math.abs(t.x1-e.x1);this.overlapX+=i<s?i:s}}};b=o([i(t.CollisionAABBResolver)],b);let A=class{constructor(){this.closestPoint=new h,this.distance=new h,this.direction=new h}resolve(t,e,i=!1){if(this.closestPoint.set(c(t.position.x,e.boundingBox.x,e.boundingBox.x1),c(t.position.y,e.boundingBox.y,e.boundingBox.y1)),h.subtract(this.distance,this.closestPoint,t.position),!(this.distance.magnitude>t.radius))return h.unit(this.direction,this.distance),{direction:i?h.scale(new h,this.direction,-1):this.direction.clone(),penetration:t.radius-this.distance.magnitude}}};A=o([i(t.CollisionCircumferenceAABBResolver)],A);let w=class{constructor(){this.distance=new h,this.direction=new h}resolve(t,e){if(h.subtract(this.distance,e.position,t.position),!(this.distance.magnitude>t.radius+e.radius))return h.unit(this.direction,this.distance),{direction:this.direction.clone(),penetration:t.radius+e.radius-this.distance.magnitude}}};w=o([i(t.CollisionCircumferenceResolver)],w);let E=class{constructor(){this.projA={min:0,max:0},this.projB={min:0,max:0},this.smallestAxis=new h,this.distance=new h(1/0,1/0),this.cache=new h}resolve(t,e){this.minOverlap=1/0,t instanceof M?this.setCircumferenceAxis(t,e):e instanceof M&&this.setCircumferenceAxis(e,t),this.axes=[...t.projectionAxes],e.projectionAxes.forEach((t=>this.axes.some((e=>e.equals(t)))?void 0:this.axes.push(t)));for(let i=0;i<this.axes.length;i++){if(t instanceof M?this.setCircumferenceVertices(t,this.axes[i]):e instanceof M&&this.setCircumferenceVertices(e,this.axes[i]),this.projectShapeOntoAxis(this.projA,t,this.axes[i]),this.projectShapeOntoAxis(this.projB,e,this.axes[i]),this.currentOverlap=Math.min(this.projA.max,this.projB.max)-Math.max(this.projA.min,this.projB.min),this.currentOverlap<0)return;if(this.invertAxis=!0,this.projA.max>this.projB.max&&this.projA.min<this.projB.min||this.projA.max<this.projB.max&&this.projA.min>this.projB.min){const t=Math.abs(this.projA.min-this.projB.min),e=Math.abs(this.projA.max-this.projB.max);t<e?this.currentOverlap+=t:(this.currentOverlap+=e,h.scale(this.axes[i],this.axes[i],-1),this.invertAxis=!1)}this.currentOverlap<this.minOverlap&&(this.minOverlap=this.currentOverlap,this.smallestAxis.copy(this.axes[i]),this.invertAxis&&this.projA.max<this.projB.max&&h.scale(this.smallestAxis,this.axes[i],-1))}return{direction:h.scale(new h,this.smallestAxis,-1),penetration:this.minOverlap}}projectShapeOntoAxis(t,e,i){return t.min=1/0,t.max=-1/0,e.vertices.forEach((e=>{t.min=Math.min(h.dot(i,e),t.min),t.max=Math.max(h.dot(i,e),t.max)})),t}setCircumferenceAxis(t,e){this.distance.set(1/0,1/0),e.vertices.forEach((e=>{h.subtract(this.cache,e,t.position),this.cache.magnitude<this.distance.magnitude&&this.distance.copy(this.cache)})),h.unit(t.projectionAxes[0],this.distance)}setCircumferenceVertices(t,e){h.add(t.vertices[0],t.position,h.scale(this.cache,h.unit(this.cache,e),-t.radius)),h.add(t.vertices[1],t.position,h.scale(this.cache,h.unit(this.cache,e),t.radius))}};E=o([i(t.CollisionSatResolver)],E),exports.CollisionRepository=class{constructor(){this.collisions=[]}findCollisionsForCollider(t){return this.collisions.filter((e=>e.localCollider===t))}findCollisionsForColliderAndLayer(t,e){return this.collisions.filter((i=>i.localCollider===t&&i.remoteCollider.layer===e))}findAll(){return this.collisions}persist(t){this.collisions.push(t)}removeAll(){this.collisions=[]}},exports.CollisionRepository=o([i(t.CollisionRepository)],exports.CollisionRepository);const R=t=>{if(null===t||"object"!=typeof t)return t;if("undefined"!=typeof Node&&t instanceof Node)return t;if("undefined"!=typeof FontFace&&t instanceof FontFace)return t;if(t instanceof Date)return new Date(t.getTime());if(t instanceof Array)return t.map((t=>R(t)));if(t instanceof Map){const e=new Map;for(const[i,s]of t)e.set(R(i),R(s));return e}if(t instanceof Set){const e=new Set;for(const i of t)e.add(R(i));return e}const e=Object.getPrototypeOf(t),i=Object.create(e);for(const e of Object.keys(t))i[e]=R(t[e]);return i};exports.EntityManager=class{constructor(){this.lastEntityId=0,this.lastComponentTypeId=0,this.entities=new Set,this.components=new Map,this.disabledEntities=new Set,this.manuallyDisabledEntities=new Set,this.disabledComponents=new Map,this.parentEntities=new Map,this.childEntities=new Map}createEntity(t,e){const i=this.lastEntityId++;return t&&(this.entities.add(i),t.forEach((t=>this.addComponent(i,t))),e&&this.setParent(i,e)),i}createEntityFromArchetype({components:t,children:e,enabled:i},s){const r=this.lastEntityId++;return this.entities.add(r),this.createComponentsFromArchetype(t,r),s&&this.setParent(r,s),e&&e.forEach((t=>this.createEntityFromArchetype(t,r))),!1===i&&this.disableEntity(r),r}createComponentsFromArchetype(t,e){t.forEach((t=>{let i,s=!0;if("object"==typeof t&&"component"in t&&"enabled"in t&&!1===t.enabled&&(s=!1,t=t.component),"object"==typeof t)i=this.addComponent(e,R(t));else{if("function"!=typeof t)throw new Error("Invalid component type");i=this.addComponent(e,t)}s||this.disableComponent(i)}))}removeEntity(t){var e;this.getChildren(t).forEach((t=>this.removeEntity(t))),this.components.forEach((e=>{e.has(t)&&e.delete(t)})),this.disabledComponents.delete(t),this.disabledEntities.delete(t),this.manuallyDisabledEntities.delete(t);const i=this.getParent(t);i&&(null===(e=this.childEntities.get(i))||void 0===e||e.delete(t)),this.parentEntities.delete(t),this.childEntities.delete(t),this.entities.delete(t)}removeAllEntities(t){const e=t?this.search(t):[];if(e.length>0){const t=new Set(e.map((({entity:t})=>t)));for(const e of this.entities)t.has(e)||this.removeEntity(e)}else this.components.clear(),this.disabledComponents.clear(),this.disabledEntities.clear(),this.manuallyDisabledEntities.clear(),this.lastEntityId=0,this.entities.clear(),this.parentEntities.clear(),this.childEntities.clear()}isEntity(t){return this.entities.has(t)}isEntityEnabled(t){return this.isEntity(t)&&!this.disabledEntities.has(t)}enableEntity(t){this.disabledEntities.has(t)&&(this.disabledEntities.delete(t),this.getChildren(t).forEach((t=>{this.manuallyDisabledEntities.has(t)||this.enableEntity(t)})))}disableEntity(t){this.disabledEntities.has(t)||(this.disabledEntities.add(t),this.getChildren(t).forEach((t=>{this.disabledEntities.has(t)?this.manuallyDisabledEntities.add(t):this.disableEntity(t)})))}disableEntitiesByComponent(t){var e,i;for(const s of null!==(i=null===(e=this.components.get(this.getComponentTypeId(t)))||void 0===e?void 0:e.keys())&&void 0!==i?i:[])this.disableEntity(s)}enableEntitiesByComponent(t){var e,i;for(const s of null!==(i=null===(e=this.components.get(this.getComponentTypeId(t)))||void 0===e?void 0:e.keys())&&void 0!==i?i:[])this.enableEntity(s)}setParent(t,e){if(!this.isEntity(t)||!this.isEntity(e))throw new Error("Both entities must exist to set a parent-child relationship.");this.parentEntities.set(t,e),this.childEntities.has(e)||this.childEntities.set(e,new Set),this.childEntities.get(e).add(t)}getParent(t){return this.parentEntities.get(t)}getChildren(t){return Array.from(this.childEntities.get(t)||[])}removeParent(t){const e=this.parentEntities.get(t);e&&(this.parentEntities.delete(t),this.childEntities.get(e).delete(t))}removeChild(t,e){this.parentEntities.get(e)===t&&(this.parentEntities.delete(e),this.childEntities.get(t).delete(e))}addComponent(t,e){var i;const s=this.getComponentTypeId(e),r="object"==typeof e?e:new e;if(this.components.has(s)||this.components.set(s,new Map),this.components.get(s).has(t)){const e=null!==(i=r.constructor.componentName)&&void 0!==i?i:r.constructor.name;throw new Error(`Entity ${t} already has a component of type ${e}`)}return this.components.get(s).set(t,r),r}hasComponent(t,e){return void 0!==this.getComponent(t,e)}getComponent(t,e){var i;return null===(i=this.components.get(this.getComponentTypeId(e)))||void 0===i?void 0:i.get(t)}getComponents(t){const e=[];return this.components.forEach((i=>i.forEach(((i,s)=>{t===s&&e.push(i)})))),e}updateComponentData(t,e,i){const s=this.getComponent(t,e);s&&i(s)}getEntityForComponent(t){const e=this.getComponentTypeId(t);if(this.components.has(e))for(const[i,s]of this.components.get(e))if(s===t)return i}removeComponent(t,e){var i;const s=this.getComponentTypeId("object"==typeof t?t:e),r="number"==typeof t?t:this.getEntityForComponent(t);void 0!==r&&(null===(i=this.components.get(s))||void 0===i?void 0:i.has(r))&&this.components.get(s).delete(r)}isComponentEnabled(t,e){var i;const s=this.getComponentTypeId("object"==typeof t?t:e),r="number"==typeof t?t:this.getEntityForComponent(t);return void 0!==r&&!(null===(i=this.disabledComponents.get(r))||void 0===i?void 0:i.has(s))}disableComponent(t,e){const i="number"==typeof t?t:this.getEntityForComponent(t),s=this.getComponentTypeId("object"==typeof t?t:e);null!=i&&(this.disabledComponents.has(i)?this.disabledComponents.get(i).has(s)||this.disabledComponents.get(i).add(s):this.disabledComponents.set(i,new Set([s])))}enableComponent(t,e){var i;const s="number"==typeof t?t:this.getEntityForComponent(t),r=this.getComponentTypeId("object"==typeof t?t:e);void 0!==s&&(null===(i=this.disabledComponents.get(s))||void 0===i?void 0:i.has(r))&&this.disabledComponents.get(s).delete(r)}getComponentFromParent(t,e){let i=t;for(;i;){const t=this.getComponent(i,e);if(t)return t;i=this.getParent(i)}}search(t,e,i=!1){const s=[],r=this.getComponentTypeId(t),o="boolean"==typeof e?e:i,n="function"==typeof e?e:void 0;return this.components.has(r)&&this.components.get(r).forEach(((e,i)=>{n&&!n(e,i)||!(o||this.isEntityEnabled(i)&&this.isComponentEnabled(i,t))||s.push({entity:i,component:e})})),s}searchEntitiesByComponents(t){const e=[];let i=!0;for(const s of t){const t=this.getComponentTypeId(s);if(!t||!this.components.has(t))return[];if(i){e.push(...this.components.get(t).keys()),i=!1;continue}const r=new Set(this.components.get(t).keys());e.forEach(((t,i)=>{r.has(t)||e.splice(i,1)}))}return e}searchInChildren(t,e,i=!1){const s=this.getChildren(t);return this.search(e,i).filter((({entity:t})=>s.includes(t)))}getComponentTypeId(t){const e="object"==typeof t?t.constructor.prototype:t.prototype;return void 0===e.__ecs_type_id&&(e.__ecs_type_id=++this.lastComponentTypeId),e.__ecs_type_id}},exports.EntityManager=o([i(t.EntityManager)],exports.EntityManager),exports.SystemManager=class{constructor(){this.systems=[]}findSystemIndex(t){return this.systems.findIndex((e=>e[0]instanceof t))}addSystem(t,e){if(this.systems.some((t=>t[0]instanceof t.constructor)))throw new Error(`SystemManager already has an instance of ${t.constructor.name}.`);this.systems.push([t,e,!1,!1])}hasSystem(t){return this.systems.some((e=>e[0]instanceof t))}getSystem(t){const e=this.findSystemIndex(t);return-1!==e?this.systems[e][0]:void 0}groupHasSystems(t){return this.systems.filter((e=>e[1]===t)).length>0}enableSystem(t){const e=this.findSystemIndex(t);if(-1===e||!0===this.systems[e][2])return;const i=this.systems[e];!1===i[3]&&(i[3]=!0,i[0].onCreate&&i[0].onCreate()),i[2]=!0,i[0].onEnabled&&i[0].onEnabled()}disableSystem(t){const e=this.findSystemIndex(t);if(-1===e||!1===this.systems[e][2])return;const i=this.systems[e];i[2]=!1,i[0].onDisabled&&i[0].onDisabled()}setExecutionOrder(t,e){const i=this.findSystemIndex(t);if(-1===i)throw new Error(`Cannot set execution order because ${t.name} is not a system.`);this.systems.splice(e,0,this.systems.splice(i,1)[0])}removeSystem(t){const e=this.findSystemIndex(t);if(-1===e)return;const i=this.systems.splice(e,1)[0][0];i.onDestroy&&i.onDestroy()}disableAllSystems(){this.systems.forEach((t=>{t[2]&&this.disableSystem(t[0].constructor)}))}update(t){this.systems.filter((e=>e[1]===t&&!0===e[2])).forEach((t=>t[0].onUpdate()))}},exports.SystemManager=o([i(t.SystemManager)],exports.SystemManager);class _{constructor(){this.buttons=new Map,this.axes=new Map,this._dpadAxes=new h,this._leftStickAxes=new h,this._rightStickAxes=new h}get dpadAxes(){return this._dpadAxes.set(this.dpadRight?1:this.dpadLeft?-1:0,this.dpadUp?1:this.dpadDown?-1:0),this._dpadAxes}get leftStickAxes(){return this._leftStickAxes.set(this.leftStickHorizontal,this.leftStickVertical),this._leftStickAxes}get rightStickAxes(){return this._rightStickAxes.set(this.rightStickHorizontal,this.rightStickVertical),this._rightStickAxes}get dpadUp(){var t;return null!==(t=this.buttons.get(12))&&void 0!==t&&t}get dpadDown(){var t;return null!==(t=this.buttons.get(13))&&void 0!==t&&t}get dpadLeft(){var t;return null!==(t=this.buttons.get(14))&&void 0!==t&&t}get dpadRight(){var t;return null!==(t=this.buttons.get(15))&&void 0!==t&&t}get bottomFace(){var t;return null!==(t=this.buttons.get(0))&&void 0!==t&&t}get rightFace(){var t;return null!==(t=this.buttons.get(1))&&void 0!==t&&t}get leftFace(){var t;return null!==(t=this.buttons.get(2))&&void 0!==t&&t}get topFace(){var t;return null!==(t=this.buttons.get(3))&&void 0!==t&&t}get leftShoulder(){var t;return null!==(t=this.buttons.get(4))&&void 0!==t&&t}get rightShoulder(){var t;return null!==(t=this.buttons.get(5))&&void 0!==t&&t}get leftTrigger(){var t;return null!==(t=this.buttons.get(6))&&void 0!==t&&t}get rightTrigger(){var t;return null!==(t=this.buttons.get(7))&&void 0!==t&&t}get back(){var t;return null!==(t=this.buttons.get(8))&&void 0!==t&&t}get start(){var t;return null!==(t=this.buttons.get(9))&&void 0!==t&&t}get leftStickButton(){var t;return null!==(t=this.buttons.get(10))&&void 0!==t&&t}get rightStickButton(){var t;return null!==(t=this.buttons.get(11))&&void 0!==t&&t}get leftStickHorizontal(){var t;return null!==(t=this.axes.get(0))&&void 0!==t?t:0}get leftStickVertical(){var t;return-(null!==(t=this.axes.get(1))&&void 0!==t?t:0)}get rightStickHorizontal(){var t;return null!==(t=this.axes.get(2))&&void 0!==t?t:0}get rightStickVertical(){var t;return-(null!==(t=this.axes.get(3))&&void 0!==t?t:0)}get anyButtonPressed(){var t;return null!==(t=Array.from(this.buttons.values()).find((t=>t)))&&void 0!==t&&t}vibrate(t=200,e=.2,i=.2,s=0){this.vibrationInput={duration:t,weakMagnitude:e,startDelay:s,strongMagnitude:i}}}class T{constructor(){this.pressedKeys=[]}isPressed(t){return this.pressedKeys.includes(t)}orPressed(t){return t.reduce(((t,e)=>t||this.pressedKeys.includes(e)),!1)}andPressed(t){return t.reduce(((t,e)=>t&&this.pressedKeys.includes(e)),!0)}isPressedReturn(t,e,i){return this.pressedKeys.includes(t)?e:i}orPressedReturn(t,e,i){return t.reduce(((t,e)=>t||this.pressedKeys.includes(e)),!1)?e:i}andPressedReturn(t,e,i){return t.reduce(((t,e)=>t&&this.pressedKeys.includes(e)),!0)?e:i}}class B{constructor(){this.leftButtonPressed=!1,this.scrollButtonPressed=!1,this.rightButtonPressed=!1,this.positionInViewport=new h,this.hasMoved=!1,this.wheelScroll=new h}}class P{constructor(){this.touching=!1,this.interactions=[]}}exports.InputManager=class{constructor(){this.keyboard=new T,this.mouse=new B,this.touchScreen=new P,this.gamepads=[]}},exports.InputManager=o([i(t.InputManager)],exports.InputManager);const D=[60,120,180,240];var F;exports.TimeManager=class{get deltaTime(){return this.unscaledDeltaTime*this.timeScale}get physicsDeltaTime(){return this.unscaledPhysicsDeltaTime*this.timeScale}get renderDeltaTime(){return this.browserDeltaTime*this.timeScale}constructor({physicsFramerate:t},e){if(this.entityManager=e,this.timeScale=1,this.browserDeltaTime=0,this.unscaledDeltaTime=0,this.unscaledPhysicsDeltaTime=0,this.maxDeltaTime=1/30,this.thenForGame=0,this.thenForPhysics=0,this.thenForRender=0,this.lastIntervalId=0,this.intervals=new Map,t&&!D.includes(t))throw new Error(`Invalid Physics frame rate. Allowed: [${D.join(", ")}]`);this.fixedGameFramerate=60,this.fixedGameDeltaTime=parseFloat((1/this.fixedGameFramerate).toFixed(6)),this.fixedPhysicsFramerate=null!=t?t:180,this.fixedPhysicsDeltaTime=parseFloat((1/this.fixedPhysicsFramerate).toFixed(6))}updateForRender(t){this.browserDeltaTime=Math.min(Math.max(0,t-this.thenForRender),this.maxDeltaTime),this.thenForRender=t}updateForGame(t){this.unscaledDeltaTime=Math.min(Math.max(this.fixedGameDeltaTime,t-this.thenForGame),this.maxDeltaTime),this.thenForGame=t}updateForPhysics(t){this.unscaledPhysicsDeltaTime=Math.min(Math.max(0,t-this.thenForPhysics),this.maxDeltaTime),this.thenForPhysics=t}updateIntervals(){if(0!==this.intervals.size)for(const[t,e]of this.intervals)this.intervalHealthCheck(e)?(e.executeImmediately?(e.timer=e.delay,e.executeImmediately=!1):e.timer+=1e3*(e.useTimeScale?this.deltaTime:this.unscaledDeltaTime),e.timer>=e.delay&&(e.callback(),e.times&&--e.times<=0?this.clearInterval(t):e.timer-=e.delay)):this.clearInterval(t)}intervalHealthCheck(t){return!(t.entityRef&&!this.entityManager.isEntityEnabled(t.entityRef))&&!(t.componentRef&&!this.entityManager.isComponentEnabled(t.componentRef))}setInterval({callback:t,delay:e,times:i,executeImmediately:s,entityRef:r,componentRef:o,useTimeScale:n=!0}){const a=++this.lastIntervalId;return this.intervals.set(a,{callback:t,delay:e,times:i,executeImmediately:s,entityRef:r,componentRef:o,timer:0,useTimeScale:n}),a}clearInterval(t){this.intervals.delete(t),0===this.intervals.size&&(this.lastIntervalId=0)}clearAllIntervals(){this.intervals.clear(),this.lastIntervalId=0}},exports.TimeManager=o([i(t.TimeManager),n(0,s(t.GameConfig)),n(1,s(t.EntityManager))],exports.TimeManager),function(t){t[t.Image=0]="Image",t[t.Audio=1]="Audio",t[t.Font=2]="Font",t[t.Video=3]="Video",t[t.Json=4]="Json"}(F||(F={})),exports.AssetManager=class{constructor(){this.assets=[]}getAssetsLoaded(){return this.assets.reduce(((t,e)=>t&&e.loaded),!0)}loadImage(t,e){if(this.getImage(t))return this.getImage(t);const i=new Image;i.crossOrigin="",i.src=t;const s=this.createAsset(t,F.Image,i,e),r=()=>s.loaded=!0;return i.complete?r():i.addEventListener("load",r),i}loadAudio(t,e){if(this.getAudio(t))return this.getAudio(t);const i=new Audio;i.src=t;const s=this.createAsset(t,F.Audio,i,e);return i.duration?s.loaded=!0:i.addEventListener("canplaythrough",(()=>s.loaded=!0)),i}loadFont(t,e){if(this.getFont(t))return this.getFont(t);const i=new FontFace(t,`url(${e})`),s=this.createAsset(e,F.Font,i);return s.family=t,document.fonts.add(i),i.load().then((()=>s.loaded=!0)),i}loadVideo(t,e){if(this.getVideo(t))return this.getVideo(t);const i=document.createElement("video");i.playsInline=!0,i.src=t;const s=this.createAsset(t,F.Video,i,e);return i.duration?s.loaded=!0:i.addEventListener("canplaythrough",(()=>s.loaded=!0)),i}loadJson(t,e){return a(this,void 0,void 0,(function*(){if(this.getJson(t))return this.getJson(t);const i=this.createAsset(t,F.Json,null,e),s=yield fetch(t),r=yield s.json();return i.loaded=!0,i.element=r,r}))}getImage(t){var e;return null===(e=this.assets.find((e=>e.type===F.Image&&(e.url===t||e.name===t))))||void 0===e?void 0:e.element}getAudio(t){var e;return null===(e=this.assets.find((e=>e.type===F.Audio&&(e.url===t||e.name===t))))||void 0===e?void 0:e.element}getFont(t){var e;return null===(e=this.assets.find((e=>e.type===F.Font&&e.family===t)))||void 0===e?void 0:e.element}getVideo(t){var e;return null===(e=this.assets.find((e=>e.type===F.Video&&(e.url===t||e.name===t))))||void 0===e?void 0:e.element}getJson(t){var e;return null===(e=this.assets.find((e=>e.type===F.Json&&(e.url===t||e.name===t))))||void 0===e?void 0:e.element}createAsset(t,e,i,s){this.deleteAssetIfExists({url:t,name:s});const r={type:e,url:t,element:i,loaded:!1,name:s};return this.assets.push(r),r}deleteAssetIfExists({url:t,name:e}){const i=this.assets.findIndex((i=>i.url===t||void 0!==i.name&&i.name===e));-1!==i&&this.assets.splice(i,1)}},exports.AssetManager=o([i(t.AssetManager)],exports.AssetManager);class U{get playing(){return"playing"===this.state}get paused(){return"paused"===this.state}get stopped(){return"stopped"===this.state}constructor(t){this.action=void 0,this.stopOnSceneTransition=!0,this.fixedToTimeScale=!1,this.loop=!1,this.state="stopped",this.volume=1,this._currentAudioSource=void 0,this._playPromisePendind=!1,this._playAfterUserInput=!1,Object.assign(this,t)}play(t){t&&(this.audioSource=t),this.action="play"}pause(){this.action="pause"}stop(){this.action="stop"}}U.componentName="AudioPlayer";const I={AudioPlayerSystem:Symbol.for("AudioPlayerSystem"),ButtonSystem:Symbol.for("ButtonSystem"),TiledWrapperSystem:Symbol.for("TiledWrapperSystem"),TilemapPreProcessingSystem:Symbol.for("TilemapPreProcessingSystem"),TransformSystem:Symbol.for("TransformSystem"),GamepadSystem:Symbol.for("GamepadSystem"),KeyboardSystem:Symbol.for("KeyboardSystem"),MouseSystem:Symbol.for("MouseSystem"),TouchScreenSystem:Symbol.for("TouchScreenSystem"),UpdateBallColliderShapeSystem:Symbol.for("UpdateBallColliderShapeSystem"),UpdateBoxColliderShapeSystem:Symbol.for("UpdateBoxColliderShapeSystem"),UpdateEdgeColliderShapeSystem:Symbol.for("UpdateEdgeColliderShapeSystem"),UpdatePolygonColliderShapeSystem:Symbol.for("UpdatePolygonColliderShapeSystem"),UpdateTilemapColliderShapeSystem:Symbol.for("UpdateTilemapColliderShapeSystem"),UpdateCollidersAfterRepositionSystem:Symbol.for("UpdateCollidersAfterRepositionSystem"),ApplyRepositionSystem:Symbol.for("ApplyRepositionSystem"),ApplyVelocitySystem:Symbol.for("ApplyVelocitySystem"),ResolveCollisionSystem:Symbol.for("ResolveCollisionSystem"),AnimatorSystem:Symbol.for("AnimatorSystem"),CameraSystem:Symbol.for("CameraSystem"),ClearScreenSystem:Symbol.for("ClearScreenSystem"),CullingSystem:Symbol.for("CullingSystem"),MaskRendererSystem:Symbol.for("MaskRendererSystem"),RenderSystem:Symbol.for("RenderSystem"),DarknessLightRendererSystem:Symbol.for("DarknessLightRendererSystem"),SpriteRendererSystem:Symbol.for("SpriteRendererSystem"),TextRendererSystem:Symbol.for("TextRendererSystem"),TilemapRendererSystem:Symbol.for("TilemapRendererSystem"),VideoRendererSystem:Symbol.for("VideoRendererSystem"),DebugColliderRenderSystem:Symbol.for("DebugColliderRenderSystem"),DebugMousePositionSystem:Symbol.for("DebugMousePositionSystem")},L=["click","contextmenu","auxclick","dblclick","mousedown","mouseup","pointerup","touchend","keydown","keyup"];let j=class{constructor(t,e,i){this.entityManager=t,this.inputManager=e,this.timeManager=i,this.canPlay=!0,this.userInputErrorCatched=!1,this.userInputEventHandler=()=>{L.forEach((t=>{window.removeEventListener(t,this.userInputEventHandler)})),this.canPlay=!0}}onCreate(){document.addEventListener("visibilitychange",(()=>{this.entityManager.search(U).forEach((({component:{audioSource:t,playing:e}})=>{t&&"string"!=typeof t&&(document.hidden?t.pause():!document.hidden&&e&&t.play())}))}))}catchUserInput(){this.canPlay=!1,this.userInputErrorCatched=!0,L.forEach((t=>window.addEventListener(t,this.userInputEventHandler)))}checkGamepad(){return this.canPlay=this.inputManager.gamepads.some((t=>t.anyButtonPressed)),this.canPlay}onUpdate(){(this.canPlay||this.checkGamepad())&&this.entityManager.search(U).forEach((({component:t})=>{t.audioSource&&"string"!=typeof t.audioSource&&t.audioSource.duration&&(t._playAfterUserInput&&(t._playAfterUserInput=!1,t.action="play"),t.audioSource!==t._currentAudioSource&&(t._currentAudioSource&&(t._currentAudioSource.pause(),t._currentAudioSource.currentTime=0),t._currentAudioSource=t.audioSource,t.audioSource.currentTime=0,t.state="stopped"),t.audioSource.loop=t.loop,t.audioSource.volume=t.volume,"play"!==t.action||"playing"===t.state||t._playPromisePendind?"pause"===t.action&&"playing"===t.state?(t.audioSource.pause(),t.state="paused"):"stop"!==t.action||t.audioSource.paused&&0===t.audioSource.currentTime?"playing"===t.state&&t.audioSource.paused&&(t.state="stopped"):(t.audioSource.pause(),t.audioSource.currentTime=0,t.state="stopped"):(t._playPromisePendind=!0,t.audioSource.playbackRate=t.fixedToTimeScale?this.timeManager.timeScale<.0625?0:Math.min(this.timeManager.timeScale,16):1,t.audioSource.play().then((()=>{t._playPromisePendind=!1,t.state="playing"})).catch((()=>{t._playAfterUserInput=!0,t._playPromisePendind=!1,this.userInputErrorCatched||this.catchUserInput()}))),t.action=void 0)}))}onDisabled(){this.entityManager.search(U).forEach((({component:{audioSource:t,stopOnSceneTransition:e}})=>{t&&"string"!=typeof t&&e&&(t.pause(),t.currentTime=0)}))}onDestroy(){this.onDisabled()}};var k;j=o([i(I.AudioPlayerSystem),n(0,s(t.EntityManager)),n(1,s(t.InputManager)),n(2,s(t.TimeManager))],j),function(t){t[t.GameLogic=0]="GameLogic",t[t.GamePhysics=1]="GamePhysics",t[t.GamePreRender=2]="GamePreRender",t[t.Physics=3]="Physics",t[t.PreGameLogic=4]="PreGameLogic",t[t.Render=5]="Render",t[t.Transform=6]="Transform"}(k||(k={}));const O=(t,e)=>{t.prototype.__system_group||(t.prototype.__system_group=e)};class V{constructor(t){this.position=new h,this.scale=new h(1,1),this.rotation=0,this.ignoreParentPosition=!1,this.ignoreParentScale=!1,this.ignoreParentRotation=!1,this.localPosition=new h,this.localScale=new h(1,1),this.localRotation=0,this._awake=!1,this._parent=void 0,Object.assign(this,t)}}V.componentName="Transform";const G="Default",N="Debug";class W{constructor(t){this.layers=[G],this.zoom=1,this.depth=0,this.debug=!1,this._renderData={position:new h,depth:0,zoom:1,layers:[]},Object.assign(this,t)}}var z;W.componentName="Camera",function(t){t.LegacyWebGL="webgl",t.WebGL2="webgl2"}(z||(z={}));class H{constructor(t){if(this.canvas=t,this.contextVersion=this.getContextVersion(),!this.contextVersion)throw new Error("Your browser does not support WebGL.");this.gl=this.canvas.getContext(this.contextVersion)}getContextVersion(){return null!==this.canvas.getContext(z.WebGL2)?z.WebGL2:null!==this.canvas.getContext(z.LegacyWebGL)?z.LegacyWebGL:void 0}}class Y{constructor(){this.fontAtlas=new Map}hasFontAtlas(t){return this.fontAtlas.has(this.getId(t))}getFontAtlas(t){return this.fontAtlas.get(this.getId(t))}getOrCreate(t){var e;return null!==(e=this.getFontAtlas(t))&&void 0!==e?e:this.create(t)}create(t){const{font:e,charRanges:i,fontSize:s,spacing:r}=t;this.chars=[];for(let t=0;t<i.length;t+=2)for(let e=i[t];e<=i[t+1];e++)this.chars.push(String.fromCharCode(e));this.font=e instanceof FontFace?e.family:e,this.fontSize=s,this.spacing=r,this.id=this.getId(t);const o=this.renderAtlas();return this.fontAtlas.set(this.id,o),o}getId({font:t,charRanges:e,fontSize:i,spacing:s}){return JSON.stringify({font:t instanceof FontFace?t.family:t,charRanges:e,fontSize:i,spacing:s})}renderAtlas(){const t=new X(this.id,this.fontSize,Math.ceil(Math.sqrt(this.chars.length)),this.spacing),e=t.canvas.getContext("2d");e.clearRect(0,0,t.canvas.width,t.canvas.height),e.textBaseline="top",e.fillStyle="#FFFFFF",e.font=`${this.fontSize}px ${this.font}`;let i=0,s=0;for(let r=0;r<this.chars.length;r++)e.fillText(this.chars[r],i,s),t.glyphs.set(this.chars[r],{id:r,width:e.measureText(this.chars[r]).width}),(i+=this.fontSize+this.spacing)>t.canvas.width-this.fontSize&&(i=0,s+=this.fontSize+this.spacing);return t}}class X{constructor(t,e,i,s){this.id=t,this.fontSize=e,this.gridSize=i,this.spacing=s,this.canvas=document.createElement("canvas"),this.glyphs=new Map,this.canvas.width=this.gridSize*(this.fontSize+this.spacing),this.canvas.height=this.canvas.width}}class ${constructor(t,e){this.gl=t,this.shaderLoader=e}create(t,e){const i=this.gl.createProgram(),s=this.shaderLoader.load(this.gl.VERTEX_SHADER,t),r=this.shaderLoader.load(this.gl.FRAGMENT_SHADER,e);this.gl.attachShader(i,s),this.gl.attachShader(i,r),this.gl.linkProgram(i);const o=this.gl.LINK_STATUS;if(!this.gl.getProgramParameter(i,o)){const t=this.gl.getProgramInfoLog(i);throw this.gl.deleteProgram(i),new Error(`Unable to initialize the Program: ${t}`)}return i}}class K{constructor(t,e,i){this.gl=t,this.contextVersion=e,this.programFactory=i}loadProgram(){this.program=this.contextVersion===z.WebGL2?this.programFactory.create("#version 300 es\n\nin vec4 positionCoords;\nin vec2 textureCoords;\n\nuniform mat4 projectionMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 textureMatrix;\n\nout vec2 texCoords;\n\nvoid main()\n{\n gl_Position = projectionMatrix * modelMatrix * positionCoords;\n texCoords = (textureMatrix * vec4(textureCoords, 0, 1)).xy;\n}","#version 300 es\nprecision highp float;\n\nin vec2 texCoords;\n\n// texture, mask and darkness\nuniform int u_renderTexture;\nuniform sampler2D u_texImage;\nuniform vec4 u_solidColor;\nuniform int u_useTintColor;\nuniform vec4 u_tintColor;\nuniform int u_useMaskColor;\nuniform vec4 u_maskColor;\nuniform float u_maskColorMix;\nuniform float u_alpha;\n\n// light\nstruct Light {\n vec2 position;\n float radius;\n float smoothMode;\n float intensity;\n};\n\nuniform int u_renderLight;\nuniform Light u_lights[64];\nuniform int u_numLights;\n\nout vec4 fragColor;\n\nvoid main()\n{\n if (u_renderTexture == 1) {\n vec4 texColor = texture(u_texImage, texCoords);\n\n if (texColor.a < 0.0001) {\n discard;\n }\n\n if (u_useTintColor == 1) {\n texColor = u_tintColor * texColor;\n }\n\n if (u_useMaskColor == 1) {\n texColor = mix(texColor, u_maskColor, clamp(u_maskColorMix, 0.0, 1.0));\n }\n\n fragColor = vec4(texColor.rgb, u_alpha * texColor.a); \n } else if (u_renderLight == 1) {\n vec2 fragCoord = gl_FragCoord.xy;\n float alpha = u_alpha;\n\n for (int i = 0; i < u_numLights; i++) {\n Light light = u_lights[i];\n float dist = distance(fragCoord, light.position);\n \n if (dist < light.radius) {\n alpha -= (light.smoothMode > 0.0 ? smoothstep(light.radius, 0.0, dist) : 1.0) * light.intensity;\n }\n }\n\n alpha = clamp(alpha, 0.0, u_alpha);\n\n fragColor = vec4(u_solidColor.rgb, alpha);\n } else {\n fragColor = vec4(u_solidColor.rgb, u_alpha);\n }\n}"):this.programFactory.create("precision mediump float;\n\nattribute vec2 positionCoords;\nattribute vec2 textureCoords;\n\nvarying vec2 texCoords;\n\nuniform mat4 projectionMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 textureMatrix;\n\nvoid main()\n{\n gl_Position = projectionMatrix * modelMatrix * vec4(positionCoords, 0, 1);\n texCoords = (textureMatrix * vec4(textureCoords, 0, 1)).xy;\n}","precision mediump float;\n\nvarying vec2 texCoords;\n\n// texture, mask and darkness\nuniform int u_renderTexture;\nuniform sampler2D u_texImage;\nuniform vec4 u_solidColor;\nuniform int u_useTintColor;\nuniform vec4 u_tintColor;\nuniform int u_useMaskColor;\nuniform vec4 u_maskColor;\nuniform float u_maskColorMix;\nuniform float u_alpha;\n\n// light\nstruct Light {\n vec2 position;\n float radius;\n float smoothMode;\n float intensity;\n};\n\nuniform int u_renderLight;\nuniform Light u_lights[64];\nuniform int u_numLights;\n\nvoid main()\n{\n if (u_renderTexture == 1) {\n vec4 texColor = texture2D(u_texImage, texCoords);\n\n if (texColor.a < 0.0001) {\n discard;\n }\n\n if (u_useTintColor == 1) {\n texColor = u_tintColor * texColor;\n }\n\n if (u_useMaskColor == 1) {\n texColor = mix(texColor, u_maskColor, clamp(u_maskColorMix, 0.0, 1.0));\n }\n\n gl_FragColor = vec4(texColor.rgb, u_alpha * texColor.a);\n } else if (u_renderLight == 1) {\n vec2 fragCoord = gl_FragCoord.xy;\n float alpha = u_alpha;\n\n for (int i = 0; i < 64; i++) {\n if (u_lights[i].intensity == 0.0) continue; \n \n Light light = u_lights[i];\n float dist = distance(fragCoord, light.position);\n \n if (dist < light.radius) {\n alpha -= (light.smoothMode > 0.0 ? smoothstep(light.radius, 0.0, dist) : 1.0) * light.intensity;\n }\n }\n\n alpha = clamp(alpha, 0.0, u_alpha);\n\n gl_FragColor = vec4(u_solidColor.rgb, alpha);\n } else {\n gl_FragColor = vec4(u_solidColor.rgb, u_alpha);\n }\n}"),this.positionCoordsAttr=this.gl.getAttribLocation(this.program,"positionCoords"),this.texCoordsAttr=this.gl.getAttribLocation(this.program,"textureCoords"),this.modelMatrixUniform=this.gl.getUniformLocation(this.program,"modelMatrix"),this.projectionMatrixUniform=this.gl.getUniformLocation(this.program,"projectionMatrix"),this.textureMatrixUniform=this.gl.getUniformLocation(this.program,"textureMatrix"),this.renderTextureUniform=this.gl.getUniformLocation(this.program,"u_renderTexture"),this.textureUniform=this.gl.getUniformLocation(this.program,"u_texImage"),this.solidColorUniform=this.gl.getUniformLocation(this.program,"u_solidColor"),this.useTintColorUniform=this.gl.getUniformLocation(this.program,"u_useTintColor"),this.tintColorUniform=this.gl.getUniformLocation(this.program,"u_tintColor"),this.useMaskColorUniform=this.gl.getUniformLocation(this.program,"u_useMaskColor"),this.maskColorUniform=this.gl.getUniformLocation(this.program,"u_maskColor"),this.maskColorMixUniform=this.gl.getUniformLocation(this.program,"u_maskColorMix"),this.alphaUniform=this.gl.getUniformLocation(this.program,"u_alpha"),this.renderLightUniform=this.gl.getUniformLocation(this.program,"u_renderLight"),this.numLightsUniform=this.gl.getUniformLocation(this.program,"u_numLights"),this.gl.useProgram(this.program),this.gl.blendFunc(this.gl.SRC_ALPHA,this.gl.ONE_MINUS_SRC_ALPHA)}}class q{constructor(t){this.gl=t}load(t,e){const i=this.gl.createShader(t);this.gl.shaderSource(i,e),this.gl.compileShader(i);const s=this.gl.COMPILE_STATUS;if(!this.gl.getShaderParameter(i,s)){const t=this.gl.getShaderInfoLog(i);throw this.gl.deleteShader(i),new Error(`Unable to initialize the shader program: ${t}`)}return i}}var J="undefined"!=typeof Float32Array?Float32Array:Array;function Q(){var t=new J(16);return J!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t}function Z(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function tt(t,e,i){var s,r,o,n,a,h,l,c,d,g,p,m,u=i[0],y=i[1],f=i[2];return e===t?(t[12]=e[0]*u+e[4]*y+e[8]*f+e[12],t[13]=e[1]*u+e[5]*y+e[9]*f+e[13],t[14]=e[2]*u+e[6]*y+e[10]*f+e[14],t[15]=e[3]*u+e[7]*y+e[11]*f+e[15]):(s=e[0],r=e[1],o=e[2],n=e[3],a=e[4],h=e[5],l=e[6],c=e[7],d=e[8],g=e[9],p=e[10],m=e[11],t[0]=s,t[1]=r,t[2]=o,t[3]=n,t[4]=a,t[5]=h,t[6]=l,t[7]=c,t[8]=d,t[9]=g,t[10]=p,t[11]=m,t[12]=s*u+a*y+d*f+e[12],t[13]=r*u+h*y+g*f+e[13],t[14]=o*u+l*y+p*f+e[14],t[15]=n*u+c*y+m*f+e[15]),t}function et(t,e,i){var s=i[0],r=i[1],o=i[2];return t[0]=e[0]*s,t[1]=e[1]*s,t[2]=e[2]*s,t[3]=e[3]*s,t[4]=e[4]*r,t[5]=e[5]*r,t[6]=e[6]*r,t[7]=e[7]*r,t[8]=e[8]*o,t[9]=e[9]*o,t[10]=e[10]*o,t[11]=e[11]*o,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}function it(t,e,i){var s=Math.sin(i),r=Math.cos(i),o=e[0],n=e[1],a=e[2],h=e[3],l=e[4],c=e[5],d=e[6],g=e[7];return e!==t&&(t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=o*r+l*s,t[1]=n*r+c*s,t[2]=a*r+d*s,t[3]=h*r+g*s,t[4]=l*r-o*s,t[5]=c*r-n*s,t[6]=d*r-a*s,t[7]=g*r-h*s,t}Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)});var st=function(t,e,i,s,r,o,n){var a=1/(e-i),h=1/(s-r),l=1/(o-n);return t[0]=-2*a,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*h,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*l,t[11]=0,t[12]=(e+i)*a,t[13]=(r+s)*h,t[14]=(n+o)*l,t[15]=1,t};const rt=(t,e,i,s)=>{t=Z(t),st(t,-e.canvas.width/2,e.canvas.width/2,-e.canvas.height/2,e.canvas.height/2,-1,1),et(t,t,[null!=i?i:1,null!=i?i:1,1]),tt(t,t,[-s.x,-s.y,0])},ot=t=>{const e=/^#?([a-f\d]{2})?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return e?{r:parseInt(e[2],16)/256,g:parseInt(e[3],16)/256,b:parseInt(e[4],16)/256,a:void 0!==e[1]?parseInt(e[1],16)/256:1}:null};class nt{constructor(t){this.gl=t}render(t){const e=ot(t);this.gl.clearColor(e.r,e.g,e.b,e.a),this.gl.clear(this.gl.COLOR_BUFFER_BIT)}}var at;!function(t){t[t.Sprite=0]="Sprite",t[t.Text=1]="Text",t[t.Tilemap=2]="Tilemap",t[t.Mask=3]="Mask",t[t.Geometric=4]="Geometric",t[t.Video=5]="Video",t[t.Darkness=6]="Darkness"}(at||(at={}));var ht,lt;!function(t){t[t.Polygon=0]="Polygon",t[t.Circumference=1]="Circumference",t[t.Line=2]="Line"}(ht||(ht={}));class ct{constructor(t,e){this.gl=t,this.programManager=e,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.circumferencePositionBuffer=this.gl.createBuffer(),this.linesPositionBuffer=this.gl.createBuffer();const i=2*Math.PI/60,s=new Float32Array(g(1,60,1).reduce(((t,e)=>[...t,Math.cos(e*i),Math.sin(e*i)]),[]));this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.circumferencePositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,s,this.gl.STATIC_DRAW)}render(t,e,i){switch(this.gl.disableVertexAttribArray(this.programManager.texCoordsAttr),t.shape){case ht.Polygon:this.renderLines(t,e,this.gl.LINE_LOOP);break;case ht.Line:this.renderLines(t,e,this.gl.LINES);break;case ht.Circumference:this.renderCircumference(t,e,i);break;default:return!1}return!0}renderLines(t,e,i){var s;this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.linesPositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(t.vertexModel.reduce(((t,e)=>[...t,e.x,e.y]),[])),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.uniform1i(this.programManager.renderTextureUniform,0);const{r:r,g:o,b:n,a:a}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,r,o,n,a),this.gl.uniform1f(this.programManager.alphaUniform,1),this.gl.drawArrays(i,0,t.vertexModel.length),this.lastShape="polygon"}renderCircumference(t,e,i){i===at.Geometric&&"circumference"===this.lastShape||(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.circumferencePositionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),et(this.modelMatrix,this.modelMatrix,[t.radius,t.radius,1]),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.uniform1i(this.programManager.renderTextureUniform,0);const{r:s,g:r,b:o,a:n}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,s,r,o,n),this.gl.uniform1f(this.programManager.alphaUniform,1),this.gl.drawArrays(this.gl.LINE_LOOP,0,60),this.lastShape="circumference"}}exports.MaskShape=void 0,(lt=exports.MaskShape||(exports.MaskShape={}))[lt.Rectangle=0]="Rectangle",lt[lt.Circumference=1]="Circumference",lt[lt.Polygon=2]="Polygon";let dt=class{constructor(t,e){this.gl=t,this.programManager=e,this.type=at.Mask,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.circumferencePositionBuffer=this.gl.createBuffer(),this.rectanglePositionBuffer=this.gl.createBuffer(),this.polygonPositionBuffer=this.gl.createBuffer();const i=2*Math.PI/60,s=[0,0];for(let t=0;t<=60;t++)s.push(Math.cos(t*i),Math.sin(t*i));this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.circumferencePositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(s),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.rectanglePositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([-.5,-.5,-.5,.5,.5,-.5,.5,-.5,-.5,.5,.5,.5]),this.gl.STATIC_DRAW)}render(t,e,i){return this.gl.disableVertexAttribArray(this.programManager.texCoordsAttr),t.shape===exports.MaskShape.Rectangle?this.renderRectangle(t,e,i):t.shape===exports.MaskShape.Circumference?this.renderCircumference(t,e,i):t.shape===exports.MaskShape.Polygon&&this.renderPolygon(t,e,i),this.lastShape=t.shape,!0}renderRectangle(t,e,i){var s,r;i===at.Mask&&this.lastShape===exports.MaskShape.Rectangle||(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.rectanglePositionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.width,t.height,1]),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),t.opacity>=0&&t.opacity<1?this.gl.enable(this.gl.BLEND):this.gl.disable(this.gl.BLEND),this.gl.uniform1i(this.programManager.renderTextureUniform,0);const{r:o,g:n,b:a,a:h}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,o,n,a,h),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.drawArrays(this.gl.TRIANGLES,0,6)}renderCircumference(t,e,i){var s,r;i===at.Mask&&this.lastShape===exports.MaskShape.Circumference||(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.circumferencePositionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.radius,t.radius,1]),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),t.opacity>=0&&t.opacity<1?this.gl.enable(this.gl.BLEND):this.gl.disable(this.gl.BLEND),this.gl.uniform1i(this.programManager.renderTextureUniform,0);const{r:o,g:n,b:a,a:h}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,o,n,a,h),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.drawArrays(this.gl.TRIANGLE_FAN,0,62)}renderPolygon(t,e,i){var s,r;i===at.Mask&&this.lastShape===exports.MaskShape.Polygon||(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.polygonPositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(t.vertices.reduce(((t,e)=>[...t,e.x,e.y]),[0,0])),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),t.opacity>=0&&t.opacity<1?this.gl.enable(this.gl.BLEND):this.gl.disable(this.gl.BLEND),this.gl.uniform1i(this.programManager.renderTextureUniform,0);const{r:o,g:n,b:a,a:h}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,o,n,a,h),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.drawArrays(this.gl.TRIANGLE_FAN,0,t.vertices.length+1)}},gt=class{constructor(t,e){this.gl=t,this.programManager=e,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.positionBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([-.5,-.5,-.5,.5,.5,-.5,.5,-.5,-.5,.5,.5,.5]),this.gl.STATIC_DRAW)}render(t,e,i){var s,r;i!==at.Darkness&&(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.disableVertexAttribArray(this.programManager.texCoordsAttr)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.width,t.height,1]),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.enable(this.gl.BLEND),this.gl.uniform1i(this.programManager.renderTextureUniform,0),this.gl.uniform1i(this.programManager.renderLightUniform,1);const{r:o,g:n,b:a,a:h}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,o,n,a,h),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.uniform1i(this.programManager.numLightsUniform,t.lights.length);for(const[i,s]of t.lights.entries()){if(i>=64)break;this.gl.uniform2f(this.gl.getUniformLocation(this.programManager.program,`u_lights[${i}].position`),this.gl.canvas.width/2+(s.position.x-e.position.x)*e.zoom,this.gl.canvas.height/2+(s.position.y-e.position.y)*e.zoom),this.gl.uniform1f(this.gl.getUniformLocation(this.programManager.program,`u_lights[${i}].radius`),s.radius*e.zoom),this.gl.uniform1f(this.gl.getUniformLocation(this.programManager.program,`u_lights[${i}].smoothMode`),s.smooth?1:0),this.gl.uniform1f(this.gl.getUniformLocation(this.programManager.program,`u_lights[${i}].intensity`),Math.max(0,Math.min(1,s.intensity)))}return this.gl.drawArrays(this.gl.TRIANGLES,0,6),this.gl.uniform1i(this.programManager.renderLightUniform,0),!0}},pt=class{constructor(t,e,i){this.gl=t,this.programManager=e,this.textureManager=i,this.tiledPosVertices=new Map,this.tiledTexVertices=new Map,this.lastTexture=null,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.positionBuffer=this.gl.createBuffer(),this.textureBuffer=this.gl.createBuffer(),this.tiledPositionBuffer=this.gl.createBuffer(),this.tiledTextureBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([-.5,-.5,-.5,.5,.5,-.5,.5,-.5,-.5,.5,.5,.5]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,1,0,0,1,1,1,1,0,0,1,0]),this.gl.STATIC_DRAW),this.lastDrawMode="sprite"}render(t,e,i){var s,r,o,n;i!==at.Sprite&&!t.tiled||!t.tiled&&"sprite"!==this.lastDrawMode?(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.enableVertexAttribArray(this.programManager.texCoordsAttr),this.gl.vertexAttribPointer(this.programManager.texCoordsAttr,2,this.gl.FLOAT,!1,0,0)):t.tiled&&(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.tiledPositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,this.getTiledPositionVertices(t.tiled),this.gl.STATIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.tiledTextureBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,this.getTiledTextureVertices(t.tiled),this.gl.STATIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.texCoordsAttr),this.gl.vertexAttribPointer(this.programManager.texCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.lastDrawMode=t.tiled?"tiled":"sprite",this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.width*(t.flipHorizontally?-1:1),t.height*(t.flipVertically?-1:1),1]),this.textureMatrix=Z(this.textureMatrix),t.slice&&(tt(this.textureMatrix,this.textureMatrix,[t.slice.x/t.image.naturalWidth,t.slice.y/t.image.naturalHeight,0]),et(this.textureMatrix,this.textureMatrix,[t.slice.width/t.image.naturalWidth,t.slice.height/t.image.naturalHeight,1])),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.enable(this.gl.BLEND);const a=this.textureManager.getOrCreateTextureFromImage(t.image,t.smooth);if(this.lastTexture===a&&i===t.type||(this.gl.bindTexture(this.gl.TEXTURE_2D,a),this.gl.uniform1i(this.programManager.textureUniform,0),this.lastTexture=a),this.gl.uniform1i(this.programManager.renderTextureUniform,1),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.uniform1i(this.programManager.useTintColorUniform,t.tintColor?1:0),t.tintColor){const{r:e,g:i,b:s,a:r}=ot(t.tintColor);this.gl.uniform4f(this.programManager.tintColorUniform,e,i,s,r)}if(this.gl.uniform1i(this.programManager.useMaskColorUniform,t.maskColor?1:0),t.maskColor){const{r:e,g:i,b:s}=ot(t.maskColor);this.gl.uniform4f(this.programManager.maskColorUniform,e,i,s,null!==(o=t.opacity)&&void 0!==o?o:1),this.gl.uniform1f(this.programManager.maskColorMixUniform,null!==(n=t.maskColorMix)&&void 0!==n?n:1)}return t.tiled?this.gl.drawArrays(this.gl.TRIANGLES,0,t.tiled.x*t.tiled.y*6):this.gl.drawArrays(this.gl.TRIANGLES,0,6),!0}getTiledPositionVertices(t){const e=t.toString();if(!this.tiledPosVertices.has(e)){const i=[];for(let e=-t.x/2;e<t.x/2;e++)for(let s=-t.y/2;s<t.y/2;s++)i.push(e,s,e,s+1,e+1,s,e+1,s,e,s+1,e+1,s+1);this.tiledPosVertices.set(e,new Float32Array(i))}return this.tiledPosVertices.get(e)}getTiledTextureVertices(t){const e=t.toString();if(!this.tiledTexVertices.has(e)){const i=[];for(let e=0;e<t.x*t.y;e++)i.push(0,1,0,0,1,1,1,1,0,0,1,0);this.tiledTexVertices.set(e,new Float32Array(i))}return this.tiledTexVertices.get(e)}};var mt;exports.TextOrientation=void 0,(mt=exports.TextOrientation||(exports.TextOrientation={}))[mt.Center=0]="Center",mt[mt.RightUp=1]="RightUp",mt[mt.RightDown=2]="RightDown",mt[mt.RightCenter=3]="RightCenter";let ut=class{constructor(t,e,i,s){this.gl=t,this.programManager=e,this.textureManager=i,this.fontAtlasFactory=s,this.type=at.Text,this.posVertices=[],this.texVertices=[],this.lastTexture=null,this.textSize=new h,this.modelPosition=new h,this.shadowPosition=new h,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.positionBuffer=this.gl.createBuffer(),this.textureBuffer=this.gl.createBuffer()}render(t,e,i,s=!1){var r;if(!t.text)return!1;const o=this.fontAtlasFactory.getOrCreate(Object.assign({font:t.font},t.textureAtlas));if(s||(this.generateTextVertices(o,t),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(this.posVertices),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(this.texVertices),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.texCoordsAttr),this.gl.vertexAttribPointer(this.programManager.texCoordsAttr,2,this.gl.FLOAT,!1,0,0)),t.shadow){const{color:s,offset:r,opacity:o}=t.shadow,n=Object.assign(Object.assign({},t),{color:s,opacity:o,position:h.add(this.shadowPosition,t.position,r)});n.shadow=void 0,this.render(n,e,i,!0),i=at.Text}this.modelMatrix=Z(this.modelMatrix),this.setPositionFromOrientation(t),tt(this.modelMatrix,this.modelMatrix,[this.modelPosition.x,this.modelPosition.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(r=t.rotation)&&void 0!==r?r:0),et(this.modelMatrix,this.modelMatrix,[t.fontSize*(t.flipHorizontally?-1:1),t.fontSize*(t.flipVertically?-1:1),1]),this.textureMatrix=Z(this.textureMatrix),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.enable(this.gl.BLEND);const n=this.textureManager.getOrCreateTextureFromCanvas(o.id,o.canvas,t.smooth);this.lastTexture===n&&i===at.Text||(this.gl.bindTexture(this.gl.TEXTURE_2D,n),this.gl.uniform1i(this.programManager.textureUniform,0),this.lastTexture=n),this.gl.uniform1i(this.programManager.useMaskColorUniform,0),this.gl.uniform1i(this.programManager.renderTextureUniform,1),this.gl.uniform1f(this.programManager.alphaUniform,t.opacity);const{r:a,g:l,b:c,a:d}=ot(t.color);return this.gl.uniform1i(this.programManager.useTintColorUniform,1),this.gl.uniform4f(this.programManager.tintColorUniform,a,l,c,d),this.gl.drawArrays(this.gl.TRIANGLES,0,this.posVertices.length/2),!0}generateTextVertices(t,{text:e,fontSize:i,letterSpacing:s,lineHeight:r}){this.posVertices=[],this.texVertices=[];let o=0,n=0,a=0;s/=i,r/=i;for(let i=0;i<e.length;i++){const h=e[i];if("\n"===h){a=Math.max(a,o),o=0,n-=r;continue}const l=t.glyphs.get(h);if(l){const e=l.width/t.fontSize;this.posVertices.push(o,n-1,o+e,n-1,o,n,o,n,o+e,n-1,o+e,n);const i=l.id%t.gridSize*(t.fontSize+t.spacing),r=(l.id/t.gridSize|0)*(t.fontSize+t.spacing),a=i/t.canvas.width,h=r/t.canvas.height,c=(i+l.width)/t.canvas.width,d=(r+t.fontSize)/t.canvas.height;this.texVertices.push(a,d,c,d,a,h,a,h,c,d,c,h),o+=e+s}}this.textSize.set(Math.max(a,o)*i,Math.abs(n-1)*i)}setPositionFromOrientation(t){this.modelPosition.set(t.position.x+(t.orientation===exports.TextOrientation.Center?-this.textSize.x/2:0),t.position.y+(t.orientation===exports.TextOrientation.Center||t.orientation===exports.TextOrientation.RightCenter?this.textSize.y/2:t.orientation===exports.TextOrientation.RightUp?this.textSize.y:0))}};var yt;exports.TilemapOrientation=void 0,(yt=exports.TilemapOrientation||(exports.TilemapOrientation={}))[yt.Center=0]="Center",yt[yt.RightUp=1]="RightUp",yt[yt.RightDown=2]="RightDown",yt[yt.RightCenter=3]="RightCenter";let ft=class{constructor(t,e,i){this.gl=t,this.programManager=e,this.textureManager=i,this.posVertices=[],this.texVertices=[],this.lastTexture=null,this.tileset={width:0,tileWidth:0,tileHeight:0,texMargin:new h,texSpacing:new h,texWidth:0,texHeight:0,texCorrection:new h},this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.positionBuffer=this.gl.createBuffer(),this.textureBuffer=this.gl.createBuffer()}render(t,e,i){var s,r,o,n;if(0===t.tiles.reduce(((t,e)=>t+e),0))return!1;if(this.processTileset(t),this.generateVertices(t),0===this.posVertices.length)return!1;this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(this.posVertices),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(this.texVertices),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.texCoordsAttr),this.gl.vertexAttribPointer(this.programManager.texCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.tilemap.tileWidth*(t.flipHorizontal?-1:1),t.tilemap.tileHeight*(t.flipVertical?-1:1),1]),this.textureMatrix=Z(this.textureMatrix),et(this.textureMatrix,this.textureMatrix,[this.tileset.tileWidth/t.tileset.image.naturalWidth,this.tileset.tileHeight/t.tileset.image.naturalHeight,1]),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.enable(this.gl.BLEND);const a=this.textureManager.getOrCreateTextureFromImage(t.tileset.image,t.smooth);if(this.lastTexture===a&&i===at.Tilemap||(this.gl.bindTexture(this.gl.TEXTURE_2D,a),this.gl.uniform1i(this.programManager.textureUniform,0),this.lastTexture=a),this.gl.uniform1i(this.programManager.renderTextureUniform,1),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.uniform1i(this.programManager.useTintColorUniform,t.tintColor?1:0),t.tintColor){const{r:e,g:i,b:s,a:r}=ot(t.tintColor);this.gl.uniform4f(this.programManager.tintColorUniform,e,i,s,r)}if(this.gl.uniform1i(this.programManager.useMaskColorUniform,t.maskColor?1:0),t.maskColor){const{r:e,g:i,b:s}=ot(t.maskColor);this.gl.uniform4f(this.programManager.maskColorUniform,e,i,s,null!==(o=t.opacity)&&void 0!==o?o:1),this.gl.uniform1f(this.programManager.maskColorMixUniform,null!==(n=t.maskColorMix)&&void 0!==n?n:1)}return this.gl.drawArrays(this.gl.TRIANGLES,0,this.posVertices.length/2),!0}processTileset({tileset:t}){var e,i,s,r,o,n,a;t.margin=null!==(e=t.margin)&&void 0!==e?e:new h,t.spacing=null!==(i=t.spacing)&&void 0!==i?i:new h,t.correction=null!==(s=t.correction)&&void 0!==s?s:new h,this.tileset.width=t.width,this.tileset.tileWidth=t.tileWidth+(null!==(r=t.margin.x)&&void 0!==r?r:0)+(null!==(o=t.spacing.x)&&void 0!==o?o:0),this.tileset.tileHeight=t.tileHeight+(null!==(n=t.margin.y)&&void 0!==n?n:0)+(null!==(a=t.spacing.y)&&void 0!==a?a:0),this.tileset.texMargin.set(t.margin.x/this.tileset.tileWidth,t.margin.y/this.tileset.tileHeight),this.tileset.texSpacing.set(t.spacing.x/this.tileset.tileWidth,t.spacing.y/this.tileset.tileHeight),this.tileset.texCorrection.set(t.correction.x/this.tileset.tileWidth,t.correction.y/this.tileset.tileHeight),this.tileset.texWidth=1-this.tileset.texMargin.x-this.tileset.texSpacing.x-2*this.tileset.texCorrection.x,this.tileset.texHeight=1-this.tileset.texMargin.y-this.tileset.texSpacing.y-2*this.tileset.texCorrection.y}generateVertices({tiles:t,tilemap:e}){this.posVertices=[],this.texVertices=[];const i=Math.floor(t.length/e.width);t.forEach(((t,s)=>{if(0===t)return;const r=s%e.width-e.width/2,o=i/2-Math.floor(s/e.width);this.posVertices.push(r,o-1,r+1,o-1,r,o,r,o,r+1,o-1,r+1,o);const n=(t-1)%this.tileset.width+this.tileset.texMargin.x+this.tileset.texCorrection.x,a=Math.floor((t-1)/this.tileset.width)+this.tileset.texMargin.y+this.tileset.texCorrection.y;this.texVertices.push(n,a+this.tileset.texHeight,n+this.tileset.texWidth,a+this.tileset.texHeight,n,a,n,a,n+this.tileset.texWidth,a+this.tileset.texHeight,n+this.tileset.texWidth,a)}))}},xt=class{constructor(t,e,i){this.gl=t,this.programManager=e,this.textureManager=i,this.lastTexture=null,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.positionBuffer=this.gl.createBuffer(),this.textureBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([-.5,-.5,-.5,.5,.5,-.5,.5,-.5,-.5,.5,.5,.5]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,1,0,0,1,1,1,1,0,0,1,0]),this.gl.STATIC_DRAW)}render(t,e,i){var s,r,o,n;i!==at.Video&&(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.enableVertexAttribArray(this.programManager.texCoordsAttr),this.gl.vertexAttribPointer(this.programManager.texCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.width*(t.flipHorizontal?-1:1),t.height*(t.flipVertical?-1:1),1]),this.textureMatrix=Z(this.textureMatrix),t.slice&&(tt(this.textureMatrix,this.textureMatrix,[t.slice.x/t.video.videoWidth,t.slice.y/t.video.videoHeight,0]),et(this.textureMatrix,this.textureMatrix,[t.slice.width/t.video.videoWidth,t.slice.height/t.video.videoHeight,1])),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.enable(this.gl.BLEND);const a=this.textureManager.getOrCreateTextureFromVideo(t.video);if(this.lastTexture===a&&i===at.Video||(this.gl.bindTexture(this.gl.TEXTURE_2D,a),this.gl.uniform1i(this.programManager.textureUniform,0),this.lastTexture=a),t.video.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA&&this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,t.video),this.gl.uniform1i(this.programManager.renderTextureUniform,1),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.uniform1i(this.programManager.useTintColorUniform,t.tintColor?1:0),t.tintColor){const{r:e,g:i,b:s,a:r}=ot(t.tintColor);this.gl.uniform4f(this.programManager.tintColorUniform,e,i,s,r)}if(this.gl.uniform1i(this.programManager.useMaskColorUniform,t.maskColor?1:0),t.maskColor){const{r:e,g:i,b:s}=ot(t.maskColor);this.gl.uniform4f(this.programManager.maskColorUniform,e,i,s,null!==(o=t.opacity)&&void 0!==o?o:1),this.gl.uniform1f(this.programManager.maskColorMixUniform,null!==(n=t.maskColorMix)&&void 0!==n?n:1)}return this.gl.drawArrays(this.gl.TRIANGLES,0,6),!0}};class Mt{constructor(t){this.gl=t}createFromImage(t,e=!1,i=null){return i=null!=i?i:this.gl.createTexture(),t.naturalWidth?this.createFromSource(t,i,e):t.addEventListener("load",(()=>this.createFromSource(t,i,e))),i}createFromCanvas(t,e=!1,i=null){return i=null!=i?i:this.gl.createTexture(),this.createFromSource(t,i,e),i}createPixelTexture(){const t=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,t),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,1,1,0,this.gl.RGBA,this.gl.UNSIGNED_BYTE,new Uint8Array([0,0,0,255])),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.bindTexture(this.gl.TEXTURE_2D,null),t}createFromSource(t,e,i=!1){this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,t),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),i?(this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR)):(this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.NEAREST),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.NEAREST)),this.gl.bindTexture(this.gl.TEXTURE_2D,null)}}const vt=(t,e)=>`${e?"_smooth_":""}${t}`;class Ct{constructor(t){this.textureFactory=t,this.textures=new Map}getOrCreateTextureFromImage(t,e=!1){var i;return null!==(i=this.textures.get(vt(t.src,e)))&&void 0!==i?i:this.createTextureFromImage(t,e)}createTextureFromImage(t,e=!1){const i=this.textureFactory.createFromImage(t,e);return this.textures.set(vt(t.src,e),i),i}getOrCreateTextureFromCanvas(t,e,i=!1){var s;return null!==(s=this.textures.get(vt(t,i)))&&void 0!==s?s:this.createTextureFromCanvas(t,e,i)}createTextureFromCanvas(t,e,i=!1){const s=this.textureFactory.createFromCanvas(e,i);return this.textures.set(vt(t,i),s),s}getOrCreateTextureFromVideo(t){var e;return null!==(e=this.textures.get(t.src))&&void 0!==e?e:this.createTextureFromVideo(t)}createTextureFromVideo(t){const e=this.textureFactory.createPixelTexture();return this.textures.set(t.src,e),e}}let St=class{constructor(t){this.renderers=new Map;const e=new H(t),i=e.gl,s=e.contextVersion,r=new K(i,s,new $(i,new q(i))),o=new Ct(new Mt(i)),n=new Y;this.renderers.set(at.Sprite,new pt(i,r,o)),this.renderers.set(at.Text,new ut(i,r,o,n)),this.renderers.set(at.Tilemap,new ft(i,r,o)),this.renderers.set(at.Geometric,new ct(i,r)),this.renderers.set(at.Mask,new dt(i,r)),this.renderers.set(at.Video,new xt(i,r,o)),this.renderers.set(at.Darkness,new gt(i,r)),this.canvasColorRenderer=new nt(i),r.loadProgram()}render(t,e){this.renderers.get(t.type).render(t,e,this.lastRender)&&(this.lastRender=t.type)}renderCanvasColor(t){this.canvasColorRenderer.render(t)}};St=o([i(t.WebGLManager),n(0,s(t.CanvasElement))],St);class bt{constructor(t){this.fixedToTimeScale=!1,this.layer=G,this.loop=!1,this.offset=new h,this.playing=!1,this.rotation=0,this.volume=1,this._currentVideoSrc=void 0,this._playPromisePendind=!1,this._renderData={type:at.Video,height:void 0,layer:void 0,position:new h,video:void 0,width:void 0,flipHorizontal:void 0,flipVertical:void 0,maskColor:void 0,maskColorMix:void 0,opacity:void 0,rotation:void 0,slice:void 0,tintColor:void 0},Object.assign(this,t)}play(t){t&&(this.video=t),this.action="play"}pause(){this.action="pause"}stop(){this.action="stop"}}bt.componentName="VideoRenderer";const At=["click","contextmenu","auxclick","dblclick","mousedown","mouseup","pointerup","touchend","keydown","keyup"];let wt=class{constructor(t,e,i,s){this.entityManager=t,this.renderManager=e,this.timeManager=i,this.assetManager=s,this.scaledOffset=new h,this.canPlay=!0,this.userInputErrorCatched=!1,this.userInputEventHandler=()=>{At.forEach((t=>{window.removeEventListener(t,this.userInputEventHandler)})),this.canPlay=!0}}onCreate(){document.addEventListener("visibilitychange",(()=>{this.entityManager.search(bt).forEach((({component:{video:t,playing:e}})=>{t&&"string"!=typeof t&&(document.hidden?t.pause():!document.hidden&&e&&t.play())}))}))}catchUserInput(){this.canPlay=!1,this.userInputErrorCatched=!0,At.forEach((t=>window.addEventListener(t,this.userInputEventHandler)))}onUpdate(){this.entityManager.search(bt).forEach((({entity:t,component:e})=>{var i,s;const r=this.entityManager.getComponent(t,V);if(!r)throw new Error("VideoRenderer component needs a Transform");if("string"==typeof e.video&&(e.video=this.assetManager.getVideo(e.video),!e.video))throw new Error(`Asset ${e.video} not found`);e.video&&e.video.duration&&(this.checkVideoState(e),this.scaledOffset.set(e.offset.x*r.localScale.x,e.offset.y*r.localScale.y),h.add(e._renderData.position,r.localPosition,this.scaledOffset),e._renderData.layer=e.layer,e._renderData.video=e.video,e._renderData.width=(null!==(i=e.width)&&void 0!==i?i:e.video.videoWidth)*Math.abs(r.localScale.x),e._renderData.height=(null!==(s=e.height)&&void 0!==s?s:e.video.videoHeight)*Math.abs(r.localScale.y),e._renderData.rotation=r.localRotation+e.rotation,e._renderData.slice=e.slice,e._renderData.flipHorizontal=e.flipHorizontally,e._renderData.flipVertical=e.flipVertically,e._renderData.opacity=e.opacity,e._renderData.maskColor=e.maskColor,e._renderData.maskColorMix=e.maskColorMix,e._renderData.tintColor=e.tintColor,0!==r.localRotation&&this.scaledOffset.magnitude>0&&this.translateRenderPosition(e._renderData,r),this.renderManager.addRenderData(e._renderData))}))}translateRenderPosition(t,e){const i=Math.atan2(this.scaledOffset.y,this.scaledOffset.x)+e.localRotation;t.position.set(e.localPosition.x+this.scaledOffset.magnitude*Math.cos(i),e.localPosition.y+this.scaledOffset.magnitude*Math.sin(i))}checkVideoState(t){const{video:e,action:i,loop:s,volume:r}=t;"string"!=typeof e&&(e.src!==t._currentVideoSrc&&(t._currentVideoSrc=e.src,t.playing=!1,e.currentTime=0),e.loop=s,e.volume=r,e.playbackRate=t.fixedToTimeScale?this.timeManager.timeScale<.0625?0:Math.min(this.timeManager.timeScale,16):1,"play"!==i||t.playing||t._playPromisePendind||!this.canPlay||(t._playPromisePendind=!0,e.play().then((()=>{t._playPromisePendind=!1,t.playing=!0})).catch((()=>{t._playPromisePendind=!1,this.userInputErrorCatched||this.catchUserInput()}))),"play"===i&&e.ended&&(t.action="stop",t.playing=!1),"stop"===i&&e.currentTime>0&&(e.pause(),e.currentTime=0,t.playing=!1),"pause"!==i||e.paused||e.pause())}onDisabled(){this.entityManager.search(bt).forEach((({component:t})=>{t.video&&"string"!=typeof t.video&&(t.video.pause(),t.video.currentTime=0)}))}onDestroy(){this.onDisabled()}};wt=o([i(I.VideoRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.TimeManager)),n(3,s(t.AssetManager))],wt),exports.SceneManager=class{constructor(t,e,i,s,r){this.systemManager=t,this.systemFactory=e,this.entityManager=i,this.assetManager=s,this.timeManager=r,this.scenes=new Map,this._loadingScene=!1,this._sceneLoadedThisFrame=!1,this.preserveEntitiesWithComponent=void 0}addScene(t,e,i=!1){const s=new t(this.entityManager,this.assetManager);this.scenes.set(e,s),i&&(this.openingSceneName=e)}loadScene(t,e){if(!this.scenes.has(t))throw new Error(`Invalid scene name: '${t}'`);this.sceneNameToBeLoaded=t,this.preserveEntitiesWithComponent=e}loadOpeningScene(){if(!this.openingSceneName)throw new Error("There is no opening scene");this.sceneNameToBeLoaded=this.openingSceneName}get loadingScene(){return this._loadingScene}get sceneLoadedThisFrame(){return this._sceneLoadedThisFrame}update(){this._sceneLoadedThisFrame=!1,this.sceneNameToBeLoaded&&(this.currentSceneName&&this.destroyCurrentScene(),this.currentSceneName=this.sceneNameToBeLoaded,this.sceneNameToBeLoaded=void 0,this.scenes.get(this.currentSceneName).loadAssets(),this.scenes.get(this.currentSceneName).registerSystems(),this._loadingScene=!0),this._loadingScene&&this.assetManager.getAssetsLoaded()&&(this._loadingScene=!1,this._sceneLoadedThisFrame=!0,this.scenes.get(this.currentSceneName).createEntities(),this.systemManager.update(k.Transform),this.systemManager.update(k.PreGameLogic),this.scenes.get(this.currentSceneName).systems.forEach(((t,e)=>{this.systemFactory.createSystemIfNotExists(t),this.systemManager.enableSystem(t),this.systemManager.setExecutionOrder(t,e)})))}destroyCurrentScene(){this.systemManager.disableSystem(j),this.systemManager.disableSystem(wt),this.scenes.get(this.currentSceneName).systems.forEach((t=>this.systemManager.disableSystem(t))),this.entityManager.removeAllEntities(this.preserveEntitiesWithComponent),this.timeManager.clearAllIntervals(),this.systemManager.enableSystem(j),this.systemManager.enableSystem(wt)}},exports.SceneManager=o([i(t.SceneManager),n(0,s(t.SystemManager)),n(1,s(t.CreateSystemService)),n(2,s(t.EntityManager)),n(3,s(t.AssetManager)),n(4,s(t.TimeManager))],exports.SceneManager);class Et{constructor(t){this.width=0,this.height=0,this.radius=0,this.touchEnabled=!0,this.offset=new h,this.pressed=!1,this.mouseOver=!1,Object.assign(this,t)}}var Rt;Et.componentName="Button",exports.ButtonShape=void 0,(Rt=exports.ButtonShape||(exports.ButtonShape={}))[Rt.Rectangle=0]="Rectangle",Rt[Rt.Circumference=1]="Circumference";let _t=class{constructor(t,e){this.entityManager=t,this.scaled={position:new h,width:0,height:0,radius:0},this.distance=new h,this.pressedLastFrame=!1,this.mouse=e.mouse,this.touchScreen=e.touchScreen}onUpdate(){this.entityManager.search(Et).forEach((({entity:t,component:e})=>{const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("Button component needs a Transform");this.pressedLastFrame=e.pressed,e.pressed=!1,this.scale(e,i),e.mouseOver=this.isMouseOverButton(e),e.pressed=e.mouseOver&&this.mouse.leftButtonPressed,e.touchEnabled&&this.touchScreen.touching&&(this.resolveTouchAndRectangle(e),this.resolveTouchAndCircumference(e)),e.onClick&&!this.pressedLastFrame&&e.pressed&&e.onClick(),e.onPressed&&e.pressed&&e.onPressed()}))}scale(t,{localPosition:e,localScale:i}){this.scaled.width=t.width*i.x,this.scaled.height=t.height*i.y,this.scaled.position.x=e.x+t.offset.x*i.x,this.scaled.position.y=e.y+t.offset.y*i.y,this.scaled.radius=t.radius*Math.max(Math.abs(i.x),Math.abs(i.y))}isMouseOverButton(t){return this.isMouseOverRectangleButton(t)||this.isMouseOverCircumferenceButton(t)}isMouseOverRectangleButton(t){return t.shape===exports.ButtonShape.Rectangle&&(p(this.mouse.positionInViewport.x,this.scaled.position.x-this.scaled.width/2,this.scaled.position.x+this.scaled.width/2)&&p(this.mouse.positionInViewport.y,this.scaled.position.y-this.scaled.height/2,this.scaled.position.y+this.scaled.height/2))}isMouseOverCircumferenceButton(t){return t.shape===exports.ButtonShape.Circumference&&(h.subtract(this.distance,this.scaled.position,this.mouse.positionInViewport),this.distance.magnitude<=this.scaled.radius)}resolveTouchAndRectangle(t){if(t.shape===exports.ButtonShape.Rectangle)for(const{positionInViewport:e,radius:i}of this.touchScreen.interactions){if(t.pressed)return;t.pressed=this.scaled.position.x+this.scaled.width/2>=e.x-i.x&&this.scaled.position.x-this.scaled.width/2<=e.x+i.x&&this.scaled.position.y+this.scaled.height/2>=e.y-i.y&&this.scaled.position.y-this.scaled.height/2<=e.y+i.y}}resolveTouchAndCircumference(t){if(t.shape===exports.ButtonShape.Circumference)for(const{positionInViewport:e,radius:i}of this.touchScreen.interactions){if(t.pressed)return;h.subtract(this.distance,this.scaled.position,e),t.pressed=this.distance.magnitude<=this.scaled.radius+Math.max(i.x,i.y)}}};_t=o([i(I.ButtonSystem),n(0,s(t.EntityManager)),n(1,s(t.InputManager))],_t);class Tt{constructor(t){Object.assign(this,t)}}Tt.componentName="TiledWrapper";class Bt{constructor(t){this.layer=G,this.tileset=void 0,this.data=[],this.chunks=[],this.width=0,this.height=0,this.tileWidth=void 0,this.tileHeight=void 0,this.tintColor=void 0,this.opacity=1,this.smooth=!1,this._processed=!1,this._renderData=[],Object.assign(this,t)}}Bt.componentName="TilemapRenderer";let Pt=class{constructor(t,e){this.entityManager=t,this.assetManager=e}onUpdate(){this.entityManager.search(Tt).forEach((({entity:t,component:e})=>{const i=this.entityManager.getComponent(t,Bt);if(!i)return;if("string"==typeof e.tilemap&&(e.tilemap=this.assetManager.getJson(e.tilemap),!e.tilemap))throw new Error(`Tilemap ${e.tilemap} not found`);const s=e.tilemap.layers.find((t=>t.name===e.layerToRender&&"tilelayer"===t.type));s&&(e.tilemap.infinite?i.chunks=s.chunks:i.data=s.data,i.width=e.tilemap.width)}))}};Pt=o([i(I.TiledWrapperSystem),n(0,s(t.EntityManager)),n(1,s(t.AssetManager))],Pt);const Dt=16;let Ft=class{constructor(t){this.entityManager=t}onUpdate(){this.entityManager.search(Bt).forEach((({component:t})=>{var e,i;t._processed||(t.chunks&&t.chunks.length>0?this.chunksToData(t):t.data&&t.data.length>0&&this.dataToChunks(t),t.tileWidth=null!==(e=t.tileWidth)&&void 0!==e?e:t.tileset.tileWidth,t.tileHeight=null!==(i=t.tileHeight)&&void 0!==i?i:t.tileset.tileHeight,t._processed=!0)}))}dataToChunks(t){t.height=Math.ceil(t.data.length/t.width);const e=Math.ceil(t.width/Dt),i=Math.ceil(t.height/Dt);for(let s=0;s<i;s++)for(let i=0;i<e;i++){const e={x:i*Dt,y:s*Dt,width:Dt,height:Dt,data:[]};for(let i=0;i<e.width*e.height;i++){const s=e.x+i%e.width,r=t.width*(e.y+Math.floor(i/e.width));e.data[i]=s<t.width&&r<t.height*t.width?t.data[r+s]:0}t.chunks.push(e)}}chunksToData(t){t.data=[],t.chunks.forEach((e=>e.data.forEach(((i,s)=>{t.data[t.width*(e.y+Math.floor(s/e.width))+e.x+s%e.width]=i})))),t.height=Math.ceil(t.data.length/t.width)}};Ft=o([i(I.TilemapPreProcessingSystem),n(0,s(t.EntityManager))],Ft);let Ut=class{constructor(t){this.entityManager=t}onUpdate(){this.entityManager.search(V).sort(((t,e)=>this.getBranchLength(t.entity)-this.getBranchLength(e.entity))).forEach((({component:t,entity:e})=>{const i=this.entityManager.getParent(e);i&&this.entityManager.isEntityEnabled(i)&&this.entityManager.isComponentEnabled(i,V)?(t._parent||(t._parent=this.entityManager.getComponent(i,V),t._awake&&!t.ignoreParentPosition&&h.subtract(t.position,t.localPosition,t._parent.position)),t._parent?this.translateChild(t):this.updateTransform(t)):(t._parent&&this.removeParent(t),this.updateTransform(t)),t._awake=!0}))}getBranchLength(t){const e=this.entityManager.getParent(t);return e?1+this.getBranchLength(e):0}removeParent(t){t._parent=void 0,t.position.copy(t.localPosition),t.rotation=t.localRotation}updateTransform(t){t.localPosition.copy(t.position),t.localScale.copy(t.scale),t.localRotation=t.rotation,t._parent=void 0}translateChild(t){t.localRotation=t.rotation+(t.ignoreParentRotation?0:t._parent.localRotation),t.localScale.x=t.scale.x*(t.ignoreParentScale?1:t._parent.scale.x),t.localScale.y=t.scale.y*(t.ignoreParentScale?1:t._parent.scale.y);const e=Math.atan2(t.position.y,t.position.x)+(t.ignoreParentRotation?0:t._parent.localRotation);t.localPosition.set(t.position.magnitude*Math.cos(e)+(t.ignoreParentPosition?0:t._parent.localPosition.x),t.position.magnitude*Math.sin(e)+(t.ignoreParentPosition?0:t._parent.localPosition.y))}};Ut=o([i(I.TransformSystem),n(0,s(t.EntityManager))],Ut);let It=class{constructor(t){this.inputManager=t,this.gamepads=new Map,this.eventHandler=t=>{"gamepadconnected"===t.type?this.gamepadConnected(t.gamepad):"gamepaddisconnected"===t.type&&this.gamepadDisconected(t.gamepad)},window.addEventListener("gamepadconnected",this.eventHandler),window.addEventListener("gamepaddisconnected",this.eventHandler)}gamepadConnected(t){this.gamepads.set(t.index,t),this.inputManager.gamepads[t.index]||(this.inputManager.gamepads[t.index]=new _,this.inputManager.gamepads[t.index].index=t.index),this.inputManager.gamepads[t.index].id=t.id,this.inputManager.gamepads[t.index].connected=!0}gamepadDisconected(t){this.gamepads.delete(t.index),this.inputManager.gamepads[t.index].connected=!1}onUpdate(){for(const t of this.getGamepadsFromBrowser())t&&(!1===this.gamepads.has(t.index)?this.gamepadConnected(t):this.gamepads.set(t.index,t));this.gamepads.forEach((t=>{const e=this.inputManager.gamepads[t.index];t.buttons.forEach(((t,i)=>e.buttons.set(i,t.pressed))),t.axes.forEach(((t,i)=>e.axes.set(i,t))),e.vibrationInput&&(t.vibrationActuator.playEffect(t.vibrationActuator.type,{duration:e.vibrationInput.duration,weakMagnitude:e.vibrationInput.weakMagnitude,strongMagnitude:e.vibrationInput.strongMagnitude,startDelay:e.vibrationInput.startDelay}).catch((()=>e.vibrating=!1)).finally((()=>e.vibrating=!1)),e.vibrating=!0,e.vibrationInput=void 0)}))}getGamepadsFromBrowser(){return navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads?navigator.webkitGetGamepads:[]}};It=o([i(I.GamepadSystem),n(0,s(t.InputManager))],It);let Lt=class{constructor(t,{keyboard:e}){this.pressedKeys=[],this.eventHandler=t=>{"keydown"!==t.type||this.pressedKeys.includes(t.code)||this.pressedKeys.push(t.code),"keyup"===t.type&&this.pressedKeys.includes(t.code)&&this.pressedKeys.splice(this.pressedKeys.indexOf(t.code),1)},this.keyboard=e,t.addEventListener("keydown",this.eventHandler),t.addEventListener("keyup",this.eventHandler),t.addEventListener("focusout",(()=>this.pressedKeys=[]))}onUpdate(){this.keyboard.pressedKeys=[...this.pressedKeys]}};Lt=o([i(I.KeyboardSystem),n(0,s(t.CanvasElement)),n(1,s(t.InputManager))],Lt);let jt=class{constructor(t,{mouse:e}){this.canvas=t,this.leftButtonPressed=!1,this.scrollButtonPressed=!1,this.rightButtonPressed=!1,this.positionInViewport=new h,this.lastPositionInViewport=new h,this.mouse=e,this.canvas.addEventListener("mousemove",(t=>this.updatePosition(t))),this.canvas.addEventListener("mousedown",(t=>this.updateButtonDown(t))),this.canvas.addEventListener("mouseup",(t=>this.updateButtonUp(t))),this.canvas.addEventListener("wheel",(t=>this.handleWheelEvent(t))),this.canvas.addEventListener("focusout",(()=>this.onFocusOut()))}updateButtonDown(t){this.canvas.focus(),t.preventDefault(),t.stopPropagation(),this.leftButtonPressed=0===t.button,this.scrollButtonPressed=1===t.button,this.rightButtonPressed=2===t.button}updateButtonUp(t){t.preventDefault(),t.stopPropagation(),this.leftButtonPressed=0!==t.button&&this.leftButtonPressed,this.scrollButtonPressed=1!==t.button&&this.scrollButtonPressed,this.rightButtonPressed=2!==t.button&&this.rightButtonPressed}updatePosition(t){t.preventDefault(),t.stopPropagation(),this.positionInViewport.set(t.offsetX/(this.canvas.clientWidth/this.canvas.width)-this.canvas.width/2,-t.offsetY/(this.canvas.clientHeight/this.canvas.height)+this.canvas.height/2)}handleWheelEvent(t){t.preventDefault(),t.stopPropagation(),this.wheelEvent=t}onFocusOut(){this.leftButtonPressed=!1,this.scrollButtonPressed=!1,this.rightButtonPressed=!1}onUpdate(){this.mouse.leftButtonPressed=this.leftButtonPressed,this.mouse.rightButtonPressed=this.rightButtonPressed,this.mouse.scrollButtonPressed=this.scrollButtonPressed,this.mouse.positionInViewport.copy(this.positionInViewport),this.positionInViewport.equals(this.lastPositionInViewport)?this.mouse.hasMoved=!1:(this.mouse.hasMoved=!0,this.lastPositionInViewport.copy(this.positionInViewport)),this.wheelEvent?(this.mouse.wheelScroll.set(this.wheelEvent.deltaX,this.wheelEvent.deltaY),this.wheelEvent=void 0):this.mouse.wheelScroll.set(0,0)}};jt=o([i(I.MouseSystem),n(0,s(t.CanvasElement)),n(1,s(t.InputManager))],jt);let kt=class{constructor(t,{touchScreen:e}){this.canvas=t,this.touching=!1,this.interactions=[],this.eventHandler=t=>{"touchstart"===t.type&&(this.touching=!0,this.updatePosition(t)),"touchmove"===t.type&&this.updatePosition(t),"touchend"!==t.type&&"touchcancel"!==t.type||(this.touching=!1)},this.touchScreen=e,this.canvas.addEventListener("touchstart",this.eventHandler),this.canvas.addEventListener("touchend",this.eventHandler),this.canvas.addEventListener("touchcancel",this.eventHandler),this.canvas.addEventListener("touchmove",this.eventHandler)}updatePosition(t){if(t.preventDefault(),t.stopPropagation(),this.interactions=[],0!==t.targetTouches.length)for(let e=0;e<t.targetTouches.length;e++)this.interactions[e]={positionInViewport:new h((t.targetTouches[e].clientX-this.canvas.offsetLeft)/(this.canvas.clientWidth/this.canvas.width)-this.canvas.width/2,-(t.targetTouches[e].clientY-this.canvas.offsetTop)/(this.canvas.clientHeight/this.canvas.height)+this.canvas.height/2),radius:new h(t.targetTouches[e].radiusX,t.targetTouches[e].radiusY)}}onUpdate(){this.touchScreen.touching=this.touching,this.touchScreen.interactions=[...this.touchScreen.interactions]}};kt=o([i(I.TouchScreenSystem),n(0,s(t.CanvasElement)),n(1,s(t.InputManager))],kt);class Ot{constructor(t){this.animations=new Map,this.speed=1,this.reset=!1,this.playing=!1,this.currentFrame=0,this.currentTime=0,this._currentAnimation=void 0,this._assetsReady=!1,Object.assign(this,t)}}Ot.componentName="Animator";class Vt{constructor(t){this.layer=G,this.smooth=!1,this.offset=new h,this.flipHorizontally=!1,this.flipVertically=!1,this.rotation=0,this.opacity=1,this.scale=new h(1,1),this._renderData={type:at.Sprite,position:new h,layer:void 0,image:void 0,width:void 0,height:void 0},Object.assign(this,t)}}Vt.componentName="SpriteRenderer";let Gt=class{constructor(t,e,i){this.entityManager=t,this.timeManager=e,this.assetManager=i}onUpdate(){this.entityManager.search(Ot).forEach((({entity:t,component:e})=>{if(this.processAssets(e),this.reset(e),this.animation=e.animations.get(e.animation),!this.animation)return;this.play(e),e._currentAnimation=e.animation;const i=this.entityManager.getComponent(t,Vt);i&&this.renderSprite(e,i)}))}processAssets(t){t._assetsReady||(t.animations.forEach((t=>{if("string"==typeof t.image){if(t.image=this.assetManager.getImage(t.image),!t.image)throw new Error(`Asset ${t.image} not found`)}else Array.isArray(t.image)&&(t.image=t.image.map((t=>{if("string"==typeof t){const e=this.assetManager.getImage(t);if(!e)throw new Error(`Asset ${t} not found`);return e}return t})))})),t._assetsReady=!0)}reset(t){t.reset&&(t.currentFrame=0,t.currentTime=0,t.playing=void 0!==t.animation,t.reset=!1)}play(t){t.animation!==t._currentAnimation&&(t._currentAnimation=t.animation,t.currentFrame=0,t.currentTime=0,t.playing=!0),t.playing&&(t.currentTime>=1/this.animation.fps*(t.currentFrame+1)&&(t.currentFrame===this.animation.frames.length-1?this.animation.loop?(t.currentFrame=0,t.currentTime=0):t.playing=!1:t.currentFrame++),t.currentTime+=this.timeManager.renderDeltaTime*t.speed)}renderSprite(t,e){if(Array.isArray(this.animation.image))e.image=this.animation.image[t.currentFrame];else{if("string"==typeof this.animation.image)return;const i=this.animation.frames[t.currentFrame],s=Math.floor(this.animation.image.naturalWidth/this.animation.slice.size.x);e.image=this.animation.image,e.slice={x:i%s*this.animation.slice.size.x+this.animation.slice.offset.x,y:Math.floor(i/s)*this.animation.slice.size.y+this.animation.slice.offset.y,width:this.animation.slice.size.x-this.animation.slice.padding.y,height:this.animation.slice.size.y-this.animation.slice.padding.y}}}};Gt=o([i(I.AnimatorSystem),n(0,s(t.EntityManager)),n(1,s(t.TimeManager)),n(2,s(t.AssetManager))],Gt);let Nt=class{constructor(t,e){this.entityManager=t,this.renderManager=e}onUpdate(){this.entityManager.search(W).forEach((({entity:t,component:e})=>{const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("Camera component needs a Transform");e._renderData.position.copy(i.localPosition),e._renderData.layers=e.layers,e._renderData.depth=e.depth,e._renderData.zoom=e.zoom,e.debug&&e._renderData.layers.push(N),this.renderManager.addCameraData(e._renderData)}))}};Nt=o([i(I.CameraSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager))],Nt);let Wt=class{constructor(t,e){this.webGLManager=t,this.gameConfig=e}onUpdate(){this.webGLManager.renderCanvasColor(this.gameConfig.canvasColor)}};Wt=o([i(I.ClearScreenSystem),n(0,s(t.WebGLManager)),n(1,s(t.GameConfig))],Wt);class zt{constructor(t){this.radius=0,this.offset=new h,this.layer="",this.physics=!0,this.ignoreCollisionsWithLayers=[],this.shapes=[],Object.assign(this,t)}}zt.componentName="BallCollider";class Ht{constructor(t){this.layer="",this.physics=!0,this.width=0,this.height=0,this.offset=new h,this.rotation=0,this.ignoreCollisionsWithLayers=[],this.shapes=[],Object.assign(this,t)}}Ht.componentName="BoxCollider";class Yt{constructor(t){this.vertexModel=[],this.offset=new h,this.rotation=0,this.layer="",this.physics=!0,this.ignoreCollisionsWithLayers=[],this.shapes=[],Object.assign(this,t)}}Yt.componentName="EdgeCollider";class Xt{constructor(t){this.vertexModel=[],this.offset=new h,this.rotation=0,this.layer="",this.physics=!0,this.ignoreCollisionsWithLayers=[],this.shapes=[],Object.assign(this,t)}}Xt.componentName="PolygonCollider";class $t{constructor(t){this.composite=!0,this.layer="",this.ignoreCollisionsWithLayers=[],this.offset=new h,this.physics=!0,this.shapes=[],Object.assign(this,t)}}$t.componentName="TilemapCollider";let Kt=class{constructor(t,e,i){this.entityManager=t,this.renderManager=e,this.gameConfig=i}onUpdate(){var t;(null===(t=this.gameConfig.debug)||void 0===t?void 0:t.colliders)&&[zt,Ht,Xt,Yt,$t].forEach((t=>this.entityManager.search(t).forEach((({component:t})=>t.shapes.forEach((t=>{const e={type:at.Geometric,position:new h,layer:N,color:this.gameConfig.debug.collidersColor,shape:void 0,radius:void 0,rotation:void 0,vertexModel:void 0};t instanceof x?this.gameConfig.collisions.collisionMethod===exports.CollisionMethods.SAT?(e.shape=t.vertices.length>2?ht.Polygon:ht.Line,e.vertexModel=t.vertices):this.gameConfig.collisions.collisionMethod===exports.CollisionMethods.AABB&&(e.shape=ht.Polygon,e.vertexModel=[new h(t.boundingBox.x,t.boundingBox.y),new h(t.boundingBox.x,t.boundingBox.y1),new h(t.boundingBox.x1,t.boundingBox.y1),new h(t.boundingBox.x1,t.boundingBox.y)]):t instanceof M&&(e.shape=ht.Circumference,e.position.copy(t.position),e.radius=t.radius),this.renderManager.addRenderData(e)}))))))}};Kt=o([i(I.DebugColliderRenderSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.GameConfig))],Kt);let qt=class{constructor(t,e){this.renderManager=t,this.canvas=e,this.viewport={x:0,x1:0,y:0,y1:0},this.object={x:0,x1:0,y:0,y1:0},this.culledRenderData=[]}onUpdate(){this.culledRenderData=[],this.renderManager.getCameraData().forEach((t=>{this.setViewport(t),this.renderManager.getRenderData().filter((e=>t.layers.includes(e.layer))).forEach((t=>{this.isInViewPort(t)&&(t.type===at.Tilemap&&this.applyCullingInTiles(t),this.culledRenderData.push(t))}))})),this.renderManager.setRenderData(this.culledRenderData)}isInViewPort(t){switch(t.type){case at.Video:case at.Darkness:case at.Sprite:this.setObjectForResizeable(t);break;case at.Mask:this.setObjectForMask(t);break;case at.Geometric:this.setObjectForGeometric(t);break;case at.Text:this.setObjectForText(t);break;case at.Tilemap:this.setObjectForTilemap(t)}return this.viewport.x1>=this.object.x&&this.viewport.x<=this.object.x1&&this.viewport.y1>=this.object.y&&this.viewport.y<=this.object.y1}setViewport({position:t,zoom:e}){this.viewport.x=t.x-this.canvas.width/e/2,this.viewport.x1=t.x+this.canvas.width/e/2,this.viewport.y=t.y-this.canvas.height/e/2,this.viewport.y1=t.y+this.canvas.height/e/2}setObjectForResizeable({position:t,width:e,height:i,rotation:s=0,tiled:r}){const o=Math.abs(Math.sin(s)),n=Math.abs(Math.cos(s));r&&(e*=r.x,i*=r.y);const a=o*i+n*e,h=o*e+n*i;this.object.x=t.x-a/2,this.object.x1=t.x+a/2,this.object.y=t.y-h/2,this.object.y1=t.y+h/2}setObjectForText({position:t,text:e,fontSize:i,lineHeight:s,letterSpacing:r,rotation:o}){const n=e.split("\n").reduce(((t,e)=>Math.max(t,e.length)),0)*(i+(null!=r?r:0))*2,a=e.split("\n").length*(null!=s?s:i);this.setObjectForResizeable({position:t,width:n,height:a,rotation:o})}setObjectForGeometric({position:t,vertexModel:e,shape:i,radius:s}){i===ht.Circumference?(this.object.x=t.x-s,this.object.y=t.y-s,this.object.x1=t.x+s,this.object.y1=t.y+s):(this.object.x=Number.MAX_SAFE_INTEGER,this.object.y=Number.MAX_SAFE_INTEGER,this.object.x1=Number.MIN_SAFE_INTEGER,this.object.y1=Number.MIN_SAFE_INTEGER,e.forEach((e=>{this.object.x=Math.min(e.x+t.x,this.object.x),this.object.y=Math.min(e.y+t.y,this.object.y),this.object.x1=Math.max(e.x+t.x,this.object.x1),this.object.y1=Math.max(e.y+t.y,this.object.y1)})))}setObjectForMask({position:t,vertices:e,shape:i,radius:s,rotation:r,width:o,height:n}){i===exports.MaskShape.Circumference?(this.object.x=t.x-s,this.object.y=t.y-s,this.object.x1=t.x+s,this.object.y1=t.y+s):i===exports.MaskShape.Polygon?(this.object.x=Number.MAX_SAFE_INTEGER,this.object.y=Number.MAX_SAFE_INTEGER,this.object.x1=Number.MIN_SAFE_INTEGER,this.object.y1=Number.MIN_SAFE_INTEGER,e.forEach((e=>{this.object.x=Math.min(e.x+t.x,this.object.x),this.object.y=Math.min(e.y+t.y,this.object.y),this.object.x1=Math.max(e.x+t.x,this.object.x1),this.object.y1=Math.max(e.y+t.y,this.object.y1)}))):this.setObjectForResizeable({position:t,width:o,height:n,rotation:r})}setObjectForTilemap(t){t.tilemap.height=Math.ceil(t.tiles.length/t.tilemap.width),this.setObjectForResizeable({position:t.position,width:t.tilemap.width*t.tilemap.tileWidth,height:t.tilemap.height*t.tilemap.tileHeight,rotation:t.rotation})}applyCullingInTiles(t){const{tiles:e,tilemap:{width:i,tileWidth:s,tileHeight:r}}=t;t.tiles=e.map(((t,e)=>this.viewport.x1>=this.object.x+e%i*s&&this.viewport.x<=this.object.x+e%i*s+s&&this.viewport.y1>=this.object.y1-((e/i|0)*r+r)&&this.viewport.y<=this.object.y1-(e/i|0)*r?t:0))}};qt=o([i(I.CullingSystem),n(0,s(t.RenderManager)),n(1,s(t.CanvasElement))],qt);class Jt{constructor(t){this.width=0,this.height=0,this.radius=0,this.vertexModel=[],this.offset=new h,this.rotation=0,this.opacity=1,this.layer=G,this._renderData={type:at.Mask,color:void 0,height:void 0,vertices:[],layer:void 0,opacity:void 0,position:new h,radius:void 0,rotation:void 0,shape:void 0,width:void 0},Object.assign(this,t)}}Jt.componentName="MaskRenderer";let Qt=class{constructor(t,e){this.entityManager=t,this.renderManager=e,this.scaledOffset=new h}onUpdate(){this.entityManager.search(Jt).forEach((({entity:t,component:e})=>{const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("MaskRenderer component needs a Transform");this.scaledOffset.set(e.offset.x*i.localScale.x,e.offset.y*i.localScale.y),h.add(e._renderData.position,i.localPosition,this.scaledOffset),e._renderData.width=e.width*Math.abs(i.localScale.x),e._renderData.height=e.height*Math.abs(i.localScale.y),e._renderData.rotation=i.localRotation+e.rotation,e._renderData.color=e.color,e._renderData.layer=e.layer,e._renderData.opacity=e.opacity,e._renderData.radius=e.radius*Math.max(Math.abs(i.localScale.x),Math.abs(i.localScale.y)),e._renderData.shape=e.shape,e.shape===exports.MaskShape.Polygon&&(e._renderData.vertices.length!==e.vertexModel.length&&(e._renderData.vertices=e.vertexModel.map((()=>new h))),e.vertexModel.forEach(((t,s)=>e._renderData.vertices[s].set(t.x*i.localScale.x,t.y*i.localScale.y))),0!==i.localRotation&&e._renderData.vertices.forEach((t=>t.set(t.x*Math.cos(i.localRotation)-t.y*Math.sin(i.localRotation),t.x*Math.sin(i.localRotation)+t.y*Math.cos(i.localRotation))))),0!==i.localRotation&&this.scaledOffset.magnitude>0&&this.translateRenderPosition(e._renderData,i),this.renderManager.addRenderData(e._renderData)}))}translateRenderPosition(t,e){const i=Math.atan2(this.scaledOffset.y,this.scaledOffset.x)+e.localRotation;t.position.set(e.localPosition.x+this.scaledOffset.magnitude*Math.cos(i),e.localPosition.y+this.scaledOffset.magnitude*Math.sin(i))}};Qt=o([i(I.MaskRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager))],Qt);let Zt=class{constructor(t){this.renderManager=t}onUpdate(){this.renderManager.render(),this.renderManager.removeCameraData(),this.renderManager.removeRenderData()}};Zt=o([i(I.RenderSystem),n(0,s(t.RenderManager))],Zt);class te{constructor(t){this.radius=0,this.smooth=!1,this.layer=G,this.intensity=1,this._boundingBox=new l,Object.assign(this,t)}}te.componentName="LightRenderer";class ee{constructor(t){this.width=0,this.height=0,this.color="#000000",this.opacity=1,this.layer=G,this._boundingBox=new l,this._renderData={type:at.Darkness,layer:void 0,color:void 0,opacity:void 0,width:void 0,height:void 0,position:void 0,rotation:void 0,lights:[]},Object.assign(this,t)}}ee.componentName="DarknessRenderer";let ie=class{constructor(t,e){this.entityManager=t,this.renderManager=e}onUpdate(){const t=this.entityManager.search(te);t.forEach((({entity:t,component:e})=>this.updateLightRendererBoundingBox(t,e))),this.entityManager.search(ee).forEach((({entity:e,component:i})=>{this.updatDarknessRendererBoundingBox(e,i),i._renderData.layer=i.layer,i._renderData.color=i.color,i._renderData.opacity=i.opacity,i._renderData.width=i._boundingBox.width,i._renderData.height=i._boundingBox.height,i._renderData.position=i._boundingBox.center,i._renderData.rotation=0,i._renderData.lights=[],i._renderData.lights=t.filter((({component:t})=>t.layer===i.layer&&t._boundingBox.intersects(i._boundingBox))).map((({component:{_boundingBox:t,smooth:e,intensity:i}})=>({position:t.center,radius:t.width/2,smooth:e,intensity:i}))),this.renderManager.addRenderData(i._renderData)}))}updateLightRendererBoundingBox(t,e){const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("LightRenderer component needs a Transform");const s=e.radius*Math.abs(Math.max(i.localScale.x,i.localScale.y));e._boundingBox.set(i.localPosition.x-s,i.localPosition.y-s,2*s,2*s)}updatDarknessRendererBoundingBox(t,e){const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("DarknessRenderer component needs a Transform");const s=e.width*Math.abs(i.localScale.x),r=e.height*Math.abs(i.localScale.y);e._boundingBox.set(i.localPosition.x-s/2,i.localPosition.y-r/2,s,r)}};ie=o([i(I.DarknessLightRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager))],ie);let se=class{constructor(t,e,i){this.entityManager=t,this.renderManager=e,this.assetManager=i,this.scaledOffset=new h}onUpdate(){this.entityManager.search(Vt).forEach((({component:t,entity:e})=>{var i,s,r,o,n,a;const l=this.entityManager.getComponent(e,V);if(!l)throw new Error("SpriteRenderer component needs a Transform");if("string"==typeof t.image&&(t.image=this.assetManager.getImage(t.image),!t.image))throw new Error(`Asset ${t.image} not found`);t.image&&t.image.complete&&(this.scaledOffset.set(t.offset.x*l.localScale.x,t.offset.y*l.localScale.y),h.add(t._renderData.position,l.localPosition,this.scaledOffset),t._renderData.width=(null!==(r=null!==(i=t.width)&&void 0!==i?i:null===(s=t.slice)||void 0===s?void 0:s.width)&&void 0!==r?r:t.image.naturalWidth)*Math.abs(t.scale.x*l.localScale.x),t._renderData.height=(null!==(a=null!==(o=t.height)&&void 0!==o?o:null===(n=t.slice)||void 0===n?void 0:n.height)&&void 0!==a?a:t.image.naturalHeight)*Math.abs(t.scale.y*l.localScale.y),t._renderData.flipHorizontally=t.flipHorizontally!==l.scale.x<0,t._renderData.flipVertically=t.flipVertically!==l.scale.y<0,t._renderData.rotation=l.localRotation+t.rotation,0!==l.localRotation&&this.scaledOffset.magnitude>0&&this.translateRenderPosition(t._renderData,l),t._renderData.image=t.image,t._renderData.layer=t.layer,t._renderData.maskColor=t.maskColor,t._renderData.maskColorMix=t.maskColorMix,t._renderData.opacity=t.opacity,t._renderData.slice=t.slice,t._renderData.smooth=t.smooth,t._renderData.tintColor=t.tintColor,t._renderData.tiled=t.tiled,this.renderManager.addRenderData(t._renderData))}))}translateRenderPosition(t,e){const i=Math.atan2(this.scaledOffset.y,this.scaledOffset.x)+e.localRotation;t.position.set(e.localPosition.x+this.scaledOffset.magnitude*Math.cos(i),e.localPosition.y+this.scaledOffset.magnitude*Math.sin(i))}};se=o([i(I.SpriteRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.AssetManager))],se);const re={charRanges:[32,126,161,255],fontSize:64,spacing:8};class oe{constructor(t){this.color="#000000",this.flipHorizontally=!1,this.flipVertically=!1,this.font="Arial",this.fontSize=16,this.height=16,this.layer=G,this.letterSpacing=0,this.lineHeight=void 0,this.offset=new h,this.opacity=1,this.orientation=exports.TextOrientation.Center,this.rotation=0,this.shadow=void 0,this.smooth=!1,this.text="Hello World!",this.textureAtlas=Object.assign({},re),this.width=160,this._renderData={color:void 0,flipHorizontally:!1,flipVertically:!1,font:void 0,fontSize:void 0,layer:void 0,letterSpacing:void 0,lineHeight:void 0,opacity:void 0,orientation:void 0,position:new h,rotation:void 0,shadow:void 0,smooth:void 0,text:void 0,textureAtlas:Object.assign({},re),type:at.Text},Object.assign(this,t)}}oe.componentName="TextRenderer";let ne=class{constructor(t,e,i){this.entityManager=t,this.renderManager=e,this.assetManager=i,this.scaledOffset=new h}onUpdate(){this.entityManager.search(oe).forEach((({entity:t,component:e})=>{var i;const s=this.entityManager.getComponent(t,V);if(!s)throw new Error("TextRenderer component needs a Transform");if("string"==typeof e.font){const t=this.assetManager.getFont(e.font);t&&(e.font=t)}if(0===e.text.length||e.font instanceof FontFace&&"loaded"!==e.font.status)return;this.scaledOffset.set(e.offset.x*s.localScale.x,e.offset.y*s.localScale.y),h.add(e._renderData.position,s.localPosition,this.scaledOffset),e._renderData.layer=e.layer,e._renderData.font=e.font,e._renderData.fontSize=e.fontSize,e._renderData.text=this.crop(e),e._renderData.orientation=e.orientation,e._renderData.color=e.color,e._renderData.lineHeight=null!==(i=e.lineHeight)&&void 0!==i?i:e.fontSize,e._renderData.letterSpacing=e.letterSpacing,e._renderData.smooth=e.smooth,e._renderData.rotation=s.localRotation+e.rotation,e._renderData.opacity=e.opacity;const{charRanges:r,fontSize:o,spacing:n}=e.textureAtlas;r&&(e._renderData.textureAtlas.charRanges=e.textureAtlas.charRanges),o&&(e._renderData.textureAtlas.fontSize=e.textureAtlas.fontSize),n&&(e._renderData.textureAtlas.spacing=e.textureAtlas.spacing),e._renderData.flipHorizontally=e.flipHorizontally,e._renderData.flipVertically=e.flipVertically,e._renderData.shadow=e.shadow,0!==s.localRotation&&this.scaledOffset.magnitude>0&&this.translateRenderPosition(e._renderData,s),this.renderManager.addRenderData(e._renderData)}))}translateRenderPosition(t,e){const i=Math.atan2(this.scaledOffset.y,this.scaledOffset.x)+e.localRotation;t.position.set(e.localPosition.x+this.scaledOffset.magnitude*Math.cos(i),e.localPosition.y+this.scaledOffset.magnitude*Math.sin(i))}crop({fontSize:t,height:e,width:i,text:s,letterSpacing:r,lineHeight:o}){if(t>e)return"";const n=[];let a=0;for(const h of s.split("\n")){const s=h.split(/(\s+)/).reduce(((e,s)=>{const o=e.length-1,n=e[o]+s;return n.length*(t+r)>i?e.push(s):e[o]=n,e}),[""]);for(const t of s){if(a+=o,a>e)return n.join("\n");n.push(t)}}return n.join("\n")}};ne=o([i(I.TextRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.AssetManager))],ne);let ae=class{constructor(t,e,i){this.entityManager=t,this.renderManager=e,this.assetManager=i}onUpdate(){this.entityManager.search(Bt).forEach((({entity:t,component:e})=>{const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("TilemapRenderer component needs a Transform");if("string"==typeof e.tileset.image&&(e.tileset.image=this.assetManager.getImage(e.tileset.image),!e.tileset.image))throw new Error(`Asset ${e.tileset.image} not found`);e._processed&&e.tileset.image&&e.tileset.image.complete&&e.chunks.forEach(((t,s)=>{e._renderData[s]||(e._renderData[s]=he());const r=e._renderData[s];r.type=at.Tilemap,r.orientation=exports.TilemapOrientation.Center,r.position=new h,r.layer=e.layer,r.tilemap.width=t.width,r.tilemap.height=Math.ceil(e.data.length/t.width),r.tilemap.tileWidth=e.tileWidth*Math.abs(i.localScale.x),r.tilemap.tileHeight=e.tileHeight*Math.abs(i.localScale.y),r.tilemap.realWidth=r.tilemap.width*r.tilemap.tileWidth,r.tilemap.realHeight=r.tilemap.height*r.tilemap.tileHeight,r.tiles=t.data,r.tileset=e.tileset,r.opacity=e.opacity,r.rotation=i.localRotation,r.tintColor=e.tintColor,r.smooth=e.smooth,r.maskColor=e.maskColor,r.maskColorMix=e.maskColorMix,r.position.x=i.localPosition.x+(t.x-e.width/2+t.width/2)*r.tilemap.tileWidth,r.position.y=i.localPosition.y+(e.height/2-t.y-t.height/2)*r.tilemap.tileHeight,this.renderManager.addRenderData(r)}))}))}};ae=o([i(I.TilemapRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.AssetManager))],ae);const he=()=>({type:at.Tilemap,layer:void 0,position:new h,tilemap:{height:void 0,realHeight:void 0,realWidth:void 0,tileHeight:void 0,tileWidth:void 0,width:void 0},tiles:void 0,tileset:void 0});var le;exports.RigidBodyType=void 0,(le=exports.RigidBodyType||(exports.RigidBodyType={}))[le.Dynamic=0]="Dynamic",le[le.Kinematic=1]="Kinematic",le[le.Static=2]="Static";class ce{constructor(t){this.type=exports.RigidBodyType.Dynamic,this.velocity=new h,this.gravity=0,this.acceleration=new h,Object.assign(this,t)}}ce.componentName="RigidBody";let de=class{constructor(t,e,i){this.entityManager=t,this.timeManager=e,this.transformSystem=i,this.types=new Set([exports.RigidBodyType.Dynamic,exports.RigidBodyType.Kinematic]),this.displacement=new h,this.totalAcceleration=new h,this.scaledAcceleration=new h,this.scaledVelocity=new h}onUpdate(){this.entityManager.search(ce).filter((({component:{type:t}})=>this.types.has(t))).forEach((({component:{velocity:t,acceleration:e,gravity:i,type:s},entity:r})=>{const{position:o}=this.entityManager.getComponent(r,V);s===exports.RigidBodyType.Dynamic?(this.totalAcceleration.y=e.y-i,this.totalAcceleration.x=e.x):this.totalAcceleration.copy(e),h.add(t,t,h.scale(this.scaledAcceleration,this.totalAcceleration,this.timeManager.physicsDeltaTime)),h.add(o,o,h.add(this.displacement,h.scale(this.scaledVelocity,t,this.timeManager.physicsDeltaTime),h.scale(this.scaledAcceleration,this.totalAcceleration,.5*Math.pow(this.timeManager.physicsDeltaTime,2))))})),this.transformSystem.onUpdate()}};de=o([i(I.ApplyVelocitySystem),n(0,s(t.EntityManager)),n(1,s(t.TimeManager)),n(2,s(I.TransformSystem))],de);class ge{constructor(){this.auxMin=new h,this.auxMax=new h,this.auxScaledOffset=new h}updatePositionAndVertices(t,e,i){this.translatePosition(t,e,i),t instanceof x?(this.auxAngle=t.rotation+i.localRotation,t.vertexModel.forEach(((e,s)=>t.vertices[s].set(e.x*i.localScale.x,e.y*i.localScale.y))),t.vertices.forEach((e=>e.set(e.x*Math.cos(this.auxAngle)-e.y*Math.sin(this.auxAngle)+t.position.x,e.x*Math.sin(this.auxAngle)+e.y*Math.cos(this.auxAngle)+t.position.y)))):t instanceof M&&(t.radius*=Math.max(Math.abs(i.localScale.x),Math.abs(i.localScale.y)))}translatePosition(t,e,{localPosition:i,localScale:s,localRotation:r}){if(this.auxScaledOffset.set(e.x*s.x,e.y*s.y),0!==r){const e=Math.atan2(this.auxScaledOffset.y,this.auxScaledOffset.x)+r;t.position.set(i.x+this.auxScaledOffset.magnitude*Math.cos(e),i.y+this.auxScaledOffset.magnitude*Math.sin(e))}else h.add(t.position,i,this.auxScaledOffset)}updateBoundingBox(t){t instanceof M?this.updateCircumferenceBoundingBox(t):t instanceof x&&this.updatePolygonBoundingBox(t)}updateCircumferenceBoundingBox(t){t.boundingBox.set(t.position.x-t.radius,t.position.y-t.radius,2*t.radius,2*t.radius)}updatePolygonBoundingBox(t){this.auxMin.x=t.vertices[0].x,this.auxMin.y=t.vertices[0].y,this.auxMax.x=t.vertices[0].x,this.auxMax.y=t.vertices[0].y,t.vertices.forEach((t=>{this.auxMin.x=Math.min(t.x,this.auxMin.x),this.auxMin.y=Math.min(t.y,this.auxMin.y),this.auxMax.x=Math.max(t.x,this.auxMax.x),this.auxMax.y=Math.max(t.y,this.auxMax.y)})),t.boundingBox.set(this.auxMin.x,this.auxMin.y,this.auxMax.x-this.auxMin.x,this.auxMax.y-this.auxMin.y)}updateProjectionAxes(t){var e;if(t.vertices.length>2)for(let i=0;i<t.vertices.length;i++)h.normal(t.projectionAxes[i],h.subtract(t.projectionAxes[i],null!==(e=t.vertices[i+1])&&void 0!==e?e:t.vertices[0],t.vertices[i]));else h.normal(t.projectionAxes[0],h.subtract(t.projectionAxes[0],t.vertices[1],t.vertices[0]))}}let pe=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){this.entityManager.search(zt).forEach((({component:t,entity:e})=>{0===t.shapes.length&&(t.shapes[0]=new M(t.radius)),t.shapes[0].radius=t.radius,this.updatePositionAndVertices(t.shapes[0],t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(t.shapes[0]),this.updateProjectionAxes(t.shapes[0])}))}};pe=o([i(I.UpdateBallColliderShapeSystem),n(0,s(t.EntityManager))],pe);let me=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){this.entityManager.search(Ht).forEach((({component:t,entity:e})=>{0===t.shapes.length&&(t.shapes[0]=new x([new h,new h,new h,new h])),t.shapes[0].rotation=t.rotation,t.shapes[0].vertexModel[0].set(-t.width/2,-t.height/2),t.shapes[0].vertexModel[1].set(-t.width/2,t.height/2),t.shapes[0].vertexModel[2].set(t.width/2,t.height/2),t.shapes[0].vertexModel[3].set(t.width/2,-t.height/2),this.updatePositionAndVertices(t.shapes[0],t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(t.shapes[0]),this.updateProjectionAxes(t.shapes[0])}))}};me=o([i(I.UpdateBoxColliderShapeSystem),n(0,s(t.EntityManager))],me);let ue=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){this.entityManager.search(Yt).forEach((({component:t,entity:e})=>{for(let i=0;i<t.vertexModel.length-1;i++)t.shapes[i]||(t.shapes[i]=new x([new h,new h])),t.shapes[i].rotation=t.rotation,t.shapes[i].vertexModel=[t.vertexModel[i],t.vertexModel[i+1]],this.updatePositionAndVertices(t.shapes[i],t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(t.shapes[i]),this.updateProjectionAxes(t.shapes[i])}))}};ue=o([i(I.UpdateEdgeColliderShapeSystem),n(0,s(t.EntityManager))],ue);let ye=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){this.entityManager.search(Xt).forEach((({component:t,entity:e})=>{0===t.shapes.length&&(t.shapes[0]=new x([])),t.shapes[0].rotation=t.rotation,t.shapes[0].vertexModel=t.vertexModel,this.updatePositionAndVertices(t.shapes[0],t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(t.shapes[0]),this.updateProjectionAxes(t.shapes[0])}))}};ye=o([i(I.UpdatePolygonColliderShapeSystem),n(0,s(t.EntityManager))],ye);let fe=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){this.entityManager.search($t).forEach((({component:t,entity:e})=>{const i=this.entityManager.getComponent(e,Bt);if(i&&0!==i.data.length){0===t.shapes.length&&(t.composite?this.useEdges(t,i):this.useBoxes(t,i));for(const i of t.shapes)this.updatePositionAndVertices(i,t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(i),this.updateProjectionAxes(i)}}))}useBoxes(t,e){t.shapes=[],e.data.forEach(((i,s)=>{if(!this.needsCollider(i,s,e))return;const r=new x(this.generateRectangleVertices(s,e));r.updateCollisions=!1,t.shapes.push(r)}))}generateRectangleVertices(t,{width:e,height:i,tileWidth:s,tileHeight:r}){const o=-e*s/2+t%e*s,n=i*r/2-Math.floor(t/e)*r;return[new h(o,n-r),new h(o,n),new h(o+s,n),new h(o+s,n-r)]}needsCollider(t,e,{data:i,width:s,height:r}){return 0!==t&&this.getNeighbors(e,s,r).some((t=>!t||!i[t]||0===i[t]))}useEdges(t,e){t.shapes=[];const i=[],s=[];let r,o;e.data.forEach(((t,r)=>{if(0===t)return;const o=r%e.width,n=Math.floor(r/e.width);i[n]||(i[n]=[]),i[n+1]||(i[n+1]=[]),s[n]||(s[n]=[]),s[n+1]||(s[n+1]=[]);const a=this.getNeighbors(r,e.width,e.height);this.hasTile(a[0],e)||(i[n][o]=!0),this.hasTile(a[2],e)||(i[n+1][o]=!0),this.hasTile(a[1],e)||(s[n][o]=!0),this.hasTile(a[3],e)||(s[n][o+1]=!0)}));for(let s=0;s<i.length;s++)if(i[s])for(let n=0;n<i[s].length;n++)!r||!o||s===o.y&&i[s][n]||(t.shapes.push(this.createEdge(r,o,e)),r=void 0,o=void 0),i[s][n]&&(r||(r=new h(n,s)),o=new h(n+1,s));r&&o&&t.shapes.push(this.createEdge(r,o,e)),r=void 0,o=void 0;for(let i=0;i<=e.width;i++)for(let n=0;n<s.length;n++)s[n]&&(!r||!o||i===o.x&&s[n][i]||(t.shapes.push(this.createEdge(r,o,e)),r=void 0,o=void 0),s[n][i]&&(r||(r=new h(i,n)),o=new h(i,n+1)));r&&o&&t.shapes.push(this.createEdge(r,o,e))}hasTile(t,{data:e}){return void 0!==t&&e[t]&&e[t]>0}createEdge(t,e,{width:i,height:s,tileWidth:r,tileHeight:o}){t.x=-i*r/2+t.x*r,t.y=s*o/2-t.y*o,e.x=-i*r/2+e.x*r,e.y=s*o/2-e.y*o;const n=new x([new h(t.x,t.y),new h(e.x,e.y)]);return n.updateCollisions=!1,n}getNeighbors(t,e,i){return[t-e>=0?t-e:void 0,t%e>0?t-1:void 0,t+e<=e*i?t+e:void 0,t%e<e-1?t+1:void 0]}};fe=o([i(I.UpdateTilemapColliderShapeSystem),n(0,s(t.EntityManager))],fe);let xe=class{constructor(t,e,i,s,r){this.entityManager=t,this.broadPhaseResolver=e,this.collisionMatrix=i,this.collisionResolutionMethod=s,this.collisionRepository=r,this.colliderTypes=[zt,Ht,Xt,Yt,$t],this.colliders=[],this.collisions=new Set,this.shapes=[]}onUpdate(){this.collisionRepository.removeAll(),this.colliders=[],this.collisions.clear(),this.shapes=[],this.colliderTypes.forEach((t=>this.entityManager.search(t).forEach((({component:t,entity:e})=>{this.colliders.push(t),t.shapes.forEach((i=>{var s;i.entity=e,i.collider=this.colliders.length-1,i.id=this.shapes.length,i.ignoreCollisionsWithLayers=null!==(s=t.ignoreCollisionsWithLayers)&&void 0!==s?s:[],i.layer=t.layer,this.shapes.push(i)}))})))),this.broadPhaseResolver.update(this.shapes),this.shapes.filter((t=>t.updateCollisions)).forEach((t=>this.narrowPhase(t,this.broadPhase(t))))}broadPhase({boundingBox:t,layer:e}){return this.collisionMatrix?this.broadPhaseResolver.retrieve(t).map((t=>this.shapes[t])).filter((t=>this.collisionMatrix.some((i=>i[0]===e&&i[1]===t.layer||i[1]===e&&i[0]===t.layer)))):this.broadPhaseResolver.retrieve(t).map((t=>this.shapes[t]))}narrowPhase(t,e){e.filter((e=>t.entity!==e.entity&&t.id!==e.id&&!t.ignoreCollisionsWithLayers.includes(e.layer)&&!e.ignoreCollisionsWithLayers.includes(t.layer)&&!this.isResolved(t,e))).forEach((e=>{const i=this.collisionResolutionMethod.findCollision(t,e);i&&(this.collisionRepository.persist({localCollider:this.colliders[t.collider],localEntity:t.entity,remoteCollider:this.colliders[e.collider],remoteEntity:e.entity,resolution:i}),this.collisionRepository.persist({localCollider:this.colliders[e.collider],localEntity:e.entity,remoteCollider:this.colliders[t.collider],remoteEntity:t.entity,resolution:{direction:h.scale(new h,i.direction,-1),penetration:i.penetration}}),this.collisions.add(`${t.id}-${e.id}`),this.collisions.add(`${e.id}-${t.id}`))}))}isResolved(t,e){return this.collisions.has(`${t.id}-${e.id}`)}};xe=o([i(I.ResolveCollisionSystem),n(0,s(t.EntityManager)),n(1,s(t.CollisionBroadphaseResolver)),n(2,s(t.CollisionMatrix)),n(3,s(t.CollisionResolutionMethod)),n(4,s(t.CollisionRepository))],xe);let Me=class{constructor(t,e,i){this.entityManager=t,this.collisionRepository=e,this.transformSystem=i,this.correction=new h,this.maxCorrection=new h}onUpdate(){const t=this.collisionRepository.findAll().filter((({localCollider:t,remoteCollider:e,remoteEntity:i,localEntity:s})=>t.physics&&e.physics&&this.entityManager.hasComponent(s,ce)&&this.entityManager.hasComponent(i,ce)));0!==t.length&&(this.entityManager.search(ce,(t=>t.type===exports.RigidBodyType.Dynamic)).forEach((({component:e,entity:i})=>{if(this.maxCorrection.set(0,0),t.filter((({localEntity:t})=>i===t)).forEach((({remoteEntity:t,resolution:{direction:e,penetration:i}})=>{this.entityManager.getComponent(t,ce).type===exports.RigidBodyType.Dynamic&&(i/=2),h.scale(this.correction,e,-i),this.correction.magnitude>this.maxCorrection.magnitude&&this.maxCorrection.copy(this.correction)})),0===this.maxCorrection.x&&0===this.maxCorrection.y)return;const{position:s}=this.entityManager.getComponent(i,V);h.add(s,s,this.maxCorrection),e.gravity>0&&this.maxCorrection.y*e.velocity.y<0&&(e.velocity.y=0)})),this.transformSystem.onUpdate())}};Me=o([i(I.ApplyRepositionSystem),n(0,s(t.EntityManager)),n(1,s(t.CollisionRepository)),n(2,s(I.TransformSystem))],Me);let ve=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){const t=this.entityManager.search(ce,(t=>t.type===exports.RigidBodyType.Dynamic)).map((({entity:t})=>t));[zt,Ht,Xt,Yt,$t].forEach((e=>this.entityManager.search(e,((e,i)=>t.includes(i))).forEach((({component:t,entity:e})=>t.shapes.forEach((i=>{this.updatePositionAndVertices(i,t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(i)}))))))}};ve=o([i(I.UpdateCollidersAfterRepositionSystem),n(0,s(t.EntityManager))],ve);const Ce=24;let Se=class{constructor(t,e,i,s,r){this.entityManager=t,this.renderManager=e,this.inputManager=i,this.canvas=s,this.gameConfig=r,this.positionInViewport=new h,this.positionInCameraViewport=new h,this.positionInWorldspace=new h,this.renderDataPerCamera=new Map}onUpdate(){var t;if(!(null===(t=this.gameConfig.debug)||void 0===t?void 0:t.mousePosition)||!this.inputManager.mouse)return;const{positionInViewport:e}=this.inputManager.mouse;this.entityManager.search(W,(t=>t.debug)).forEach((({entity:t,component:i},s)=>{var r;const{zoom:o}=i,n=this.entityManager.getComponent(t,V).position,a=null!==(r=this.renderDataPerCamera.get(s))&&void 0!==r?r:be();h.floor(this.positionInWorldspace,h.add(this.positionInWorldspace,n,h.scale(this.positionInWorldspace,e,1/o))),h.floor(this.positionInCameraViewport,h.scale(this.positionInCameraViewport,e,1/o)),h.round(this.positionInViewport,e),a.color=this.gameConfig.debug.textColor,a.text=`mouse_position: canvas_viewport=${this.positionInViewport}, camera_viewport=${this.positionInCameraViewport}, world_space=${this.positionInWorldspace}`,a.fontSize=Ce/o,a.shadow.offset.x=2/o,a.shadow.offset.y=-2/o,this.updateRenderDataPosition(a,n,o),this.renderManager.addRenderData(a)}))}updateRenderDataPosition(t,e,i){switch(this.gameConfig.debug.textPosition){case"top-left":t.position.set(e.x-(this.canvas.width/2-Ce)/i,e.y+(this.canvas.height/2-Ce)/i);break;case"top-right":t.position.set(e.x+(this.canvas.width/2-t.text.length/2*Ce)/i,e.y+(this.canvas.height/2-Ce)/i);break;case"bottom-left":default:t.position.set(e.x-(this.canvas.width/2-Ce)/i,e.y-(this.canvas.height/2-Ce)/i);break;case"bottom-right":t.position.set(e.x+(this.canvas.width/2-t.text.length/2*Ce)/i,e.y-(this.canvas.height/2-Ce)/i)}}};Se=o([i(I.DebugMousePositionSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.InputManager)),n(3,s(t.CanvasElement)),n(4,s(t.GameConfig))],Se);const be=(t=24)=>({type:at.Text,text:"",position:new h,layer:N,color:"#00FF00",fontSize:t,font:"Arial",shadow:{color:"#000000",opacity:1,offset:new h(1,-1)},orientation:exports.TextOrientation.RightCenter,flipHorizontally:!1,flipVertically:!1,letterSpacing:0,lineHeight:t,opacity:1,rotation:0,smooth:!1,textureAtlas:Object.assign({},re)}),Ae=new Map([[k.PreGameLogic,[{name:I.KeyboardSystem,type:Lt},{name:I.MouseSystem,type:jt},{name:I.TouchScreenSystem,type:kt},{name:I.GamepadSystem,type:It},{name:I.ButtonSystem,type:_t},{name:I.AudioPlayerSystem,type:j},{name:I.TiledWrapperSystem,type:Pt},{name:I.TilemapPreProcessingSystem,type:Ft}]],[k.Transform,[{name:I.TransformSystem,type:Ut}]],[k.Physics,[{name:I.ApplyVelocitySystem,type:de},{name:I.UpdateBallColliderShapeSystem,type:pe},{name:I.UpdateBoxColliderShapeSystem,type:me},{name:I.UpdateEdgeColliderShapeSystem,type:ue},{name:I.UpdatePolygonColliderShapeSystem,type:ye},{name:I.UpdateTilemapColliderShapeSystem,type:fe},{name:I.ResolveCollisionSystem,type:xe},{name:I.ApplyRepositionSystem,type:Me},{name:I.UpdateCollidersAfterRepositionSystem,type:ve}]],[k.Render,[{name:I.AnimatorSystem,type:Gt},{name:I.CameraSystem,type:Nt},{name:I.TilemapRendererSystem,type:ae},{name:I.SpriteRendererSystem,type:se},{name:I.MaskRendererSystem,type:Qt},{name:I.DarknessLightRendererSystem,type:ie},{name:I.TextRendererSystem,type:ne},{name:I.VideoRendererSystem,type:wt},{name:I.DebugColliderRenderSystem,type:Kt},{name:I.DebugMousePositionSystem,type:Se},{name:I.CullingSystem,type:qt},{name:I.ClearScreenSystem,type:Wt},{name:I.RenderSystem,type:Zt}]]]);let we=class{constructor(t,e,i){this.timeManager=t,this.systemManager=e,this.sceneManager=i,this.running=!1,this.gameLoopAccumulator=0}start(){this.running||(this.running=!0,this.gameLoopAccumulator=0,this.enableSystems(),this.sceneManager.loadOpeningScene(),this.requestAnimationLoop(window.performance.now()),this.asyncPhysicsLoop())}enableSystems(){Ae.forEach((t=>{t.forEach((({type:t})=>this.systemManager.enableSystem(t)))}))}stop(){this.running&&(this.systemManager.disableAllSystems(),this.running=!1)}requestAnimationLoop(t){this.running&&(this.timeManager.updateForRender(.001*t),this.sceneManager.update(),this.sceneManager.loadingScene||(this.gameLoopAccumulator+=this.timeManager.browserDeltaTime,this.sceneManager.sceneLoadedThisFrame&&(this.gameLoopAccumulator=this.timeManager.fixedGameDeltaTime),this.gameLoopAccumulator>=this.timeManager.fixedGameDeltaTime&&(this.gameLogicIteration(.001*t),this.gameLoopAccumulator-=this.timeManager.fixedGameDeltaTime),this.renderIteration()),window.requestAnimationFrame((t=>this.requestAnimationLoop(t))))}gameLogicIteration(t){this.timeManager.updateForGame(t),this.systemManager.update(k.PreGameLogic),this.systemManager.update(k.GameLogic),this.timeManager.updateIntervals(),this.systemManager.update(k.Transform)}renderIteration(){this.systemManager.groupHasSystems(k.GamePreRender)&&(this.systemManager.update(k.GamePreRender),this.systemManager.update(k.Transform)),this.systemManager.update(k.Render)}asyncPhysicsLoop(){this.physicsIntervalId=window.setInterval((()=>{if(!this.running)return window.clearInterval(this.physicsIntervalId);this.timeManager.updateForPhysics(.001*window.performance.now()),document.hidden||this.physicsIteration()}),1e3/this.timeManager.fixedPhysicsFramerate)}physicsIteration(){this.timeManager.timeScale<=0||(this.systemManager.groupHasSystems(k.GamePhysics)&&(this.systemManager.update(k.GamePhysics),this.systemManager.update(k.Transform)),this.systemManager.update(k.Physics))}};we=o([i(t.LoopManager),n(0,s(t.TimeManager)),n(1,s(t.SystemManager)),n(2,s(t.SceneManager))],we);class Ee{constructor(t,e){this.container=t,this.systemManager=e,this.lastSystemTypeId=0}createSystemIfNotExists(t){if(this.systemManager.hasSystem(t))return;const e="__system_"+this.lastSystemTypeId++;var i;this.container.add(t,e),this.systemManager.addSystem(this.container.get(e),null!==(i=t.prototype.__system_group)&&void 0!==i?i:k.GameLogic)}}let Re=class{constructor(t){this.webGLManager=t,this.renderData=[],this.cameraData=[]}addCameraData(t){this.cameraData.push(t)}addRenderData(t){this.renderData.push(t)}setRenderData(t){this.renderData=t}getCameraData(){return this.cameraData}getRenderData(){return this.renderData}removeCameraData(){this.cameraData=[]}removeRenderData(){this.renderData=[]}render(){this.cameraData.sort(((t,e)=>t.depth-e.depth)).forEach((t=>this.renderData.filter((e=>t.layers.includes(e.layer))).sort(((e,i)=>t.layers.indexOf(e.layer)-t.layers.indexOf(i.layer))).forEach((e=>this.webGLManager.render(e,t)))))}};Re=o([i(t.RenderManager),n(0,s(t.WebGLManager))],Re);const _e=t=>{var e,i,s,r,o,n,a,h,l,c,d;if(!(t.containerNode instanceof HTMLElement))throw new Error("GameConfig Error: Invalid containerNode");if("number"!=typeof t.width)throw new Error("GameConfig Error: Invalid width");if("number"!=typeof t.height)throw new Error("GameConfig Error: Invalid height");t.canvasColor=null!==(e=t.canvasColor)&&void 0!==e?e:"#000000",t.physicsFramerate=null!==(i=t.physicsFramerate)&&void 0!==i?i:180,t.headless=null!==(s=t.headless)&&void 0!==s&&s,t.debug=null!==(r=t.debug)&&void 0!==r?r:{colliders:!1,mousePosition:!1},t.debug.collidersColor=null!==(o=t.debug.collidersColor)&&void 0!==o?o:"#00FF00",t.debug.textColor=null!==(n=t.debug.textColor)&&void 0!==n?n:"#00FF00",t.debug.textPosition=null!==(a=t.debug.textPosition)&&void 0!==a?a:"bottom-left",t.collisions=null!==(h=t.collisions)&&void 0!==h?h:{},t.collisions.collisionBroadPhaseMethod=null!==(l=t.collisions.collisionBroadPhaseMethod)&&void 0!==l?l:exports.BroadPhaseMethods.SpartialGrid,t.collisions.collisionMatrix=null!==(c=t.collisions.collisionMatrix)&&void 0!==c?c:void 0,t.collisions.collisionMethod=null!==(d=t.collisions.collisionMethod)&&void 0!==d?d:exports.CollisionMethods.SAT},Te=({containerNode:t,width:e,height:i})=>{const s=document.createElement("canvas");return s.id="angryPixelGameCanvas",s.width=Math.floor(e),s.height=Math.floor(i),s.tabIndex=0,s.addEventListener("contextmenu",(t=>t.preventDefault())),t.appendChild(s),s.focus(),s},Be=e=>{e.add(exports.EntityManager),e.add(exports.SystemManager),e.set(t.CreateSystemService,new Ee(e,e.get(t.SystemManager))),e.add(exports.TimeManager),e.add(exports.AssetManager),e.add(exports.InputManager),e.add(exports.SceneManager),e.add(exports.InputManager),e.add(we),e.add(St),e.add(Re)},Pe=e=>{e.get(t.GameConfig).headless&&De(Ae),Ae.forEach(((i,s)=>i.forEach((({type:i,name:r})=>{e.add(i),e.get(t.SystemManager).addSystem(e.get(r),s)}))))},De=t=>{t.delete(k.Render),t.set(k.PreGameLogic,t.get(k.PreGameLogic).filter((({name:t})=>![I.AudioPlayerSystem,I.ButtonSystem,I.GamepadSystem,I.KeyboardSystem,I.MouseSystem,I.TouchScreenSystem].includes(t))))},Fe=e=>{const{collisions:{collisionBroadPhaseMethod:i,collisionMatrix:s,collisionMethod:r}}=e.get(t.GameConfig);e.add(exports.CollisionRepository),e.add(w),r===exports.CollisionMethods.AABB?(e.add(b),e.add(A)):e.add(E),e.add(i===exports.BroadPhaseMethods.QuadTree?u:f),e.add(r===exports.CollisionMethods.AABB?v:S),e.set(t.CollisionMatrix,s)},Ue=e=>{const i=e.get(t.GameConfig);i.dependencies&&i.dependencies.forEach((([t,i])=>{e.set(t,i)}))};class Ie{onUpdate(){}onCreate(){}onEnabled(){}onDisabled(){}onDestroy(){}}o([s(t.EntityManager)],Ie.prototype,"entityManager",void 0),o([s(t.AssetManager)],Ie.prototype,"assetManager",void 0),o([s(t.SceneManager)],Ie.prototype,"sceneManager",void 0),o([s(t.TimeManager)],Ie.prototype,"timeManager",void 0),o([s(t.InputManager)],Ie.prototype,"inputManager",void 0),o([s(t.CollisionRepository)],Ie.prototype,"collisionRepository",void 0),o([s(t.GameConfig)],Ie.prototype,"gameConfig",void 0);const Le={AssetManager:t.AssetManager,CanvasElement:t.CanvasElement,CollisionRepository:t.CollisionRepository,EntityManager:t.EntityManager,GameConfig:t.GameConfig,InputManager:t.InputManager,SceneManager:t.SceneManager,SystemManager:t.SystemManager,TimeManager:t.TimeManager};exports.Animation=class{constructor(t){var e,i,s;this.slice={size:new h,offset:new h,padding:new h},this.frames=[],this.fps=12,this.loop=!1,t&&(this.image=t.image,this.frames=null!==(e=t.frames)&&void 0!==e?e:this.frames,this.fps=null!==(i=t.fps)&&void 0!==i?i:this.fps,this.loop=null!==(s=t.loop)&&void 0!==s?s:this.loop,t.slice&&(this.slice.size.copy(t.slice.size),t.slice.offset&&this.slice.offset.copy(t.slice.offset),t.slice.padding&&this.slice.padding.copy(t.slice.padding)))}},exports.Animator=Ot,exports.AudioPlayer=U,exports.BallCollider=zt,exports.BoxCollider=Ht,exports.BuiltInDependencyIdentifiers=Le,exports.Button=Et,exports.Camera=W,exports.Circumference=M,exports.DarknessRenderer=ee,exports.EdgeCollider=Yt,exports.Game=class{constructor(i){this.container=(i=>{_e(i);const s=new e;return s.set(t.GameConfig,i),s.set(t.CanvasElement,Te(i)),Fe(s),Be(s),Pe(s),Ue(s),s})(i)}get running(){return this.container.get(t.LoopManager).running}addScene(e,i,s=!1){this.container.get(t.SceneManager).addScene(e,i,s)}addDependencyType(t,e){this.container.add(t,e)}addDependencyInstance(t,e){this.container.set(e,t)}start(){this.container.get(t.LoopManager).start()}stop(){this.container.get(t.LoopManager).stop()}},exports.GameSystem=Ie,exports.GamepadController=_,exports.Keyboard=T,exports.LightRenderer=te,exports.MaskRenderer=Jt,exports.Mouse=B,exports.Polygon=x,exports.PolygonCollider=Xt,exports.Rectangle=l,exports.RigidBody=ce,exports.Scene=class{constructor(t,e){this.entityManager=t,this.assetManager=e,this.systems=[]}registerSystems(){}loadAssets(){}createEntities(){}addSystem(t){this.systems.push(t)}addSystems(t){this.systems.push(...t)}},exports.SpriteRenderer=Vt,exports.TextRenderer=oe,exports.TiledWrapper=Tt,exports.TilemapCollider=$t,exports.TilemapRenderer=Bt,exports.TouchScreen=P,exports.Transform=V,exports.Vector2=h,exports.VideoRenderer=bt,exports.between=p,exports.clamp=c,exports.debugRenderLayer=N,exports.decorate=function(t,e,i){"number"==typeof i?t(e.prototype,void 0,i):void 0!==i?t(e.prototype,i):t(e)},exports.defaultRenderLayer=G,exports.defaultTextureAtlasOptions=re,exports.degreesToRadians=t=>t*(Math.PI/180),exports.disableComponent=t=>({enabled:!1,component:t}),exports.fixedRound=d,exports.gameLogicSystem=function(){return function(t){O(t,k.GameLogic)}},exports.gamePhysicsSystem=function(){return function(t){O(t,k.GamePhysics)}},exports.gamePreRenderSystem=function(){return function(t){O(t,k.GamePreRender)}},exports.inject=s,exports.injectable=i,exports.playSfx=({audioSource:t,volume:e=1,loop:i=!1})=>{t.volume=e,t.loop=i,t.currentTime=0,t.play().catch((t=>console.warn("playSfx error:",t)))},exports.radiansToDegrees=t=>t*(180/Math.PI),exports.randomFloat=(t,e,i=2)=>d(Math.random()*(e-t)+t,i),exports.randomInt=(t,e)=>Math.round(Math.random()*(e-t))+t,exports.range=g,exports.rgbToHex=({r:t,g:e,b:i},s="#")=>{const r=t=>t.toString(16).padStart(2,"0");return`${s}${r(t)}${r(e)}${r(i)}`},exports.stopSfx=t=>{t.pause(),t.currentTime=0};
1
+ "use strict";const t={AssetManager:Symbol.for("AssetManager"),CanvasElement:Symbol.for("CanvasElement"),CollisionRepository:Symbol.for("CollisionRepository"),CollisionBroadphaseResolver:Symbol.for("CollisionBroadphaseResolver"),CollisionResolutionMethod:Symbol.for("CollisionResolutionMethod"),CollisionAABBResolver:Symbol.for("CollisionAABBResolver"),CollisionCircumferenceAABBResolver:Symbol.for("CollisionCircumferenceAABBResolver"),CollisionCircumferenceResolver:Symbol.for("CollisionCircumferenceResolver"),CollisionSatResolver:Symbol.for("CollisionSatResolver"),CollisionMatrix:Symbol.for("CollisionMatrix"),CreateSystemService:Symbol.for("CreateSystemService"),EntityManager:Symbol.for("EntityManager"),GameConfig:Symbol.for("GameConfig"),InputManager:Symbol.for("InputManager"),LoopManager:Symbol.for("LoopManager"),RenderManager:Symbol.for("RenderManager"),SceneManager:Symbol.for("SceneManager"),SystemManager:Symbol.for("SystemManager"),TimeManager:Symbol.for("TimeManager"),WebGLManager:Symbol.for("WebGLManager")};class e{constructor(){this.instances=new Map,this.types=new Map}add(t,e){if(!e&&!t.prototype.__ioc_injectable)throw new Error(`Type ${t.name} is not injectable`);return this.types.set(null!=e?e:t.prototype.__ioc_injectable,t),this}set(t,e){return this.instances.set(t,e),this}get(t){var e,i;if(!this.instances.has(t)){const s=this.types.get(t);if(!s)throw new Error(`${t.toString()} is not a valid type`);const r=new s(...(null!==(e=s.prototype.__ioc_inject_constructor)&&void 0!==e?e:[]).map((t=>this.get(t))));(null!==(i=s.prototype.__ioc_inject_prop)&&void 0!==i?i:[]).forEach((([t,e])=>r[t]=this.get(e))),this.instances.set(t,r)}return this.instances.get(t)}has(t){return this.types.has(t)||this.instances.has(t)}}function i(t){return function(e){e.prototype.__ioc_injectable&&e.prototype.__ioc_injectable===t||(e.prototype.__ioc_injectable=t)}}function s(t){return function(e,i,s){void 0!==s?(e.prototype.__ioc_inject_constructor||(e.prototype.__ioc_inject_constructor=[]),e.prototype.__ioc_inject_constructor[s]=t):void 0!==i&&(e.constructor.prototype.__ioc_inject_prop||(e.constructor.prototype.__ioc_inject_prop=[]),e.constructor.prototype.__ioc_inject_prop.push([i,t]))}}var r;function o(t,e,i,s){var r,o=arguments.length,n=o<3?e:null===s?s=Object.getOwnPropertyDescriptor(e,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,i,s);else for(var a=t.length-1;a>=0;a--)(r=t[a])&&(n=(o<3?r(n):o>3?r(e,i,n):r(e,i))||n);return o>3&&n&&Object.defineProperty(e,i,n),n}function n(t,e){return function(i,s){e(i,s,t)}}function a(t,e,i,s){return new(i||(i=Promise))((function(r,o){function n(t){try{h(s.next(t))}catch(t){o(t)}}function a(t){try{h(s.throw(t))}catch(t){o(t)}}function h(t){var e;t.done?r(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(n,a)}h((s=s.apply(t,e||[])).next())}))}exports.BroadPhaseMethods=void 0,(r=exports.BroadPhaseMethods||(exports.BroadPhaseMethods={}))[r.QuadTree=0]="QuadTree",r[r.SpartialGrid=1]="SpartialGrid","function"==typeof SuppressedError&&SuppressedError;class h{constructor(t=0,e=0){this._x=t,this._y=e}get x(){return this._x}set x(t){this._x=t}get y(){return this._y}set y(t){this._y=t}get magnitude(){return Math.sqrt(Math.pow(this._x,2)+Math.pow(this._y,2))}get direction(){return this._direction||(this._direction=new h),h.unit(this._direction,this)}set(t,e){this._x=t,this._y=e}copy(t){this.set(t.x,t.y)}equals(t){return this._x===t.x&&this._y===t.y}clone(){return new h(this._x,this._y)}distance(t){return Math.sqrt(Math.pow(this._x-t.x,2)+Math.pow(this._y-t.y,2))}static add(t,e,i){return t.set(e.x+i.x,e.y+i.y),t}static subtract(t,e,i){return t.set(e.x-i.x,e.y-i.y),t}static unit(t,e){return 0===e.magnitude?t.set(0,0):t.set(e.x/e.magnitude,e.y/e.magnitude),t}static normal(t,e){return t.set(-e.y,e.x),this.unit(t,t)}static scale(t,e,i){return t.set(e.x*i,e.y*i),t}static dot(t,e){return t.x*e.x+t.y*e.y}static cross(t,e){return t.x*e.y-t.y*e.x}static round(t,e){return t.set(Math.round(e.x),Math.round(e.y)),t}static floor(t,e){return t.set(Math.floor(e.x),Math.floor(e.y)),t}static ceil(t,e){return t.set(Math.ceil(e.x),Math.ceil(e.y)),t}toString(){return`(${this._x}, ${this._y})`}}class l{constructor(t=0,e=0,i=0,s=0){this.width=0,this.height=0,this._position=new h,this._center=new h,this.set(t,e,i,s)}get x(){return this._position.x}set x(t){this._position.set(t,this._position.y)}get y(){return this._position.y}set y(t){this._position.set(this._position.x,t)}get x1(){return this._position.x+this.width}get y1(){return this._position.y+this.height}get position(){return this._position}set position(t){this._position.set(t.x,t.y)}get center(){return this._center.set(this.x+this.width/2,this.y+this.height/2),this._center}set(t,e,i,s){this._position.set(t,e),this.width=i,this.height=s}equals(t){return this.position.equals(t.position)&&this.width===t.width&&this.height===t.height}copy(t){this.set(t.x,t.y,t.width,t.height)}intersects(t){return!(this.x1<t.x||this.x>t.x1||this.y1<t.y||this.y>t.y1)}contains(t){return t instanceof l?t.x1<=this.x1&&t.x>=this.x&&t.y1<=this.y1&&t.y>=this.y:t instanceof h&&!(t.x<this.x||t.y<this.y||t.x>=this.x1||t.y>=this.y1)}toString(){return`(${this.position.x}, ${this.position.y}, ${this.width}, ${this.height})`}}const c=(t,e,i)=>Math.min(i,Math.max(e,t)),d=(t,e)=>Math.round(t*Math.pow(10,e))/Math.pow(10,e),g=(t,e,i=1)=>{const s=[];for(let r=t;r<=e;r+=i)s.push(r);return s},p=(t,e,i)=>t>=e&&t<=i;var m;let u=m=class{constructor(t=new l,e=0){this.rects=new Map,this.children=null,this.minArea=new h,this.maxArea=new h,this.bounds=t,this.depth=e}update(t){this.clear(),0!==t.length&&(this.resize(t),t.forEach((({id:t,boundingBox:e})=>this.insert(t,e))))}clear(){this.rects.clear(),this.children&&(this.children.forEach((t=>t.clear())),this.children=null)}resize(t){this.minArea.set(1/0,1/0),this.maxArea.set(-1/0,-1/0),t.forEach((({boundingBox:t})=>{this.minArea.set(Math.min(t.x,this.minArea.x),Math.min(t.y,this.minArea.y)),this.maxArea.set(Math.max(t.x1,this.maxArea.x),Math.max(t.y1,this.maxArea.y))})),this.bounds.set(this.minArea.x,this.minArea.y,this.maxArea.x-this.minArea.x,this.maxArea.y-this.minArea.y)}insert(t,e){!this.children&&this.rects.size>=16&&this.depth<8&&(this.subdivide(),this.rects.forEach(((t,e)=>this.children.forEach((i=>{i.bounds.intersects(t)&&i.insert(e,t)})))),this.rects.clear()),this.children?this.children.forEach((i=>{i.bounds.intersects(e)&&i.insert(t,e)})):this.rects.set(t,e)}subdivide(){const t=this.bounds.x,e=this.bounds.y,i=this.bounds.width/2,s=this.bounds.height/2;this.children=[new m(new l(t,e,i,s),this.depth+1),new m(new l(t+i,e,i,s),this.depth+1),new m(new l(t,e+s,i,s),this.depth+1),new m(new l(t+i,e+s,i,s),this.depth+1)]}retrieve(t){const e=[];return this.retrieveFromNode(t,e),e}retrieveFromNode(t,e){this.children?this.children.forEach((i=>{i.bounds.intersects(t)&&i.retrieveFromNode(t,e)})):this.rects.forEach(((i,s)=>{i.intersects(t)&&-1===e.indexOf(s)&&e.push(s)}))}};u=m=o([i(t.CollisionBroadphaseResolver)],u);const y=(t,e,i,s)=>Math.min((t-e)/i|0,s-1);let f=class{constructor(){this.area=new l,this.grid=[],this.rects=new Map,this.subdivisions=0,this.minArea=new h,this.maxArea=new h,this.coordinates={x0:0,x1:0,y0:0,y1:0}}update(t){this.clear(),0!==t.length&&(this.resize(t),t.forEach((({id:t,boundingBox:e})=>this.insert(t,e))))}clear(){this.grid=[],this.rects.clear()}resize(t){this.minArea.set(1/0,1/0),this.maxArea.set(-1/0,-1/0),t.forEach((({boundingBox:t})=>{this.minArea.set(Math.min(t.x,this.minArea.x),Math.min(t.y,this.minArea.y)),this.maxArea.set(Math.max(t.x1,this.maxArea.x),Math.max(t.y1,this.maxArea.y))})),this.area.set(this.minArea.x,this.minArea.y,this.maxArea.x-this.minArea.x,this.maxArea.y-this.minArea.y),this.updateSubdivisions(t.length)}updateSubdivisions(t){this.subdivisions=1+(t/16|0),this.cellWidth=Math.ceil(this.area.width/this.subdivisions),this.cellHeight=Math.ceil(this.area.height/this.subdivisions),this.grid=[];for(let t=0;t<this.subdivisions;t++){this.grid[t]=[];for(let e=0;e<this.subdivisions;e++)this.grid[t][e]=[]}}insert(t,e){this.updateCoordinates(e);for(let e=this.coordinates.x0;e<=this.coordinates.x1;e++)for(let i=this.coordinates.y0;i<=this.coordinates.y1;i++)this.grid[e][i].push(t);this.rects.set(t,e)}retrieve(t){const e=new Set;this.updateCoordinates(t);for(let i=this.coordinates.x0;i<=this.coordinates.x1;i++)for(let s=this.coordinates.y0;s<=this.coordinates.y1;s++)this.grid[i][s].forEach((i=>{this.rects.get(i).intersects(t)&&e.add(i)}));return Array.from(e)}updateCoordinates(t){this.coordinates.x0=y(t.x,this.area.x,this.cellWidth,this.subdivisions),this.coordinates.x1=y(t.x1,this.area.x,this.cellWidth,this.subdivisions),this.coordinates.y0=y(t.y,this.area.y,this.cellHeight,this.subdivisions),this.coordinates.y1=y(t.y1,this.area.y,this.cellHeight,this.subdivisions)}};f=o([i(t.CollisionBroadphaseResolver)],f);class x{get vertexModel(){return this._vertexModel}set vertexModel(t){if(this._vertexModel=t,2===t.length)return this.vertices=[new h,new h],void(this.projectionAxes=[new h]);this.vertices=[],this.projectionAxes=[],this._vertexModel.forEach((()=>{this.vertices.push(new h),this.projectionAxes.push(new h)}))}constructor(t,e=0){this.rotation=e,this.boundingBox=new l,this.collider=void 0,this.entity=void 0,this.id=void 0,this.ignoreCollisionsWithLayers=void 0,this.layer=void 0,this.position=new h,this.projectionAxes=[],this.radius=0,this.vertices=[],this.updateCollisions=!0,this._vertexModel=[],this.vertexModel=t}}class M{constructor(t){this.radius=t,this.boundingBox=new l,this.collider=void 0,this.entity=void 0,this.id=void 0,this.ignoreCollisionsWithLayers=void 0,this.layer=void 0,this.position=new h,this.projectionAxes=[new h],this.rotation=0,this.vertexModel=[],this.vertices=[new h,new h],this.updateCollisions=!0}}let v=class{constructor(t,e,i){this.AABBResolver=t,this.circumferenceAABBResolver=e,this.circumferenceResolver=i}findCollision(t,e){return t instanceof x&&e instanceof x?this.AABBResolver.resolve(t,e):t instanceof M&&e instanceof x?this.circumferenceAABBResolver.resolve(t,e):t instanceof x&&e instanceof M?this.circumferenceAABBResolver.resolve(e,t,!0):t instanceof M&&e instanceof M?this.circumferenceResolver.resolve(t,e):void 0}};var C;v=o([i(t.CollisionResolutionMethod),n(0,s(t.CollisionAABBResolver)),n(1,s(t.CollisionCircumferenceAABBResolver)),n(2,s(t.CollisionCircumferenceResolver))],v),exports.CollisionMethods=void 0,(C=exports.CollisionMethods||(exports.CollisionMethods={}))[C.AABB=0]="AABB",C[C.SAT=1]="SAT";let S=class{constructor(t,e){this.circumferenceResolver=t,this.satResolver=e}findCollision(t,e){return t instanceof M&&e instanceof M?this.circumferenceResolver.resolve(t,e):this.satResolver.resolve(t,e)}};S=o([i(t.CollisionResolutionMethod),n(0,s(t.CollisionCircumferenceResolver)),n(1,s(t.CollisionSatResolver))],S);let b=class{constructor(){this.direction=new h,this.resolutionDirection=new h}resolve({boundingBox:t},{boundingBox:e}){if(this.overlapX=Math.min(t.x1,e.x1)-Math.max(t.x,e.x),this.overlapY=Math.min(t.y1,e.y1)-Math.max(t.y,e.y),!(this.overlapX<0||this.overlapY<0))return this.checkOverlapForLines(t,e),this.direction.set(Math.sign(e.center.x-t.center.x),Math.sign(e.center.y-t.center.y)),this.preventContainment(t,e),this.overlapY<this.overlapX?(this.minOverlap=this.overlapY,this.resolutionDirection.set(0,this.direction.y)):(this.minOverlap=this.overlapX,this.resolutionDirection.set(this.direction.x,this.overlapY===this.overlapX?this.direction.y:0)),{direction:h.unit(new h,this.resolutionDirection),penetration:this.minOverlap}}checkOverlapForLines(t,e){0!==t.width&&0!==e.width||0!==this.overlapX||(this.overlapX=Math.min(Math.abs(t.x-e.x),Math.abs(t.x1-e.x1))),0!==t.height&&0!==e.height||0!==this.overlapY||(this.overlapY=Math.min(Math.abs(t.y-e.y),Math.abs(t.y1-e.y1)))}preventContainment(t,e){if(this.overlapY>0&&(t.y1>e.y1&&t.y<e.y||t.y1<e.y1&&t.y>e.y)){const i=Math.abs(t.y-e.y),s=Math.abs(t.y1-e.y1);this.overlapY+=i<s?i:s}if(this.overlapX>0&&(t.x1>e.x1&&t.x<e.x||t.x1<e.x1&&t.x>e.x)){const i=Math.abs(t.x-e.x),s=Math.abs(t.x1-e.x1);this.overlapX+=i<s?i:s}}};b=o([i(t.CollisionAABBResolver)],b);let A=class{constructor(){this.closestPoint=new h,this.distance=new h,this.direction=new h}resolve(t,e,i=!1){if(this.closestPoint.set(c(t.position.x,e.boundingBox.x,e.boundingBox.x1),c(t.position.y,e.boundingBox.y,e.boundingBox.y1)),h.subtract(this.distance,this.closestPoint,t.position),!(this.distance.magnitude>t.radius))return h.unit(this.direction,this.distance),{direction:i?h.scale(new h,this.direction,-1):this.direction.clone(),penetration:t.radius-this.distance.magnitude}}};A=o([i(t.CollisionCircumferenceAABBResolver)],A);let w=class{constructor(){this.distance=new h,this.direction=new h}resolve(t,e){if(h.subtract(this.distance,e.position,t.position),!(this.distance.magnitude>t.radius+e.radius))return h.unit(this.direction,this.distance),{direction:this.direction.clone(),penetration:t.radius+e.radius-this.distance.magnitude}}};w=o([i(t.CollisionCircumferenceResolver)],w);let E=class{constructor(){this.projA={min:0,max:0},this.projB={min:0,max:0},this.smallestAxis=new h,this.distance=new h(1/0,1/0),this.cache=new h}resolve(t,e){this.minOverlap=1/0,t instanceof M?this.setCircumferenceAxis(t,e):e instanceof M&&this.setCircumferenceAxis(e,t),this.axes=[...t.projectionAxes],e.projectionAxes.forEach((t=>this.axes.some((e=>e.equals(t)))?void 0:this.axes.push(t)));for(let i=0;i<this.axes.length;i++){if(t instanceof M?this.setCircumferenceVertices(t,this.axes[i]):e instanceof M&&this.setCircumferenceVertices(e,this.axes[i]),this.projectShapeOntoAxis(this.projA,t,this.axes[i]),this.projectShapeOntoAxis(this.projB,e,this.axes[i]),this.currentOverlap=Math.min(this.projA.max,this.projB.max)-Math.max(this.projA.min,this.projB.min),this.currentOverlap<0)return;if(this.invertAxis=!0,this.projA.max>this.projB.max&&this.projA.min<this.projB.min||this.projA.max<this.projB.max&&this.projA.min>this.projB.min){const t=Math.abs(this.projA.min-this.projB.min),e=Math.abs(this.projA.max-this.projB.max);t<e?this.currentOverlap+=t:(this.currentOverlap+=e,h.scale(this.axes[i],this.axes[i],-1),this.invertAxis=!1)}this.currentOverlap<this.minOverlap&&(this.minOverlap=this.currentOverlap,this.smallestAxis.copy(this.axes[i]),this.invertAxis&&this.projA.max<this.projB.max&&h.scale(this.smallestAxis,this.axes[i],-1))}return{direction:h.scale(new h,this.smallestAxis,-1),penetration:this.minOverlap}}projectShapeOntoAxis(t,e,i){return t.min=1/0,t.max=-1/0,e.vertices.forEach((e=>{t.min=Math.min(h.dot(i,e),t.min),t.max=Math.max(h.dot(i,e),t.max)})),t}setCircumferenceAxis(t,e){this.distance.set(1/0,1/0),e.vertices.forEach((e=>{h.subtract(this.cache,e,t.position),this.cache.magnitude<this.distance.magnitude&&this.distance.copy(this.cache)})),h.unit(t.projectionAxes[0],this.distance)}setCircumferenceVertices(t,e){h.add(t.vertices[0],t.position,h.scale(this.cache,h.unit(this.cache,e),-t.radius)),h.add(t.vertices[1],t.position,h.scale(this.cache,h.unit(this.cache,e),t.radius))}};E=o([i(t.CollisionSatResolver)],E),exports.CollisionRepository=class{constructor(){this.collisions=[]}findCollisionsForCollider(t){return this.collisions.filter((e=>e.localCollider===t))}findCollisionsForColliderAndLayer(t,e){return this.collisions.filter((i=>i.localCollider===t&&i.remoteCollider.layer===e))}findAll(){return this.collisions}persist(t){this.collisions.push(t)}removeAll(){this.collisions=[]}},exports.CollisionRepository=o([i(t.CollisionRepository)],exports.CollisionRepository);const R=t=>{if(null===t||"object"!=typeof t)return t;if("undefined"!=typeof Node&&t instanceof Node)return t;if("undefined"!=typeof FontFace&&t instanceof FontFace)return t;if(t instanceof Date)return new Date(t.getTime());if(t instanceof Array)return t.map((t=>R(t)));if(t instanceof Map){const e=new Map;for(const[i,s]of t)e.set(R(i),R(s));return e}if(t instanceof Set){const e=new Set;for(const i of t)e.add(R(i));return e}const e=Object.getPrototypeOf(t),i=Object.create(e);for(const e of Object.keys(t))i[e]=R(t[e]);return i};exports.EntityManager=class{constructor(){this.lastEntityId=0,this.lastComponentTypeId=0,this.entities=new Set,this.components=new Map,this.disabledEntities=new Set,this.manuallyDisabledEntities=new Set,this.disabledComponents=new Map,this.parentEntities=new Map,this.childEntities=new Map}createEntity(t,e){const i=this.lastEntityId++;return t&&(this.entities.add(i),t.forEach((t=>this.addComponent(i,t))),e&&this.setParent(i,e)),i}createEntityFromArchetype({components:t,children:e,enabled:i},s){const r=this.lastEntityId++;return this.entities.add(r),this.createComponentsFromArchetype(t,r),s&&this.setParent(r,s),e&&e.forEach((t=>this.createEntityFromArchetype(t,r))),!1===i&&this.disableEntity(r),r}createComponentsFromArchetype(t,e){t.forEach((t=>{let i,s=!0;if("object"==typeof t&&"component"in t&&"enabled"in t&&!1===t.enabled&&(s=!1,t=t.component),"object"==typeof t)i=this.addComponent(e,R(t));else{if("function"!=typeof t)throw new Error("Invalid component type");i=this.addComponent(e,t)}s||this.disableComponent(i)}))}removeEntity(t){var e;this.getChildren(t).forEach((t=>this.removeEntity(t))),this.components.forEach((e=>{e.has(t)&&e.delete(t)})),this.disabledComponents.delete(t),this.disabledEntities.delete(t),this.manuallyDisabledEntities.delete(t);const i=this.getParent(t);i&&(null===(e=this.childEntities.get(i))||void 0===e||e.delete(t)),this.parentEntities.delete(t),this.childEntities.delete(t),this.entities.delete(t)}removeAllEntities(t){const e=t?this.search(t):[];if(e.length>0){const t=new Set(e.map((({entity:t})=>t)));for(const e of this.entities)t.has(e)||this.removeEntity(e)}else this.components.clear(),this.disabledComponents.clear(),this.disabledEntities.clear(),this.manuallyDisabledEntities.clear(),this.lastEntityId=0,this.entities.clear(),this.parentEntities.clear(),this.childEntities.clear()}isEntity(t){return this.entities.has(t)}isEntityEnabled(t){return this.isEntity(t)&&!this.disabledEntities.has(t)}enableEntity(t){this.disabledEntities.has(t)&&(this.disabledEntities.delete(t),this.getChildren(t).forEach((t=>{this.manuallyDisabledEntities.has(t)||this.enableEntity(t)})))}disableEntity(t){this.disabledEntities.has(t)||(this.disabledEntities.add(t),this.getChildren(t).forEach((t=>{this.disabledEntities.has(t)?this.manuallyDisabledEntities.add(t):this.disableEntity(t)})))}disableEntitiesByComponent(t){var e,i;for(const s of null!==(i=null===(e=this.components.get(this.getComponentTypeId(t)))||void 0===e?void 0:e.keys())&&void 0!==i?i:[])this.disableEntity(s)}enableEntitiesByComponent(t){var e,i;for(const s of null!==(i=null===(e=this.components.get(this.getComponentTypeId(t)))||void 0===e?void 0:e.keys())&&void 0!==i?i:[])this.enableEntity(s)}setParent(t,e){if(!this.isEntity(t)||!this.isEntity(e))throw new Error("Both entities must exist to set a parent-child relationship.");if(this.parentEntities.has(t)){const i=this.parentEntities.get(t);if(i===e)return;this.childEntities.get(i).delete(t)}this.parentEntities.set(t,e),this.childEntities.has(e)||this.childEntities.set(e,new Set),this.childEntities.get(e).add(t)}getParent(t){return this.parentEntities.get(t)}getChildren(t){return Array.from(this.childEntities.get(t)||[])}removeParent(t){const e=this.parentEntities.get(t);e&&(this.parentEntities.delete(t),this.childEntities.get(e).delete(t))}removeChild(t,e){this.parentEntities.get(e)===t&&(this.parentEntities.delete(e),this.childEntities.get(t).delete(e))}addComponent(t,e){var i;const s=this.getComponentTypeId(e),r="object"==typeof e?e:new e;if(this.components.has(s)||this.components.set(s,new Map),this.components.get(s).has(t)){const e=null!==(i=r.constructor.componentName)&&void 0!==i?i:r.constructor.name;throw new Error(`Entity ${t} already has a component of type ${e}`)}return this.components.get(s).set(t,r),r}hasComponent(t,e){return void 0!==this.getComponent(t,e)}getComponent(t,e){var i;return null===(i=this.components.get(this.getComponentTypeId(e)))||void 0===i?void 0:i.get(t)}getComponents(t){const e=[];return this.components.forEach((i=>i.forEach(((i,s)=>{t===s&&e.push(i)})))),e}updateComponentData(t,e,i){const s=this.getComponent(t,e);s&&i(s)}getEntityForComponent(t){const e=this.getComponentTypeId(t);if(this.components.has(e))for(const[i,s]of this.components.get(e))if(s===t)return i}removeComponent(t,e){var i;const s=this.getComponentTypeId("object"==typeof t?t:e),r="number"==typeof t?t:this.getEntityForComponent(t);void 0!==r&&(null===(i=this.components.get(s))||void 0===i?void 0:i.has(r))&&this.components.get(s).delete(r)}isComponentEnabled(t,e){var i;const s=this.getComponentTypeId("object"==typeof t?t:e),r="number"==typeof t?t:this.getEntityForComponent(t);return void 0!==r&&!(null===(i=this.disabledComponents.get(r))||void 0===i?void 0:i.has(s))}disableComponent(t,e){const i="number"==typeof t?t:this.getEntityForComponent(t),s=this.getComponentTypeId("object"==typeof t?t:e);null!=i&&(this.disabledComponents.has(i)?this.disabledComponents.get(i).has(s)||this.disabledComponents.get(i).add(s):this.disabledComponents.set(i,new Set([s])))}enableComponent(t,e){var i;const s="number"==typeof t?t:this.getEntityForComponent(t),r=this.getComponentTypeId("object"==typeof t?t:e);void 0!==s&&(null===(i=this.disabledComponents.get(s))||void 0===i?void 0:i.has(r))&&this.disabledComponents.get(s).delete(r)}getComponentFromParent(t,e){let i=t;for(;i;){const t=this.getComponent(i,e);if(t)return t;i=this.getParent(i)}}search(t,e,i=!1){const s=[],r=this.getComponentTypeId(t),o="boolean"==typeof e?e:i,n="function"==typeof e?e:void 0;return this.components.has(r)&&this.components.get(r).forEach(((e,i)=>{n&&!n(e,i)||!(o||this.isEntityEnabled(i)&&this.isComponentEnabled(i,t))||s.push({entity:i,component:e})})),s}searchEntitiesByComponents(t){const e=[];let i=!0;for(const s of t){const t=this.getComponentTypeId(s);if(!t||!this.components.has(t))return[];if(i){e.push(...this.components.get(t).keys()),i=!1;continue}const r=new Set(this.components.get(t).keys());e.forEach(((t,i)=>{r.has(t)||e.splice(i,1)}))}return e}searchInChildren(t,e,i=!1){const s=this.getChildren(t);return this.search(e,i).filter((({entity:t})=>s.includes(t)))}getComponentTypeId(t){const e="object"==typeof t?t.constructor.prototype:t.prototype;return void 0===e.__ecs_type_id&&(e.__ecs_type_id=++this.lastComponentTypeId),e.__ecs_type_id}},exports.EntityManager=o([i(t.EntityManager)],exports.EntityManager),exports.SystemManager=class{constructor(){this.systems=[]}findSystemIndex(t){return this.systems.findIndex((e=>e[0]instanceof t))}addSystem(t,e){if(this.systems.some((t=>t[0]instanceof t.constructor)))throw new Error(`SystemManager already has an instance of ${t.constructor.name}.`);this.systems.push([t,e,!1,!1])}hasSystem(t){return this.systems.some((e=>e[0]instanceof t))}getSystem(t){const e=this.findSystemIndex(t);return-1!==e?this.systems[e][0]:void 0}groupHasSystems(t){return this.systems.filter((e=>e[1]===t)).length>0}enableSystem(t){const e=this.findSystemIndex(t);if(-1===e||!0===this.systems[e][2])return;const i=this.systems[e];!1===i[3]&&(i[3]=!0,i[0].onCreate&&i[0].onCreate()),i[2]=!0,i[0].onEnabled&&i[0].onEnabled()}disableSystem(t){const e=this.findSystemIndex(t);if(-1===e||!1===this.systems[e][2])return;const i=this.systems[e];i[2]=!1,i[0].onDisabled&&i[0].onDisabled()}setExecutionOrder(t,e){const i=this.findSystemIndex(t);if(-1===i)throw new Error(`Cannot set execution order because ${t.name} is not a system.`);this.systems.splice(e,0,this.systems.splice(i,1)[0])}removeSystem(t){const e=this.findSystemIndex(t);if(-1===e)return;const i=this.systems.splice(e,1)[0][0];i.onDestroy&&i.onDestroy()}disableAllSystems(){this.systems.forEach((t=>{t[2]&&this.disableSystem(t[0].constructor)}))}update(t){this.systems.filter((e=>e[1]===t&&!0===e[2])).forEach((t=>t[0].onUpdate()))}},exports.SystemManager=o([i(t.SystemManager)],exports.SystemManager);class _{constructor(){this.buttons=new Map,this.axes=new Map,this._dpadAxes=new h,this._leftStickAxes=new h,this._rightStickAxes=new h}get dpadAxes(){return this._dpadAxes.set(this.dpadRight?1:this.dpadLeft?-1:0,this.dpadUp?1:this.dpadDown?-1:0),this._dpadAxes}get leftStickAxes(){return this._leftStickAxes.set(this.leftStickHorizontal,this.leftStickVertical),this._leftStickAxes}get rightStickAxes(){return this._rightStickAxes.set(this.rightStickHorizontal,this.rightStickVertical),this._rightStickAxes}get dpadUp(){var t;return null!==(t=this.buttons.get(12))&&void 0!==t&&t}get dpadDown(){var t;return null!==(t=this.buttons.get(13))&&void 0!==t&&t}get dpadLeft(){var t;return null!==(t=this.buttons.get(14))&&void 0!==t&&t}get dpadRight(){var t;return null!==(t=this.buttons.get(15))&&void 0!==t&&t}get bottomFace(){var t;return null!==(t=this.buttons.get(0))&&void 0!==t&&t}get rightFace(){var t;return null!==(t=this.buttons.get(1))&&void 0!==t&&t}get leftFace(){var t;return null!==(t=this.buttons.get(2))&&void 0!==t&&t}get topFace(){var t;return null!==(t=this.buttons.get(3))&&void 0!==t&&t}get leftShoulder(){var t;return null!==(t=this.buttons.get(4))&&void 0!==t&&t}get rightShoulder(){var t;return null!==(t=this.buttons.get(5))&&void 0!==t&&t}get leftTrigger(){var t;return null!==(t=this.buttons.get(6))&&void 0!==t&&t}get rightTrigger(){var t;return null!==(t=this.buttons.get(7))&&void 0!==t&&t}get back(){var t;return null!==(t=this.buttons.get(8))&&void 0!==t&&t}get start(){var t;return null!==(t=this.buttons.get(9))&&void 0!==t&&t}get leftStickButton(){var t;return null!==(t=this.buttons.get(10))&&void 0!==t&&t}get rightStickButton(){var t;return null!==(t=this.buttons.get(11))&&void 0!==t&&t}get leftStickHorizontal(){var t;return null!==(t=this.axes.get(0))&&void 0!==t?t:0}get leftStickVertical(){var t;return-(null!==(t=this.axes.get(1))&&void 0!==t?t:0)}get rightStickHorizontal(){var t;return null!==(t=this.axes.get(2))&&void 0!==t?t:0}get rightStickVertical(){var t;return-(null!==(t=this.axes.get(3))&&void 0!==t?t:0)}get anyButtonPressed(){var t;return null!==(t=Array.from(this.buttons.values()).find((t=>t)))&&void 0!==t&&t}vibrate(t=200,e=.2,i=.2,s=0){this.vibrationInput={duration:t,weakMagnitude:e,startDelay:s,strongMagnitude:i}}}class T{constructor(){this.pressedKeys=[]}isPressed(t){return this.pressedKeys.includes(t)}orPressed(t){return t.reduce(((t,e)=>t||this.pressedKeys.includes(e)),!1)}andPressed(t){return t.reduce(((t,e)=>t&&this.pressedKeys.includes(e)),!0)}isPressedReturn(t,e,i){return this.pressedKeys.includes(t)?e:i}orPressedReturn(t,e,i){return t.reduce(((t,e)=>t||this.pressedKeys.includes(e)),!1)?e:i}andPressedReturn(t,e,i){return t.reduce(((t,e)=>t&&this.pressedKeys.includes(e)),!0)?e:i}}class B{constructor(){this.leftButtonPressed=!1,this.scrollButtonPressed=!1,this.rightButtonPressed=!1,this.positionInViewport=new h,this.hasMoved=!1,this.wheelScroll=new h}}class P{constructor(){this.touching=!1,this.interactions=[]}}exports.InputManager=class{constructor(){this.keyboard=new T,this.mouse=new B,this.touchScreen=new P,this.gamepads=[]}},exports.InputManager=o([i(t.InputManager)],exports.InputManager);const D=[60,120,180,240];var F;exports.TimeManager=class{get deltaTime(){return this.unscaledDeltaTime*this.timeScale}get physicsDeltaTime(){return this.unscaledPhysicsDeltaTime*this.timeScale}get renderDeltaTime(){return this.browserDeltaTime*this.timeScale}constructor({physicsFramerate:t},e){if(this.entityManager=e,this.timeScale=1,this.browserDeltaTime=0,this.unscaledDeltaTime=0,this.unscaledPhysicsDeltaTime=0,this.maxDeltaTime=1/30,this.thenForGame=0,this.thenForPhysics=0,this.thenForRender=0,this.lastIntervalId=0,this.intervals=new Map,t&&!D.includes(t))throw new Error(`Invalid Physics frame rate. Allowed: [${D.join(", ")}]`);this.fixedGameFramerate=60,this.fixedGameDeltaTime=parseFloat((1/this.fixedGameFramerate).toFixed(6)),this.fixedPhysicsFramerate=null!=t?t:180,this.fixedPhysicsDeltaTime=parseFloat((1/this.fixedPhysicsFramerate).toFixed(6))}updateForRender(t){this.browserDeltaTime=Math.min(Math.max(0,t-this.thenForRender),this.maxDeltaTime),this.thenForRender=t}updateForGame(t){this.unscaledDeltaTime=Math.min(Math.max(this.fixedGameDeltaTime,t-this.thenForGame),this.maxDeltaTime),this.thenForGame=t}updateForPhysics(t){this.unscaledPhysicsDeltaTime=Math.min(Math.max(0,t-this.thenForPhysics),this.maxDeltaTime),this.thenForPhysics=t}updateIntervals(){if(0!==this.intervals.size)for(const[t,e]of this.intervals)this.intervalHealthCheck(e)?(e.executeImmediately?(e.timer=e.delay,e.executeImmediately=!1):e.timer+=1e3*(e.useTimeScale?this.deltaTime:this.unscaledDeltaTime),e.timer>=e.delay&&(e.callback(),e.times&&--e.times<=0?this.clearInterval(t):e.timer-=e.delay)):this.clearInterval(t)}intervalHealthCheck(t){return!(t.entityRef&&!this.entityManager.isEntityEnabled(t.entityRef))&&!(t.componentRef&&!this.entityManager.isComponentEnabled(t.componentRef))}setInterval({callback:t,delay:e,times:i,executeImmediately:s,entityRef:r,componentRef:o,useTimeScale:n=!0}){const a=++this.lastIntervalId;return this.intervals.set(a,{callback:t,delay:e,times:i,executeImmediately:s,entityRef:r,componentRef:o,timer:0,useTimeScale:n}),a}clearInterval(t){this.intervals.delete(t)}clearAllIntervals(){this.intervals.clear()}},exports.TimeManager=o([i(t.TimeManager),n(0,s(t.GameConfig)),n(1,s(t.EntityManager))],exports.TimeManager),function(t){t[t.Image=0]="Image",t[t.Audio=1]="Audio",t[t.Font=2]="Font",t[t.Video=3]="Video",t[t.Json=4]="Json"}(F||(F={})),exports.AssetManager=class{constructor(){this.assets=[]}getAssetsLoaded(){return this.assets.reduce(((t,e)=>t&&e.loaded),!0)}loadImage(t,e){if(this.getImage(t))return this.getImage(t);const i=new Image;i.crossOrigin="",i.src=t;const s=this.createAsset(t,F.Image,i,e),r=()=>s.loaded=!0;return i.complete?r():i.addEventListener("load",r),i}loadAudio(t,e){if(this.getAudio(t))return this.getAudio(t);const i=new Audio;i.src=t;const s=this.createAsset(t,F.Audio,i,e);return i.duration?s.loaded=!0:i.addEventListener("canplaythrough",(()=>s.loaded=!0)),i}loadFont(t,e){if(this.getFont(t))return this.getFont(t);const i=new FontFace(t,`url(${e})`),s=this.createAsset(e,F.Font,i);return s.family=t,document.fonts.add(i),i.load().then((()=>s.loaded=!0)),i}loadVideo(t,e){if(this.getVideo(t))return this.getVideo(t);const i=document.createElement("video");i.playsInline=!0,i.src=t;const s=this.createAsset(t,F.Video,i,e);return i.duration?s.loaded=!0:i.addEventListener("canplaythrough",(()=>s.loaded=!0)),i}loadJson(t,e){return a(this,void 0,void 0,(function*(){if(this.getJson(t))return this.getJson(t);const i=this.createAsset(t,F.Json,null,e),s=yield fetch(t),r=yield s.json();return i.loaded=!0,i.element=r,r}))}getImage(t){var e;return null===(e=this.assets.find((e=>e.type===F.Image&&(e.url===t||e.name===t))))||void 0===e?void 0:e.element}getAudio(t){var e;return null===(e=this.assets.find((e=>e.type===F.Audio&&(e.url===t||e.name===t))))||void 0===e?void 0:e.element}getFont(t){var e;return null===(e=this.assets.find((e=>e.type===F.Font&&e.family===t)))||void 0===e?void 0:e.element}getVideo(t){var e;return null===(e=this.assets.find((e=>e.type===F.Video&&(e.url===t||e.name===t))))||void 0===e?void 0:e.element}getJson(t){var e;return null===(e=this.assets.find((e=>e.type===F.Json&&(e.url===t||e.name===t))))||void 0===e?void 0:e.element}createAsset(t,e,i,s){this.deleteAssetIfExists({url:t,name:s});const r={type:e,url:t,element:i,loaded:!1,name:s};return this.assets.push(r),r}deleteAssetIfExists({url:t,name:e}){const i=this.assets.findIndex((i=>i.url===t||void 0!==i.name&&i.name===e));-1!==i&&this.assets.splice(i,1)}},exports.AssetManager=o([i(t.AssetManager)],exports.AssetManager);class U{get playing(){return"playing"===this.state}get paused(){return"paused"===this.state}get stopped(){return"stopped"===this.state}constructor(t){this.action=void 0,this.stopOnSceneTransition=!0,this.fixedToTimeScale=!1,this.loop=!1,this.state="stopped",this.volume=1,this._currentAudioSource=void 0,this._playPromisePendind=!1,this._playAfterUserInput=!1,Object.assign(this,t)}play(t){t&&(this.audioSource=t),this.action="play"}pause(){this.action="pause"}stop(){this.action="stop"}}U.componentName="AudioPlayer";const I={AudioPlayerSystem:Symbol.for("AudioPlayerSystem"),ButtonSystem:Symbol.for("ButtonSystem"),TiledWrapperSystem:Symbol.for("TiledWrapperSystem"),TilemapPreProcessingSystem:Symbol.for("TilemapPreProcessingSystem"),TransformSystem:Symbol.for("TransformSystem"),GamepadSystem:Symbol.for("GamepadSystem"),KeyboardSystem:Symbol.for("KeyboardSystem"),MouseSystem:Symbol.for("MouseSystem"),TouchScreenSystem:Symbol.for("TouchScreenSystem"),UpdateBallColliderShapeSystem:Symbol.for("UpdateBallColliderShapeSystem"),UpdateBoxColliderShapeSystem:Symbol.for("UpdateBoxColliderShapeSystem"),UpdateEdgeColliderShapeSystem:Symbol.for("UpdateEdgeColliderShapeSystem"),UpdatePolygonColliderShapeSystem:Symbol.for("UpdatePolygonColliderShapeSystem"),UpdateTilemapColliderShapeSystem:Symbol.for("UpdateTilemapColliderShapeSystem"),UpdateCollidersAfterRepositionSystem:Symbol.for("UpdateCollidersAfterRepositionSystem"),ApplyRepositionSystem:Symbol.for("ApplyRepositionSystem"),ApplyVelocitySystem:Symbol.for("ApplyVelocitySystem"),ResolveCollisionSystem:Symbol.for("ResolveCollisionSystem"),AnimatorSystem:Symbol.for("AnimatorSystem"),CameraSystem:Symbol.for("CameraSystem"),ClearScreenSystem:Symbol.for("ClearScreenSystem"),CullingSystem:Symbol.for("CullingSystem"),MaskRendererSystem:Symbol.for("MaskRendererSystem"),RenderSystem:Symbol.for("RenderSystem"),DarknessLightRendererSystem:Symbol.for("DarknessLightRendererSystem"),SpriteRendererSystem:Symbol.for("SpriteRendererSystem"),TextRendererSystem:Symbol.for("TextRendererSystem"),TilemapRendererSystem:Symbol.for("TilemapRendererSystem"),VideoRendererSystem:Symbol.for("VideoRendererSystem"),DebugColliderRenderSystem:Symbol.for("DebugColliderRenderSystem"),DebugMousePositionSystem:Symbol.for("DebugMousePositionSystem")},L=["click","contextmenu","auxclick","dblclick","mousedown","mouseup","pointerup","touchend","keydown","keyup"];let j=class{constructor(t,e,i){this.entityManager=t,this.inputManager=e,this.timeManager=i,this.canPlay=!0,this.userInputErrorCatched=!1,this.userInputEventHandler=()=>{L.forEach((t=>{window.removeEventListener(t,this.userInputEventHandler)})),this.canPlay=!0}}onCreate(){document.addEventListener("visibilitychange",(()=>{this.entityManager.search(U).forEach((({component:{audioSource:t,playing:e}})=>{t&&"string"!=typeof t&&(document.hidden?t.pause():!document.hidden&&e&&t.play(),this.canPlay=!document.hidden)}))}))}catchUserInput(){this.canPlay=!1,this.userInputErrorCatched=!0,L.forEach((t=>window.addEventListener(t,this.userInputEventHandler)))}checkGamepad(){return this.canPlay=this.inputManager.gamepads.some((t=>t.anyButtonPressed)),this.canPlay}onUpdate(){(this.canPlay||this.checkGamepad())&&this.entityManager.search(U).forEach((({component:t})=>{t.audioSource&&"string"!=typeof t.audioSource&&t.audioSource.duration&&(t._playAfterUserInput&&(t._playAfterUserInput=!1,t.action="play"),t.audioSource!==t._currentAudioSource&&(t._currentAudioSource&&(t._currentAudioSource.pause(),t._currentAudioSource.currentTime=0),t._currentAudioSource=t.audioSource,t.audioSource.currentTime=0,t.state="stopped"),t.audioSource.loop=t.loop,t.audioSource.volume=t.volume,"play"!==t.action||"playing"===t.state||t._playPromisePendind?"pause"===t.action&&"playing"===t.state?(t.audioSource.pause(),t.state="paused"):"stop"!==t.action||t.audioSource.paused&&0===t.audioSource.currentTime?"playing"===t.state&&t.audioSource.paused&&(t.state="stopped"):(t.audioSource.pause(),t.audioSource.currentTime=0,t.state="stopped"):(t._playPromisePendind=!0,t.audioSource.playbackRate=t.fixedToTimeScale?this.timeManager.timeScale<.0625?0:Math.min(this.timeManager.timeScale,16):1,t.audioSource.play().then((()=>{t._playPromisePendind=!1,t.state="playing"})).catch((()=>{t._playAfterUserInput=!0,t._playPromisePendind=!1,this.userInputErrorCatched||this.catchUserInput()}))),t.action=void 0)}))}onDisabled(){this.entityManager.search(U).forEach((({component:{audioSource:t,stopOnSceneTransition:e}})=>{t&&"string"!=typeof t&&e&&(t.pause(),t.currentTime=0)}))}onDestroy(){this.onDisabled()}};var k;j=o([i(I.AudioPlayerSystem),n(0,s(t.EntityManager)),n(1,s(t.InputManager)),n(2,s(t.TimeManager))],j),function(t){t[t.GameLogic=0]="GameLogic",t[t.GamePhysics=1]="GamePhysics",t[t.GamePreRender=2]="GamePreRender",t[t.Physics=3]="Physics",t[t.PreGameLogic=4]="PreGameLogic",t[t.Render=5]="Render",t[t.Transform=6]="Transform"}(k||(k={}));const O=(t,e)=>{t.prototype.__system_group||(t.prototype.__system_group=e)};class V{constructor(t){this.position=new h,this.scale=new h(1,1),this.rotation=0,this.ignoreParentPosition=!1,this.ignoreParentScale=!1,this.ignoreParentRotation=!1,this.localPosition=new h,this.localScale=new h(1,1),this.localRotation=0,this._awake=!1,this._parent=void 0,Object.assign(this,t)}}V.componentName="Transform";const G="Default",N="Debug";class W{constructor(t){this.layers=[G],this.zoom=1,this.depth=0,this.debug=!1,this._renderData={position:new h,depth:0,zoom:1,layers:[]},Object.assign(this,t)}}var z;W.componentName="Camera",function(t){t.LegacyWebGL="webgl",t.WebGL2="webgl2"}(z||(z={}));class H{constructor(t){if(this.canvas=t,this.contextVersion=this.getContextVersion(),!this.contextVersion)throw new Error("Your browser does not support WebGL.");this.gl=this.canvas.getContext(this.contextVersion)}getContextVersion(){return null!==this.canvas.getContext(z.WebGL2)?z.WebGL2:null!==this.canvas.getContext(z.LegacyWebGL)?z.LegacyWebGL:void 0}}class Y{constructor(){this.fontAtlas=new Map}hasFontAtlas(t){return this.fontAtlas.has(this.getId(t))}getFontAtlas(t){return this.fontAtlas.get(this.getId(t))}getOrCreate(t){var e;return null!==(e=this.getFontAtlas(t))&&void 0!==e?e:this.create(t)}create(t){const{font:e,charRanges:i,fontSize:s,spacing:r}=t;this.chars=[];for(let t=0;t<i.length;t+=2)for(let e=i[t];e<=i[t+1];e++)this.chars.push(String.fromCharCode(e));this.font=e instanceof FontFace?e.family:e,this.fontSize=s,this.spacing=r,this.id=this.getId(t);const o=this.renderAtlas();return this.fontAtlas.set(this.id,o),o}getId({font:t,charRanges:e,fontSize:i,spacing:s}){return JSON.stringify({font:t instanceof FontFace?t.family:t,charRanges:e,fontSize:i,spacing:s})}renderAtlas(){const t=new X(this.id,this.fontSize,Math.ceil(Math.sqrt(this.chars.length)),this.spacing),e=t.canvas.getContext("2d");e.clearRect(0,0,t.canvas.width,t.canvas.height),e.textBaseline="top",e.fillStyle="#FFFFFF",e.font=`${this.fontSize}px ${this.font}`;let i=0,s=0;for(let r=0;r<this.chars.length;r++)e.fillText(this.chars[r],i,s),t.glyphs.set(this.chars[r],{id:r,width:e.measureText(this.chars[r]).width}),(i+=this.fontSize+this.spacing)>t.canvas.width-this.fontSize&&(i=0,s+=this.fontSize+this.spacing);return t}}class X{constructor(t,e,i,s){this.id=t,this.fontSize=e,this.gridSize=i,this.spacing=s,this.canvas=document.createElement("canvas"),this.glyphs=new Map,this.canvas.width=this.gridSize*(this.fontSize+this.spacing),this.canvas.height=this.canvas.width}}class ${constructor(t,e){this.gl=t,this.shaderLoader=e}create(t,e){const i=this.gl.createProgram(),s=this.shaderLoader.load(this.gl.VERTEX_SHADER,t),r=this.shaderLoader.load(this.gl.FRAGMENT_SHADER,e);this.gl.attachShader(i,s),this.gl.attachShader(i,r),this.gl.linkProgram(i);const o=this.gl.LINK_STATUS;if(!this.gl.getProgramParameter(i,o)){const t=this.gl.getProgramInfoLog(i);throw this.gl.deleteProgram(i),new Error(`Unable to initialize the Program: ${t}`)}return i}}class K{constructor(t,e,i){this.gl=t,this.contextVersion=e,this.programFactory=i}loadProgram(){this.program=this.contextVersion===z.WebGL2?this.programFactory.create("#version 300 es\n\nin vec4 positionCoords;\nin vec2 textureCoords;\n\nuniform mat4 projectionMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 textureMatrix;\n\nout vec2 texCoords;\n\nvoid main()\n{\n gl_Position = projectionMatrix * modelMatrix * positionCoords;\n texCoords = (textureMatrix * vec4(textureCoords, 0, 1)).xy;\n}","#version 300 es\nprecision highp float;\n\nin vec2 texCoords;\n\n// texture, mask and darkness\nuniform int u_renderTexture;\nuniform sampler2D u_texImage;\nuniform vec4 u_solidColor;\nuniform int u_useTintColor;\nuniform vec4 u_tintColor;\nuniform int u_useMaskColor;\nuniform vec4 u_maskColor;\nuniform float u_maskColorMix;\nuniform float u_alpha;\n\n// light\nstruct Light {\n vec2 position;\n float radius;\n float smoothMode;\n float intensity;\n};\n\nuniform int u_renderLight;\nuniform Light u_lights[64];\nuniform int u_numLights;\n\nout vec4 fragColor;\n\nvoid main()\n{\n if (u_renderTexture == 1) {\n vec4 texColor = texture(u_texImage, texCoords);\n\n if (texColor.a < 0.0001) {\n discard;\n }\n\n if (u_useTintColor == 1) {\n texColor = u_tintColor * texColor;\n }\n\n if (u_useMaskColor == 1) {\n texColor = mix(texColor, u_maskColor, clamp(u_maskColorMix, 0.0, 1.0));\n }\n\n fragColor = vec4(texColor.rgb, u_alpha * texColor.a); \n } else if (u_renderLight == 1) {\n vec2 fragCoord = gl_FragCoord.xy;\n float alpha = u_alpha;\n\n for (int i = 0; i < u_numLights; i++) {\n Light light = u_lights[i];\n float dist = distance(fragCoord, light.position);\n \n if (dist < light.radius) {\n alpha -= (light.smoothMode > 0.0 ? smoothstep(light.radius, 0.0, dist) : 1.0) * light.intensity;\n }\n }\n\n alpha = clamp(alpha, 0.0, u_alpha);\n\n fragColor = vec4(u_solidColor.rgb, alpha);\n } else {\n fragColor = vec4(u_solidColor.rgb, u_alpha);\n }\n}"):this.programFactory.create("precision mediump float;\n\nattribute vec2 positionCoords;\nattribute vec2 textureCoords;\n\nvarying vec2 texCoords;\n\nuniform mat4 projectionMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 textureMatrix;\n\nvoid main()\n{\n gl_Position = projectionMatrix * modelMatrix * vec4(positionCoords, 0, 1);\n texCoords = (textureMatrix * vec4(textureCoords, 0, 1)).xy;\n}","precision mediump float;\n\nvarying vec2 texCoords;\n\n// texture, mask and darkness\nuniform int u_renderTexture;\nuniform sampler2D u_texImage;\nuniform vec4 u_solidColor;\nuniform int u_useTintColor;\nuniform vec4 u_tintColor;\nuniform int u_useMaskColor;\nuniform vec4 u_maskColor;\nuniform float u_maskColorMix;\nuniform float u_alpha;\n\n// light\nstruct Light {\n vec2 position;\n float radius;\n float smoothMode;\n float intensity;\n};\n\nuniform int u_renderLight;\nuniform Light u_lights[64];\nuniform int u_numLights;\n\nvoid main()\n{\n if (u_renderTexture == 1) {\n vec4 texColor = texture2D(u_texImage, texCoords);\n\n if (texColor.a < 0.0001) {\n discard;\n }\n\n if (u_useTintColor == 1) {\n texColor = u_tintColor * texColor;\n }\n\n if (u_useMaskColor == 1) {\n texColor = mix(texColor, u_maskColor, clamp(u_maskColorMix, 0.0, 1.0));\n }\n\n gl_FragColor = vec4(texColor.rgb, u_alpha * texColor.a);\n } else if (u_renderLight == 1) {\n vec2 fragCoord = gl_FragCoord.xy;\n float alpha = u_alpha;\n\n for (int i = 0; i < 64; i++) {\n if (u_lights[i].intensity == 0.0) continue; \n \n Light light = u_lights[i];\n float dist = distance(fragCoord, light.position);\n \n if (dist < light.radius) {\n alpha -= (light.smoothMode > 0.0 ? smoothstep(light.radius, 0.0, dist) : 1.0) * light.intensity;\n }\n }\n\n alpha = clamp(alpha, 0.0, u_alpha);\n\n gl_FragColor = vec4(u_solidColor.rgb, alpha);\n } else {\n gl_FragColor = vec4(u_solidColor.rgb, u_alpha);\n }\n}"),this.positionCoordsAttr=this.gl.getAttribLocation(this.program,"positionCoords"),this.texCoordsAttr=this.gl.getAttribLocation(this.program,"textureCoords"),this.modelMatrixUniform=this.gl.getUniformLocation(this.program,"modelMatrix"),this.projectionMatrixUniform=this.gl.getUniformLocation(this.program,"projectionMatrix"),this.textureMatrixUniform=this.gl.getUniformLocation(this.program,"textureMatrix"),this.renderTextureUniform=this.gl.getUniformLocation(this.program,"u_renderTexture"),this.textureUniform=this.gl.getUniformLocation(this.program,"u_texImage"),this.solidColorUniform=this.gl.getUniformLocation(this.program,"u_solidColor"),this.useTintColorUniform=this.gl.getUniformLocation(this.program,"u_useTintColor"),this.tintColorUniform=this.gl.getUniformLocation(this.program,"u_tintColor"),this.useMaskColorUniform=this.gl.getUniformLocation(this.program,"u_useMaskColor"),this.maskColorUniform=this.gl.getUniformLocation(this.program,"u_maskColor"),this.maskColorMixUniform=this.gl.getUniformLocation(this.program,"u_maskColorMix"),this.alphaUniform=this.gl.getUniformLocation(this.program,"u_alpha"),this.renderLightUniform=this.gl.getUniformLocation(this.program,"u_renderLight"),this.numLightsUniform=this.gl.getUniformLocation(this.program,"u_numLights"),this.gl.useProgram(this.program),this.gl.blendFunc(this.gl.SRC_ALPHA,this.gl.ONE_MINUS_SRC_ALPHA)}}class q{constructor(t){this.gl=t}load(t,e){const i=this.gl.createShader(t);this.gl.shaderSource(i,e),this.gl.compileShader(i);const s=this.gl.COMPILE_STATUS;if(!this.gl.getShaderParameter(i,s)){const t=this.gl.getShaderInfoLog(i);throw this.gl.deleteShader(i),new Error(`Unable to initialize the shader program: ${t}`)}return i}}var J="undefined"!=typeof Float32Array?Float32Array:Array;function Q(){var t=new J(16);return J!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t}function Z(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function tt(t,e,i){var s,r,o,n,a,h,l,c,d,g,p,m,u=i[0],y=i[1],f=i[2];return e===t?(t[12]=e[0]*u+e[4]*y+e[8]*f+e[12],t[13]=e[1]*u+e[5]*y+e[9]*f+e[13],t[14]=e[2]*u+e[6]*y+e[10]*f+e[14],t[15]=e[3]*u+e[7]*y+e[11]*f+e[15]):(s=e[0],r=e[1],o=e[2],n=e[3],a=e[4],h=e[5],l=e[6],c=e[7],d=e[8],g=e[9],p=e[10],m=e[11],t[0]=s,t[1]=r,t[2]=o,t[3]=n,t[4]=a,t[5]=h,t[6]=l,t[7]=c,t[8]=d,t[9]=g,t[10]=p,t[11]=m,t[12]=s*u+a*y+d*f+e[12],t[13]=r*u+h*y+g*f+e[13],t[14]=o*u+l*y+p*f+e[14],t[15]=n*u+c*y+m*f+e[15]),t}function et(t,e,i){var s=i[0],r=i[1],o=i[2];return t[0]=e[0]*s,t[1]=e[1]*s,t[2]=e[2]*s,t[3]=e[3]*s,t[4]=e[4]*r,t[5]=e[5]*r,t[6]=e[6]*r,t[7]=e[7]*r,t[8]=e[8]*o,t[9]=e[9]*o,t[10]=e[10]*o,t[11]=e[11]*o,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}function it(t,e,i){var s=Math.sin(i),r=Math.cos(i),o=e[0],n=e[1],a=e[2],h=e[3],l=e[4],c=e[5],d=e[6],g=e[7];return e!==t&&(t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=o*r+l*s,t[1]=n*r+c*s,t[2]=a*r+d*s,t[3]=h*r+g*s,t[4]=l*r-o*s,t[5]=c*r-n*s,t[6]=d*r-a*s,t[7]=g*r-h*s,t}Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)});var st=function(t,e,i,s,r,o,n){var a=1/(e-i),h=1/(s-r),l=1/(o-n);return t[0]=-2*a,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*h,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*l,t[11]=0,t[12]=(e+i)*a,t[13]=(r+s)*h,t[14]=(n+o)*l,t[15]=1,t};const rt=(t,e,i,s)=>{t=Z(t),st(t,-e.canvas.width/2,e.canvas.width/2,-e.canvas.height/2,e.canvas.height/2,-1,1),et(t,t,[null!=i?i:1,null!=i?i:1,1]),tt(t,t,[-s.x,-s.y,0])},ot=t=>{const e=/^#?([a-f\d]{2})?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return e?{r:parseInt(e[2],16)/256,g:parseInt(e[3],16)/256,b:parseInt(e[4],16)/256,a:void 0!==e[1]?parseInt(e[1],16)/256:1}:null};class nt{constructor(t){this.gl=t}render(t){const e=ot(t);this.gl.clearColor(e.r,e.g,e.b,e.a),this.gl.clear(this.gl.COLOR_BUFFER_BIT)}}var at;!function(t){t[t.Sprite=0]="Sprite",t[t.Text=1]="Text",t[t.Tilemap=2]="Tilemap",t[t.Mask=3]="Mask",t[t.Geometric=4]="Geometric",t[t.Video=5]="Video",t[t.Darkness=6]="Darkness"}(at||(at={}));var ht,lt;!function(t){t[t.Polygon=0]="Polygon",t[t.Circumference=1]="Circumference",t[t.Line=2]="Line"}(ht||(ht={}));class ct{constructor(t,e){this.gl=t,this.programManager=e,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.circumferencePositionBuffer=this.gl.createBuffer(),this.linesPositionBuffer=this.gl.createBuffer();const i=2*Math.PI/60,s=new Float32Array(g(1,60,1).reduce(((t,e)=>[...t,Math.cos(e*i),Math.sin(e*i)]),[]));this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.circumferencePositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,s,this.gl.STATIC_DRAW)}render(t,e,i){switch(this.gl.disableVertexAttribArray(this.programManager.texCoordsAttr),t.shape){case ht.Polygon:this.renderLines(t,e,this.gl.LINE_LOOP);break;case ht.Line:this.renderLines(t,e,this.gl.LINES);break;case ht.Circumference:this.renderCircumference(t,e,i);break;default:return!1}return!0}renderLines(t,e,i){var s;this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.linesPositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(t.vertexModel.reduce(((t,e)=>[...t,e.x,e.y]),[])),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.uniform1i(this.programManager.renderTextureUniform,0);const{r:r,g:o,b:n,a:a}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,r,o,n,a),this.gl.uniform1f(this.programManager.alphaUniform,1),this.gl.drawArrays(i,0,t.vertexModel.length),this.lastShape="polygon"}renderCircumference(t,e,i){i===at.Geometric&&"circumference"===this.lastShape||(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.circumferencePositionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),et(this.modelMatrix,this.modelMatrix,[t.radius,t.radius,1]),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.uniform1i(this.programManager.renderTextureUniform,0);const{r:s,g:r,b:o,a:n}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,s,r,o,n),this.gl.uniform1f(this.programManager.alphaUniform,1),this.gl.drawArrays(this.gl.LINE_LOOP,0,60),this.lastShape="circumference"}}exports.MaskShape=void 0,(lt=exports.MaskShape||(exports.MaskShape={}))[lt.Rectangle=0]="Rectangle",lt[lt.Circumference=1]="Circumference",lt[lt.Polygon=2]="Polygon";let dt=class{constructor(t,e){this.gl=t,this.programManager=e,this.type=at.Mask,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.circumferencePositionBuffer=this.gl.createBuffer(),this.rectanglePositionBuffer=this.gl.createBuffer(),this.polygonPositionBuffer=this.gl.createBuffer();const i=2*Math.PI/60,s=[0,0];for(let t=0;t<=60;t++)s.push(Math.cos(t*i),Math.sin(t*i));this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.circumferencePositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(s),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.rectanglePositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([-.5,-.5,-.5,.5,.5,-.5,.5,-.5,-.5,.5,.5,.5]),this.gl.STATIC_DRAW)}render(t,e,i){return this.gl.disableVertexAttribArray(this.programManager.texCoordsAttr),t.shape===exports.MaskShape.Rectangle?this.renderRectangle(t,e,i):t.shape===exports.MaskShape.Circumference?this.renderCircumference(t,e,i):t.shape===exports.MaskShape.Polygon&&this.renderPolygon(t,e,i),this.lastShape=t.shape,!0}renderRectangle(t,e,i){var s,r;i===at.Mask&&this.lastShape===exports.MaskShape.Rectangle||(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.rectanglePositionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.width,t.height,1]),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),t.opacity>=0&&t.opacity<1?this.gl.enable(this.gl.BLEND):this.gl.disable(this.gl.BLEND),this.gl.uniform1i(this.programManager.renderTextureUniform,0);const{r:o,g:n,b:a,a:h}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,o,n,a,h),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.drawArrays(this.gl.TRIANGLES,0,6)}renderCircumference(t,e,i){var s,r;i===at.Mask&&this.lastShape===exports.MaskShape.Circumference||(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.circumferencePositionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.radius,t.radius,1]),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),t.opacity>=0&&t.opacity<1?this.gl.enable(this.gl.BLEND):this.gl.disable(this.gl.BLEND),this.gl.uniform1i(this.programManager.renderTextureUniform,0);const{r:o,g:n,b:a,a:h}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,o,n,a,h),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.drawArrays(this.gl.TRIANGLE_FAN,0,62)}renderPolygon(t,e,i){var s,r;i===at.Mask&&this.lastShape===exports.MaskShape.Polygon||(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.polygonPositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(t.vertices.reduce(((t,e)=>[...t,e.x,e.y]),[0,0])),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),t.opacity>=0&&t.opacity<1?this.gl.enable(this.gl.BLEND):this.gl.disable(this.gl.BLEND),this.gl.uniform1i(this.programManager.renderTextureUniform,0);const{r:o,g:n,b:a,a:h}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,o,n,a,h),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.drawArrays(this.gl.TRIANGLE_FAN,0,t.vertices.length+1)}},gt=class{constructor(t,e){this.gl=t,this.programManager=e,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.positionBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([-.5,-.5,-.5,.5,.5,-.5,.5,-.5,-.5,.5,.5,.5]),this.gl.STATIC_DRAW)}render(t,e,i){var s,r;i!==at.Darkness&&(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.disableVertexAttribArray(this.programManager.texCoordsAttr)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.width,t.height,1]),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.enable(this.gl.BLEND),this.gl.uniform1i(this.programManager.renderTextureUniform,0),this.gl.uniform1i(this.programManager.renderLightUniform,1);const{r:o,g:n,b:a,a:h}=ot(t.color);this.gl.uniform4f(this.programManager.solidColorUniform,o,n,a,h),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.uniform1i(this.programManager.numLightsUniform,t.lights.length);for(const[i,s]of t.lights.entries()){if(i>=64)break;this.gl.uniform2f(this.gl.getUniformLocation(this.programManager.program,`u_lights[${i}].position`),this.gl.canvas.width/2+(s.position.x-e.position.x)*e.zoom,this.gl.canvas.height/2+(s.position.y-e.position.y)*e.zoom),this.gl.uniform1f(this.gl.getUniformLocation(this.programManager.program,`u_lights[${i}].radius`),s.radius*e.zoom),this.gl.uniform1f(this.gl.getUniformLocation(this.programManager.program,`u_lights[${i}].smoothMode`),s.smooth?1:0),this.gl.uniform1f(this.gl.getUniformLocation(this.programManager.program,`u_lights[${i}].intensity`),Math.max(0,Math.min(1,s.intensity)))}return this.gl.drawArrays(this.gl.TRIANGLES,0,6),this.gl.uniform1i(this.programManager.renderLightUniform,0),!0}},pt=class{constructor(t,e,i){this.gl=t,this.programManager=e,this.textureManager=i,this.tiledPosVertices=new Map,this.tiledTexVertices=new Map,this.lastTexture=null,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.positionBuffer=this.gl.createBuffer(),this.textureBuffer=this.gl.createBuffer(),this.tiledPositionBuffer=this.gl.createBuffer(),this.tiledTextureBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([-.5,-.5,-.5,.5,.5,-.5,.5,-.5,-.5,.5,.5,.5]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,1,0,0,1,1,1,1,0,0,1,0]),this.gl.STATIC_DRAW),this.lastDrawMode="sprite"}render(t,e,i){var s,r,o,n;i!==at.Sprite&&!t.tiled||!t.tiled&&"sprite"!==this.lastDrawMode?(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.enableVertexAttribArray(this.programManager.texCoordsAttr),this.gl.vertexAttribPointer(this.programManager.texCoordsAttr,2,this.gl.FLOAT,!1,0,0)):t.tiled&&(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.tiledPositionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,this.getTiledPositionVertices(t.tiled),this.gl.STATIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.tiledTextureBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,this.getTiledTextureVertices(t.tiled),this.gl.STATIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.texCoordsAttr),this.gl.vertexAttribPointer(this.programManager.texCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.lastDrawMode=t.tiled?"tiled":"sprite",this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.width*(t.flipHorizontally?-1:1),t.height*(t.flipVertically?-1:1),1]),this.textureMatrix=Z(this.textureMatrix),t.slice&&(tt(this.textureMatrix,this.textureMatrix,[t.slice.x/t.image.naturalWidth,t.slice.y/t.image.naturalHeight,0]),et(this.textureMatrix,this.textureMatrix,[t.slice.width/t.image.naturalWidth,t.slice.height/t.image.naturalHeight,1])),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.enable(this.gl.BLEND);const a=this.textureManager.getOrCreateTextureFromImage(t.image,t.smooth);if(this.lastTexture===a&&i===t.type||(this.gl.bindTexture(this.gl.TEXTURE_2D,a),this.gl.uniform1i(this.programManager.textureUniform,0),this.lastTexture=a),this.gl.uniform1i(this.programManager.renderTextureUniform,1),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.uniform1i(this.programManager.useTintColorUniform,t.tintColor?1:0),t.tintColor){const{r:e,g:i,b:s,a:r}=ot(t.tintColor);this.gl.uniform4f(this.programManager.tintColorUniform,e,i,s,r)}if(this.gl.uniform1i(this.programManager.useMaskColorUniform,t.maskColor?1:0),t.maskColor){const{r:e,g:i,b:s}=ot(t.maskColor);this.gl.uniform4f(this.programManager.maskColorUniform,e,i,s,null!==(o=t.opacity)&&void 0!==o?o:1),this.gl.uniform1f(this.programManager.maskColorMixUniform,null!==(n=t.maskColorMix)&&void 0!==n?n:1)}return t.tiled?this.gl.drawArrays(this.gl.TRIANGLES,0,t.tiled.x*t.tiled.y*6):this.gl.drawArrays(this.gl.TRIANGLES,0,6),!0}getTiledPositionVertices(t){const e=t.toString();if(!this.tiledPosVertices.has(e)){const i=[];for(let e=-t.x/2;e<t.x/2;e++)for(let s=-t.y/2;s<t.y/2;s++)i.push(e,s,e,s+1,e+1,s,e+1,s,e,s+1,e+1,s+1);this.tiledPosVertices.set(e,new Float32Array(i))}return this.tiledPosVertices.get(e)}getTiledTextureVertices(t){const e=t.toString();if(!this.tiledTexVertices.has(e)){const i=[];for(let e=0;e<t.x*t.y;e++)i.push(0,1,0,0,1,1,1,1,0,0,1,0);this.tiledTexVertices.set(e,new Float32Array(i))}return this.tiledTexVertices.get(e)}};var mt;exports.TextOrientation=void 0,(mt=exports.TextOrientation||(exports.TextOrientation={}))[mt.Center=0]="Center",mt[mt.RightUp=1]="RightUp",mt[mt.RightDown=2]="RightDown",mt[mt.RightCenter=3]="RightCenter";let ut=class{constructor(t,e,i,s){this.gl=t,this.programManager=e,this.textureManager=i,this.fontAtlasFactory=s,this.type=at.Text,this.posVertices=[],this.texVertices=[],this.lastTexture=null,this.textSize=new h,this.modelPosition=new h,this.shadowPosition=new h,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.positionBuffer=this.gl.createBuffer(),this.textureBuffer=this.gl.createBuffer()}render(t,e,i,s=!1){var r;if(!t.text)return!1;const o=this.fontAtlasFactory.getOrCreate(Object.assign({font:t.font},t.textureAtlas));if(s||(this.generateTextVertices(o,t),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(this.posVertices),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(this.texVertices),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.texCoordsAttr),this.gl.vertexAttribPointer(this.programManager.texCoordsAttr,2,this.gl.FLOAT,!1,0,0)),t.shadow){const{color:s,offset:r,opacity:o}=t.shadow,n=Object.assign(Object.assign({},t),{color:s,opacity:o,position:h.add(this.shadowPosition,t.position,r)});n.shadow=void 0,this.render(n,e,i,!0),i=at.Text}this.modelMatrix=Z(this.modelMatrix),this.setPositionFromOrientation(t),tt(this.modelMatrix,this.modelMatrix,[this.modelPosition.x,this.modelPosition.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(r=t.rotation)&&void 0!==r?r:0),et(this.modelMatrix,this.modelMatrix,[t.fontSize*(t.flipHorizontally?-1:1),t.fontSize*(t.flipVertically?-1:1),1]),this.textureMatrix=Z(this.textureMatrix),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.enable(this.gl.BLEND);const n=this.textureManager.getOrCreateTextureFromCanvas(o.id,o.canvas,t.smooth);this.lastTexture===n&&i===at.Text||(this.gl.bindTexture(this.gl.TEXTURE_2D,n),this.gl.uniform1i(this.programManager.textureUniform,0),this.lastTexture=n),this.gl.uniform1i(this.programManager.useMaskColorUniform,0),this.gl.uniform1i(this.programManager.renderTextureUniform,1),this.gl.uniform1f(this.programManager.alphaUniform,t.opacity);const{r:a,g:l,b:c,a:d}=ot(t.color);return this.gl.uniform1i(this.programManager.useTintColorUniform,1),this.gl.uniform4f(this.programManager.tintColorUniform,a,l,c,d),this.gl.drawArrays(this.gl.TRIANGLES,0,this.posVertices.length/2),!0}generateTextVertices(t,{text:e,fontSize:i,letterSpacing:s,lineHeight:r}){this.posVertices=[],this.texVertices=[];let o=0,n=0,a=0;s/=i,r/=i;for(let i=0;i<e.length;i++){const h=e[i];if("\n"===h){a=Math.max(a,o),o=0,n-=r;continue}const l=t.glyphs.get(h);if(l){const e=l.width/t.fontSize;this.posVertices.push(o,n-1,o+e,n-1,o,n,o,n,o+e,n-1,o+e,n);const i=l.id%t.gridSize*(t.fontSize+t.spacing),r=(l.id/t.gridSize|0)*(t.fontSize+t.spacing),a=i/t.canvas.width,h=r/t.canvas.height,c=(i+l.width)/t.canvas.width,d=(r+t.fontSize)/t.canvas.height;this.texVertices.push(a,d,c,d,a,h,a,h,c,d,c,h),o+=e+s}}this.textSize.set(Math.max(a,o)*i,Math.abs(n-1)*i)}setPositionFromOrientation(t){this.modelPosition.set(t.position.x+(t.orientation===exports.TextOrientation.Center?-this.textSize.x/2:0),t.position.y+(t.orientation===exports.TextOrientation.Center||t.orientation===exports.TextOrientation.RightCenter?this.textSize.y/2:t.orientation===exports.TextOrientation.RightUp?this.textSize.y:0))}};var yt;exports.TilemapOrientation=void 0,(yt=exports.TilemapOrientation||(exports.TilemapOrientation={}))[yt.Center=0]="Center",yt[yt.RightUp=1]="RightUp",yt[yt.RightDown=2]="RightDown",yt[yt.RightCenter=3]="RightCenter";let ft=class{constructor(t,e,i){this.gl=t,this.programManager=e,this.textureManager=i,this.posVertices=[],this.texVertices=[],this.lastTexture=null,this.tileset={width:0,tileWidth:0,tileHeight:0,texMargin:new h,texSpacing:new h,texWidth:0,texHeight:0,texCorrection:new h},this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.positionBuffer=this.gl.createBuffer(),this.textureBuffer=this.gl.createBuffer()}render(t,e,i){var s,r,o,n;if(0===t.tiles.reduce(((t,e)=>t+e),0))return!1;if(this.processTileset(t),this.generateVertices(t),0===this.posVertices.length)return!1;this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(this.posVertices),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(this.texVertices),this.gl.DYNAMIC_DRAW),this.gl.enableVertexAttribArray(this.programManager.texCoordsAttr),this.gl.vertexAttribPointer(this.programManager.texCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.tilemap.tileWidth*(t.flipHorizontal?-1:1),t.tilemap.tileHeight*(t.flipVertical?-1:1),1]),this.textureMatrix=Z(this.textureMatrix),et(this.textureMatrix,this.textureMatrix,[this.tileset.tileWidth/t.tileset.image.naturalWidth,this.tileset.tileHeight/t.tileset.image.naturalHeight,1]),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.enable(this.gl.BLEND);const a=this.textureManager.getOrCreateTextureFromImage(t.tileset.image,t.smooth);if(this.lastTexture===a&&i===at.Tilemap||(this.gl.bindTexture(this.gl.TEXTURE_2D,a),this.gl.uniform1i(this.programManager.textureUniform,0),this.lastTexture=a),this.gl.uniform1i(this.programManager.renderTextureUniform,1),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.uniform1i(this.programManager.useTintColorUniform,t.tintColor?1:0),t.tintColor){const{r:e,g:i,b:s,a:r}=ot(t.tintColor);this.gl.uniform4f(this.programManager.tintColorUniform,e,i,s,r)}if(this.gl.uniform1i(this.programManager.useMaskColorUniform,t.maskColor?1:0),t.maskColor){const{r:e,g:i,b:s}=ot(t.maskColor);this.gl.uniform4f(this.programManager.maskColorUniform,e,i,s,null!==(o=t.opacity)&&void 0!==o?o:1),this.gl.uniform1f(this.programManager.maskColorMixUniform,null!==(n=t.maskColorMix)&&void 0!==n?n:1)}return this.gl.drawArrays(this.gl.TRIANGLES,0,this.posVertices.length/2),!0}processTileset({tileset:t}){var e,i,s,r,o,n,a;t.margin=null!==(e=t.margin)&&void 0!==e?e:new h,t.spacing=null!==(i=t.spacing)&&void 0!==i?i:new h,t.correction=null!==(s=t.correction)&&void 0!==s?s:new h,this.tileset.width=t.width,this.tileset.tileWidth=t.tileWidth+(null!==(r=t.margin.x)&&void 0!==r?r:0)+(null!==(o=t.spacing.x)&&void 0!==o?o:0),this.tileset.tileHeight=t.tileHeight+(null!==(n=t.margin.y)&&void 0!==n?n:0)+(null!==(a=t.spacing.y)&&void 0!==a?a:0),this.tileset.texMargin.set(t.margin.x/this.tileset.tileWidth,t.margin.y/this.tileset.tileHeight),this.tileset.texSpacing.set(t.spacing.x/this.tileset.tileWidth,t.spacing.y/this.tileset.tileHeight),this.tileset.texCorrection.set(t.correction.x/this.tileset.tileWidth,t.correction.y/this.tileset.tileHeight),this.tileset.texWidth=1-this.tileset.texMargin.x-this.tileset.texSpacing.x-2*this.tileset.texCorrection.x,this.tileset.texHeight=1-this.tileset.texMargin.y-this.tileset.texSpacing.y-2*this.tileset.texCorrection.y}generateVertices({tiles:t,tilemap:e}){this.posVertices=[],this.texVertices=[];const i=Math.floor(t.length/e.width);t.forEach(((t,s)=>{if(0===t)return;const r=s%e.width-e.width/2,o=i/2-Math.floor(s/e.width);this.posVertices.push(r,o-1,r+1,o-1,r,o,r,o,r+1,o-1,r+1,o);const n=(t-1)%this.tileset.width+this.tileset.texMargin.x+this.tileset.texCorrection.x,a=Math.floor((t-1)/this.tileset.width)+this.tileset.texMargin.y+this.tileset.texCorrection.y;this.texVertices.push(n,a+this.tileset.texHeight,n+this.tileset.texWidth,a+this.tileset.texHeight,n,a,n,a,n+this.tileset.texWidth,a+this.tileset.texHeight,n+this.tileset.texWidth,a)}))}},xt=class{constructor(t,e,i){this.gl=t,this.programManager=e,this.textureManager=i,this.lastTexture=null,this.projectionMatrix=Q(),this.modelMatrix=Q(),this.textureMatrix=Q(),this.positionBuffer=this.gl.createBuffer(),this.textureBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([-.5,-.5,-.5,.5,.5,-.5,.5,-.5,-.5,.5,.5,.5]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,1,0,0,1,1,1,1,0,0,1,0]),this.gl.STATIC_DRAW)}render(t,e,i){var s,r,o,n;i!==at.Video&&(this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.enableVertexAttribArray(this.programManager.positionCoordsAttr),this.gl.vertexAttribPointer(this.programManager.positionCoordsAttr,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.textureBuffer),this.gl.enableVertexAttribArray(this.programManager.texCoordsAttr),this.gl.vertexAttribPointer(this.programManager.texCoordsAttr,2,this.gl.FLOAT,!1,0,0)),this.modelMatrix=Z(this.modelMatrix),tt(this.modelMatrix,this.modelMatrix,[t.position.x,t.position.y,0]),it(this.modelMatrix,this.modelMatrix,null!==(s=t.rotation)&&void 0!==s?s:0),et(this.modelMatrix,this.modelMatrix,[t.width*(t.flipHorizontal?-1:1),t.height*(t.flipVertical?-1:1),1]),this.textureMatrix=Z(this.textureMatrix),t.slice&&(tt(this.textureMatrix,this.textureMatrix,[t.slice.x/t.video.videoWidth,t.slice.y/t.video.videoHeight,0]),et(this.textureMatrix,this.textureMatrix,[t.slice.width/t.video.videoWidth,t.slice.height/t.video.videoHeight,1])),rt(this.projectionMatrix,this.gl,e.zoom,e.position),this.gl.uniformMatrix4fv(this.programManager.projectionMatrixUniform,!1,this.projectionMatrix),this.gl.uniformMatrix4fv(this.programManager.modelMatrixUniform,!1,this.modelMatrix),this.gl.uniformMatrix4fv(this.programManager.textureMatrixUniform,!1,this.textureMatrix),this.gl.enable(this.gl.BLEND);const a=this.textureManager.getOrCreateTextureFromVideo(t.video);if(this.lastTexture===a&&i===at.Video||(this.gl.bindTexture(this.gl.TEXTURE_2D,a),this.gl.uniform1i(this.programManager.textureUniform,0),this.lastTexture=a),t.video.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA&&this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,t.video),this.gl.uniform1i(this.programManager.renderTextureUniform,1),this.gl.uniform1f(this.programManager.alphaUniform,null!==(r=t.opacity)&&void 0!==r?r:1),this.gl.uniform1i(this.programManager.useTintColorUniform,t.tintColor?1:0),t.tintColor){const{r:e,g:i,b:s,a:r}=ot(t.tintColor);this.gl.uniform4f(this.programManager.tintColorUniform,e,i,s,r)}if(this.gl.uniform1i(this.programManager.useMaskColorUniform,t.maskColor?1:0),t.maskColor){const{r:e,g:i,b:s}=ot(t.maskColor);this.gl.uniform4f(this.programManager.maskColorUniform,e,i,s,null!==(o=t.opacity)&&void 0!==o?o:1),this.gl.uniform1f(this.programManager.maskColorMixUniform,null!==(n=t.maskColorMix)&&void 0!==n?n:1)}return this.gl.drawArrays(this.gl.TRIANGLES,0,6),!0}};class Mt{constructor(t){this.gl=t}createFromImage(t,e=!1,i=null){return i=null!=i?i:this.gl.createTexture(),t.naturalWidth?this.createFromSource(t,i,e):t.addEventListener("load",(()=>this.createFromSource(t,i,e))),i}createFromCanvas(t,e=!1,i=null){return i=null!=i?i:this.gl.createTexture(),this.createFromSource(t,i,e),i}createPixelTexture(){const t=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,t),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,1,1,0,this.gl.RGBA,this.gl.UNSIGNED_BYTE,new Uint8Array([0,0,0,255])),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.bindTexture(this.gl.TEXTURE_2D,null),t}createFromSource(t,e,i=!1){this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,t),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),i?(this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR)):(this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.NEAREST),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.NEAREST)),this.gl.bindTexture(this.gl.TEXTURE_2D,null)}}const vt=(t,e)=>`${e?"_smooth_":""}${t}`;class Ct{constructor(t){this.textureFactory=t,this.textures=new Map}getOrCreateTextureFromImage(t,e=!1){var i;return null!==(i=this.textures.get(vt(t.src,e)))&&void 0!==i?i:this.createTextureFromImage(t,e)}createTextureFromImage(t,e=!1){const i=this.textureFactory.createFromImage(t,e);return this.textures.set(vt(t.src,e),i),i}getOrCreateTextureFromCanvas(t,e,i=!1){var s;return null!==(s=this.textures.get(vt(t,i)))&&void 0!==s?s:this.createTextureFromCanvas(t,e,i)}createTextureFromCanvas(t,e,i=!1){const s=this.textureFactory.createFromCanvas(e,i);return this.textures.set(vt(t,i),s),s}getOrCreateTextureFromVideo(t){var e;return null!==(e=this.textures.get(t.src))&&void 0!==e?e:this.createTextureFromVideo(t)}createTextureFromVideo(t){const e=this.textureFactory.createPixelTexture();return this.textures.set(t.src,e),e}}let St=class{constructor(t){this.renderers=new Map;const e=new H(t),i=e.gl,s=e.contextVersion,r=new K(i,s,new $(i,new q(i))),o=new Ct(new Mt(i)),n=new Y;this.renderers.set(at.Sprite,new pt(i,r,o)),this.renderers.set(at.Text,new ut(i,r,o,n)),this.renderers.set(at.Tilemap,new ft(i,r,o)),this.renderers.set(at.Geometric,new ct(i,r)),this.renderers.set(at.Mask,new dt(i,r)),this.renderers.set(at.Video,new xt(i,r,o)),this.renderers.set(at.Darkness,new gt(i,r)),this.canvasColorRenderer=new nt(i),r.loadProgram()}render(t,e){this.renderers.get(t.type).render(t,e,this.lastRender)&&(this.lastRender=t.type)}renderCanvasColor(t){this.canvasColorRenderer.render(t)}};St=o([i(t.WebGLManager),n(0,s(t.CanvasElement))],St);class bt{constructor(t){this.fixedToTimeScale=!1,this.layer=G,this.loop=!1,this.offset=new h,this.playing=!1,this.rotation=0,this.volume=1,this._currentVideoSrc=void 0,this._playPromisePendind=!1,this._renderData={type:at.Video,height:void 0,layer:void 0,position:new h,video:void 0,width:void 0,flipHorizontal:void 0,flipVertical:void 0,maskColor:void 0,maskColorMix:void 0,opacity:void 0,rotation:void 0,slice:void 0,tintColor:void 0},Object.assign(this,t)}play(t){t&&(this.video=t),this.action="play"}pause(){this.action="pause"}stop(){this.action="stop"}}bt.componentName="VideoRenderer";const At=["click","contextmenu","auxclick","dblclick","mousedown","mouseup","pointerup","touchend","keydown","keyup"];let wt=class{constructor(t,e,i,s,r){this.entityManager=t,this.renderManager=e,this.timeManager=i,this.assetManager=s,this.inputManager=r,this.scaledOffset=new h,this.canPlay=!0,this.userInputErrorCatched=!1,this.userInputEventHandler=()=>{At.forEach((t=>{window.removeEventListener(t,this.userInputEventHandler)})),this.canPlay=!0}}onCreate(){document.addEventListener("visibilitychange",(()=>{this.entityManager.search(bt).forEach((({component:{video:t,playing:e}})=>{t&&"string"!=typeof t&&(document.hidden?t.pause():!document.hidden&&e&&t.play(),this.canPlay=!document.hidden)}))}))}catchUserInput(){this.canPlay=!1,this.userInputErrorCatched=!0,At.forEach((t=>window.addEventListener(t,this.userInputEventHandler)))}checkGamepad(){return this.canPlay=this.inputManager.gamepads.some((t=>t.anyButtonPressed)),this.canPlay}onUpdate(){(this.canPlay||this.checkGamepad())&&this.entityManager.search(bt).forEach((({entity:t,component:e})=>{var i,s;const r=this.entityManager.getComponent(t,V);if(!r)throw new Error("VideoRenderer component needs a Transform");if("string"==typeof e.video&&(e.video=this.assetManager.getVideo(e.video),!e.video))throw new Error(`Asset ${e.video} not found`);e.video&&e.video.duration&&(this.checkVideoState(e),this.scaledOffset.set(e.offset.x*r.localScale.x,e.offset.y*r.localScale.y),h.add(e._renderData.position,r.localPosition,this.scaledOffset),e._renderData.layer=e.layer,e._renderData.video=e.video,e._renderData.width=(null!==(i=e.width)&&void 0!==i?i:e.video.videoWidth)*Math.abs(r.localScale.x),e._renderData.height=(null!==(s=e.height)&&void 0!==s?s:e.video.videoHeight)*Math.abs(r.localScale.y),e._renderData.rotation=r.localRotation+e.rotation,e._renderData.slice=e.slice,e._renderData.flipHorizontal=e.flipHorizontally,e._renderData.flipVertical=e.flipVertically,e._renderData.opacity=e.opacity,e._renderData.maskColor=e.maskColor,e._renderData.maskColorMix=e.maskColorMix,e._renderData.tintColor=e.tintColor,0!==r.localRotation&&this.scaledOffset.magnitude>0&&this.translateRenderPosition(e._renderData,r),this.renderManager.addRenderData(e._renderData))}))}translateRenderPosition(t,e){const i=Math.atan2(this.scaledOffset.y,this.scaledOffset.x)+e.localRotation;t.position.set(e.localPosition.x+this.scaledOffset.magnitude*Math.cos(i),e.localPosition.y+this.scaledOffset.magnitude*Math.sin(i))}checkVideoState(t){const{video:e,action:i,loop:s,volume:r}=t;"string"!=typeof e&&(e.src!==t._currentVideoSrc&&(t._currentVideoSrc=e.src,t.playing=!1,e.currentTime=0),e.loop=s,e.volume=r,e.playbackRate=t.fixedToTimeScale?this.timeManager.timeScale<.0625?0:Math.min(this.timeManager.timeScale,16):1,"play"!==i||t.playing||t._playPromisePendind||!this.canPlay||(t._playPromisePendind=!0,e.play().then((()=>{t._playPromisePendind=!1,t.playing=!0})).catch((()=>{t._playPromisePendind=!1,this.userInputErrorCatched||this.catchUserInput()}))),"play"===i&&e.ended&&(t.action="stop",t.playing=!1),"stop"===i&&e.currentTime>0&&(e.pause(),e.currentTime=0,t.playing=!1),"pause"!==i||e.paused||e.pause())}onDisabled(){this.entityManager.search(bt).forEach((({component:t})=>{t.video&&"string"!=typeof t.video&&(t.video.pause(),t.video.currentTime=0)}))}onDestroy(){this.onDisabled()}};wt=o([i(I.VideoRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.TimeManager)),n(3,s(t.AssetManager)),n(4,s(t.InputManager))],wt),exports.SceneManager=class{constructor(t,e,i,s,r){this.systemManager=t,this.systemFactory=e,this.entityManager=i,this.assetManager=s,this.timeManager=r,this.scenes=new Map,this._loadingScene=!1,this._sceneLoadedThisFrame=!1,this.preserveEntitiesWithComponent=void 0}addScene(t,e,i=!1){const s=new t(this.entityManager,this.assetManager);this.scenes.set(e,s),i&&(this.openingSceneName=e)}loadScene(t,e){if(!this.scenes.has(t))throw new Error(`Invalid scene name: '${t}'`);this.sceneNameToBeLoaded=t,this.preserveEntitiesWithComponent=e}loadOpeningScene(){if(!this.openingSceneName)throw new Error("There is no opening scene");this.sceneNameToBeLoaded=this.openingSceneName}get loadingScene(){return this._loadingScene}get sceneLoadedThisFrame(){return this._sceneLoadedThisFrame}update(){this._sceneLoadedThisFrame=!1,this.sceneNameToBeLoaded&&(this.currentSceneName&&this.destroyCurrentScene(),this.currentSceneName=this.sceneNameToBeLoaded,this.sceneNameToBeLoaded=void 0,this.scenes.get(this.currentSceneName).loadAssets(),this.scenes.get(this.currentSceneName).registerSystems(),this._loadingScene=!0),this._loadingScene&&this.assetManager.getAssetsLoaded()&&(this._loadingScene=!1,this._sceneLoadedThisFrame=!0,this.scenes.get(this.currentSceneName).createEntities(),this.systemManager.update(k.Transform),this.systemManager.update(k.PreGameLogic),this.scenes.get(this.currentSceneName).systems.forEach(((t,e)=>{this.systemFactory.createSystemIfNotExists(t),this.systemManager.enableSystem(t),this.systemManager.setExecutionOrder(t,e)})))}destroyCurrentScene(){this.systemManager.disableSystem(j),this.systemManager.disableSystem(wt),this.scenes.get(this.currentSceneName).systems.forEach((t=>this.systemManager.disableSystem(t))),this.entityManager.removeAllEntities(this.preserveEntitiesWithComponent),this.timeManager.clearAllIntervals(),this.systemManager.enableSystem(j),this.systemManager.enableSystem(wt)}},exports.SceneManager=o([i(t.SceneManager),n(0,s(t.SystemManager)),n(1,s(t.CreateSystemService)),n(2,s(t.EntityManager)),n(3,s(t.AssetManager)),n(4,s(t.TimeManager))],exports.SceneManager);class Et{constructor(t){this.width=0,this.height=0,this.radius=0,this.touchEnabled=!0,this.offset=new h,this.pressed=!1,this.mouseOver=!1,Object.assign(this,t)}}var Rt;Et.componentName="Button",exports.ButtonShape=void 0,(Rt=exports.ButtonShape||(exports.ButtonShape={}))[Rt.Rectangle=0]="Rectangle",Rt[Rt.Circumference=1]="Circumference";let _t=class{constructor(t,e){this.entityManager=t,this.scaled={position:new h,width:0,height:0,radius:0},this.distance=new h,this.pressedLastFrame=!1,this.mouse=e.mouse,this.touchScreen=e.touchScreen}onUpdate(){this.entityManager.search(Et).forEach((({entity:t,component:e})=>{const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("Button component needs a Transform");this.pressedLastFrame=e.pressed,e.pressed=!1,this.scale(e,i),e.mouseOver=this.isMouseOverButton(e),e.pressed=e.mouseOver&&this.mouse.leftButtonPressed,e.touchEnabled&&this.touchScreen.touching&&(this.resolveTouchAndRectangle(e),this.resolveTouchAndCircumference(e)),e.onClick&&!this.pressedLastFrame&&e.pressed&&e.onClick(),e.onPressed&&e.pressed&&e.onPressed()}))}scale(t,{localPosition:e,localScale:i}){this.scaled.width=t.width*i.x,this.scaled.height=t.height*i.y,this.scaled.position.x=e.x+t.offset.x*i.x,this.scaled.position.y=e.y+t.offset.y*i.y,this.scaled.radius=t.radius*Math.max(Math.abs(i.x),Math.abs(i.y))}isMouseOverButton(t){return this.isMouseOverRectangleButton(t)||this.isMouseOverCircumferenceButton(t)}isMouseOverRectangleButton(t){return t.shape===exports.ButtonShape.Rectangle&&(p(this.mouse.positionInViewport.x,this.scaled.position.x-this.scaled.width/2,this.scaled.position.x+this.scaled.width/2)&&p(this.mouse.positionInViewport.y,this.scaled.position.y-this.scaled.height/2,this.scaled.position.y+this.scaled.height/2))}isMouseOverCircumferenceButton(t){return t.shape===exports.ButtonShape.Circumference&&(h.subtract(this.distance,this.scaled.position,this.mouse.positionInViewport),this.distance.magnitude<=this.scaled.radius)}resolveTouchAndRectangle(t){if(t.shape===exports.ButtonShape.Rectangle)for(const{positionInViewport:e,radius:i}of this.touchScreen.interactions){if(t.pressed)return;t.pressed=this.scaled.position.x+this.scaled.width/2>=e.x-i.x&&this.scaled.position.x-this.scaled.width/2<=e.x+i.x&&this.scaled.position.y+this.scaled.height/2>=e.y-i.y&&this.scaled.position.y-this.scaled.height/2<=e.y+i.y}}resolveTouchAndCircumference(t){if(t.shape===exports.ButtonShape.Circumference)for(const{positionInViewport:e,radius:i}of this.touchScreen.interactions){if(t.pressed)return;h.subtract(this.distance,this.scaled.position,e),t.pressed=this.distance.magnitude<=this.scaled.radius+Math.max(i.x,i.y)}}};_t=o([i(I.ButtonSystem),n(0,s(t.EntityManager)),n(1,s(t.InputManager))],_t);class Tt{constructor(t){Object.assign(this,t)}}Tt.componentName="TiledWrapper";class Bt{constructor(t){this.layer=G,this.tileset=void 0,this.data=[],this.chunks=[],this.width=0,this.height=0,this.tileWidth=void 0,this.tileHeight=void 0,this.tintColor=void 0,this.opacity=1,this.smooth=!1,this._processed=!1,this._renderData=[],Object.assign(this,t)}}Bt.componentName="TilemapRenderer";let Pt=class{constructor(t,e){this.entityManager=t,this.assetManager=e}onUpdate(){this.entityManager.search(Tt).forEach((({entity:t,component:e})=>{const i=this.entityManager.getComponent(t,Bt);if(!i)return;if("string"==typeof e.tilemap&&(e.tilemap=this.assetManager.getJson(e.tilemap),!e.tilemap))throw new Error(`Tilemap ${e.tilemap} not found`);const s=e.tilemap.layers.find((t=>t.name===e.layerToRender&&"tilelayer"===t.type));s&&(e.tilemap.infinite?i.chunks=s.chunks:i.data=s.data,i.width=e.tilemap.width)}))}};Pt=o([i(I.TiledWrapperSystem),n(0,s(t.EntityManager)),n(1,s(t.AssetManager))],Pt);const Dt=16;let Ft=class{constructor(t){this.entityManager=t}onUpdate(){this.entityManager.search(Bt).forEach((({component:t})=>{var e,i;t._processed||(t.chunks&&t.chunks.length>0?this.chunksToData(t):t.data&&t.data.length>0&&this.dataToChunks(t),t.tileWidth=null!==(e=t.tileWidth)&&void 0!==e?e:t.tileset.tileWidth,t.tileHeight=null!==(i=t.tileHeight)&&void 0!==i?i:t.tileset.tileHeight,t._processed=!0)}))}dataToChunks(t){t.height=Math.ceil(t.data.length/t.width);const e=Math.ceil(t.width/Dt),i=Math.ceil(t.height/Dt);for(let s=0;s<i;s++)for(let i=0;i<e;i++){const e={x:i*Dt,y:s*Dt,width:Dt,height:Dt,data:[]};for(let i=0;i<e.width*e.height;i++){const s=e.x+i%e.width,r=t.width*(e.y+Math.floor(i/e.width));e.data[i]=s<t.width&&r<t.height*t.width?t.data[r+s]:0}t.chunks.push(e)}}chunksToData(t){t.data=[],t.chunks.forEach((e=>e.data.forEach(((i,s)=>{t.data[t.width*(e.y+Math.floor(s/e.width))+e.x+s%e.width]=i})))),t.height=Math.ceil(t.data.length/t.width)}};Ft=o([i(I.TilemapPreProcessingSystem),n(0,s(t.EntityManager))],Ft);let Ut=class{constructor(t){this.entityManager=t}onUpdate(){this.entityManager.search(V).sort(((t,e)=>this.getBranchLength(t.entity)-this.getBranchLength(e.entity))).forEach((({component:t,entity:e})=>{const i=this.entityManager.getParent(e);i&&this.entityManager.isEntityEnabled(i)&&this.entityManager.isComponentEnabled(i,V)?(t._parent||(t._parent=this.entityManager.getComponent(i,V),t._awake&&!t.ignoreParentPosition&&h.subtract(t.position,t.localPosition,t._parent.position)),t._parent?this.translateChild(t):this.updateTransform(t)):(t._parent&&this.removeParent(t),this.updateTransform(t)),t._awake=!0}))}getBranchLength(t){const e=this.entityManager.getParent(t);return e?1+this.getBranchLength(e):0}removeParent(t){t._parent=void 0,t.position.copy(t.localPosition),t.rotation=t.localRotation}updateTransform(t){t.localPosition.copy(t.position),t.localScale.copy(t.scale),t.localRotation=t.rotation,t._parent=void 0}translateChild(t){t.localRotation=t.rotation+(t.ignoreParentRotation?0:t._parent.localRotation),t.localScale.x=t.scale.x*(t.ignoreParentScale?1:t._parent.scale.x),t.localScale.y=t.scale.y*(t.ignoreParentScale?1:t._parent.scale.y);const e=Math.atan2(t.position.y,t.position.x)+(t.ignoreParentRotation?0:t._parent.localRotation);t.localPosition.set(t.position.magnitude*Math.cos(e)+(t.ignoreParentPosition?0:t._parent.localPosition.x),t.position.magnitude*Math.sin(e)+(t.ignoreParentPosition?0:t._parent.localPosition.y))}};Ut=o([i(I.TransformSystem),n(0,s(t.EntityManager))],Ut);let It=class{constructor(t){this.inputManager=t,this.gamepads=new Map,this.eventHandler=t=>{"gamepadconnected"===t.type?this.gamepadConnected(t.gamepad):"gamepaddisconnected"===t.type&&this.gamepadDisconected(t.gamepad)},window.addEventListener("gamepadconnected",this.eventHandler),window.addEventListener("gamepaddisconnected",this.eventHandler)}gamepadConnected(t){this.gamepads.set(t.index,t),this.inputManager.gamepads[t.index]||(this.inputManager.gamepads[t.index]=new _,this.inputManager.gamepads[t.index].index=t.index),this.inputManager.gamepads[t.index].id=t.id,this.inputManager.gamepads[t.index].connected=!0}gamepadDisconected(t){this.gamepads.delete(t.index),this.inputManager.gamepads[t.index].connected=!1}onUpdate(){for(const t of this.getGamepadsFromBrowser())t&&(!1===this.gamepads.has(t.index)?this.gamepadConnected(t):this.gamepads.set(t.index,t));this.gamepads.forEach((t=>{const e=this.inputManager.gamepads[t.index];t.buttons.forEach(((t,i)=>e.buttons.set(i,t.pressed))),t.axes.forEach(((t,i)=>e.axes.set(i,t))),e.vibrationInput&&(t.vibrationActuator.playEffect(t.vibrationActuator.type,{duration:e.vibrationInput.duration,weakMagnitude:e.vibrationInput.weakMagnitude,strongMagnitude:e.vibrationInput.strongMagnitude,startDelay:e.vibrationInput.startDelay}).catch((()=>e.vibrating=!1)).finally((()=>e.vibrating=!1)),e.vibrating=!0,e.vibrationInput=void 0)}))}getGamepadsFromBrowser(){return navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads?navigator.webkitGetGamepads:[]}};It=o([i(I.GamepadSystem),n(0,s(t.InputManager))],It);let Lt=class{constructor(t,{keyboard:e}){this.pressedKeys=[],this.eventHandler=t=>{"keydown"!==t.type||this.pressedKeys.includes(t.code)||this.pressedKeys.push(t.code),"keyup"===t.type&&this.pressedKeys.includes(t.code)&&this.pressedKeys.splice(this.pressedKeys.indexOf(t.code),1)},this.keyboard=e,t.addEventListener("keydown",this.eventHandler),t.addEventListener("keyup",this.eventHandler),t.addEventListener("focusout",(()=>this.pressedKeys=[]))}onUpdate(){this.keyboard.pressedKeys=[...this.pressedKeys]}};Lt=o([i(I.KeyboardSystem),n(0,s(t.CanvasElement)),n(1,s(t.InputManager))],Lt);let jt=class{constructor(t,{mouse:e}){this.canvas=t,this.leftButtonPressed=!1,this.scrollButtonPressed=!1,this.rightButtonPressed=!1,this.positionInViewport=new h,this.lastPositionInViewport=new h,this.mouse=e,this.canvas.addEventListener("mousemove",(t=>this.updatePosition(t))),this.canvas.addEventListener("mousedown",(t=>this.updateButtonDown(t))),this.canvas.addEventListener("mouseup",(t=>this.updateButtonUp(t))),this.canvas.addEventListener("wheel",(t=>this.handleWheelEvent(t))),this.canvas.addEventListener("focusout",(()=>this.onFocusOut()))}updateButtonDown(t){this.canvas.focus(),t.preventDefault(),t.stopPropagation(),this.leftButtonPressed=0===t.button,this.scrollButtonPressed=1===t.button,this.rightButtonPressed=2===t.button}updateButtonUp(t){t.preventDefault(),t.stopPropagation(),this.leftButtonPressed=0!==t.button&&this.leftButtonPressed,this.scrollButtonPressed=1!==t.button&&this.scrollButtonPressed,this.rightButtonPressed=2!==t.button&&this.rightButtonPressed}updatePosition(t){t.preventDefault(),t.stopPropagation(),this.positionInViewport.set(t.offsetX/(this.canvas.clientWidth/this.canvas.width)-this.canvas.width/2,-t.offsetY/(this.canvas.clientHeight/this.canvas.height)+this.canvas.height/2)}handleWheelEvent(t){t.preventDefault(),t.stopPropagation(),this.wheelEvent=t}onFocusOut(){this.leftButtonPressed=!1,this.scrollButtonPressed=!1,this.rightButtonPressed=!1}onUpdate(){this.mouse.leftButtonPressed=this.leftButtonPressed,this.mouse.rightButtonPressed=this.rightButtonPressed,this.mouse.scrollButtonPressed=this.scrollButtonPressed,this.mouse.positionInViewport.copy(this.positionInViewport),this.positionInViewport.equals(this.lastPositionInViewport)?this.mouse.hasMoved=!1:(this.mouse.hasMoved=!0,this.lastPositionInViewport.copy(this.positionInViewport)),this.wheelEvent?(this.mouse.wheelScroll.set(this.wheelEvent.deltaX,this.wheelEvent.deltaY),this.wheelEvent=void 0):this.mouse.wheelScroll.set(0,0)}};jt=o([i(I.MouseSystem),n(0,s(t.CanvasElement)),n(1,s(t.InputManager))],jt);let kt=class{constructor(t,{touchScreen:e}){this.canvas=t,this.touching=!1,this.interactions=[],this.eventHandler=t=>{"touchstart"===t.type&&(this.touching=!0,this.updatePosition(t)),"touchmove"===t.type&&this.updatePosition(t),"touchend"!==t.type&&"touchcancel"!==t.type||(this.touching=!1)},this.touchScreen=e,this.canvas.addEventListener("touchstart",this.eventHandler),this.canvas.addEventListener("touchend",this.eventHandler),this.canvas.addEventListener("touchcancel",this.eventHandler),this.canvas.addEventListener("touchmove",this.eventHandler)}updatePosition(t){if(t.preventDefault(),t.stopPropagation(),this.interactions=[],0!==t.targetTouches.length)for(let e=0;e<t.targetTouches.length;e++)this.interactions[e]={positionInViewport:new h((t.targetTouches[e].clientX-this.canvas.offsetLeft)/(this.canvas.clientWidth/this.canvas.width)-this.canvas.width/2,-(t.targetTouches[e].clientY-this.canvas.offsetTop)/(this.canvas.clientHeight/this.canvas.height)+this.canvas.height/2),radius:new h(t.targetTouches[e].radiusX,t.targetTouches[e].radiusY)}}onUpdate(){this.touchScreen.touching=this.touching,this.touchScreen.interactions=[...this.touchScreen.interactions]}};kt=o([i(I.TouchScreenSystem),n(0,s(t.CanvasElement)),n(1,s(t.InputManager))],kt);class Ot{constructor(t){this.animations=new Map,this.speed=1,this.reset=!1,this.playing=!1,this.currentFrame=0,this.currentTime=0,this._currentAnimation=void 0,this._assetsReady=!1,Object.assign(this,t)}}Ot.componentName="Animator";class Vt{constructor(t){this.layer=G,this.smooth=!1,this.offset=new h,this.flipHorizontally=!1,this.flipVertically=!1,this.rotation=0,this.opacity=1,this.scale=new h(1,1),this._renderData={type:at.Sprite,position:new h,layer:void 0,image:void 0,width:void 0,height:void 0},Object.assign(this,t)}}Vt.componentName="SpriteRenderer";let Gt=class{constructor(t,e,i){this.entityManager=t,this.timeManager=e,this.assetManager=i}onUpdate(){this.entityManager.search(Ot).forEach((({entity:t,component:e})=>{if(this.processAssets(e),this.reset(e),this.animation=e.animations.get(e.animation),!this.animation)return;this.play(e),e._currentAnimation=e.animation;const i=this.entityManager.getComponent(t,Vt);i&&this.renderSprite(e,i)}))}processAssets(t){t._assetsReady||(t.animations.forEach((t=>{if("string"==typeof t.image){if(t.image=this.assetManager.getImage(t.image),!t.image)throw new Error(`Asset ${t.image} not found`)}else Array.isArray(t.image)&&(t.image=t.image.map((t=>{if("string"==typeof t){const e=this.assetManager.getImage(t);if(!e)throw new Error(`Asset ${t} not found`);return e}return t})))})),t._assetsReady=!0)}reset(t){t.reset&&(t.currentFrame=0,t.currentTime=0,t.playing=void 0!==t.animation,t.reset=!1)}play(t){t.animation!==t._currentAnimation&&(t._currentAnimation=t.animation,t.currentFrame=0,t.currentTime=0,t.playing=!0),t.playing&&(t.currentTime>=1/this.animation.fps*(t.currentFrame+1)&&(t.currentFrame===this.animation.frames.length-1?this.animation.loop?(t.currentFrame=0,t.currentTime=0):t.playing=!1:t.currentFrame++),t.currentTime+=this.timeManager.renderDeltaTime*t.speed)}renderSprite(t,e){if(Array.isArray(this.animation.image))e.image=this.animation.image[t.currentFrame];else{if("string"==typeof this.animation.image)return;const i=this.animation.frames[t.currentFrame],s=Math.floor(this.animation.image.naturalWidth/this.animation.slice.size.x);e.image=this.animation.image,e.slice={x:i%s*this.animation.slice.size.x+this.animation.slice.offset.x,y:Math.floor(i/s)*this.animation.slice.size.y+this.animation.slice.offset.y,width:this.animation.slice.size.x-this.animation.slice.padding.y,height:this.animation.slice.size.y-this.animation.slice.padding.y}}}};Gt=o([i(I.AnimatorSystem),n(0,s(t.EntityManager)),n(1,s(t.TimeManager)),n(2,s(t.AssetManager))],Gt);let Nt=class{constructor(t,e){this.entityManager=t,this.renderManager=e}onUpdate(){this.entityManager.search(W).forEach((({entity:t,component:e})=>{const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("Camera component needs a Transform");e._renderData.position.copy(i.localPosition),e._renderData.layers=e.layers,e._renderData.depth=e.depth,e._renderData.zoom=e.zoom,e.debug&&e._renderData.layers.push(N),this.renderManager.addCameraData(e._renderData)}))}};Nt=o([i(I.CameraSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager))],Nt);let Wt=class{constructor(t,e){this.webGLManager=t,this.gameConfig=e}onUpdate(){this.webGLManager.renderCanvasColor(this.gameConfig.canvasColor)}};Wt=o([i(I.ClearScreenSystem),n(0,s(t.WebGLManager)),n(1,s(t.GameConfig))],Wt);class zt{constructor(t){this.radius=0,this.offset=new h,this.layer="",this.physics=!0,this.ignoreCollisionsWithLayers=[],this.shapes=[],Object.assign(this,t)}}zt.componentName="BallCollider";class Ht{constructor(t){this.layer="",this.physics=!0,this.width=0,this.height=0,this.offset=new h,this.rotation=0,this.ignoreCollisionsWithLayers=[],this.shapes=[],Object.assign(this,t)}}Ht.componentName="BoxCollider";class Yt{constructor(t){this.vertexModel=[],this.offset=new h,this.rotation=0,this.layer="",this.physics=!0,this.ignoreCollisionsWithLayers=[],this.shapes=[],Object.assign(this,t)}}Yt.componentName="EdgeCollider";class Xt{constructor(t){this.vertexModel=[],this.offset=new h,this.rotation=0,this.layer="",this.physics=!0,this.ignoreCollisionsWithLayers=[],this.shapes=[],Object.assign(this,t)}}Xt.componentName="PolygonCollider";class $t{constructor(t){this.composite=!0,this.layer="",this.ignoreCollisionsWithLayers=[],this.offset=new h,this.physics=!0,this.shapes=[],Object.assign(this,t)}}$t.componentName="TilemapCollider";let Kt=class{constructor(t,e,i){this.entityManager=t,this.renderManager=e,this.gameConfig=i}onUpdate(){var t;(null===(t=this.gameConfig.debug)||void 0===t?void 0:t.colliders)&&[zt,Ht,Xt,Yt,$t].forEach((t=>this.entityManager.search(t).forEach((({component:t})=>t.shapes.forEach((t=>{const e={type:at.Geometric,position:new h,layer:N,color:this.gameConfig.debug.collidersColor,shape:void 0,radius:void 0,rotation:void 0,vertexModel:void 0};t instanceof x?this.gameConfig.collisions.collisionMethod===exports.CollisionMethods.SAT?(e.shape=t.vertices.length>2?ht.Polygon:ht.Line,e.vertexModel=t.vertices):this.gameConfig.collisions.collisionMethod===exports.CollisionMethods.AABB&&(e.shape=ht.Polygon,e.vertexModel=[new h(t.boundingBox.x,t.boundingBox.y),new h(t.boundingBox.x,t.boundingBox.y1),new h(t.boundingBox.x1,t.boundingBox.y1),new h(t.boundingBox.x1,t.boundingBox.y)]):t instanceof M&&(e.shape=ht.Circumference,e.position.copy(t.position),e.radius=t.radius),this.renderManager.addRenderData(e)}))))))}};Kt=o([i(I.DebugColliderRenderSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.GameConfig))],Kt);let qt=class{constructor(t,e){this.renderManager=t,this.canvas=e,this.viewport={x:0,x1:0,y:0,y1:0},this.object={x:0,x1:0,y:0,y1:0},this.culledRenderData=[]}onUpdate(){this.culledRenderData=[],this.renderManager.getCameraData().forEach((t=>{this.setViewport(t),this.renderManager.getRenderData().filter((e=>t.layers.includes(e.layer))).forEach((t=>{this.isInViewPort(t)&&(t.type===at.Tilemap&&this.applyCullingInTiles(t),this.culledRenderData.push(t))}))})),this.renderManager.setRenderData(this.culledRenderData)}isInViewPort(t){switch(t.type){case at.Video:case at.Darkness:case at.Sprite:this.setObjectForResizeable(t);break;case at.Mask:this.setObjectForMask(t);break;case at.Geometric:this.setObjectForGeometric(t);break;case at.Text:this.setObjectForText(t);break;case at.Tilemap:this.setObjectForTilemap(t)}return this.viewport.x1>=this.object.x&&this.viewport.x<=this.object.x1&&this.viewport.y1>=this.object.y&&this.viewport.y<=this.object.y1}setViewport({position:t,zoom:e}){this.viewport.x=t.x-this.canvas.width/e/2,this.viewport.x1=t.x+this.canvas.width/e/2,this.viewport.y=t.y-this.canvas.height/e/2,this.viewport.y1=t.y+this.canvas.height/e/2}setObjectForResizeable({position:t,width:e,height:i,rotation:s=0,tiled:r}){const o=Math.abs(Math.sin(s)),n=Math.abs(Math.cos(s));r&&(e*=r.x,i*=r.y);const a=o*i+n*e,h=o*e+n*i;this.object.x=t.x-a/2,this.object.x1=t.x+a/2,this.object.y=t.y-h/2,this.object.y1=t.y+h/2}setObjectForText({position:t,text:e,fontSize:i,lineHeight:s,letterSpacing:r,rotation:o}){const n=e.split("\n").reduce(((t,e)=>Math.max(t,e.length)),0)*(i+(null!=r?r:0))*2,a=e.split("\n").length*(null!=s?s:i);this.setObjectForResizeable({position:t,width:n,height:a,rotation:o})}setObjectForGeometric({position:t,vertexModel:e,shape:i,radius:s}){i===ht.Circumference?(this.object.x=t.x-s,this.object.y=t.y-s,this.object.x1=t.x+s,this.object.y1=t.y+s):(this.object.x=Number.MAX_SAFE_INTEGER,this.object.y=Number.MAX_SAFE_INTEGER,this.object.x1=Number.MIN_SAFE_INTEGER,this.object.y1=Number.MIN_SAFE_INTEGER,e.forEach((e=>{this.object.x=Math.min(e.x+t.x,this.object.x),this.object.y=Math.min(e.y+t.y,this.object.y),this.object.x1=Math.max(e.x+t.x,this.object.x1),this.object.y1=Math.max(e.y+t.y,this.object.y1)})))}setObjectForMask({position:t,vertices:e,shape:i,radius:s,rotation:r,width:o,height:n}){i===exports.MaskShape.Circumference?(this.object.x=t.x-s,this.object.y=t.y-s,this.object.x1=t.x+s,this.object.y1=t.y+s):i===exports.MaskShape.Polygon?(this.object.x=Number.MAX_SAFE_INTEGER,this.object.y=Number.MAX_SAFE_INTEGER,this.object.x1=Number.MIN_SAFE_INTEGER,this.object.y1=Number.MIN_SAFE_INTEGER,e.forEach((e=>{this.object.x=Math.min(e.x+t.x,this.object.x),this.object.y=Math.min(e.y+t.y,this.object.y),this.object.x1=Math.max(e.x+t.x,this.object.x1),this.object.y1=Math.max(e.y+t.y,this.object.y1)}))):this.setObjectForResizeable({position:t,width:o,height:n,rotation:r})}setObjectForTilemap(t){t.tilemap.height=Math.ceil(t.tiles.length/t.tilemap.width),this.setObjectForResizeable({position:t.position,width:t.tilemap.width*t.tilemap.tileWidth,height:t.tilemap.height*t.tilemap.tileHeight,rotation:t.rotation})}applyCullingInTiles(t){const{tiles:e,tilemap:{width:i,tileWidth:s,tileHeight:r}}=t;t.tiles=e.map(((t,e)=>this.viewport.x1>=this.object.x+e%i*s&&this.viewport.x<=this.object.x+e%i*s+s&&this.viewport.y1>=this.object.y1-((e/i|0)*r+r)&&this.viewport.y<=this.object.y1-(e/i|0)*r?t:0))}};qt=o([i(I.CullingSystem),n(0,s(t.RenderManager)),n(1,s(t.CanvasElement))],qt);class Jt{constructor(t){this.width=0,this.height=0,this.radius=0,this.vertexModel=[],this.offset=new h,this.rotation=0,this.opacity=1,this.layer=G,this._renderData={type:at.Mask,color:void 0,height:void 0,vertices:[],layer:void 0,opacity:void 0,position:new h,radius:void 0,rotation:void 0,shape:void 0,width:void 0},Object.assign(this,t)}}Jt.componentName="MaskRenderer";let Qt=class{constructor(t,e){this.entityManager=t,this.renderManager=e,this.scaledOffset=new h}onUpdate(){this.entityManager.search(Jt).forEach((({entity:t,component:e})=>{const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("MaskRenderer component needs a Transform");this.scaledOffset.set(e.offset.x*i.localScale.x,e.offset.y*i.localScale.y),h.add(e._renderData.position,i.localPosition,this.scaledOffset),e._renderData.width=e.width*Math.abs(i.localScale.x),e._renderData.height=e.height*Math.abs(i.localScale.y),e._renderData.rotation=i.localRotation+e.rotation,e._renderData.color=e.color,e._renderData.layer=e.layer,e._renderData.opacity=e.opacity,e._renderData.radius=e.radius*Math.max(Math.abs(i.localScale.x),Math.abs(i.localScale.y)),e._renderData.shape=e.shape,e.shape===exports.MaskShape.Polygon&&(e._renderData.vertices.length!==e.vertexModel.length&&(e._renderData.vertices=e.vertexModel.map((()=>new h))),e.vertexModel.forEach(((t,s)=>e._renderData.vertices[s].set(t.x*i.localScale.x,t.y*i.localScale.y))),0!==i.localRotation&&e._renderData.vertices.forEach((t=>t.set(t.x*Math.cos(i.localRotation)-t.y*Math.sin(i.localRotation),t.x*Math.sin(i.localRotation)+t.y*Math.cos(i.localRotation))))),0!==i.localRotation&&this.scaledOffset.magnitude>0&&this.translateRenderPosition(e._renderData,i),this.renderManager.addRenderData(e._renderData)}))}translateRenderPosition(t,e){const i=Math.atan2(this.scaledOffset.y,this.scaledOffset.x)+e.localRotation;t.position.set(e.localPosition.x+this.scaledOffset.magnitude*Math.cos(i),e.localPosition.y+this.scaledOffset.magnitude*Math.sin(i))}};Qt=o([i(I.MaskRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager))],Qt);let Zt=class{constructor(t){this.renderManager=t}onUpdate(){this.renderManager.render(),this.renderManager.removeCameraData(),this.renderManager.removeRenderData()}};Zt=o([i(I.RenderSystem),n(0,s(t.RenderManager))],Zt);class te{constructor(t){this.radius=0,this.smooth=!1,this.layer=G,this.intensity=1,this._boundingBox=new l,Object.assign(this,t)}}te.componentName="LightRenderer";class ee{constructor(t){this.width=0,this.height=0,this.color="#000000",this.opacity=1,this.layer=G,this._boundingBox=new l,this._renderData={type:at.Darkness,layer:void 0,color:void 0,opacity:void 0,width:void 0,height:void 0,position:void 0,rotation:void 0,lights:[]},Object.assign(this,t)}}ee.componentName="DarknessRenderer";let ie=class{constructor(t,e){this.entityManager=t,this.renderManager=e}onUpdate(){const t=this.entityManager.search(te);t.forEach((({entity:t,component:e})=>this.updateLightRendererBoundingBox(t,e))),this.entityManager.search(ee).forEach((({entity:e,component:i})=>{this.updatDarknessRendererBoundingBox(e,i),i._renderData.layer=i.layer,i._renderData.color=i.color,i._renderData.opacity=i.opacity,i._renderData.width=i._boundingBox.width,i._renderData.height=i._boundingBox.height,i._renderData.position=i._boundingBox.center,i._renderData.rotation=0,i._renderData.lights=[],i._renderData.lights=t.filter((({component:t})=>t.layer===i.layer&&t._boundingBox.intersects(i._boundingBox))).map((({component:{_boundingBox:t,smooth:e,intensity:i}})=>({position:t.center,radius:t.width/2,smooth:e,intensity:i}))),this.renderManager.addRenderData(i._renderData)}))}updateLightRendererBoundingBox(t,e){const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("LightRenderer component needs a Transform");const s=e.radius*Math.abs(Math.max(i.localScale.x,i.localScale.y));e._boundingBox.set(i.localPosition.x-s,i.localPosition.y-s,2*s,2*s)}updatDarknessRendererBoundingBox(t,e){const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("DarknessRenderer component needs a Transform");const s=e.width*Math.abs(i.localScale.x),r=e.height*Math.abs(i.localScale.y);e._boundingBox.set(i.localPosition.x-s/2,i.localPosition.y-r/2,s,r)}};ie=o([i(I.DarknessLightRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager))],ie);let se=class{constructor(t,e,i){this.entityManager=t,this.renderManager=e,this.assetManager=i,this.scaledOffset=new h}onUpdate(){this.entityManager.search(Vt).forEach((({component:t,entity:e})=>{var i,s,r,o,n,a;const l=this.entityManager.getComponent(e,V);if(!l)throw new Error("SpriteRenderer component needs a Transform");if("string"==typeof t.image&&(t.image=this.assetManager.getImage(t.image),!t.image))throw new Error(`Asset ${t.image} not found`);t.image&&t.image.complete&&(this.scaledOffset.set(t.offset.x*l.localScale.x,t.offset.y*l.localScale.y),h.add(t._renderData.position,l.localPosition,this.scaledOffset),t._renderData.width=(null!==(r=null!==(i=t.width)&&void 0!==i?i:null===(s=t.slice)||void 0===s?void 0:s.width)&&void 0!==r?r:t.image.naturalWidth)*Math.abs(t.scale.x*l.localScale.x),t._renderData.height=(null!==(a=null!==(o=t.height)&&void 0!==o?o:null===(n=t.slice)||void 0===n?void 0:n.height)&&void 0!==a?a:t.image.naturalHeight)*Math.abs(t.scale.y*l.localScale.y),t._renderData.flipHorizontally=t.flipHorizontally!==l.scale.x<0,t._renderData.flipVertically=t.flipVertically!==l.scale.y<0,t._renderData.rotation=l.localRotation+t.rotation,0!==l.localRotation&&this.scaledOffset.magnitude>0&&this.translateRenderPosition(t._renderData,l),t._renderData.image=t.image,t._renderData.layer=t.layer,t._renderData.maskColor=t.maskColor,t._renderData.maskColorMix=t.maskColorMix,t._renderData.opacity=t.opacity,t._renderData.slice=t.slice,t._renderData.smooth=t.smooth,t._renderData.tintColor=t.tintColor,t._renderData.tiled=t.tiled,this.renderManager.addRenderData(t._renderData))}))}translateRenderPosition(t,e){const i=Math.atan2(this.scaledOffset.y,this.scaledOffset.x)+e.localRotation;t.position.set(e.localPosition.x+this.scaledOffset.magnitude*Math.cos(i),e.localPosition.y+this.scaledOffset.magnitude*Math.sin(i))}};se=o([i(I.SpriteRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.AssetManager))],se);const re={charRanges:[32,126,161,255],fontSize:64,spacing:8};class oe{constructor(t){this.color="#000000",this.flipHorizontally=!1,this.flipVertically=!1,this.font="Arial",this.fontSize=16,this.height=16,this.layer=G,this.letterSpacing=0,this.lineHeight=void 0,this.offset=new h,this.opacity=1,this.orientation=exports.TextOrientation.Center,this.rotation=0,this.shadow=void 0,this.smooth=!1,this.text="Hello World!",this.textureAtlas=Object.assign({},re),this.width=160,this._renderData={color:void 0,flipHorizontally:!1,flipVertically:!1,font:void 0,fontSize:void 0,layer:void 0,letterSpacing:void 0,lineHeight:void 0,opacity:void 0,orientation:void 0,position:new h,rotation:void 0,shadow:void 0,smooth:void 0,text:void 0,textureAtlas:Object.assign({},re),type:at.Text},Object.assign(this,t)}}oe.componentName="TextRenderer";let ne=class{constructor(t,e,i){this.entityManager=t,this.renderManager=e,this.assetManager=i,this.scaledOffset=new h}onUpdate(){this.entityManager.search(oe).forEach((({entity:t,component:e})=>{var i;const s=this.entityManager.getComponent(t,V);if(!s)throw new Error("TextRenderer component needs a Transform");if("string"==typeof e.font){const t=this.assetManager.getFont(e.font);t&&(e.font=t)}if(0===e.text.length||e.font instanceof FontFace&&"loaded"!==e.font.status)return;this.scaledOffset.set(e.offset.x*s.localScale.x,e.offset.y*s.localScale.y),h.add(e._renderData.position,s.localPosition,this.scaledOffset),e._renderData.layer=e.layer,e._renderData.font=e.font,e._renderData.fontSize=e.fontSize,e._renderData.text=this.crop(e),e._renderData.orientation=e.orientation,e._renderData.color=e.color,e._renderData.lineHeight=null!==(i=e.lineHeight)&&void 0!==i?i:e.fontSize,e._renderData.letterSpacing=e.letterSpacing,e._renderData.smooth=e.smooth,e._renderData.rotation=s.localRotation+e.rotation,e._renderData.opacity=e.opacity;const{charRanges:r,fontSize:o,spacing:n}=e.textureAtlas;r&&(e._renderData.textureAtlas.charRanges=e.textureAtlas.charRanges),o&&(e._renderData.textureAtlas.fontSize=e.textureAtlas.fontSize),n&&(e._renderData.textureAtlas.spacing=e.textureAtlas.spacing),e._renderData.flipHorizontally=e.flipHorizontally,e._renderData.flipVertically=e.flipVertically,e._renderData.shadow=e.shadow,0!==s.localRotation&&this.scaledOffset.magnitude>0&&this.translateRenderPosition(e._renderData,s),this.renderManager.addRenderData(e._renderData)}))}translateRenderPosition(t,e){const i=Math.atan2(this.scaledOffset.y,this.scaledOffset.x)+e.localRotation;t.position.set(e.localPosition.x+this.scaledOffset.magnitude*Math.cos(i),e.localPosition.y+this.scaledOffset.magnitude*Math.sin(i))}crop({fontSize:t,height:e,width:i,text:s,letterSpacing:r,lineHeight:o}){if(t>e)return"";const n=[];let a=0;for(const h of s.split("\n")){const s=h.split(/(\s+)/).reduce(((e,s)=>{const o=e.length-1,n=e[o]+s;return n.length*(t+r)>i?e.push(s):e[o]=n,e}),[""]);for(const t of s){if(a+=o,a>e)return n.join("\n");n.push(t)}}return n.join("\n")}};ne=o([i(I.TextRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.AssetManager))],ne);let ae=class{constructor(t,e,i){this.entityManager=t,this.renderManager=e,this.assetManager=i}onUpdate(){this.entityManager.search(Bt).forEach((({entity:t,component:e})=>{const i=this.entityManager.getComponent(t,V);if(!i)throw new Error("TilemapRenderer component needs a Transform");if("string"==typeof e.tileset.image&&(e.tileset.image=this.assetManager.getImage(e.tileset.image),!e.tileset.image))throw new Error(`Asset ${e.tileset.image} not found`);e._processed&&e.tileset.image&&e.tileset.image.complete&&e.chunks.forEach(((t,s)=>{e._renderData[s]||(e._renderData[s]=he());const r=e._renderData[s];r.type=at.Tilemap,r.orientation=exports.TilemapOrientation.Center,r.position=new h,r.layer=e.layer,r.tilemap.width=t.width,r.tilemap.height=Math.ceil(e.data.length/t.width),r.tilemap.tileWidth=e.tileWidth*Math.abs(i.localScale.x),r.tilemap.tileHeight=e.tileHeight*Math.abs(i.localScale.y),r.tilemap.realWidth=r.tilemap.width*r.tilemap.tileWidth,r.tilemap.realHeight=r.tilemap.height*r.tilemap.tileHeight,r.tiles=t.data,r.tileset=e.tileset,r.opacity=e.opacity,r.rotation=i.localRotation,r.tintColor=e.tintColor,r.smooth=e.smooth,r.maskColor=e.maskColor,r.maskColorMix=e.maskColorMix,r.position.x=i.localPosition.x+(t.x-e.width/2+t.width/2)*r.tilemap.tileWidth,r.position.y=i.localPosition.y+(e.height/2-t.y-t.height/2)*r.tilemap.tileHeight,this.renderManager.addRenderData(r)}))}))}};ae=o([i(I.TilemapRendererSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.AssetManager))],ae);const he=()=>({type:at.Tilemap,layer:void 0,position:new h,tilemap:{height:void 0,realHeight:void 0,realWidth:void 0,tileHeight:void 0,tileWidth:void 0,width:void 0},tiles:void 0,tileset:void 0});var le;exports.RigidBodyType=void 0,(le=exports.RigidBodyType||(exports.RigidBodyType={}))[le.Dynamic=0]="Dynamic",le[le.Kinematic=1]="Kinematic",le[le.Static=2]="Static";class ce{constructor(t){this.type=exports.RigidBodyType.Dynamic,this.velocity=new h,this.gravity=0,this.acceleration=new h,Object.assign(this,t)}}ce.componentName="RigidBody";let de=class{constructor(t,e,i){this.entityManager=t,this.timeManager=e,this.transformSystem=i,this.types=new Set([exports.RigidBodyType.Dynamic,exports.RigidBodyType.Kinematic]),this.displacement=new h,this.totalAcceleration=new h,this.scaledAcceleration=new h,this.scaledVelocity=new h}onUpdate(){this.entityManager.search(ce).filter((({component:{type:t}})=>this.types.has(t))).forEach((({component:{velocity:t,acceleration:e,gravity:i,type:s},entity:r})=>{const{position:o}=this.entityManager.getComponent(r,V);s===exports.RigidBodyType.Dynamic?(this.totalAcceleration.y=e.y-i,this.totalAcceleration.x=e.x):this.totalAcceleration.copy(e),h.add(t,t,h.scale(this.scaledAcceleration,this.totalAcceleration,this.timeManager.physicsDeltaTime)),h.add(o,o,h.add(this.displacement,h.scale(this.scaledVelocity,t,this.timeManager.physicsDeltaTime),h.scale(this.scaledAcceleration,this.totalAcceleration,.5*Math.pow(this.timeManager.physicsDeltaTime,2))))})),this.transformSystem.onUpdate()}};de=o([i(I.ApplyVelocitySystem),n(0,s(t.EntityManager)),n(1,s(t.TimeManager)),n(2,s(I.TransformSystem))],de);class ge{constructor(){this.auxMin=new h,this.auxMax=new h,this.auxScaledOffset=new h}updatePositionAndVertices(t,e,i){this.translatePosition(t,e,i),t instanceof x?(this.auxAngle=t.rotation+i.localRotation,t.vertexModel.forEach(((e,s)=>t.vertices[s].set(e.x*i.localScale.x,e.y*i.localScale.y))),t.vertices.forEach((e=>e.set(e.x*Math.cos(this.auxAngle)-e.y*Math.sin(this.auxAngle)+t.position.x,e.x*Math.sin(this.auxAngle)+e.y*Math.cos(this.auxAngle)+t.position.y)))):t instanceof M&&(t.radius*=Math.max(Math.abs(i.localScale.x),Math.abs(i.localScale.y)))}translatePosition(t,e,{localPosition:i,localScale:s,localRotation:r}){if(this.auxScaledOffset.set(e.x*s.x,e.y*s.y),0!==r){const e=Math.atan2(this.auxScaledOffset.y,this.auxScaledOffset.x)+r;t.position.set(i.x+this.auxScaledOffset.magnitude*Math.cos(e),i.y+this.auxScaledOffset.magnitude*Math.sin(e))}else h.add(t.position,i,this.auxScaledOffset)}updateBoundingBox(t){t instanceof M?this.updateCircumferenceBoundingBox(t):t instanceof x&&this.updatePolygonBoundingBox(t)}updateCircumferenceBoundingBox(t){t.boundingBox.set(t.position.x-t.radius,t.position.y-t.radius,2*t.radius,2*t.radius)}updatePolygonBoundingBox(t){this.auxMin.x=t.vertices[0].x,this.auxMin.y=t.vertices[0].y,this.auxMax.x=t.vertices[0].x,this.auxMax.y=t.vertices[0].y,t.vertices.forEach((t=>{this.auxMin.x=Math.min(t.x,this.auxMin.x),this.auxMin.y=Math.min(t.y,this.auxMin.y),this.auxMax.x=Math.max(t.x,this.auxMax.x),this.auxMax.y=Math.max(t.y,this.auxMax.y)})),t.boundingBox.set(this.auxMin.x,this.auxMin.y,this.auxMax.x-this.auxMin.x,this.auxMax.y-this.auxMin.y)}updateProjectionAxes(t){var e;if(t.vertices.length>2)for(let i=0;i<t.vertices.length;i++)h.normal(t.projectionAxes[i],h.subtract(t.projectionAxes[i],null!==(e=t.vertices[i+1])&&void 0!==e?e:t.vertices[0],t.vertices[i]));else h.normal(t.projectionAxes[0],h.subtract(t.projectionAxes[0],t.vertices[1],t.vertices[0]))}}let pe=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){this.entityManager.search(zt).forEach((({component:t,entity:e})=>{0===t.shapes.length&&(t.shapes[0]=new M(t.radius)),t.shapes[0].radius=t.radius,this.updatePositionAndVertices(t.shapes[0],t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(t.shapes[0]),this.updateProjectionAxes(t.shapes[0])}))}};pe=o([i(I.UpdateBallColliderShapeSystem),n(0,s(t.EntityManager))],pe);let me=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){this.entityManager.search(Ht).forEach((({component:t,entity:e})=>{0===t.shapes.length&&(t.shapes[0]=new x([new h,new h,new h,new h])),t.shapes[0].rotation=t.rotation,t.shapes[0].vertexModel[0].set(-t.width/2,-t.height/2),t.shapes[0].vertexModel[1].set(-t.width/2,t.height/2),t.shapes[0].vertexModel[2].set(t.width/2,t.height/2),t.shapes[0].vertexModel[3].set(t.width/2,-t.height/2),this.updatePositionAndVertices(t.shapes[0],t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(t.shapes[0]),this.updateProjectionAxes(t.shapes[0])}))}};me=o([i(I.UpdateBoxColliderShapeSystem),n(0,s(t.EntityManager))],me);let ue=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){this.entityManager.search(Yt).forEach((({component:t,entity:e})=>{for(let i=0;i<t.vertexModel.length-1;i++)t.shapes[i]||(t.shapes[i]=new x([new h,new h])),t.shapes[i].rotation=t.rotation,t.shapes[i].vertexModel=[t.vertexModel[i],t.vertexModel[i+1]],this.updatePositionAndVertices(t.shapes[i],t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(t.shapes[i]),this.updateProjectionAxes(t.shapes[i])}))}};ue=o([i(I.UpdateEdgeColliderShapeSystem),n(0,s(t.EntityManager))],ue);let ye=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){this.entityManager.search(Xt).forEach((({component:t,entity:e})=>{0===t.shapes.length&&(t.shapes[0]=new x([])),t.shapes[0].rotation=t.rotation,t.shapes[0].vertexModel=t.vertexModel,this.updatePositionAndVertices(t.shapes[0],t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(t.shapes[0]),this.updateProjectionAxes(t.shapes[0])}))}};ye=o([i(I.UpdatePolygonColliderShapeSystem),n(0,s(t.EntityManager))],ye);let fe=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){this.entityManager.search($t).forEach((({component:t,entity:e})=>{const i=this.entityManager.getComponent(e,Bt);if(i&&0!==i.data.length){0===t.shapes.length&&(t.composite?this.useEdges(t,i):this.useBoxes(t,i));for(const i of t.shapes)this.updatePositionAndVertices(i,t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(i),this.updateProjectionAxes(i)}}))}useBoxes(t,e){t.shapes=[],e.data.forEach(((i,s)=>{if(!this.needsCollider(i,s,e))return;const r=new x(this.generateRectangleVertices(s,e));r.updateCollisions=!1,t.shapes.push(r)}))}generateRectangleVertices(t,{width:e,height:i,tileWidth:s,tileHeight:r}){const o=-e*s/2+t%e*s,n=i*r/2-Math.floor(t/e)*r;return[new h(o,n-r),new h(o,n),new h(o+s,n),new h(o+s,n-r)]}needsCollider(t,e,{data:i,width:s,height:r}){return 0!==t&&this.getNeighbors(e,s,r).some((t=>!t||!i[t]||0===i[t]))}useEdges(t,e){t.shapes=[];const i=[],s=[];let r,o;e.data.forEach(((t,r)=>{if(0===t)return;const o=r%e.width,n=Math.floor(r/e.width);i[n]||(i[n]=[]),i[n+1]||(i[n+1]=[]),s[n]||(s[n]=[]),s[n+1]||(s[n+1]=[]);const a=this.getNeighbors(r,e.width,e.height);this.hasTile(a[0],e)||(i[n][o]=!0),this.hasTile(a[2],e)||(i[n+1][o]=!0),this.hasTile(a[1],e)||(s[n][o]=!0),this.hasTile(a[3],e)||(s[n][o+1]=!0)}));for(let s=0;s<i.length;s++)if(i[s])for(let n=0;n<i[s].length;n++)!r||!o||s===o.y&&i[s][n]||(t.shapes.push(this.createEdge(r,o,e)),r=void 0,o=void 0),i[s][n]&&(r||(r=new h(n,s)),o=new h(n+1,s));r&&o&&t.shapes.push(this.createEdge(r,o,e)),r=void 0,o=void 0;for(let i=0;i<=e.width;i++)for(let n=0;n<s.length;n++)s[n]&&(!r||!o||i===o.x&&s[n][i]||(t.shapes.push(this.createEdge(r,o,e)),r=void 0,o=void 0),s[n][i]&&(r||(r=new h(i,n)),o=new h(i,n+1)));r&&o&&t.shapes.push(this.createEdge(r,o,e))}hasTile(t,{data:e}){return void 0!==t&&e[t]&&e[t]>0}createEdge(t,e,{width:i,height:s,tileWidth:r,tileHeight:o}){t.x=-i*r/2+t.x*r,t.y=s*o/2-t.y*o,e.x=-i*r/2+e.x*r,e.y=s*o/2-e.y*o;const n=new x([new h(t.x,t.y),new h(e.x,e.y)]);return n.updateCollisions=!1,n}getNeighbors(t,e,i){return[t-e>=0?t-e:void 0,t%e>0?t-1:void 0,t+e<=e*i?t+e:void 0,t%e<e-1?t+1:void 0]}};fe=o([i(I.UpdateTilemapColliderShapeSystem),n(0,s(t.EntityManager))],fe);let xe=class{constructor(t,e,i,s,r){this.entityManager=t,this.broadPhaseResolver=e,this.collisionMatrix=i,this.collisionResolutionMethod=s,this.collisionRepository=r,this.colliderTypes=[zt,Ht,Xt,Yt,$t],this.colliders=[],this.collisions=new Set,this.shapes=[]}onUpdate(){this.collisionRepository.removeAll(),this.colliders=[],this.collisions.clear(),this.shapes=[],this.colliderTypes.forEach((t=>this.entityManager.search(t).forEach((({component:t,entity:e})=>{this.colliders.push(t),t.shapes.forEach((i=>{var s;i.entity=e,i.collider=this.colliders.length-1,i.id=this.shapes.length,i.ignoreCollisionsWithLayers=null!==(s=t.ignoreCollisionsWithLayers)&&void 0!==s?s:[],i.layer=t.layer,this.shapes.push(i)}))})))),this.broadPhaseResolver.update(this.shapes),this.shapes.filter((t=>t.updateCollisions)).forEach((t=>this.narrowPhase(t,this.broadPhase(t))))}broadPhase({boundingBox:t,layer:e}){return this.collisionMatrix?this.broadPhaseResolver.retrieve(t).map((t=>this.shapes[t])).filter((t=>this.collisionMatrix.some((i=>i[0]===e&&i[1]===t.layer||i[1]===e&&i[0]===t.layer)))):this.broadPhaseResolver.retrieve(t).map((t=>this.shapes[t]))}narrowPhase(t,e){e.filter((e=>t.entity!==e.entity&&t.id!==e.id&&!t.ignoreCollisionsWithLayers.includes(e.layer)&&!e.ignoreCollisionsWithLayers.includes(t.layer)&&!this.isResolved(t,e))).forEach((e=>{const i=this.collisionResolutionMethod.findCollision(t,e);i&&(this.collisionRepository.persist({localCollider:this.colliders[t.collider],localEntity:t.entity,remoteCollider:this.colliders[e.collider],remoteEntity:e.entity,resolution:i}),this.collisionRepository.persist({localCollider:this.colliders[e.collider],localEntity:e.entity,remoteCollider:this.colliders[t.collider],remoteEntity:t.entity,resolution:{direction:h.scale(new h,i.direction,-1),penetration:i.penetration}}),this.collisions.add(`${t.id}-${e.id}`),this.collisions.add(`${e.id}-${t.id}`))}))}isResolved(t,e){return this.collisions.has(`${t.id}-${e.id}`)}};xe=o([i(I.ResolveCollisionSystem),n(0,s(t.EntityManager)),n(1,s(t.CollisionBroadphaseResolver)),n(2,s(t.CollisionMatrix)),n(3,s(t.CollisionResolutionMethod)),n(4,s(t.CollisionRepository))],xe);let Me=class{constructor(t,e,i){this.entityManager=t,this.collisionRepository=e,this.transformSystem=i,this.correction=new h,this.maxCorrection=new h}onUpdate(){const t=this.collisionRepository.findAll().filter((({localCollider:t,remoteCollider:e,remoteEntity:i,localEntity:s})=>t.physics&&e.physics&&this.entityManager.hasComponent(s,ce)&&this.entityManager.hasComponent(i,ce)));0!==t.length&&(this.entityManager.search(ce,(t=>t.type===exports.RigidBodyType.Dynamic)).forEach((({component:e,entity:i})=>{if(this.maxCorrection.set(0,0),t.filter((({localEntity:t})=>i===t)).forEach((({remoteEntity:t,resolution:{direction:e,penetration:i}})=>{this.entityManager.getComponent(t,ce).type===exports.RigidBodyType.Dynamic&&(i/=2),h.scale(this.correction,e,-i),this.correction.magnitude>this.maxCorrection.magnitude&&this.maxCorrection.copy(this.correction)})),0===this.maxCorrection.x&&0===this.maxCorrection.y)return;const{position:s}=this.entityManager.getComponent(i,V);h.add(s,s,this.maxCorrection),e.gravity>0&&this.maxCorrection.y*e.velocity.y<0&&(e.velocity.y=0)})),this.transformSystem.onUpdate())}};Me=o([i(I.ApplyRepositionSystem),n(0,s(t.EntityManager)),n(1,s(t.CollisionRepository)),n(2,s(I.TransformSystem))],Me);let ve=class extends ge{constructor(t){super(),this.entityManager=t}onUpdate(){const t=this.entityManager.search(ce,(t=>t.type===exports.RigidBodyType.Dynamic)).map((({entity:t})=>t));[zt,Ht,Xt,Yt,$t].forEach((e=>this.entityManager.search(e,((e,i)=>t.includes(i))).forEach((({component:t,entity:e})=>t.shapes.forEach((i=>{this.updatePositionAndVertices(i,t.offset,this.entityManager.getComponent(e,V)),this.updateBoundingBox(i)}))))))}};ve=o([i(I.UpdateCollidersAfterRepositionSystem),n(0,s(t.EntityManager))],ve);const Ce=24;let Se=class{constructor(t,e,i,s,r){this.entityManager=t,this.renderManager=e,this.inputManager=i,this.canvas=s,this.gameConfig=r,this.positionInViewport=new h,this.positionInCameraViewport=new h,this.positionInWorldspace=new h,this.renderDataPerCamera=new Map}onUpdate(){var t;if(!(null===(t=this.gameConfig.debug)||void 0===t?void 0:t.mousePosition)||!this.inputManager.mouse)return;const{positionInViewport:e}=this.inputManager.mouse;this.entityManager.search(W,(t=>t.debug)).forEach((({entity:t,component:i},s)=>{var r;const{zoom:o}=i,n=this.entityManager.getComponent(t,V).position,a=null!==(r=this.renderDataPerCamera.get(s))&&void 0!==r?r:be();h.floor(this.positionInWorldspace,h.add(this.positionInWorldspace,n,h.scale(this.positionInWorldspace,e,1/o))),h.floor(this.positionInCameraViewport,h.scale(this.positionInCameraViewport,e,1/o)),h.round(this.positionInViewport,e),a.color=this.gameConfig.debug.textColor,a.text=`mouse_position: canvas_viewport=${this.positionInViewport}, camera_viewport=${this.positionInCameraViewport}, world_space=${this.positionInWorldspace}`,a.fontSize=Ce/o,a.shadow.offset.x=2/o,a.shadow.offset.y=-2/o,this.updateRenderDataPosition(a,n,o),this.renderManager.addRenderData(a)}))}updateRenderDataPosition(t,e,i){switch(this.gameConfig.debug.textPosition){case"top-left":t.position.set(e.x-(this.canvas.width/2-Ce)/i,e.y+(this.canvas.height/2-Ce)/i);break;case"top-right":t.position.set(e.x+(this.canvas.width/2-t.text.length/2*Ce)/i,e.y+(this.canvas.height/2-Ce)/i);break;case"bottom-left":default:t.position.set(e.x-(this.canvas.width/2-Ce)/i,e.y-(this.canvas.height/2-Ce)/i);break;case"bottom-right":t.position.set(e.x+(this.canvas.width/2-t.text.length/2*Ce)/i,e.y-(this.canvas.height/2-Ce)/i)}}};Se=o([i(I.DebugMousePositionSystem),n(0,s(t.EntityManager)),n(1,s(t.RenderManager)),n(2,s(t.InputManager)),n(3,s(t.CanvasElement)),n(4,s(t.GameConfig))],Se);const be=(t=24)=>({type:at.Text,text:"",position:new h,layer:N,color:"#00FF00",fontSize:t,font:"Arial",shadow:{color:"#000000",opacity:1,offset:new h(1,-1)},orientation:exports.TextOrientation.RightCenter,flipHorizontally:!1,flipVertically:!1,letterSpacing:0,lineHeight:t,opacity:1,rotation:0,smooth:!1,textureAtlas:Object.assign({},re)}),Ae=new Map([[k.PreGameLogic,[{name:I.KeyboardSystem,type:Lt},{name:I.MouseSystem,type:jt},{name:I.TouchScreenSystem,type:kt},{name:I.GamepadSystem,type:It},{name:I.ButtonSystem,type:_t},{name:I.AudioPlayerSystem,type:j},{name:I.TiledWrapperSystem,type:Pt},{name:I.TilemapPreProcessingSystem,type:Ft}]],[k.Transform,[{name:I.TransformSystem,type:Ut}]],[k.Physics,[{name:I.ApplyVelocitySystem,type:de},{name:I.UpdateBallColliderShapeSystem,type:pe},{name:I.UpdateBoxColliderShapeSystem,type:me},{name:I.UpdateEdgeColliderShapeSystem,type:ue},{name:I.UpdatePolygonColliderShapeSystem,type:ye},{name:I.UpdateTilemapColliderShapeSystem,type:fe},{name:I.ResolveCollisionSystem,type:xe},{name:I.ApplyRepositionSystem,type:Me},{name:I.UpdateCollidersAfterRepositionSystem,type:ve}]],[k.Render,[{name:I.AnimatorSystem,type:Gt},{name:I.CameraSystem,type:Nt},{name:I.TilemapRendererSystem,type:ae},{name:I.SpriteRendererSystem,type:se},{name:I.MaskRendererSystem,type:Qt},{name:I.DarknessLightRendererSystem,type:ie},{name:I.TextRendererSystem,type:ne},{name:I.VideoRendererSystem,type:wt},{name:I.DebugColliderRenderSystem,type:Kt},{name:I.DebugMousePositionSystem,type:Se},{name:I.CullingSystem,type:qt},{name:I.ClearScreenSystem,type:Wt},{name:I.RenderSystem,type:Zt}]]]);let we=class{constructor(t,e,i){this.timeManager=t,this.systemManager=e,this.sceneManager=i,this.running=!1,this.gameLoopAccumulator=0}start(){this.running||(this.running=!0,this.gameLoopAccumulator=0,this.enableSystems(),this.sceneManager.loadOpeningScene(),this.requestAnimationLoop(window.performance.now()),this.asyncPhysicsLoop())}enableSystems(){Ae.forEach((t=>{t.forEach((({type:t})=>this.systemManager.enableSystem(t)))}))}stop(){this.running&&(this.systemManager.disableAllSystems(),this.running=!1)}requestAnimationLoop(t){this.running&&(this.timeManager.updateForRender(.001*t),this.sceneManager.update(),this.sceneManager.loadingScene||(this.gameLoopAccumulator+=this.timeManager.browserDeltaTime,this.sceneManager.sceneLoadedThisFrame&&(this.gameLoopAccumulator=this.timeManager.fixedGameDeltaTime),this.gameLoopAccumulator>=this.timeManager.fixedGameDeltaTime&&(this.gameLogicIteration(.001*t),this.gameLoopAccumulator-=this.timeManager.fixedGameDeltaTime),this.renderIteration()),window.requestAnimationFrame((t=>this.requestAnimationLoop(t))))}gameLogicIteration(t){this.timeManager.updateForGame(t),this.systemManager.update(k.PreGameLogic),this.systemManager.update(k.GameLogic),this.timeManager.updateIntervals(),this.systemManager.update(k.Transform)}renderIteration(){this.systemManager.groupHasSystems(k.GamePreRender)&&(this.systemManager.update(k.GamePreRender),this.systemManager.update(k.Transform)),this.systemManager.update(k.Render)}asyncPhysicsLoop(){this.physicsIntervalId=window.setInterval((()=>{if(!this.running)return window.clearInterval(this.physicsIntervalId);this.timeManager.updateForPhysics(.001*window.performance.now()),document.hidden||this.physicsIteration()}),1e3/this.timeManager.fixedPhysicsFramerate)}physicsIteration(){this.timeManager.timeScale<=0||(this.systemManager.groupHasSystems(k.GamePhysics)&&(this.systemManager.update(k.GamePhysics),this.systemManager.update(k.Transform)),this.systemManager.update(k.Physics))}};we=o([i(t.LoopManager),n(0,s(t.TimeManager)),n(1,s(t.SystemManager)),n(2,s(t.SceneManager))],we);class Ee{constructor(t,e){this.container=t,this.systemManager=e,this.lastSystemTypeId=0}createSystemIfNotExists(t){if(this.systemManager.hasSystem(t))return;const e="__system_"+this.lastSystemTypeId++;var i;this.container.add(t,e),this.systemManager.addSystem(this.container.get(e),null!==(i=t.prototype.__system_group)&&void 0!==i?i:k.GameLogic)}}let Re=class{constructor(t){this.webGLManager=t,this.renderData=[],this.cameraData=[]}addCameraData(t){this.cameraData.push(t)}addRenderData(t){this.renderData.push(t)}setRenderData(t){this.renderData=t}getCameraData(){return this.cameraData}getRenderData(){return this.renderData}removeCameraData(){this.cameraData=[]}removeRenderData(){this.renderData=[]}render(){this.cameraData.sort(((t,e)=>t.depth-e.depth)).forEach((t=>this.renderData.filter((e=>t.layers.includes(e.layer))).sort(((e,i)=>t.layers.indexOf(e.layer)-t.layers.indexOf(i.layer))).forEach((e=>this.webGLManager.render(e,t)))))}};Re=o([i(t.RenderManager),n(0,s(t.WebGLManager))],Re);const _e=t=>{var e,i,s,r,o,n,a,h,l,c,d;if(!(t.containerNode instanceof HTMLElement))throw new Error("GameConfig Error: Invalid containerNode");if("number"!=typeof t.width)throw new Error("GameConfig Error: Invalid width");if("number"!=typeof t.height)throw new Error("GameConfig Error: Invalid height");t.canvasColor=null!==(e=t.canvasColor)&&void 0!==e?e:"#000000",t.physicsFramerate=null!==(i=t.physicsFramerate)&&void 0!==i?i:180,t.headless=null!==(s=t.headless)&&void 0!==s&&s,t.debug=null!==(r=t.debug)&&void 0!==r?r:{colliders:!1,mousePosition:!1},t.debug.collidersColor=null!==(o=t.debug.collidersColor)&&void 0!==o?o:"#00FF00",t.debug.textColor=null!==(n=t.debug.textColor)&&void 0!==n?n:"#00FF00",t.debug.textPosition=null!==(a=t.debug.textPosition)&&void 0!==a?a:"bottom-left",t.collisions=null!==(h=t.collisions)&&void 0!==h?h:{},t.collisions.collisionBroadPhaseMethod=null!==(l=t.collisions.collisionBroadPhaseMethod)&&void 0!==l?l:exports.BroadPhaseMethods.SpartialGrid,t.collisions.collisionMatrix=null!==(c=t.collisions.collisionMatrix)&&void 0!==c?c:void 0,t.collisions.collisionMethod=null!==(d=t.collisions.collisionMethod)&&void 0!==d?d:exports.CollisionMethods.SAT},Te=({containerNode:t,width:e,height:i})=>{const s=document.createElement("canvas");return s.id="angryPixelGameCanvas",s.width=Math.floor(e),s.height=Math.floor(i),s.tabIndex=0,s.addEventListener("contextmenu",(t=>t.preventDefault())),t.appendChild(s),s.focus(),s},Be=e=>{e.add(exports.EntityManager),e.add(exports.SystemManager),e.set(t.CreateSystemService,new Ee(e,e.get(t.SystemManager))),e.add(exports.TimeManager),e.add(exports.AssetManager),e.add(exports.InputManager),e.add(exports.SceneManager),e.add(exports.InputManager),e.add(we),e.add(St),e.add(Re)},Pe=e=>{e.get(t.GameConfig).headless&&De(Ae),Ae.forEach(((i,s)=>i.forEach((({type:i,name:r})=>{e.add(i),e.get(t.SystemManager).addSystem(e.get(r),s)}))))},De=t=>{t.delete(k.Render),t.set(k.PreGameLogic,t.get(k.PreGameLogic).filter((({name:t})=>![I.AudioPlayerSystem,I.ButtonSystem,I.GamepadSystem,I.KeyboardSystem,I.MouseSystem,I.TouchScreenSystem].includes(t))))},Fe=e=>{const{collisions:{collisionBroadPhaseMethod:i,collisionMatrix:s,collisionMethod:r}}=e.get(t.GameConfig);e.add(exports.CollisionRepository),e.add(w),r===exports.CollisionMethods.AABB?(e.add(b),e.add(A)):e.add(E),e.add(i===exports.BroadPhaseMethods.QuadTree?u:f),e.add(r===exports.CollisionMethods.AABB?v:S),e.set(t.CollisionMatrix,s)},Ue=e=>{const i=e.get(t.GameConfig);i.dependencies&&i.dependencies.forEach((([t,i])=>{e.set(t,i)}))};class Ie{onUpdate(){}onCreate(){}onEnabled(){}onDisabled(){}onDestroy(){}}o([s(t.EntityManager)],Ie.prototype,"entityManager",void 0),o([s(t.AssetManager)],Ie.prototype,"assetManager",void 0),o([s(t.SceneManager)],Ie.prototype,"sceneManager",void 0),o([s(t.TimeManager)],Ie.prototype,"timeManager",void 0),o([s(t.InputManager)],Ie.prototype,"inputManager",void 0),o([s(t.CollisionRepository)],Ie.prototype,"collisionRepository",void 0),o([s(t.GameConfig)],Ie.prototype,"gameConfig",void 0);const Le={AssetManager:t.AssetManager,CanvasElement:t.CanvasElement,CollisionRepository:t.CollisionRepository,EntityManager:t.EntityManager,GameConfig:t.GameConfig,InputManager:t.InputManager,SceneManager:t.SceneManager,SystemManager:t.SystemManager,TimeManager:t.TimeManager};exports.Animation=class{constructor(t){var e,i,s;this.slice={size:new h,offset:new h,padding:new h},this.frames=[],this.fps=12,this.loop=!1,t&&(this.image=t.image,this.frames=null!==(e=t.frames)&&void 0!==e?e:this.frames,this.fps=null!==(i=t.fps)&&void 0!==i?i:this.fps,this.loop=null!==(s=t.loop)&&void 0!==s?s:this.loop,t.slice&&(this.slice.size.copy(t.slice.size),t.slice.offset&&this.slice.offset.copy(t.slice.offset),t.slice.padding&&this.slice.padding.copy(t.slice.padding)))}},exports.Animator=Ot,exports.AudioPlayer=U,exports.BallCollider=zt,exports.BoxCollider=Ht,exports.BuiltInDependencyIdentifiers=Le,exports.Button=Et,exports.Camera=W,exports.Circumference=M,exports.DarknessRenderer=ee,exports.EdgeCollider=Yt,exports.Game=class{constructor(i){this.container=(i=>{_e(i);const s=new e;return s.set(t.GameConfig,i),s.set(t.CanvasElement,Te(i)),Fe(s),Be(s),Pe(s),Ue(s),s})(i)}get running(){return this.container.get(t.LoopManager).running}addScene(e,i,s=!1){this.container.get(t.SceneManager).addScene(e,i,s)}addDependencyType(t,e){this.container.add(t,e)}addDependencyInstance(t,e){this.container.set(e,t)}start(){this.container.get(t.LoopManager).start()}stop(){this.container.get(t.LoopManager).stop()}},exports.GameSystem=Ie,exports.GamepadController=_,exports.Keyboard=T,exports.LightRenderer=te,exports.MaskRenderer=Jt,exports.Mouse=B,exports.Polygon=x,exports.PolygonCollider=Xt,exports.Rectangle=l,exports.RigidBody=ce,exports.Scene=class{constructor(t,e){this.entityManager=t,this.assetManager=e,this.systems=[]}registerSystems(){}loadAssets(){}createEntities(){}addSystem(t){this.systems.push(t)}addSystems(t){this.systems.push(...t)}},exports.SpriteRenderer=Vt,exports.TextRenderer=oe,exports.TiledWrapper=Tt,exports.TilemapCollider=$t,exports.TilemapRenderer=Bt,exports.TouchScreen=P,exports.Transform=V,exports.Vector2=h,exports.VideoRenderer=bt,exports.between=p,exports.clamp=c,exports.debugRenderLayer=N,exports.decorate=function(t,e,i){"number"==typeof i?t(e.prototype,void 0,i):void 0!==i?t(e.prototype,i):t(e)},exports.defaultRenderLayer=G,exports.defaultTextureAtlasOptions=re,exports.degreesToRadians=t=>t*(Math.PI/180),exports.disableComponent=t=>({enabled:!1,component:t}),exports.fixedRound=d,exports.gameLogicSystem=function(){return function(t){O(t,k.GameLogic)}},exports.gamePhysicsSystem=function(){return function(t){O(t,k.GamePhysics)}},exports.gamePreRenderSystem=function(){return function(t){O(t,k.GamePreRender)}},exports.inject=s,exports.injectable=i,exports.playSfx=({audioSource:t,volume:e=1,loop:i=!1})=>{t.volume=e,t.loop=i,t.currentTime=0,t.play().catch((t=>console.warn("playSfx error:",t)))},exports.radiansToDegrees=t=>t*(180/Math.PI),exports.randomFloat=(t,e,i=2)=>d(Math.random()*(e-t)+t,i),exports.randomInt=(t,e)=>Math.round(Math.random()*(e-t))+t,exports.range=g,exports.rgbToHex=({r:t,g:e,b:i},s="#")=>{const r=t=>t.toString(16).padStart(2,"0");return`${s}${r(t)}${r(e)}${r(i)}`},exports.stopSfx=t=>{t.pause(),t.currentTime=0};
2
2
  //# sourceMappingURL=index.cjs.js.map