@jael-ecs/core 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class o{_listeners=new Map;on(e,t){if(this.contains(e,t))return;const s=this._listeners.get(e);s?s.add(t):this._listeners.set(e,new Set([t]))}off(e,t){if(!this.contains(e,t))return;const s=this._listeners.get(e);s&&s.delete(t)}once(e,t){const s=i=>{t(i),this.off(e,s)};this.on(e,s)}clearEvent(e){this._listeners.get(e)&&this._listeners.get(e)?.clear()}clearAllEvents(){this._listeners.forEach(e=>e.clear()),this._listeners.clear()}contains(e,t){return this._listeners.get(e)?this._listeners.get(e).has(t):!1}emit(e,t){this._listeners.get(e)&&this._listeners.get(e)?.forEach(s=>{s(t)})}}class c{systemList=[];addSystem(e){this.systemList.push(e),e.init?.(),this.reorder()}reorder(){this.systemList.sort((e,t)=>e.priority-t.priority)}has(e){return this.systemList.indexOf(e)>0}removeSystem(e){if(!this.has(e))return;const t=this.systemList.indexOf(e);t>=0&&(this.systemList.splice(t,1),e.exit?.(),this.reorder())}}class d{denseValues=[];sparse=new Map;[Symbol.iterator](){let e=this.values.length;const t={value:void 0,done:!1};return{next:()=>(t.value=this.values[--e],t.done=e<0,t)}}get values(){return this.denseValues}first(){return this.denseValues[0]}add(e){this.has(e)||(this.denseValues.push(e),this.sparse.set(e,this.denseValues.length-1))}indexOf(e){const t=this.sparse.get(e);return t!==void 0?t:-1}remove(e){if(!this.has(e))return;const t=this.sparse.get(e);this.sparse.delete(e);const s=this.denseValues[this.denseValues.length-1];s!==e&&(this.denseValues[t]=s,this.sparse.set(s,t)),this.denseValues.pop()}forEach(e){for(let t of this)e(t)}size(){return this.denseValues.length}clear(){for(let e of this)this.remove(e)}has(e){return this.sparse.has(e)}}class m{id;_world;constructor(e,t){this.id=t,this._world=e}add(e,t){this._world.addComponent(this.id,e,t)}remove(e){this._world.removeComponent(this.id,e)}has(e){return this._world.componentManager.hasComponent(this.id,e)}get(e){return this._world.componentManager.getComponent(this.id,e)}}class l extends o{entityMap=new d;nextId=0;_world;constructor(e){super(),this._world=e}get entities(){return this.entityMap}create(){const e=this.nextId++;return this.entities.add(e),this.emit("create",e),e}exist(e){return this.entities.has(e)}size(){return this.entities.size()}destroy(e){return this.entities.remove(e),this.emit("destroy",e),e}}class u extends o{componentSet={};world;dirtyEntities=new Set;constructor(e){super(),this.world=e}clearComponentSchema(e){this.componentSet[e]&&delete this.componentSet[e]}addComponent(e,t,s){if(!this.world.exist(e))return;const i=this.componentSet[e];i?i[t]=s:this.componentSet[e]={[t]:s},this.dirtyEntities.add(e),this.emit("add",{entityId:e,component:t})}getComponent(e,t){if(this.hasComponent(e,t))return this.componentSet[e][t]}cleanDirtyEntities(){this.dirtyEntities.clear()}hasComponent(e,t){const s=this.componentSet[e];return s?t in s:!1}removeComponent(e,t){if(!this.componentSet[e])return;const s=this.componentSet[e];s&&s[t]!==void 0&&(delete s[t],Object.keys(s).length===0&&delete this.componentSet[e],this.dirtyEntities.add(e),this.emit("remove",{entityId:e,component:t}))}}class h extends o{config;entityMap;world;lastVersion=0;dirty;constructor(e,t){super(),this.config=e,this.world=t,this.entityMap=new d,this.dirty=!1,this.world.on("entityDestroyed",({entityId:s})=>{this.entityMap.has(s)&&(this.emit("removed",s),this.entityMap.remove(s))})}hasComponents(e){const t=this.world.componentManager;return this.config.include?.every(s=>t.getComponent(e,s))&&this.config.exclude?.every(s=>!t.getComponent(e,s))}size(){return this.ids.size()}get hash(){return h.getHash(this.config)}get ids(){return this.entityMap}get entities(){const e=[];return this.entityMap.forEach(t=>{const s=this.world.getEntity(t);s&&e.push(s)}),e}include(...e){return this.world.include(...e)}exclude(...e){return this.world.exclude(...e)}markDirty(){this.dirty=!0}checkEntities(e){if(!this.dirty||this.world.version===this.lastVersion)return;const t=e||this.world.entityIds;for(let s of t)this.hasComponents(s)&&(this.entityMap.add(s),this.emit("added",s));this.dirty=!1,this.lastVersion=this.world.version}static getHash(e){const t=e.include?.map(n=>n.trim()).filter(n=>n).join("_"),s=e.exclude?.map(n=>n.trim()).filter(n=>n).join("_"),i="in_"+t+"_out_"+s;let a=0;for(const n of i)a=(a<<5)-a+n.charCodeAt(0),a|=0;return a}}class p extends o{_startTime=0;_oldTime=0;_requestId=0;running=!1;delta=0;elapsed=0;constructor(){super()}_loop(){let e=0;if(this.running){const t=performance.now();e=(t-this._oldTime)/1e3,this._oldTime=t,this.elapsed+=e}this.delta=e,this.emit("update"),this._requestId=requestAnimationFrame(this._loop.bind(this))}start(){this._startTime=performance.now(),this._oldTime=this._startTime,this.elapsed=0,this.delta=0,this.running=!0,this._loop()}stop(){this.running=!1,cancelAnimationFrame(this._requestId),this._requestId=0}}let g=new p;class f extends o{entityManager;componentManager;systemManager;queries;version;constructor(){super(),this.entityManager=new l(this),this.componentManager=new u(this),this.systemManager=new c,this.version=0,this.entityManager.on("create",e=>{this.emit("entityCreated",{entityId:e}),this._updateQueries()}),this.entityManager.on("destroy",e=>{this.emit("entityDestroyed",{entityId:e}),this._updateQueries(),this.componentManager.clearComponentSchema(e)}),this.componentManager.on("add",({entityId:e,component:t})=>{this.emit("componentAdded",{entityId:e,component:t}),this._updateQueries()}),this.componentManager.on("remove",({entityId:e,component:t})=>{this.getEntity(e)&&this.emit("componentRemoved",{entityId:e,component:t}),this._updateQueries()}),this.queries=new Map}getEntity(e){return this.exist(e)?new m(this,e):void 0}get entityIds(){return this.entityManager.entities}query(e){const t=h.getHash(e);let i=this.queries.get(t);return i||(i=new h(e,this),this.queries.set(t,i),this._updateQueries()),i}_updateQueries(){const e=this.componentManager.dirtyEntities;this.queries.forEach(t=>{t.markDirty(),e.size>0&&t.checkEntities()}),this.componentManager.cleanDirtyEntities(),this.version++}exist(e){return this.entityManager.exist(e)}include(...e){return this.query({include:e,exclude:[]})}exclude(...e){return this.query({include:[],exclude:e})}create(){return this.entityManager.create()}destroy(e){this.entityManager.destroy(e)}addSystem(e){this.systemManager.addSystem(e)}removeSystem(e){this.systemManager.removeSystem(e)}addComponent(e,t,s){this.componentManager.addComponent(e,t,s)}getComponent(e,t){return this.componentManager.getComponent(e,t)}removeComponent(e,t){this.componentManager.removeComponent(e,t)}update(){this.systemManager.systemList.forEach(e=>{e.update()}),this.emit("updated")}}exports.ComponentManager=u;exports.EntityManager=l;exports.EventRegistry=o;exports.Query=h;exports.SparseSet=d;exports.SystemManager=c;exports.Time=g;exports.World=f;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class o{_listeners=new Map;on(e,t){if(this.contains(e,t))return;const s=this._listeners.get(e);s?s.add(t):this._listeners.set(e,new Set([t]))}off(e,t){if(!this.contains(e,t))return;const s=this._listeners.get(e);s&&s.delete(t)}once(e,t){const s=i=>{t(i),this.off(e,s)};this.on(e,s)}clearEvent(e){this._listeners.get(e)&&this._listeners.get(e)?.clear()}clearAllEvents(){this._listeners.forEach(e=>e.clear()),this._listeners.clear()}contains(e,t){return this._listeners.get(e)?this._listeners.get(e).has(t):!1}emit(e,t){this._listeners.get(e)&&this._listeners.get(e)?.forEach(s=>{s(t)})}}class c{systemList=[];addSystem(e){this.systemList.push(e),e.init?.(),this.reorder()}reorder(){this.systemList.sort((e,t)=>e.priority-t.priority)}has(e){return this.systemList.indexOf(e)>0}removeSystem(e){if(!this.has(e))return;const t=this.systemList.indexOf(e);t>=0&&(this.systemList.splice(t,1),e.exit?.(),this.reorder())}}class d{denseValues=[];sparse=new Map;[Symbol.iterator](){let e=this.values.length;const t={value:void 0,done:!1};return{next:()=>(t.value=this.values[--e],t.done=e<0,t)}}get values(){return this.denseValues}first(){return this.denseValues[0]}add(e){this.has(e)||(this.denseValues.push(e),this.sparse.set(e,this.denseValues.length-1))}indexOf(e){const t=this.sparse.get(e);return t!==void 0?t:-1}remove(e){if(!this.has(e))return;const t=this.sparse.get(e);this.sparse.delete(e);const s=this.denseValues[this.denseValues.length-1];s!==e&&(this.denseValues[t]=s,this.sparse.set(s,t)),this.denseValues.pop()}forEach(e){for(let t of this)e(t)}size(){return this.denseValues.length}clear(){for(let e of this)this.remove(e)}has(e){return this.sparse.has(e)}}class m{id;_world;constructor(e,t){this.id=t,this._world=e}add(e,t){this._world.addComponent(this.id,e,t)}remove(e){this._world.removeComponent(this.id,e)}has(e){return this._world.componentManager.hasComponent(this.id,e)}get(e){return this._world.componentManager.getComponent(this.id,e)}}class l extends o{entityMap=new d;nextId=0;_world;constructor(e){super(),this._world=e}get entities(){return this.entityMap}create(){const e=this.nextId++;return this.entities.add(e),this.emit("create",e),e}exist(e){return this.entities.has(e)}size(){return this.entities.size()}destroy(e){return this.entities.remove(e),this.emit("destroy",e),e}}class u extends o{componentSet={};world;dirtyEntities=new Set;constructor(e){super(),this.world=e}clearComponentSchema(e){this.componentSet[e]&&delete this.componentSet[e]}addComponent(e,t,s){if(!this.world.exist(e))return;const i=this.componentSet[e];i?i[t]=s:this.componentSet[e]={[t]:s},this.dirtyEntities.add(e),this.emit("add",{entityId:e,component:t})}getComponent(e,t){if(this.hasComponent(e,t))return this.componentSet[e][t]}cleanDirtyEntities(){this.dirtyEntities.clear()}hasComponent(e,t){const s=this.componentSet[e];return s?t in s:!1}removeComponent(e,t){if(!this.componentSet[e])return;const s=this.componentSet[e];s&&s[t]!==void 0&&(delete s[t],Object.keys(s).length===0&&delete this.componentSet[e],this.dirtyEntities.add(e),this.emit("remove",{entityId:e,component:t}))}}class h extends o{config;entityMap;world;lastVersion=0;dirty;constructor(e,t){super(),this.config=e,this.world=t,this.entityMap=new d,this.dirty=!1,this.world.on("entityDestroyed",({entityId:s})=>{this.entityMap.has(s)&&(this.emit("removed",s),this.entityMap.remove(s))})}hasComponents(e){const t=this.world.componentManager;return this.config.include?.every(s=>t.getComponent(e,s))&&this.config.exclude?.every(s=>!t.getComponent(e,s))}size(){return this.ids.size()}get hash(){return h.getHash(this.config)}get ids(){return this.entityMap}get entities(){const e=[];return this.entityMap.forEach(t=>{const s=this.world.getEntity(t);s&&e.push(s)}),e}include(...e){return this.world.include(...e)}exclude(...e){return this.world.exclude(...e)}markDirty(){this.dirty=!0}checkEntities(e){if(!this.dirty||this.world.version===this.lastVersion)return;const t=e||this.world.entityIds;for(let s of t)this.hasComponents(s)&&(this.entityMap.add(s),this.emit("added",s));this.dirty=!1,this.lastVersion=this.world.version}static getHash(e){const t=e.include?.map(n=>n.trim()).filter(n=>n).join("_"),s=e.exclude?.map(n=>n.trim()).filter(n=>n).join("_"),i="in_"+t+"_out_"+s;let a=0;for(const n of i)a=(a<<5)-a+n.charCodeAt(0),a|=0;return a}}class p extends o{_startTime=0;_oldTime=0;_requestId=0;running=!1;delta=0;elapsed=0;constructor(){super()}_loop(){let e=0;if(this.running){const t=performance.now();e=(t-this._oldTime)/1e3,this._oldTime=t,this.elapsed+=e}this.delta=e,this.emit("update"),this._requestId=requestAnimationFrame(this._loop.bind(this))}start(){this._startTime=performance.now(),this._oldTime=this._startTime,this.elapsed=0,this.delta=0,this.running=!0,this._loop()}stop(){this.running=!1,cancelAnimationFrame(this._requestId),this._requestId=0}}let g=new p;class f extends o{entityManager;componentManager;systemManager;queries;version;constructor(){super(),this.entityManager=new l(this),this.componentManager=new u(this),this.systemManager=new c,this.version=0,this.entityManager.on("create",e=>{this.emit("entityCreated",{entityId:e}),this._updateQueries()}),this.entityManager.on("destroy",e=>{this.emit("entityDestroyed",{entityId:e}),this._updateQueries(),this.componentManager.clearComponentSchema(e)}),this.componentManager.on("add",({entityId:e,component:t})=>{this.emit("componentAdded",{entityId:e,component:t}),this._updateQueries()}),this.componentManager.on("remove",({entityId:e,component:t})=>{this.getEntity(e)&&this.emit("componentRemoved",{entityId:e,component:t}),this._updateQueries()}),this.queries=new Map}getEntity(e){return this.exist(e)?new m(this,e):void 0}get entityIds(){return this.entityManager.entities}query(e){const t=h.getHash(e);let i=this.queries.get(t);return i||(i=new h(e,this),this.queries.set(t,i),this._updateQueries()),i}_updateQueries(){const e=this.componentManager.dirtyEntities;this.queries.forEach(t=>{t.markDirty(),t.checkEntities(e.size>0?e:void 0)}),this.componentManager.cleanDirtyEntities(),this.version++}exist(e){return this.entityManager.exist(e)}include(...e){return this.query({include:e,exclude:[]})}exclude(...e){return this.query({include:[],exclude:e})}create(){return this.entityManager.create()}destroy(e){this.entityManager.destroy(e)}addSystem(e){this.systemManager.addSystem(e)}removeSystem(e){this.systemManager.removeSystem(e)}addComponent(e,t,s){this.componentManager.addComponent(e,t,s)}getComponent(e,t){return this.componentManager.getComponent(e,t)}removeComponent(e,t){this.componentManager.removeComponent(e,t)}update(){this.systemManager.systemList.forEach(e=>{e.update()}),this.emit("updated")}}exports.ComponentManager=u;exports.EntityManager=l;exports.EventRegistry=o;exports.Query=h;exports.SparseSet=d;exports.SystemManager=c;exports.Time=g;exports.World=f;
@@ -318,7 +318,7 @@ class f extends h {
318
318
  _updateQueries() {
319
319
  const e = this.componentManager.dirtyEntities;
320
320
  this.queries.forEach((t) => {
321
- t.markDirty(), e.size > 0 && t.checkEntities();
321
+ t.markDirty(), t.checkEntities(e.size > 0 ? e : void 0);
322
322
  }), this.componentManager.cleanDirtyEntities(), this.version++;
323
323
  }
324
324
  exist(e) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jael-ecs/core",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "Entity Component System library with typescript",
5
5
  "keywords": [
6
6
  "ecs",