ecspresso 0.19.0 → 0.19.2

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/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  All notable changes to ECSpresso are documented here. Format loosely follows [Keep a Changelog](https://keepachangelog.com/).
4
4
 
5
+ ## 0.19.2
6
+
7
+ ### Added
8
+
9
+ - **Orthographic zoom bounds on `camera3D`**:
10
+ - `createCamera3DPlugin({ projection: 'orthographic', minZoom?, maxZoom? })` clamps `camera3DState.setZoom`, initial zoom, camera sync at init, and built-in wheel zoom (defaults `0.1`–`10`, matching the 2D camera plugin wheel limits).
11
+
12
+ ## 0.19.1
13
+
14
+ ### Added
15
+
16
+ - **Projection-aware `camera3D` wheel input**:
17
+ - Orthographic cameras now use wheel input to update `camera3DState.zoom` by default.
18
+ - `createCamera3DPlugin({ wheelMode })` supports `'auto'`, `'distance'`, `'zoom'`, and `'disabled'`.
19
+
5
20
  ## 0.19.0
6
21
 
7
22
  ### Breaking
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var Gj=((j)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(j,{get:(D,G)=>(typeof require<"u"?require:D)[G]}):j)(function(j){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+j+'" is not supported')});class H{parentMap=new Map;childrenMap=new Map;_bfsQueue=[];setParent(j,D){if(j===D)throw Error(`Cannot set entity ${j} as its own parent`);if(this.wouldCreateCycle(j,D))throw Error("Cannot set parent: would create circular reference");let G=this.parentMap.get(j);if(G!==void 0){let J=this.childrenMap.get(G);if(J){let X=J.indexOf(j);if(X!==-1)J.splice(X,1)}}this.parentMap.set(j,D);let $=this.childrenMap.get(D);if($)$.push(j);else this.childrenMap.set(D,[j]);return this}removeParent(j){let D=this.parentMap.get(j);if(D===void 0)return!1;let G=this.childrenMap.get(D);if(G){let $=G.indexOf(j);if($!==-1)G.splice($,1)}return this.parentMap.delete(j),!0}getParent(j){return this.parentMap.get(j)??null}getChildren(j){let D=this.childrenMap.get(j);return D?[...D]:[]}getChildAt(j,D){if(D<0)return null;let G=this.childrenMap.get(j);if(!G||D>=G.length)return null;return G[D]??null}getChildIndex(j,D){let G=this.childrenMap.get(j);if(!G)return-1;return G.indexOf(D)}removeEntity(j){let D=this.parentMap.get(j)??null;if(D!==null){let J=this.childrenMap.get(D);if(J){let X=J.indexOf(j);if(X!==-1)J.splice(X,1)}}this.parentMap.delete(j);let G=this.childrenMap.get(j)??[],$=[...G];for(let J of G)this.parentMap.delete(J);return this.childrenMap.delete(j),{oldParent:D,orphanedChildren:$}}getAncestors(j){let D=[],G=this.parentMap.get(j);while(G!==void 0)D.push(G),G=this.parentMap.get(G);return D}getDescendants(j){let D=[],G=this.childrenMap.get(j);if(!G)return D;let $=G.slice().reverse();while($.length>0){let J=$.pop();D.push(J);let X=this.childrenMap.get(J);if(X)for(let Z=X.length-1;Z>=0;Z--)$.push(X[Z])}return D}getRoot(j){let D=j,G=this.parentMap.get(D);while(G!==void 0)D=G,G=this.parentMap.get(D);return D}getSiblings(j){let D=this.parentMap.get(j);if(D===void 0)return[];let G=this.childrenMap.get(D);if(!G)return[];return G.filter(($)=>$!==j)}isDescendantOf(j,D){if(j===D)return!1;let G=this.parentMap.get(j);while(G!==void 0){if(G===D)return!0;G=this.parentMap.get(G)}return!1}isAncestorOf(j,D){return this.isDescendantOf(D,j)}get hasHierarchy(){return this.childrenMap.size>0}getRootEntities(){let j=[];for(let D of this.childrenMap.keys())if(!this.parentMap.has(D))j.push(D);return j}wouldCreateCycle(j,D){let G=D;while(G!==void 0){if(G===j)return!0;G=this.parentMap.get(G)}return!1}forEachInHierarchy(j,D){let G=D?.roots??this.getRootEntities(),$=this._bfsQueue;$.length=0;for(let J of G)$.push(J,-1,0);for(let J=0;J<$.length;J+=3){let X=$[J],Z=$[J+1],Y=$[J+2];j(X,Z===-1?null:Z,Y);let F=this.childrenMap.get(X);if(F){let O=Y+1;for(let A of F)$.push(A,X,O)}}}*hierarchyIterator(j){let D=j?.roots??this.getRootEntities(),G=[];for(let $ of D)G.push({entityId:$,parentId:null,depth:0});for(let $ of G){yield $;let J=this.childrenMap.get($.entityId);if(J)for(let X of J)G.push({entityId:X,parentId:$.entityId,depth:$.depth+1})}}}function R(j,D,G,$,J){let X=j.components;for(let Z of D)if(!(Z in X))return!1;if(G){for(let Z of G)if(Z in X)return!1}if($&&$.length>0){let Z=J.getParent(j.id);if(Z===null)return!1;let Y=J.getEntity(Z);if(!Y)return!1;let F=Y.components;for(let O of $)if(!(O in F))return!1}return!0}function a(j,D,G){let $=j.length===0?"":[...j].map(String).sort().join(","),J=D.length===0?"":[...D].map(String).sort().join(","),X=G.length===0?"":[...G].map(String).sort().join(",");return`${$}|${J}|${X}`}class S{host;caches=new Map;byComp=new Map;byParentComp=new Map;constructor(j){this.host=j}getOrCreate(j,D,G){let $=a(j,D,G),J=this.caches.get($);if(J)return J.members;let X={with:[...j],without:[...D],parentHas:[...G],members:new Map};this.caches.set($,X);for(let Z of X.with)v(this.byComp,Z,X);for(let Z of X.without)v(this.byComp,Z,X);for(let Z of X.parentHas)v(this.byParentComp,Z,X);return this.populate(X),X.members}get cacheCount(){return this.caches.size}populate(j){let D=this.host,G=j.with;if(G.length===0){for(let Z of D.allEntities())if(this.matches(Z,j))j.members.set(Z.id,Z);return}let $=G[0];if($===void 0)return;let J=D.componentIndex($)?.size??0;for(let Z=1;Z<G.length;Z++){let Y=G[Z];if(Y===void 0)continue;let F=D.componentIndex(Y)?.size??0;if(F<J)$=Y,J=F}let X=D.componentIndex($);if(!X||X.size===0)return;for(let Z of X){let Y=D.getEntity(Z);if(!Y)continue;if(this.matches(Y,j))j.members.set(Z,Y)}}matches(j,D){return R(j,D.with,D.without,D.parentHas,this.host)}reeval(j,D){let G=this.host.getEntity(j);if(!G){D.members.delete(j);return}if(this.matches(G,D))D.members.set(j,G);else D.members.delete(j)}onComponentChanged(j,D){let G=this.byComp.get(D);if(G)for(let J of G)this.reeval(j,J);let $=this.byParentComp.get(D);if($&&$.length>0){let J=this.host.getChildren(j);if(J.length>0)for(let X of $)for(let Z of J)this.reeval(Z,X)}}onParentChanged(j){for(let D of this.caches.values())if(D.parentHas.length>0)this.reeval(j,D)}onEntityRemoved(j){let D=!1;for(let $ of this.caches.values())if($.members.delete(j),$.parentHas.length>0)D=!0;if(!D)return;let G=this.host.getChildren(j);if(G.length===0)return;for(let $ of this.caches.values()){if($.parentHas.length===0)continue;for(let J of G)$.members.delete(J)}}}function v(j,D,G){let $=j.get(D);if($)$.push(G);else j.set(D,[G])}function l(j,D,G){if(!j||!D)return!1;for(let $=0;$<D.length;$++){let J=D[$];if(J===void 0||J>=j.length)continue;let X=j[J];if(X!==void 0&&X>G)return!0}return!1}class N{callbacks=[];_iterDepth=0;_pendingRemovals=[];add(j){this.callbacks.push(j)}remove(j){if(this._iterDepth>0){this._pendingRemovals.push(j);return}let D=this.callbacks.indexOf(j);if(D!==-1)this.callbacks.splice(D,1)}invoke(j){this._iterDepth++;let D=this.callbacks.length;for(let G=0;G<D;G++){let $=this.callbacks[G];if($)$(j)}if(this._iterDepth--,this._iterDepth===0&&this._pendingRemovals.length>0){for(let G of this._pendingRemovals){let $=this.callbacks.indexOf(G);if($!==-1)this.callbacks.splice($,1)}this._pendingRemovals.length=0}}}class T{nextId=1;entities=new Map;componentIndices=new Map;addedCallbacks=new Map;removedCallbacks=new Map;hierarchyManager=new H;disposeCallbacks=new Map;changeSeqs=[];componentNameToIdx=new Map;_idxCache0Name;_idxCache0Idx=-1;_idxCache1Name;_idxCache1Idx=-1;_subscribedComponentIdx=null;_changeSeq=0;_afterComponentAddedHooks=[];_afterEntityMutatedHooks=[];_afterComponentRemovedHooks=[];_beforeEntityRemovedHooks=[];_afterParentChangedHooks=[];_queryCache=new S({getEntity:(j)=>this.entities.get(j),getParent:(j)=>this.hierarchyManager.getParent(j),getChildren:(j)=>this.hierarchyManager.getChildren(j),allEntities:()=>this.entities.values(),componentIndex:(j)=>this.componentIndices.get(j)});_batchingDepth=0;_batchedEntityIds=new Set;_pendingBatchKeys=null;get entityCount(){return this.entities.size}createEntity(){let j=this.nextId++,D={id:j,components:{}};return this.entities.set(j,D),D}registerDispose(j,D){this.disposeCallbacks.set(j,D)}getDisposeCallbacks(){return this.disposeCallbacks}invokeDispose(j,D,G){let $=this.disposeCallbacks.get(j);if(!$)return;try{$({value:D,entityId:G})}catch(J){console.warn(`Component dispose callback for '${String(j)}' threw:`,J)}}addComponent(j,D,G){let $=this.entities.get(j);if(!$)throw Error(`Cannot add component '${String(D)}': Entity with ID ${j} does not exist`);let J=$.components[D];if(J!==void 0)this.invokeDispose(D,J,$.id);if($.components[D]=G,!this.componentIndices.has(D))this.componentIndices.set(D,new Set);this.componentIndices.get(D)?.add($.id);let X=this.addedCallbacks.get(D);if(X)X.invoke({value:G,entity:$});this._queryCache.onComponentChanged($.id,D),this._batchingDepth++;for(let Z of this._afterComponentAddedHooks)Z($.id,D);if(this._batchedEntityIds.add($.id),this._batchingDepth--,this._batchingDepth===0){for(let Z of this._batchedEntityIds)for(let Y of this._afterEntityMutatedHooks)Y(Z);this._batchedEntityIds.clear()}return this}addComponents(j,D){let G=this.entities.get(j);if(!G)throw Error(`Cannot add components: Entity with ID ${j} does not exist`);let $=this._pendingBatchKeys;this._pendingBatchKeys=new Set(Object.keys(D)),this._batchingDepth++;for(let J in D)this.addComponent(G.id,J,D[J]);if(this._batchingDepth--,this._pendingBatchKeys=$,this._batchingDepth===0){for(let J of this._batchedEntityIds)for(let X of this._afterEntityMutatedHooks)X(J);this._batchedEntityIds.clear()}return this}removeComponent(j,D){let G=this.entities.get(j);if(!G)throw Error(`Cannot remove component '${String(D)}': Entity with ID ${j} does not exist`);let $=G.components[D];if($!==void 0)this.invokeDispose(D,$,G.id);delete G.components[D];let J=this.removedCallbacks.get(D);if(J&&$!==void 0)J.invoke({value:$,entity:G});if(this.componentIndices.get(D)?.delete(G.id),$!==void 0){this._queryCache.onComponentChanged(G.id,D);for(let X of this._afterComponentRemovedHooks)X(G.id,D)}return this}getComponent(j,D){return this.entities.get(j)?.components[D]}getEntitiesWithQuery(j=[],D=[],G,$,J,X){return this.getEntitiesWithQueryInto([],j,D,G,$,J,X)}getEntitiesWithQueryInto(j,D=[],G=[],$,J,X,Z){j.length=0;let Y=$!==void 0&&$.length>0&&J!==void 0,F=Z;if(Y&&F===void 0){let W=[];for(let _ of $){let L=this.componentNameToIdx.get(_);if(L!==void 0)W.push(L)}F=W}if(Y&&F.length===0)return j;let O=X!==void 0&&X.length>0;if(D.length===0&&G.length===0&&!O){if(!Y){for(let W of this.entities.values())j.push(W);return j}for(let W of this.entities.values()){if(!l(this.changeSeqs[W.id],F,J??0))continue;j.push(W)}return j}let A=this._queryCache.getOrCreate(D,G,X??[]);if(A.size===0)return j;if(Y){for(let W of A.values()){if(!l(this.changeSeqs[W.id],F,J??0))continue;j.push(W)}return j}for(let W of A.values())j.push(W);return j}get _queryCacheForTesting(){return this._queryCache}removeEntity(j,D){let G=this.entities.get(j);if(!G)return!1;if(D?.cascade??!0){let J=this.hierarchyManager.getDescendants(G.id);for(let X=J.length-1;X>=0;X--){let Z=J[X];if(Z===void 0)continue;this._queryCache.onEntityRemoved(Z);for(let Y of this._beforeEntityRemovedHooks)Y(Z)}this._queryCache.onEntityRemoved(G.id);for(let X of this._beforeEntityRemovedHooks)X(G.id);for(let X=J.length-1;X>=0;X--){let Z=J[X];if(Z===void 0)continue;this.removeEntityInternal(Z)}}else{this._queryCache.onEntityRemoved(G.id);for(let J of this._beforeEntityRemovedHooks)J(G.id)}return this.removeEntityInternal(G.id)}removeEntityInternal(j){let D=this.entities.get(j);if(!D)return!1;this.hierarchyManager.removeEntity(j);for(let G of Object.keys(D.components)){let $=D.components[G];if($!==void 0){this.invokeDispose(G,$,D.id);let J=this.removedCallbacks.get(G);if(J)J.invoke({value:$,entity:D})}this.componentIndices.get(G)?.delete(D.id)}return this.changeSeqs[D.id]=void 0,this.entities.delete(D.id)}getEntity(j){return this.entities.get(j)}onComponentAdded(j,D){let G=D,$=this.addedCallbacks.get(j);if(!$)$=new N,this.addedCallbacks.set(j,$);return $.add(G),()=>{this.addedCallbacks.get(j)?.remove(G)}}onComponentRemoved(j,D){let G=D,$=this.removedCallbacks.get(j);if(!$)$=new N,this.removedCallbacks.set(j,$);return $.add(G),()=>{this.removedCallbacks.get(j)?.remove(G)}}onAfterComponentAdded(j){return this._afterComponentAddedHooks.push(j),()=>{let D=this._afterComponentAddedHooks.indexOf(j);if(D!==-1)this._afterComponentAddedHooks.splice(D,1)}}onAfterEntityMutated(j){return this._afterEntityMutatedHooks.push(j),()=>{let D=this._afterEntityMutatedHooks.indexOf(j);if(D!==-1)this._afterEntityMutatedHooks.splice(D,1)}}onAfterComponentRemoved(j){return this._afterComponentRemovedHooks.push(j),()=>{let D=this._afterComponentRemovedHooks.indexOf(j);if(D!==-1)this._afterComponentRemovedHooks.splice(D,1)}}onBeforeEntityRemoved(j){return this._beforeEntityRemovedHooks.push(j),()=>{let D=this._beforeEntityRemovedHooks.indexOf(j);if(D!==-1)this._beforeEntityRemovedHooks.splice(D,1)}}onAfterParentChanged(j){return this._afterParentChangedHooks.push(j),()=>{let D=this._afterParentChangedHooks.indexOf(j);if(D!==-1)this._afterParentChangedHooks.splice(D,1)}}get changeSeq(){return this._changeSeq}markChanged(j,D){this.markChangedByIdx(j,this.getOrAssignComponentIdx(D))}markChangedByIdx(j,D){let G=this._subscribedComponentIdx;if(G!==null&&(D>=G.length||G[D]===0))return;let $=++this._changeSeq,J=this.changeSeqs[j];if(J===void 0)J=new Uint32Array(Math.max(D+1,8)),this.changeSeqs[j]=J;else if(D>=J.length){let X=new Uint32Array(Math.max(D+1,J.length*2));X.set(J),J=X,this.changeSeqs[j]=J}J[D]=$}getOrAssignComponentIdx(j){if(j===this._idxCache0Name)return this._idxCache0Idx;if(j===this._idxCache1Name){let G=this._idxCache1Idx;return this._idxCache1Name=this._idxCache0Name,this._idxCache1Idx=this._idxCache0Idx,this._idxCache0Name=j,this._idxCache0Idx=G,G}let D=this.componentNameToIdx.get(j);if(D===void 0)D=this.componentNameToIdx.size,this.componentNameToIdx.set(j,D);return this._idxCache1Name=this._idxCache0Name,this._idxCache1Idx=this._idxCache0Idx,this._idxCache0Name=j,this._idxCache0Idx=D,D}subscribeChanged(j){let D=this.getOrAssignComponentIdx(j),G=this._subscribedComponentIdx;if(G===null)G=new Uint8Array(Math.max(D+1,8)),this._subscribedComponentIdx=G;else if(D>=G.length){let $=new Uint8Array(Math.max(D+1,G.length*2));$.set(G),G=$,this._subscribedComponentIdx=G}G[D]=1}disableChangeTracking(){this._subscribedComponentIdx=new Uint8Array(0)}hasAnySubscribed(j){let D=this._subscribedComponentIdx;if(D===null)return!0;for(let G=0;G<j.length;G++){let $=j[G];if($!==void 0&&$<D.length&&D[$]!==0)return!0}return!1}getChangeSeq(j,D){let G=this.componentNameToIdx.get(D);if(G===void 0)return-1;let $=this.changeSeqs[j];if(!$||G>=$.length)return-1;let J=$[G]??0;return J===0?-1:J}spawnChild(j,D){let G=this.createEntity();return this.addComponents(G.id,D),this.setParent(G.id,j),G}setParent(j,D){this.hierarchyManager.setParent(j,D),this._queryCache.onParentChanged(j);for(let G of this._afterParentChangedHooks)G(j);return this}removeParent(j){let D=this.hierarchyManager.removeParent(j);if(D){this._queryCache.onParentChanged(j);for(let G of this._afterParentChangedHooks)G(j)}return D}getParent(j){return this.hierarchyManager.getParent(j)}getChildren(j){return this.hierarchyManager.getChildren(j)}getChildAt(j,D){return this.hierarchyManager.getChildAt(j,D)}getChildIndex(j,D){return this.hierarchyManager.getChildIndex(j,D)}getAncestors(j){return this.hierarchyManager.getAncestors(j)}getDescendants(j){return this.hierarchyManager.getDescendants(j)}getRoot(j){return this.hierarchyManager.getRoot(j)}getSiblings(j){return this.hierarchyManager.getSiblings(j)}isDescendantOf(j,D){return this.hierarchyManager.isDescendantOf(j,D)}isAncestorOf(j,D){return this.hierarchyManager.isAncestorOf(j,D)}get hasHierarchy(){return this.hierarchyManager.hasHierarchy}getRootEntities(){return this.hierarchyManager.getRootEntities()}forEachInHierarchy(j,D){this.hierarchyManager.forEachInHierarchy(j,D)}hierarchyIterator(j){return this.hierarchyManager.hierarchyIterator(j)}}class w{handlers=new Map;subscribe(j,D){return this.addHandler(j,D,!1)}once(j,D){return this.addHandler(j,D,!0)}unsubscribe(j,D){let G=this.handlers.get(j);if(!G)return!1;let $=G.findIndex((J)=>J.callback===D);if($===-1)return!1;return G.splice($,1),!0}addHandler(j,D,G){let $=this.handlers.get(j);if(!$)$=[],this.handlers.set(j,$);let J={callback:D,once:G};return $.push(J),()=>{let X=this.handlers.get(j);if(X){let Z=X.indexOf(J);if(Z!==-1)X.splice(Z,1)}}}publish(j,D){let G=this.handlers.get(j);if(!G||G.length===0)return;let $=!1,J=G.length;for(let X=0;X<J&&X<G.length;X++){let Z=G[X];if(!Z)continue;if(Z.callback(D),Z.once)$=!0}if($){for(let X=G.length-1;X>=0;X--)if(G[X]?.once)G.splice(X,1)}}clear(){this.handlers.clear()}clearEvent(j){this.handlers.delete(j)}}var k=Symbol("resource-direct");function n(j){return{[k]:j}}function b(j){if(typeof j==="object"&&j!==null&&!Array.isArray(j))return{...j};return{$value:j}}function t(j,D){if(typeof j==="object"&&j!==null&&!Array.isArray(j)){let G=j;for(let $ in D)if(!Object.is(G[$],D[$]))return!0;return!1}return!Object.is(j,D.$value)}function e(j){return typeof j==="object"&&j!==null&&"factory"in j&&typeof j.factory==="function"}function jj(j){return typeof j==="object"&&j!==null&&k in j}function m(j,D){let G=[],$=new Set,J=new Set;function X(Z,Y=[]){if($.has(Z))return;if(J.has(Z))throw Error(`Circular resource dependency: ${[...Y,Z].join(" -> ")}`);J.add(Z);for(let F of D(Z)){let O=j.find((A)=>A===F);if(O)X(O,[...Y,Z])}J.delete(Z),$.add(Z),G.push(Z)}for(let Z of j)X(Z);return G}class C{resources=new Map;resourceFactories=new Map;resourceDependencies=new Map;resourceDisposers=new Map;initializedResourceKeys=new Set;_changeSubscribers=new Map;_observedSnapshots=new Map;add(j,D){let G=($)=>{this.resources.set(j,$),this.initializedResourceKeys.add(j),this.resourceDependencies.set(j,[])};if(e(D)){if(this.resourceFactories.set(j,D.factory),this.resourceDependencies.set(j,D.dependsOn??[]),D.onDispose)this.resourceDisposers.set(j,D.onDispose)}else if(jj(D))G(D[k]);else if(typeof D==="function")this.resourceFactories.set(j,D),this.resourceDependencies.set(j,[]);else G(D);return this}tryGet(j,...D){if(!this.has(j))return;return this.get(j,...D)}get(j,...D){let G=this.resources.get(j);if(G!==void 0)return G;let $=this.resourceFactories.get(j);if($===void 0)throw Error(`Resource ${String(j)} not found`);let J=D[0],X=$(J);if(!(X instanceof Promise))this.resources.set(j,X),this.initializedResourceKeys.add(j);return X}has(j){return this.resources.has(j)||this.resourceFactories.has(j)}remove(j){let D=this.resources.delete(j),G=this.resourceFactories.delete(j);return this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),D||G}getKeys(){let j=new Set([...this.resources.keys(),...this.resourceFactories.keys()]);return Array.from(j)}needsInitialization(j){return this.resourceFactories.has(j)&&!this.initializedResourceKeys.has(j)}getPendingInitializationKeys(){return Array.from(this.resourceFactories.keys()).filter((j)=>!this.initializedResourceKeys.has(j))}async initializeResource(j,...D){if(!this.resourceFactories.has(j)||this.initializedResourceKeys.has(j))return;let G=this.resourceFactories.get(j);if(!G)return;let $=D[0],J=await G($);this.resources.set(j,J),this.initializedResourceKeys.add(j),this.resourceFactories.delete(j)}async initializeResources(...j){let D=j.slice(1),G=D.length===0?this.getPendingInitializationKeys():D;if(G.length===0)return;let $=m(G,(J)=>[...this.resourceDependencies.get(J)??[]]);for(let J of $)await this.initializeResource(J,...j.slice(0,1))}getDependencies(j){return this.resourceDependencies.get(j)??[]}async disposeResource(j,...D){if(!this.resources.has(j)&&!this.resourceFactories.has(j))return!1;if(this.initializedResourceKeys.has(j)){let G=this.resourceDisposers.get(j),$=this.resources.get(j);if(G&&$!==void 0){let J=D[0];await G($,J)}}return this.resources.delete(j),this.resourceFactories.delete(j),this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),this._changeSubscribers.delete(j),!0}onResourceChange(j,D){let G=this._changeSubscribers.get(j),$=G??new Set;if(!G){this._changeSubscribers.set(j,$);let X=this.resources.get(j);this._observedSnapshots.set(j,b(X))}let J=D;return $.add(J),()=>{if($.delete(J),$.size===0)this._changeSubscribers.delete(j),this._observedSnapshots.delete(j)}}notifyChange(j,D,G){if(Object.is(D,G))return;let $=this._changeSubscribers.get(j);if(!$||$.size===0)return;if(this._observedSnapshots.has(j))this._observedSnapshots.set(j,b(D));let J=[...$];for(let X of J)X(D,G)}isObserved(j){return this._observedSnapshots.has(j)}flushObserved(){if(this._observedSnapshots.size===0)return;for(let[j,D]of this._observedSnapshots){let G=this.resources.get(j);if(!t(G,D))continue;let $="$value"in D?D.$value:D,J=b(G),X=this._changeSubscribers.get(j);for(let Z of X)Z(G,$);this._observedSnapshots.set(j,J)}}async disposeResources(...j){let D=Array.from(this.initializedResourceKeys);if(D.length===0)return;let G=m(D,($)=>[...this.resourceDependencies.get($)??[]]).reverse();for(let $ of G)await this.disposeResource($,...j)}}class q{queries=new Map;entityManager;ecs;_hasParentHasQueries=!1;constructor(j,D){this.entityManager=j,this.ecs=D}get hasParentHasQueries(){return this._hasParentHasQueries}addQuery(j,D){let G={definition:D,matchingEntities:new Set};if(this.queries.set(j,G),D.parentHas?.length)this._hasParentHasQueries=!0;let $=this.entityManager.getEntitiesWithQuery(D.with,D.without??[]);for(let J of $)if(this.entityMatchesQuery(J,G.definition))G.matchingEntities.add(J.id),this._fireEnter(G.definition,J)}removeQuery(j){let D=this.queries.delete(j);if(D)this._recalcParentHasFlag();return D}entityMatchesQuery(j,D){return R(j,D.with,D.without,D.parentHas,this.entityManager)}_fireEnter(j,D){j.onEnter?.({entity:D,ecs:this.ecs})}_fireExit(j,D){j.onExit?.({entityId:D,ecs:this.ecs})}_applyQueryTransition(j,D){let G=D.matchingEntities.has(j.id),$=this.entityMatchesQuery(j,D.definition);if(!G&&$)D.matchingEntities.add(j.id),this._fireEnter(D.definition,j);else if(G&&!$)D.matchingEntities.delete(j.id),this._fireExit(D.definition,j.id)}onComponentAdded(j,D){for(let[,G]of this.queries)this._applyQueryTransition(j,G);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onComponentRemoved(j,D){for(let[,G]of this.queries)this._applyQueryTransition(j,G);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onEntityRemoved(j){for(let[D,G]of this.queries)if(G.matchingEntities.has(j))G.matchingEntities.delete(j),this._fireExit(G.definition,j)}recheckEntity(j){for(let[,D]of this.queries)this._applyQueryTransition(j,D)}recheckEntityAndChildren(j){if(this.recheckEntity(j),this._hasParentHasQueries)this._recheckChildren(j.id)}_recheckChildren(j){let D=this.entityManager.getChildren(j);for(let G of D){let $=this.entityManager.getEntity(G);if($)this.recheckEntity($)}}_recalcParentHasFlag(){this._hasParentHasQueries=!1;for(let[,j]of this.queries)if(j.definition.parentHas?.length){this._hasParentHasQueries=!0;return}}}class g{parent;commands=[];constructor(j){this.parent=j}removeEntity(j,D){this.commands.push((G)=>{G.removeEntity(j,D)})}addComponent(j,D,G){this.commands.push(($)=>{$.addComponent(j,D,G)})}removeComponent(j,D){this.commands.push((G)=>{G.removeComponent(j,D)})}spawn(j,D){let G=this._resolveScope(D);this.commands.push(($)=>{$.spawn(j,G)})}spawnChild(j,D,G){let $=this._resolveScope(G);this.commands.push((J)=>{J.spawnChild(j,D,$)})}_resolveScope(j){if(j?.scope!==void 0)return j;let D=this.parent?._getActiveScopeHint();if(!D)return j;return{scope:D}}addComponents(j,D){this.commands.push((G)=>{G.addComponents(j,D)})}setParent(j,D){this.commands.push((G)=>{G.setParent(j,D)})}mutateComponent(j,D,G){this.commands.push(($)=>{$.mutateComponent(j,D,G)})}markChanged(j,D){this.commands.push((G)=>{G.markChanged(j,D)})}removeParent(j){this.commands.push((D)=>{D.removeParent(j)})}playback(j){for(let D of this.commands)try{D(j)}catch(G){console.warn("CommandBuffer: Command failed during playback:",G)}this.commands.length=0}clear(){this.commands.length=0}get length(){return this.commands.length}}class s{_id;constructor(j){this._id=j}_systemDefaults;setSystemDefaults(j){return this._systemDefaults=j,this}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}withAssetTypes(){return this}withScreenTypes(){return this}withLabels(){return this}withGroups(){return this}withAssetGroupNames(){return this}withReactiveQueryNames(){return this}requires(){return this}install(j){return{id:this._id,install:j,...this._systemDefaults?{systemDefaults:this._systemDefaults}:{}}}}function E(j){return new s(j)}var c="__each";class x{_label;queries={};singletons={};processFunction;detachFunction;initializeFunction;eventHandlers;_priority=0;_phase="update";_groups=[];_inScreens;_excludeScreens;_requiredAssets;_runWhenEmpty=!1;_entityEnterHandlers={};_resourceKeys;constructor(j,D){this._label=j;if(D){if(D.phase!==void 0)this._phase=D.phase;if(D.priority!==void 0)this._priority=D.priority;if(D.inScreens!==void 0)this._inScreens=D.inScreens;if(D.excludeScreens!==void 0)this._excludeScreens=D.excludeScreens}}get label(){return this._label}_createSystemObject(){let j={label:this._label,entityQueries:this.queries,priority:this._priority,phase:this._phase};if(Object.keys(this.singletons).length>0)j.entitySingletons=this.singletons;if(this.processFunction)j.process=this.processFunction;if(this.detachFunction)j.onDetach=this.detachFunction;if(this.initializeFunction)j.onInitialize=this.initializeFunction;if(this.eventHandlers)j.eventHandlers=this.eventHandlers;if(this._groups.length>0)j.groups=[...this._groups];if(this._inScreens)j.inScreens=this._inScreens;if(this._excludeScreens)j.excludeScreens=this._excludeScreens;if(this._requiredAssets)j.requiredAssets=this._requiredAssets;if(this._runWhenEmpty)j.runWhenEmpty=!0;if(Object.keys(this._entityEnterHandlers).length>0)j.onEntityEnter={...this._entityEnterHandlers};return j}setPriority(j){return this._priority=j,this}inPhase(j){return this._phase=j,this}inGroup(j){if(!this._groups.includes(j))this._groups.push(j);return this}inScreens(j){return this._inScreens=[...j],this}excludeScreens(j){return this._excludeScreens=[...j],this}requiresAssets(j){return this._requiredAssets=[...j],this}runWhenEmpty(){return this._runWhenEmpty=!0,this}withResources(j){return this._resourceKeys=[...j],this}addQuery(j,D){let G=this;return G.queries={...this.queries,[j]:D},G}addSingleton(j,D){let G=this;return G.singletons={...this.singletons,[j]:D},G}setProcess(j){return this.processFunction=this._wrapWithResources(j),this}_wrapWithResources(j){if(!this._resourceKeys?.length)return j;let D=this._resourceKeys,G={},$=!1;return(J)=>{for(let X of D)if(!$||J.ecs.isResourceObserved(X))G[X]=J.ecs.getResource(X);$=!0,J.resources=G,j(J)}}setProcessEach(j,D){let G=this;if(Object.keys(G.queries).length>0||Object.keys(G.singletons).length>0||G.processFunction!==void 0)throw Error("setProcessEach requires a SystemBuilder with no prior queries, singletons, or process function. Use addQuery + setProcess for multi-query systems.");G.queries.__each=j;let $={entity:void 0,dt:0,ecs:void 0,resources:void 0},J=(X)=>{let Z=X,Y=Z.queries.__each;if(!Y)return;let F=j._mutatesIdx;$.dt=Z.dt,$.ecs=Z.ecs,$.resources=Z.resources;let O=Z.ecs.entityManager;for(let A=0;A<Y.length;A++){let W=Y[A];if(!W)continue;$.entity=W;let _=D($);if(F===void 0||_===!1)continue;for(let L=0;L<F.length;L++){let Q=F[L];if(Q!==void 0)O.markChangedByIdx(W.id,Q)}}};return G.processFunction=G._wrapWithResources(J),this}setOnEntityEnter(j,D){return this._entityEnterHandlers[j]=D,this}setOnDetach(j){return this.detachFunction=j,this}setOnInitialize(j){return this.initializeFunction=j,this}setEventHandlers(j){return this.eventHandlers=j,this}}function i(j,D,G){let $=new Set,J=[D];while(J.length>0){let X=J.pop();if(X===void 0)break;if(X===j)throw Error(`Circular required component dependency: '${String(j)}' -> '${String(D)}' -> ... -> '${String(j)}'`);if($.has(X))continue;$.add(X);let Z=G(X);if(Z)for(let Y of Z)J.push(Y.component)}}var y="0.19.0";class z{assets=new Map;groups=new Map;eventBus=null;setEventBus(j){this.eventBus=j}register(j,D){if(this.assets.set(j,{definition:D,status:"pending"}),D.group){let G=this.groups.get(D.group)??new Set;G.add(j),this.groups.set(D.group,G)}}async loadEagerAssets(){let j=[];for(let[D,G]of this.assets)if(G.definition.eager&&G.status==="pending")j.push(D);await Promise.all(j.map((D)=>this.loadAsset(D)))}async loadAsset(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);if(D.status==="loaded"&&D.value!==void 0)return D.value;if(D.status==="loading"&&D.loadPromise)return D.loadPromise;if(D.status==="failed")D.status="pending";D.status="loading",D.loadPromise=D.definition.loader();try{let G=await D.loadPromise;return D.value=G,D.status="loaded",D.loadPromise=void 0,this.eventBus?.publish("assetLoaded",{key:j}),this.checkGroupProgress(D.definition.group),G}catch(G){let $=G instanceof Error?G:Error(String(G));throw D.status="failed",D.error=$,D.loadPromise=void 0,this.eventBus?.publish("assetFailed",{key:j,error:$}),$}}async loadAssetGroup(j){let D=this.groups.get(j);if(!D||D.size===0)throw Error(`Asset group '${j}' not found or empty`);await Promise.all(Array.from(D).map((G)=>this.loadAsset(G)))}get(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);if(D.status!=="loaded"||D.value===void 0)throw Error(`Asset '${String(j)}' is not loaded (status: ${D.status})`);return D.value}tryGet(j){let D=this.assets.get(j);if(!D||D.status!=="loaded")return;return D.value}getHandle(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);let G=this;return{get status(){return D.status},get isLoaded(){return D.status==="loaded"},get(){return G.get(j)},tryGet(){return G.tryGet(j)}}}getStatus(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);return D.status}isLoaded(j){return this.assets.get(j)?.status==="loaded"}isGroupLoaded(j){let D=this.groups.get(j);if(!D||D.size===0)return!1;for(let G of D){let $=this.assets.get(G);if(!$||$.status!=="loaded")return!1}return!0}getGroupProgress(j){return this.getGroupProgressDetails(j).progress}getGroupProgressDetails(j){let D=this.groups.get(j);if(!D||D.size===0)return{loaded:0,total:0,progress:0};let G=0;for(let J of D)if(this.assets.get(J)?.status==="loaded")G++;let $=D.size;return{loaded:G,total:$,progress:G/$}}checkGroupProgress(j){if(!j||!this.eventBus)return;let D=j,G=this.getGroupProgressDetails(D);if(this.eventBus.publish("assetGroupProgress",{group:D,...G}),G.loaded===G.total)this.eventBus.publish("assetGroupLoaded",{group:D})}createResource(){let j=this;return{getStatus(D){return j.getStatus(D)},isLoaded(D){return j.isLoaded(D)},isGroupLoaded(D){return j.isGroupLoaded(D)},getGroupProgress(D){return j.getGroupProgress(D)},get(D){return j.get(D)},tryGet(D){return j.tryGet(D)},getHandle(D){return j.getHandle(D)}}}getKeys(){return Array.from(this.assets.keys())}getGroupNames(){return Array.from(this.groups.keys())}getGroupKeys(j){let D=this.groups.get(j);return D?Array.from(D):[]}}class d{manager;constructor(j){this.manager=j}add(j,D){return this.manager.register(j,{loader:D,eager:!0}),this}addWithConfig(j,D){return this.manager.register(j,D),this}addGroup(j,D){for(let[G,$]of Object.entries(D))this.manager.register(G,{loader:$,eager:!1,group:j});return this}getManager(){return this.manager}}function p(j){return new d(j??new z)}class P{screens=new Map;currentScreen=null;screenStack=[];eventBus=null;assetManager=null;ecs=null;setDependencies(j,D,G){this.eventBus=j,this.assetManager=D,this.ecs=G}requireEcs(){if(!this.ecs)throw Error("ScreenManager: dependencies not set. Call setDependencies() first.");return this.ecs}register(j,D){this.screens.set(j,{definition:D})}async setScreen(j,D){let G=this.screens.get(j);if(!G)throw Error(`Screen '${String(j)}' not found`);await this.verifyRequiredAssets(G.definition.requiredAssets,G.definition.requiredAssetGroups);while(this.screenStack.length>0){let J=this.screenStack.pop();if(J)await this.exitScreen(J.name)}if(this.currentScreen)await this.exitScreen(this.currentScreen.name);let $=G.definition.initialState(D);this.currentScreen={name:j,config:D,state:$},await G.definition.onEnter?.({config:D,ecs:this.requireEcs()}),this.eventBus?.publish("screenEnter",{screen:j,config:D})}async pushScreen(j,D){let G=this.screens.get(j);if(!G)throw Error(`Screen '${String(j)}' not found`);if(await this.verifyRequiredAssets(G.definition.requiredAssets,G.definition.requiredAssetGroups),this.currentScreen)this.screenStack.push(this.currentScreen);let $=G.definition.initialState(D);this.currentScreen={name:j,config:D,state:$},await G.definition.onEnter?.({config:D,ecs:this.requireEcs()}),this.eventBus?.publish("screenPush",{screen:j,config:D})}async popScreen(){if(this.screenStack.length===0)throw Error("Cannot pop screen: stack is empty");if(this.currentScreen)await this.exitScreen(this.currentScreen.name),this.eventBus?.publish("screenPop",{screen:this.currentScreen.name});let j=this.screenStack.pop();if(this.currentScreen=j??null,!j)return;await this.screens.get(j.name)?.definition.onResume?.({config:j.config,state:j.state,ecs:this.requireEcs()}),this.eventBus?.publish("screenResume",{screen:j.name,config:j.config,state:j.state})}async exitScreen(j){let D=this.screens.get(j);if(D?.definition.onExit)await D.definition.onExit(this.requireEcs());this.eventBus?.publish("screenExit",{screen:j})}async verifyRequiredAssets(j,D){if(!this.assetManager)return;if(j){for(let G of j)if(!this.assetManager.isLoaded(G))await this.assetManager.loadAsset(G)}if(D){for(let G of D)if(!this.assetManager.isGroupLoaded(G))await this.assetManager.loadAssetGroup(G)}}getCurrentScreen(){return this.currentScreen?.name??null}getConfig(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.config}tryGetConfig(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.config}getState(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.state}tryGetState(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.state}updateState(j,D){if(!this.currentScreen)throw Error("No current screen");if(D!==void 0&&this.currentScreen.name!==D)throw Error(`Expected current screen '${String(D)}', but current is '${String(this.currentScreen.name)}'`);let G=typeof j==="function"?j(this.currentScreen.state):j;this.currentScreen.state={...this.currentScreen.state,...G}}getStackDepth(){return this.screenStack.length}isOverlay(){return this.screenStack.length>0}isActive(j){if(this.currentScreen?.name===j)return!0;return this.screenStack.some((D)=>D.name===j)}isCurrent(j){return this.currentScreen?.name===j}createResource(){let j=this;return{get current(){return j.getCurrentScreen()},get config(){return j.tryGetConfig()??null},get state(){return j.tryGetState()??null},set state(D){if(j.currentScreen&&D!==null)j.currentScreen.state=D},get stack(){return j.screenStack},get isOverlay(){return j.isOverlay()},get stackDepth(){return j.getStackDepth()},isActive(D){return j.isActive(D)},isCurrent(D){return j.isCurrent(D)}}}getScreenNames(){return Array.from(this.screens.keys())}hasScreen(j){return this.screens.has(j)}}class o{manager;constructor(j){this.manager=j}add(j,D){return this.manager.register(j,D),this}getManager(){return this.manager}}function h(j){return new o(j??new P)}class I{assetConfigurator=null;screenConfigurator=null;pendingResources=[];pendingDisposeCallbacks=[];pendingRequiredComponents=[];pendingPlugins=[];_fixedDt=null;_disableChangeTracking=!1;constructor(){}withPlugin(j){return this.pendingPlugins.push(j),this}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}disableChangeTracking(){return this._disableChangeTracking=!0,this}withResource(j,D){return this.pendingResources.push({key:j,value:D}),this}withDispose(j,D){return this.pendingDisposeCallbacks.push({key:j,callback:D}),this}withRequired(j,D,G){return this.pendingRequiredComponents.push({trigger:j,required:D,factory:G}),this}withAssets(j){let D=p();return j(D),this.assetConfigurator=D,this}withScreens(j){let D=h();return j(D),this.screenConfigurator=D,this}withFixedTimestep(j){return this._fixedDt=j,this}withReactiveQueryNames(){return this}pluginFactory(){return(j)=>E(j.id).install(j.install)}build(){let j=new V;if(this._disableChangeTracking)j.entityManager.disableChangeTracking();for(let D of this.pendingPlugins)j._installPluginUnchecked(D);for(let{key:D,value:G}of this.pendingResources)j.addResource(D,G);for(let{key:D,callback:G}of this.pendingDisposeCallbacks)j.registerDispose(D,G);for(let{trigger:D,required:G,factory:$}of this.pendingRequiredComponents)j.registerRequired(D,G,$);if(this.assetConfigurator)j._setAssetManager(this.assetConfigurator.getManager());else if(j._hasPendingPluginAssets())j._setAssetManager(new z);if(this.screenConfigurator)j._setScreenManager(this.screenConfigurator.getManager());else if(j._hasPendingPluginScreens())j._setScreenManager(new P);if(this._fixedDt!==null)j._setFixedDt(this._fixedDt);return j}}var r=["preUpdate","fixedUpdate","update","postUpdate","render"];class V{static VERSION=y;_entityManager;_eventBus;_resourceManager;_commandBuffer;_systems=[];_phaseSystems={preUpdate:[],fixedUpdate:[],update:[],postUpdate:[],render:[]};_installedPlugins=new Set;_pluginCleanups=new Map;_currentSystemDefaults;_screenScopedEntities=new Map;_entityScreenScope=new Map;_activeScopeHint=null;_disabledGroups=new Set;_assetManager=null;_screenManager=null;_reactiveQueryManager;_postUpdateHooks=[];_currentTick=0;_systemLastSeqs=new Map;_changeThreshold=0;_fixedDt=0.016666666666666666;_fixedAccumulator=0;_interpolationAlpha=0;_maxFixedSteps=8;_requiredComponents=new Map;_pendingPluginAssets=[];_pendingPluginScreens=[];_diagnosticsEnabled=!1;_systemTimings=new Map;_phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0};_entityEnterTracking=new Map;_entityEnterFrameSet=new Set;_systemContexts=new WeakMap;_singletonScratch=[];_pendingFinalizers=[];_batchingRegistrations=!1;_initializeFired=!1;_systemsInitialized=new WeakSet;constructor(){this._entityManager=new T,this._eventBus=new w,this._resourceManager=new C,this._reactiveQueryManager=new q(this._entityManager,this),this._commandBuffer=new g(this),this._subscribeLifecycleHooks()}_subscribeLifecycleHooks(){this._entityManager.onAfterComponentAdded((j,D)=>{this._entityManager.markChanged(j,D);let G=this._requiredComponents.get(D);if(G){let $=this._entityManager.getEntity(j);if($){let J=$.components[D];for(let{component:X,factory:Z}of G){if(this._entityManager._pendingBatchKeys?.has(X))continue;if(!(X in $.components))this._entityManager.addComponent(j,X,Z(J))}}}}),this._entityManager.onAfterEntityMutated((j)=>{let D=this._entityManager.getEntity(j);if(D)this._reactiveQueryManager.recheckEntityAndChildren(D)}),this._entityManager.onAfterComponentRemoved((j,D)=>{let G=this._entityManager.getEntity(j);if(G)this._reactiveQueryManager.onComponentRemoved(G,D)}),this._entityManager.onBeforeEntityRemoved((j)=>{this._reactiveQueryManager.onEntityRemoved(j);let D=this._entityScreenScope.get(j);if(D!==void 0)this._entityScreenScope.delete(j),this._screenScopedEntities.get(D)?.delete(j)}),this._entityManager.onAfterParentChanged((j)=>{if(this._reactiveQueryManager.hasParentHasQueries){let D=this._entityManager.getEntity(j);if(D)this._reactiveQueryManager.recheckEntity(D)}})}static create(){return new I}addSystem(j){let D=new x(j,this._currentSystemDefaults);return this._pendingFinalizers.push(()=>{this._registerSystem(D._createSystemObject())}),D}_finalizePendingBuilders(){if(this._pendingFinalizers.length===0)return;this._batchingRegistrations=!0;while(this._pendingFinalizers.length>0){let j=this._pendingFinalizers;this._pendingFinalizers=[];for(let D of j)D()}this._batchingRegistrations=!1,this._rebuildPhaseSystems()}update(j){this._finalizePendingBuilders();let D=this._screenManager?.getCurrentScreen()??null,G=this._diagnosticsEnabled;this._runPhase("preUpdate",j,D,G);let $=G?performance.now():0;this._fixedAccumulator+=j;let J=0;while(this._fixedAccumulator>=this._fixedDt&&J<this._maxFixedSteps)this._executePhase(this._phaseSystems.fixedUpdate,this._fixedDt,D),this._commandBuffer.playback(this),this._fixedAccumulator-=this._fixedDt,J++;if(this._fixedAccumulator>=this._fixedDt)this._fixedAccumulator=0;if(G)this._phaseTimings.fixedUpdate=performance.now()-$;this._interpolationAlpha=this._fixedAccumulator/this._fixedDt,this._runPhase("update",j,D,G),this._runPhase("postUpdate",j,D,G);for(let X of this._postUpdateHooks)X({ecs:this,dt:j});this._runPhase("render",j,D,G),this._resourceManager.flushObserved(),this._changeThreshold=this._entityManager.changeSeq,this._currentTick++}_executePhase(j,D,G){for(let $ of j){if(!$.process&&!$.onEntityEnter)continue;if($.groups?.length){let W=!1;for(let _ of $.groups)if(this._disabledGroups.has(_)){W=!0;break}if(W)continue}if($.inScreens?.length){if(G===null||!$.inScreens.includes(G))continue}if($.excludeScreens?.length){if(G!==null&&$.excludeScreens.includes(G))continue}if($.requiredAssets?.length&&this._assetManager){let W=!0;for(let _ of $.requiredAssets)if(!this._assetManager.isLoaded(_)){W=!1;break}if(!W)continue}let J=this._systemLastSeqs.get($)??0;this._changeThreshold=J;let X=this._systemContexts.get($);if(!X)X={queries:{},dt:0,ecs:this},this._systemContexts.set($,X);X.dt=D;let Z=X.queries,Y=!1,F=!1;if($.entityQueries)for(let W in $.entityQueries){F=!0;let _=$.entityQueries[W];if(_){let Q=Z[W]??(Z[W]=[]);if(this._entityManager.getEntitiesWithQueryInto(Q,_.with,_.without||[],_.changed,_.changed?this._changeThreshold:void 0,_.parentHas,_._changedIdx),Q.length)Y=!0}}if($.entitySingletons){let W=this._singletonScratch;for(let _ in $.entitySingletons){F=!0;let L=$.entitySingletons[_];if(L){if(this._entityManager.getEntitiesWithQueryInto(W,L.with,L.without||[],L.changed,L.changed?this._changeThreshold:void 0,L.parentHas,L._changedIdx),Z[_]=W[0],W.length)Y=!0}}}let O=this._entityEnterTracking.get($);if(O&&$.onEntityEnter)for(let W in $.onEntityEnter){let _=Z[W],L=O.get(W);if(!_||!L)continue;let Q=$.onEntityEnter[W];if(!Q)continue;let K=this._entityEnterFrameSet;K.clear();for(let B of _)if(K.add(B.id),!L.has(B.id))L.add(B.id),Q({entity:B,ecs:this});for(let B of L)if(!K.has(B))L.delete(B)}if($.process){if(Y||$.runWhenEmpty||!F){let _=this._activeScopeHint;this._activeScopeHint=$.inScreens?.length&&G!==null?G:null;let L=this._diagnosticsEnabled?performance.now():0;try{$.process(X)}finally{if(this._activeScopeHint=_,this._diagnosticsEnabled)this._systemTimings.set($.label,performance.now()-L)}}}let A=$._autoMarkPairs;if(A){let W=this._entityManager;for(let _=0;_<A.length;_++){let L=A[_];if(!L)continue;let Q=L.mutatesIdx,K=Q.length;if(!W.hasAnySubscribed(Q))continue;if(L.kind==="list"){let B=Z[L.queryName];if(!B)continue;for(let U=0;U<B.length;U++){let M=B[U];if(!M)continue;for(let f=0;f<K;f++){let u=Q[f];if(u!==void 0)W.markChangedByIdx(M.id,u)}}}else{let B=Z[L.queryName];if(!B)continue;for(let U=0;U<K;U++){let M=Q[U];if(M!==void 0)W.markChangedByIdx(B.id,M)}}}}this._systemLastSeqs.set($,this._entityManager.changeSeq)}}_runPhase(j,D,G,$){if($){let J=performance.now();this._executePhase(this._phaseSystems[j],D,G),this._phaseTimings[j]=performance.now()-J}else this._executePhase(this._phaseSystems[j],D,G);this._commandBuffer.playback(this)}async initialize(){if(this._finalizePendingBuilders(),await this.initializeResources(),this._assetManager)this._assetManager.setEventBus(this._eventBus),await this._assetManager.loadEagerAssets(),this._resourceManager.add("$assets",this._assetManager.createResource());if(this._screenManager){let j=this._eventBus;this._screenManager.setDependencies(j,this._assetManager,this),this._resourceManager.add("$screen",this._screenManager.createResource()),j.subscribe("screenExit",({screen:D})=>{let G=this._screenScopedEntities.get(D);if(!G||G.size===0)return;this._screenScopedEntities.delete(D);for(let $ of Array.from(G))this._entityScreenScope.delete($),this.removeEntity($)})}for(let j of this._systems){if(this._systemsInitialized.has(j))continue;this._systemsInitialized.add(j),await j.onInitialize?.(this)}this._initializeFired=!0}async initializeResources(...j){await this._resourceManager.initializeResources(this,...j)}_rebuildPhaseSystems(){for(let j of r)this._phaseSystems[j]=[];for(let j of this._systems){let D=j.phase??"update";this._phaseSystems[D].push(j)}for(let j of r)this._phaseSystems[j].sort((D,G)=>{let $=D.priority??0;return(G.priority??0)-$})}updateSystemPriority(j,D){this._finalizePendingBuilders();let G=this._systems.find(($)=>$.label===j);if(!G)return!1;return G.priority=D,this._rebuildPhaseSystems(),!0}updateSystemPhase(j,D){this._finalizePendingBuilders();let G=this._systems.find(($)=>$.label===j);if(!G)return!1;return G.phase=D,this._rebuildPhaseSystems(),!0}get interpolationAlpha(){return this._interpolationAlpha}get fixedDt(){return this._fixedDt}disableSystemGroup(j){this._disabledGroups.add(j)}enableSystemGroup(j){this._disabledGroups.delete(j)}isSystemGroupEnabled(j){return!this._disabledGroups.has(j)}getSystemsInGroup(j){return this._finalizePendingBuilders(),this._systems.filter((D)=>D.groups?.includes(j)).map((D)=>D.label)}removeSystem(j){this._finalizePendingBuilders();let D=this._systems.findIndex(($)=>$.label===j);if(D===-1)return!1;let G=this._systems[D];if(!G)return!1;if(G.onDetach)G.onDetach(this);return this._systems.splice(D,1),this._systemLastSeqs.delete(G),this._entityEnterTracking.delete(G),this._systemsInitialized.delete(G),this._rebuildPhaseSystems(),!0}_registerSystem(j){if(this._systems.push(j),this._systemLastSeqs.set(j,this._changeThreshold),!this._batchingRegistrations)this._rebuildPhaseSystems();let D=[],G=this._entityManager,$=(J,X,Z)=>{let Y=X.changed;if(Y&&Y.length>0){let O=[];for(let A=0;A<Y.length;A++){let W=Y[A];if(W===void 0)continue;G.subscribeChanged(W),O.push(G.getOrAssignComponentIdx(W))}X._changedIdx=O}let F=X.mutates;if(F&&F.length>0){let O=[];for(let A=0;A<F.length;A++){let W=F[A];if(W!==void 0)O.push(G.getOrAssignComponentIdx(W))}if(X._mutatesIdx=O,J!==c)D.push({queryName:J,mutatesIdx:O,kind:Z})}};if(j.entityQueries)for(let J in j.entityQueries){let X=j.entityQueries[J];if(X)$(J,X,"list")}if(j.entitySingletons)for(let J in j.entitySingletons){let X=j.entitySingletons[J];if(X)$(J,X,"singleton")}if(j._autoMarkPairs=D.length>0?D:null,j.onEntityEnter){let J=new Map;for(let X in j.onEntityEnter)J.set(X,new Set);this._entityEnterTracking.set(j,J)}if(j.eventHandlers)for(let J in j.eventHandlers){let X=j.eventHandlers[J];if(X)this._eventBus.subscribe(J,(Z)=>{X({data:Z,ecs:this})})}if(this._initializeFired&&!this._systemsInitialized.has(j)){this._systemsInitialized.add(j);let J=j.onInitialize?.(this);if(J instanceof Promise)J.catch((X)=>{console.error(`onInitialize for system "${j.label}" rejected:`,X)})}}hasResource(j){return this._resourceManager.has(j)}getResource(j){if(!this._resourceManager.has(j))throw Error(`Resource '${String(j)}' not found. Available resources: [${this.getResourceKeys().map((D)=>String(D)).join(", ")}]`);return this._resourceManager.get(j,this)}tryGetResource(j){let D=j;if(!this._resourceManager.has(D))return;return this._resourceManager.get(D,this)}addResource(j,D){return this._resourceManager.add(j,D),this}removeResource(j){return this._resourceManager.remove(j)}async disposeResource(j){return this._resourceManager.disposeResource(j,this)}async disposeResources(){return this._resourceManager.disposeResources(this)}updateResource(j,D){let G=this.getResource(j),$=D(G);return this._resourceManager.add(j,$),this._resourceManager.notifyChange(j,$,G),this}setResource(j,D){let G=this.tryGetResource(j);if(this._resourceManager.add(j,D),G!==void 0)this._resourceManager.notifyChange(j,D,G);return this}onResourceChange(j,D){return this._resourceManager.onResourceChange(j,D)}isResourceObserved(j){return this._resourceManager.isObserved(j)}getResourceKeys(){return this._resourceManager.getKeys()}resourceNeedsInitialization(j){return this._resourceManager.needsInitialization(j)}getEntity(j){return this._entityManager.getEntity(j)}getComponent(j,D){return this._entityManager.getComponent(j,D)}addComponent(j,D,G){this._entityManager.addComponent(j,D,G)}addComponents(j,D){this._entityManager.addComponents(j,D)}removeComponent(j,D){this._entityManager.removeComponent(j,D)}hasComponent(j,D){return this._entityManager.getComponent(j,D)!==void 0}spawn(j,D){let G=this._entityManager.createEntity();return this._entityManager.addComponents(G.id,j),this._applyScreenScope(G.id,D),G}_getActiveScopeHint(){return this._activeScopeHint}_applyScreenScope(j,D){let G=D?.scope!==void 0?D.scope:this._activeScopeHint;if(G===null)return;let $=this._screenScopedEntities.get(G)??new Set;$.add(j),this._screenScopedEntities.set(G,$),this._entityScreenScope.set(j,G)}getEntitiesWithQuery(j,D=[],G,$){return this._entityManager.getEntitiesWithQuery(j,D,G,G?this._changeThreshold:void 0,$)}getSingleton(j,D=[]){let G=this._entityManager.getEntitiesWithQuery(j,D);if(G.length===0)throw Error(`getSingleton: no entity matches query with=[${String(j)}] without=[${String(D)}]`);if(G.length>1)throw Error(`getSingleton: expected 1 entity but found ${G.length} matching query with=[${String(j)}] without=[${String(D)}]`);let $=G[0];if(!$)throw Error("getSingleton: unexpected empty result");return $}tryGetSingleton(j,D=[]){let G=this._entityManager.getEntitiesWithQuery(j,D);if(G.length===0)return;if(G.length>1)throw Error(`tryGetSingleton: expected 0 or 1 entity but found ${G.length} matching query with=[${String(j)}] without=[${String(D)}]`);return G[0]}removeEntity(j,D){return this._entityManager.removeEntity(j,D)}spawnChild(j,D,G){let $=this._entityManager.spawnChild(j,D);return this._emitHierarchyChanged($.id,null,j),this._applyScreenScope($.id,G),$}setParent(j,D){let G=this._entityManager.getParent(j);return this._entityManager.setParent(j,D),this._emitHierarchyChanged(j,G,D),this}removeParent(j){let D=this._entityManager.getParent(j),G=this._entityManager.removeParent(j);if(G)this._emitHierarchyChanged(j,D,null);return G}getParent(j){return this._entityManager.getParent(j)}getChildren(j){return this._entityManager.getChildren(j)}getChildAt(j,D){return this._entityManager.getChildAt(j,D)}getChildIndex(j,D){return this._entityManager.getChildIndex(j,D)}getAncestors(j){return this._entityManager.getAncestors(j)}getDescendants(j){return this._entityManager.getDescendants(j)}getRoot(j){return this._entityManager.getRoot(j)}getSiblings(j){return this._entityManager.getSiblings(j)}isDescendantOf(j,D){return this._entityManager.isDescendantOf(j,D)}isAncestorOf(j,D){return this._entityManager.isAncestorOf(j,D)}getRootEntities(){return this._entityManager.getRootEntities()}forEachInHierarchy(j,D){this._entityManager.forEachInHierarchy(j,D)}hierarchyIterator(j){return this._entityManager.hierarchyIterator(j)}_emitHierarchyChanged(j,D,G){this._eventBus.publish("hierarchyChanged",{entityId:j,oldParent:D,newParent:G})}get installedPlugins(){return Array.from(this._installedPlugins)}get entityManager(){return this._entityManager}get eventBus(){return this._finalizePendingBuilders(),this._eventBus}get commands(){return this._commandBuffer}get currentTick(){return this._currentTick}get changeThreshold(){return this._changeThreshold}enableDiagnostics(j){if(this._diagnosticsEnabled=j,!j)this._systemTimings.clear(),this._phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0}}get diagnosticsEnabled(){return this._diagnosticsEnabled}get systemTimings(){return this._systemTimings}get phaseTimings(){return this._phaseTimings}get entityCount(){return this._entityManager.entityCount}mutateComponent(j,D,G){let $=this._entityManager.getComponent(j,D);if($===void 0)throw Error(`Entity ${j} does not have component "${String(D)}"`);return G($),this._entityManager.markChanged(j,D),$}markChanged(j,D){this._entityManager.markChanged(j,D)}registerDispose(j,D){this._entityManager.registerDispose(j,D)}registerRequired(j,D,G){if(String(j)===String(D))throw Error(`Cannot require a component to depend on itself: '${String(j)}'`);let $=this._requiredComponents.get(j)??[];if($.some((J)=>J.component===D))throw Error(`Required component '${String(D)}' already registered for trigger '${String(j)}'`);this._checkRequiredCycle(j,D),$.push({component:D,factory:G}),this._requiredComponents.set(j,$)}_checkRequiredCycle(j,D){i(j,D,(G)=>this._requiredComponents.get(G))}onComponentAdded(j,D){return this._entityManager.onComponentAdded(j,D)}onComponentRemoved(j,D){return this._entityManager.onComponentRemoved(j,D)}addReactiveQuery(j,D){this._reactiveQueryManager.addQuery(j,D)}removeReactiveQuery(j){return this._reactiveQueryManager.removeQuery(j)}on(j,D){return this._eventBus.subscribe(j,D)}off(j,D){return this._eventBus.unsubscribe(j,D)}onPostUpdate(j){return this._postUpdateHooks.push(j),()=>{let D=this._postUpdateHooks.indexOf(j);if(D!==-1)this._postUpdateHooks.splice(D,1)}}requireAssetManager(){if(!this._assetManager)throw Error("Asset manager not configured. Use withAssets() in builder.");return this._assetManager}getAsset(j){return this.requireAssetManager().get(j)}tryGetAsset(j){return this._assetManager?.tryGet(j)}getAssetHandle(j){return this.requireAssetManager().getHandle(j)}isAssetLoaded(j){return this._assetManager?.isLoaded(j)??!1}async loadAsset(j){return this.requireAssetManager().loadAsset(j)}async loadAssetGroup(j){return this.requireAssetManager().loadAssetGroup(j)}isAssetGroupLoaded(j){return this._assetManager?.isGroupLoaded(j)??!1}getAssetGroupProgress(j){return this._assetManager?.getGroupProgress(j)??0}requireScreenManager(){if(!this._screenManager)throw Error("Screen manager not configured. Use withScreens() in builder.");return this._screenManager}async setScreen(j,D){return this.requireScreenManager().setScreen(j,D)}async pushScreen(j,D){return this.requireScreenManager().pushScreen(j,D)}async popScreen(){return this.requireScreenManager().popScreen()}getCurrentScreen(){return this._screenManager?.getCurrentScreen()??null}getScreenConfig(j){return this.requireScreenManager().getConfig(j)}tryGetScreenConfig(j){return this._screenManager?.tryGetConfig(j)??void 0}getScreenState(j){return this.requireScreenManager().getState(j)}tryGetScreenState(j){return this._screenManager?.tryGetState(j)??void 0}updateScreenState(j,D){if(typeof j==="string")this.requireScreenManager().updateState(D,j);else this.requireScreenManager().updateState(j)}isCurrentScreen(j){return this._screenManager?.isCurrent(j)??!1}isScreenActive(j){return this._screenManager?.isActive(j)??!1}getScreenStackDepth(){return this._screenManager?.getStackDepth()??0}onScreenEnter(j,D){let G=this._eventBus,$=(Z)=>{if(Z.screen!==j)return;D({config:Z.config,ecs:this})},J=G.subscribe("screenEnter",$),X=G.subscribe("screenPush",$);return()=>{J(),X()}}onScreenResume(j,D){return this._eventBus.subscribe("screenResume",($)=>{if($.screen!==j)return;D({config:$.config,state:$.state,ecs:this})})}onScreenExit(j,D){return this._eventBus.subscribe("screenExit",($)=>{if($.screen!==j)return;D({ecs:this})})}_setAssetManager(j){this._assetManager=j;for(let[D,G]of this._pendingPluginAssets)this._assetManager.register(D,G);this._pendingPluginAssets=[]}_setScreenManager(j){this._screenManager=j;for(let[D,G]of this._pendingPluginScreens)this._screenManager.register(D,G);this._pendingPluginScreens=[]}_hasPendingPluginAssets(){return this._pendingPluginAssets.length>0}_hasPendingPluginScreens(){return this._pendingPluginScreens.length>0}_setFixedDt(j){this._fixedDt=j}_registerAsset(j,D){this._pendingPluginAssets.push([j,D])}_registerScreen(j,D){this._pendingPluginScreens.push([j,D])}installPlugin(j){return this._installPluginUnchecked(j)}_installPluginUnchecked(j){if(this._installedPlugins.has(j.id))return this;this._installedPlugins.add(j.id);let D=[];this._pluginCleanups.set(j.id,D);let G=(J)=>{D.push(J)},$=this._currentSystemDefaults;this._currentSystemDefaults=j.systemDefaults;try{j.install(this,G)}finally{this._currentSystemDefaults=$}return this}uninstallPlugin(j){if(!this._installedPlugins.has(j))return!1;let D=this._pluginCleanups.get(j);if(this._pluginCleanups.delete(j),this._installedPlugins.delete(j),D)for(let G=D.length-1;G>=0;G--){let $=D[G];if(!$)continue;try{$()}catch(J){console.warn(`Plugin '${j}' cleanup threw:`,J)}}return!0}dispose(){let j=Array.from(this._installedPlugins);for(let D=j.length-1;D>=0;D--){let G=j[D];if(G!==void 0)this.uninstallPlugin(G)}}pluginFactory(){return(j)=>E(j.id).install(j.install)}getHelpers(j){return j(this)}}function uj(j){return j}function mj(j,D){return{x:j,y:D}}function sj(){return{x:0,y:0}}function cj(j,D){return{x:j.x+D.x,y:j.y+D.y}}function ij(j,D){return{x:j.x-D.x,y:j.y-D.y}}function yj(j,D){return{x:j.x*D,y:j.y*D}}function dj(j){return{x:-j.x,y:-j.y}}function oj(j,D){return j.x*D.x+j.y*D.y}function rj(j,D){return j.x*D.y-j.y*D.x}function aj(j){return j.x*j.x+j.y*j.y}function nj(j){return Math.sqrt(j.x*j.x+j.y*j.y)}function tj(j){let D=Math.sqrt(j.x*j.x+j.y*j.y);if(D===0)return{x:0,y:0};return{x:j.x/D,y:j.y/D}}function ej(j,D){let G=j.x-D.x,$=j.y-D.y;return G*G+$*$}function j3(j,D){let G=j.x-D.x,$=j.y-D.y;return Math.sqrt(G*G+$*$)}function D3(j,D,G=0.0000000001){return Math.abs(j.x-D.x)<=G&&Math.abs(j.y-D.y)<=G}function G3(j,D,G){return{x:j,y:D,z:G}}function $3(){return{x:0,y:0,z:0}}function J3(j,D){return{x:j.x+D.x,y:j.y+D.y,z:j.z+D.z}}function X3(j,D){return{x:j.x-D.x,y:j.y-D.y,z:j.z-D.z}}function Z3(j,D){return{x:j.x*D,y:j.y*D,z:j.z*D}}function W3(j){return{x:-j.x,y:-j.y,z:-j.z}}function Y3(j,D){return j.x*D.x+j.y*D.y+j.z*D.z}function L3(j,D){return{x:j.y*D.z-j.z*D.y,y:j.z*D.x-j.x*D.z,z:j.x*D.y-j.y*D.x}}function F3(j){return j.x*j.x+j.y*j.y+j.z*j.z}function _3(j){return Math.sqrt(j.x*j.x+j.y*j.y+j.z*j.z)}function A3(j){let D=Math.sqrt(j.x*j.x+j.y*j.y+j.z*j.z);if(D===0)return{x:0,y:0,z:0};return{x:j.x/D,y:j.y/D,z:j.z/D}}function O3(j,D){let G=j.x-D.x,$=j.y-D.y,J=j.z-D.z;return G*G+$*$+J*J}function B3(j,D){let G=j.x-D.x,$=j.y-D.y,J=j.z-D.z;return Math.sqrt(G*G+$*$+J*J)}function Q3(j,D,G=0.0000000001){return Math.abs(j.x-D.x)<=G&&Math.abs(j.y-D.y)<=G&&Math.abs(j.z-D.z)<=G}var C3=V;export{$3 as vec3Zero,X3 as vec3Sub,Z3 as vec3Scale,A3 as vec3Normalize,W3 as vec3Negate,F3 as vec3LengthSq,_3 as vec3Length,Q3 as vec3Equals,Y3 as vec3Dot,O3 as vec3DistanceSq,B3 as vec3Distance,L3 as vec3Cross,J3 as vec3Add,G3 as vec3,sj as vec2Zero,ij as vec2Sub,yj as vec2Scale,tj as vec2Normalize,dj as vec2Negate,aj as vec2LengthSq,nj as vec2Length,D3 as vec2Equals,oj as vec2Dot,ej as vec2DistanceSq,j3 as vec2Distance,rj as vec2Cross,cj as vec2Add,mj as vec2,n as directValue,E as definePlugin,C3 as default,h as createScreenConfigurator,uj as createQueryDefinition,p as createAssetConfigurator,x as SystemBuilder,P as ScreenManager,z as AssetManager};
1
+ var Gj=((j)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(j,{get:(D,G)=>(typeof require<"u"?require:D)[G]}):j)(function(j){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+j+'" is not supported')});class H{parentMap=new Map;childrenMap=new Map;_bfsQueue=[];setParent(j,D){if(j===D)throw Error(`Cannot set entity ${j} as its own parent`);if(this.wouldCreateCycle(j,D))throw Error("Cannot set parent: would create circular reference");let G=this.parentMap.get(j);if(G!==void 0){let J=this.childrenMap.get(G);if(J){let X=J.indexOf(j);if(X!==-1)J.splice(X,1)}}this.parentMap.set(j,D);let $=this.childrenMap.get(D);if($)$.push(j);else this.childrenMap.set(D,[j]);return this}removeParent(j){let D=this.parentMap.get(j);if(D===void 0)return!1;let G=this.childrenMap.get(D);if(G){let $=G.indexOf(j);if($!==-1)G.splice($,1)}return this.parentMap.delete(j),!0}getParent(j){return this.parentMap.get(j)??null}getChildren(j){let D=this.childrenMap.get(j);return D?[...D]:[]}getChildAt(j,D){if(D<0)return null;let G=this.childrenMap.get(j);if(!G||D>=G.length)return null;return G[D]??null}getChildIndex(j,D){let G=this.childrenMap.get(j);if(!G)return-1;return G.indexOf(D)}removeEntity(j){let D=this.parentMap.get(j)??null;if(D!==null){let J=this.childrenMap.get(D);if(J){let X=J.indexOf(j);if(X!==-1)J.splice(X,1)}}this.parentMap.delete(j);let G=this.childrenMap.get(j)??[],$=[...G];for(let J of G)this.parentMap.delete(J);return this.childrenMap.delete(j),{oldParent:D,orphanedChildren:$}}getAncestors(j){let D=[],G=this.parentMap.get(j);while(G!==void 0)D.push(G),G=this.parentMap.get(G);return D}getDescendants(j){let D=[],G=this.childrenMap.get(j);if(!G)return D;let $=G.slice().reverse();while($.length>0){let J=$.pop();D.push(J);let X=this.childrenMap.get(J);if(X)for(let Z=X.length-1;Z>=0;Z--)$.push(X[Z])}return D}getRoot(j){let D=j,G=this.parentMap.get(D);while(G!==void 0)D=G,G=this.parentMap.get(D);return D}getSiblings(j){let D=this.parentMap.get(j);if(D===void 0)return[];let G=this.childrenMap.get(D);if(!G)return[];return G.filter(($)=>$!==j)}isDescendantOf(j,D){if(j===D)return!1;let G=this.parentMap.get(j);while(G!==void 0){if(G===D)return!0;G=this.parentMap.get(G)}return!1}isAncestorOf(j,D){return this.isDescendantOf(D,j)}get hasHierarchy(){return this.childrenMap.size>0}getRootEntities(){let j=[];for(let D of this.childrenMap.keys())if(!this.parentMap.has(D))j.push(D);return j}wouldCreateCycle(j,D){let G=D;while(G!==void 0){if(G===j)return!0;G=this.parentMap.get(G)}return!1}forEachInHierarchy(j,D){let G=D?.roots??this.getRootEntities(),$=this._bfsQueue;$.length=0;for(let J of G)$.push(J,-1,0);for(let J=0;J<$.length;J+=3){let X=$[J],Z=$[J+1],Y=$[J+2];j(X,Z===-1?null:Z,Y);let F=this.childrenMap.get(X);if(F){let O=Y+1;for(let A of F)$.push(A,X,O)}}}*hierarchyIterator(j){let D=j?.roots??this.getRootEntities(),G=[];for(let $ of D)G.push({entityId:$,parentId:null,depth:0});for(let $ of G){yield $;let J=this.childrenMap.get($.entityId);if(J)for(let X of J)G.push({entityId:X,parentId:$.entityId,depth:$.depth+1})}}}function R(j,D,G,$,J){let X=j.components;for(let Z of D)if(!(Z in X))return!1;if(G){for(let Z of G)if(Z in X)return!1}if($&&$.length>0){let Z=J.getParent(j.id);if(Z===null)return!1;let Y=J.getEntity(Z);if(!Y)return!1;let F=Y.components;for(let O of $)if(!(O in F))return!1}return!0}function a(j,D,G){let $=j.length===0?"":[...j].map(String).sort().join(","),J=D.length===0?"":[...D].map(String).sort().join(","),X=G.length===0?"":[...G].map(String).sort().join(",");return`${$}|${J}|${X}`}class S{host;caches=new Map;byComp=new Map;byParentComp=new Map;constructor(j){this.host=j}getOrCreate(j,D,G){let $=a(j,D,G),J=this.caches.get($);if(J)return J.members;let X={with:[...j],without:[...D],parentHas:[...G],members:new Map};this.caches.set($,X);for(let Z of X.with)v(this.byComp,Z,X);for(let Z of X.without)v(this.byComp,Z,X);for(let Z of X.parentHas)v(this.byParentComp,Z,X);return this.populate(X),X.members}get cacheCount(){return this.caches.size}populate(j){let D=this.host,G=j.with;if(G.length===0){for(let Z of D.allEntities())if(this.matches(Z,j))j.members.set(Z.id,Z);return}let $=G[0];if($===void 0)return;let J=D.componentIndex($)?.size??0;for(let Z=1;Z<G.length;Z++){let Y=G[Z];if(Y===void 0)continue;let F=D.componentIndex(Y)?.size??0;if(F<J)$=Y,J=F}let X=D.componentIndex($);if(!X||X.size===0)return;for(let Z of X){let Y=D.getEntity(Z);if(!Y)continue;if(this.matches(Y,j))j.members.set(Z,Y)}}matches(j,D){return R(j,D.with,D.without,D.parentHas,this.host)}reeval(j,D){let G=this.host.getEntity(j);if(!G){D.members.delete(j);return}if(this.matches(G,D))D.members.set(j,G);else D.members.delete(j)}onComponentChanged(j,D){let G=this.byComp.get(D);if(G)for(let J of G)this.reeval(j,J);let $=this.byParentComp.get(D);if($&&$.length>0){let J=this.host.getChildren(j);if(J.length>0)for(let X of $)for(let Z of J)this.reeval(Z,X)}}onParentChanged(j){for(let D of this.caches.values())if(D.parentHas.length>0)this.reeval(j,D)}onEntityRemoved(j){let D=!1;for(let $ of this.caches.values())if($.members.delete(j),$.parentHas.length>0)D=!0;if(!D)return;let G=this.host.getChildren(j);if(G.length===0)return;for(let $ of this.caches.values()){if($.parentHas.length===0)continue;for(let J of G)$.members.delete(J)}}}function v(j,D,G){let $=j.get(D);if($)$.push(G);else j.set(D,[G])}function l(j,D,G){if(!j||!D)return!1;for(let $=0;$<D.length;$++){let J=D[$];if(J===void 0||J>=j.length)continue;let X=j[J];if(X!==void 0&&X>G)return!0}return!1}class N{callbacks=[];_iterDepth=0;_pendingRemovals=[];add(j){this.callbacks.push(j)}remove(j){if(this._iterDepth>0){this._pendingRemovals.push(j);return}let D=this.callbacks.indexOf(j);if(D!==-1)this.callbacks.splice(D,1)}invoke(j){this._iterDepth++;let D=this.callbacks.length;for(let G=0;G<D;G++){let $=this.callbacks[G];if($)$(j)}if(this._iterDepth--,this._iterDepth===0&&this._pendingRemovals.length>0){for(let G of this._pendingRemovals){let $=this.callbacks.indexOf(G);if($!==-1)this.callbacks.splice($,1)}this._pendingRemovals.length=0}}}class T{nextId=1;entities=new Map;componentIndices=new Map;addedCallbacks=new Map;removedCallbacks=new Map;hierarchyManager=new H;disposeCallbacks=new Map;changeSeqs=[];componentNameToIdx=new Map;_idxCache0Name;_idxCache0Idx=-1;_idxCache1Name;_idxCache1Idx=-1;_subscribedComponentIdx=null;_changeSeq=0;_afterComponentAddedHooks=[];_afterEntityMutatedHooks=[];_afterComponentRemovedHooks=[];_beforeEntityRemovedHooks=[];_afterParentChangedHooks=[];_queryCache=new S({getEntity:(j)=>this.entities.get(j),getParent:(j)=>this.hierarchyManager.getParent(j),getChildren:(j)=>this.hierarchyManager.getChildren(j),allEntities:()=>this.entities.values(),componentIndex:(j)=>this.componentIndices.get(j)});_batchingDepth=0;_batchedEntityIds=new Set;_pendingBatchKeys=null;get entityCount(){return this.entities.size}createEntity(){let j=this.nextId++,D={id:j,components:{}};return this.entities.set(j,D),D}registerDispose(j,D){this.disposeCallbacks.set(j,D)}getDisposeCallbacks(){return this.disposeCallbacks}invokeDispose(j,D,G){let $=this.disposeCallbacks.get(j);if(!$)return;try{$({value:D,entityId:G})}catch(J){console.warn(`Component dispose callback for '${String(j)}' threw:`,J)}}addComponent(j,D,G){let $=this.entities.get(j);if(!$)throw Error(`Cannot add component '${String(D)}': Entity with ID ${j} does not exist`);let J=$.components[D];if(J!==void 0)this.invokeDispose(D,J,$.id);if($.components[D]=G,!this.componentIndices.has(D))this.componentIndices.set(D,new Set);this.componentIndices.get(D)?.add($.id);let X=this.addedCallbacks.get(D);if(X)X.invoke({value:G,entity:$});this._queryCache.onComponentChanged($.id,D),this._batchingDepth++;for(let Z of this._afterComponentAddedHooks)Z($.id,D);if(this._batchedEntityIds.add($.id),this._batchingDepth--,this._batchingDepth===0){for(let Z of this._batchedEntityIds)for(let Y of this._afterEntityMutatedHooks)Y(Z);this._batchedEntityIds.clear()}return this}addComponents(j,D){let G=this.entities.get(j);if(!G)throw Error(`Cannot add components: Entity with ID ${j} does not exist`);let $=this._pendingBatchKeys;this._pendingBatchKeys=new Set(Object.keys(D)),this._batchingDepth++;for(let J in D)this.addComponent(G.id,J,D[J]);if(this._batchingDepth--,this._pendingBatchKeys=$,this._batchingDepth===0){for(let J of this._batchedEntityIds)for(let X of this._afterEntityMutatedHooks)X(J);this._batchedEntityIds.clear()}return this}removeComponent(j,D){let G=this.entities.get(j);if(!G)throw Error(`Cannot remove component '${String(D)}': Entity with ID ${j} does not exist`);let $=G.components[D];if($!==void 0)this.invokeDispose(D,$,G.id);delete G.components[D];let J=this.removedCallbacks.get(D);if(J&&$!==void 0)J.invoke({value:$,entity:G});if(this.componentIndices.get(D)?.delete(G.id),$!==void 0){this._queryCache.onComponentChanged(G.id,D);for(let X of this._afterComponentRemovedHooks)X(G.id,D)}return this}getComponent(j,D){return this.entities.get(j)?.components[D]}getEntitiesWithQuery(j=[],D=[],G,$,J,X){return this.getEntitiesWithQueryInto([],j,D,G,$,J,X)}getEntitiesWithQueryInto(j,D=[],G=[],$,J,X,Z){j.length=0;let Y=$!==void 0&&$.length>0&&J!==void 0,F=Z;if(Y&&F===void 0){let W=[];for(let _ of $){let L=this.componentNameToIdx.get(_);if(L!==void 0)W.push(L)}F=W}if(Y&&F.length===0)return j;let O=X!==void 0&&X.length>0;if(D.length===0&&G.length===0&&!O){if(!Y){for(let W of this.entities.values())j.push(W);return j}for(let W of this.entities.values()){if(!l(this.changeSeqs[W.id],F,J??0))continue;j.push(W)}return j}let A=this._queryCache.getOrCreate(D,G,X??[]);if(A.size===0)return j;if(Y){for(let W of A.values()){if(!l(this.changeSeqs[W.id],F,J??0))continue;j.push(W)}return j}for(let W of A.values())j.push(W);return j}get _queryCacheForTesting(){return this._queryCache}removeEntity(j,D){let G=this.entities.get(j);if(!G)return!1;if(D?.cascade??!0){let J=this.hierarchyManager.getDescendants(G.id);for(let X=J.length-1;X>=0;X--){let Z=J[X];if(Z===void 0)continue;this._queryCache.onEntityRemoved(Z);for(let Y of this._beforeEntityRemovedHooks)Y(Z)}this._queryCache.onEntityRemoved(G.id);for(let X of this._beforeEntityRemovedHooks)X(G.id);for(let X=J.length-1;X>=0;X--){let Z=J[X];if(Z===void 0)continue;this.removeEntityInternal(Z)}}else{this._queryCache.onEntityRemoved(G.id);for(let J of this._beforeEntityRemovedHooks)J(G.id)}return this.removeEntityInternal(G.id)}removeEntityInternal(j){let D=this.entities.get(j);if(!D)return!1;this.hierarchyManager.removeEntity(j);for(let G of Object.keys(D.components)){let $=D.components[G];if($!==void 0){this.invokeDispose(G,$,D.id);let J=this.removedCallbacks.get(G);if(J)J.invoke({value:$,entity:D})}this.componentIndices.get(G)?.delete(D.id)}return this.changeSeqs[D.id]=void 0,this.entities.delete(D.id)}getEntity(j){return this.entities.get(j)}onComponentAdded(j,D){let G=D,$=this.addedCallbacks.get(j);if(!$)$=new N,this.addedCallbacks.set(j,$);return $.add(G),()=>{this.addedCallbacks.get(j)?.remove(G)}}onComponentRemoved(j,D){let G=D,$=this.removedCallbacks.get(j);if(!$)$=new N,this.removedCallbacks.set(j,$);return $.add(G),()=>{this.removedCallbacks.get(j)?.remove(G)}}onAfterComponentAdded(j){return this._afterComponentAddedHooks.push(j),()=>{let D=this._afterComponentAddedHooks.indexOf(j);if(D!==-1)this._afterComponentAddedHooks.splice(D,1)}}onAfterEntityMutated(j){return this._afterEntityMutatedHooks.push(j),()=>{let D=this._afterEntityMutatedHooks.indexOf(j);if(D!==-1)this._afterEntityMutatedHooks.splice(D,1)}}onAfterComponentRemoved(j){return this._afterComponentRemovedHooks.push(j),()=>{let D=this._afterComponentRemovedHooks.indexOf(j);if(D!==-1)this._afterComponentRemovedHooks.splice(D,1)}}onBeforeEntityRemoved(j){return this._beforeEntityRemovedHooks.push(j),()=>{let D=this._beforeEntityRemovedHooks.indexOf(j);if(D!==-1)this._beforeEntityRemovedHooks.splice(D,1)}}onAfterParentChanged(j){return this._afterParentChangedHooks.push(j),()=>{let D=this._afterParentChangedHooks.indexOf(j);if(D!==-1)this._afterParentChangedHooks.splice(D,1)}}get changeSeq(){return this._changeSeq}markChanged(j,D){this.markChangedByIdx(j,this.getOrAssignComponentIdx(D))}markChangedByIdx(j,D){let G=this._subscribedComponentIdx;if(G!==null&&(D>=G.length||G[D]===0))return;let $=++this._changeSeq,J=this.changeSeqs[j];if(J===void 0)J=new Uint32Array(Math.max(D+1,8)),this.changeSeqs[j]=J;else if(D>=J.length){let X=new Uint32Array(Math.max(D+1,J.length*2));X.set(J),J=X,this.changeSeqs[j]=J}J[D]=$}getOrAssignComponentIdx(j){if(j===this._idxCache0Name)return this._idxCache0Idx;if(j===this._idxCache1Name){let G=this._idxCache1Idx;return this._idxCache1Name=this._idxCache0Name,this._idxCache1Idx=this._idxCache0Idx,this._idxCache0Name=j,this._idxCache0Idx=G,G}let D=this.componentNameToIdx.get(j);if(D===void 0)D=this.componentNameToIdx.size,this.componentNameToIdx.set(j,D);return this._idxCache1Name=this._idxCache0Name,this._idxCache1Idx=this._idxCache0Idx,this._idxCache0Name=j,this._idxCache0Idx=D,D}subscribeChanged(j){let D=this.getOrAssignComponentIdx(j),G=this._subscribedComponentIdx;if(G===null)G=new Uint8Array(Math.max(D+1,8)),this._subscribedComponentIdx=G;else if(D>=G.length){let $=new Uint8Array(Math.max(D+1,G.length*2));$.set(G),G=$,this._subscribedComponentIdx=G}G[D]=1}disableChangeTracking(){this._subscribedComponentIdx=new Uint8Array(0)}hasAnySubscribed(j){let D=this._subscribedComponentIdx;if(D===null)return!0;for(let G=0;G<j.length;G++){let $=j[G];if($!==void 0&&$<D.length&&D[$]!==0)return!0}return!1}getChangeSeq(j,D){let G=this.componentNameToIdx.get(D);if(G===void 0)return-1;let $=this.changeSeqs[j];if(!$||G>=$.length)return-1;let J=$[G]??0;return J===0?-1:J}spawnChild(j,D){let G=this.createEntity();return this.addComponents(G.id,D),this.setParent(G.id,j),G}setParent(j,D){this.hierarchyManager.setParent(j,D),this._queryCache.onParentChanged(j);for(let G of this._afterParentChangedHooks)G(j);return this}removeParent(j){let D=this.hierarchyManager.removeParent(j);if(D){this._queryCache.onParentChanged(j);for(let G of this._afterParentChangedHooks)G(j)}return D}getParent(j){return this.hierarchyManager.getParent(j)}getChildren(j){return this.hierarchyManager.getChildren(j)}getChildAt(j,D){return this.hierarchyManager.getChildAt(j,D)}getChildIndex(j,D){return this.hierarchyManager.getChildIndex(j,D)}getAncestors(j){return this.hierarchyManager.getAncestors(j)}getDescendants(j){return this.hierarchyManager.getDescendants(j)}getRoot(j){return this.hierarchyManager.getRoot(j)}getSiblings(j){return this.hierarchyManager.getSiblings(j)}isDescendantOf(j,D){return this.hierarchyManager.isDescendantOf(j,D)}isAncestorOf(j,D){return this.hierarchyManager.isAncestorOf(j,D)}get hasHierarchy(){return this.hierarchyManager.hasHierarchy}getRootEntities(){return this.hierarchyManager.getRootEntities()}forEachInHierarchy(j,D){this.hierarchyManager.forEachInHierarchy(j,D)}hierarchyIterator(j){return this.hierarchyManager.hierarchyIterator(j)}}class w{handlers=new Map;subscribe(j,D){return this.addHandler(j,D,!1)}once(j,D){return this.addHandler(j,D,!0)}unsubscribe(j,D){let G=this.handlers.get(j);if(!G)return!1;let $=G.findIndex((J)=>J.callback===D);if($===-1)return!1;return G.splice($,1),!0}addHandler(j,D,G){let $=this.handlers.get(j);if(!$)$=[],this.handlers.set(j,$);let J={callback:D,once:G};return $.push(J),()=>{let X=this.handlers.get(j);if(X){let Z=X.indexOf(J);if(Z!==-1)X.splice(Z,1)}}}publish(j,D){let G=this.handlers.get(j);if(!G||G.length===0)return;let $=!1,J=G.length;for(let X=0;X<J&&X<G.length;X++){let Z=G[X];if(!Z)continue;if(Z.callback(D),Z.once)$=!0}if($){for(let X=G.length-1;X>=0;X--)if(G[X]?.once)G.splice(X,1)}}clear(){this.handlers.clear()}clearEvent(j){this.handlers.delete(j)}}var k=Symbol("resource-direct");function n(j){return{[k]:j}}function b(j){if(typeof j==="object"&&j!==null&&!Array.isArray(j))return{...j};return{$value:j}}function t(j,D){if(typeof j==="object"&&j!==null&&!Array.isArray(j)){let G=j;for(let $ in D)if(!Object.is(G[$],D[$]))return!0;return!1}return!Object.is(j,D.$value)}function e(j){return typeof j==="object"&&j!==null&&"factory"in j&&typeof j.factory==="function"}function jj(j){return typeof j==="object"&&j!==null&&k in j}function m(j,D){let G=[],$=new Set,J=new Set;function X(Z,Y=[]){if($.has(Z))return;if(J.has(Z))throw Error(`Circular resource dependency: ${[...Y,Z].join(" -> ")}`);J.add(Z);for(let F of D(Z)){let O=j.find((A)=>A===F);if(O)X(O,[...Y,Z])}J.delete(Z),$.add(Z),G.push(Z)}for(let Z of j)X(Z);return G}class C{resources=new Map;resourceFactories=new Map;resourceDependencies=new Map;resourceDisposers=new Map;initializedResourceKeys=new Set;_changeSubscribers=new Map;_observedSnapshots=new Map;add(j,D){let G=($)=>{this.resources.set(j,$),this.initializedResourceKeys.add(j),this.resourceDependencies.set(j,[])};if(e(D)){if(this.resourceFactories.set(j,D.factory),this.resourceDependencies.set(j,D.dependsOn??[]),D.onDispose)this.resourceDisposers.set(j,D.onDispose)}else if(jj(D))G(D[k]);else if(typeof D==="function")this.resourceFactories.set(j,D),this.resourceDependencies.set(j,[]);else G(D);return this}tryGet(j,...D){if(!this.has(j))return;return this.get(j,...D)}get(j,...D){let G=this.resources.get(j);if(G!==void 0)return G;let $=this.resourceFactories.get(j);if($===void 0)throw Error(`Resource ${String(j)} not found`);let J=D[0],X=$(J);if(!(X instanceof Promise))this.resources.set(j,X),this.initializedResourceKeys.add(j);return X}has(j){return this.resources.has(j)||this.resourceFactories.has(j)}remove(j){let D=this.resources.delete(j),G=this.resourceFactories.delete(j);return this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),D||G}getKeys(){let j=new Set([...this.resources.keys(),...this.resourceFactories.keys()]);return Array.from(j)}needsInitialization(j){return this.resourceFactories.has(j)&&!this.initializedResourceKeys.has(j)}getPendingInitializationKeys(){return Array.from(this.resourceFactories.keys()).filter((j)=>!this.initializedResourceKeys.has(j))}async initializeResource(j,...D){if(!this.resourceFactories.has(j)||this.initializedResourceKeys.has(j))return;let G=this.resourceFactories.get(j);if(!G)return;let $=D[0],J=await G($);this.resources.set(j,J),this.initializedResourceKeys.add(j),this.resourceFactories.delete(j)}async initializeResources(...j){let D=j.slice(1),G=D.length===0?this.getPendingInitializationKeys():D;if(G.length===0)return;let $=m(G,(J)=>[...this.resourceDependencies.get(J)??[]]);for(let J of $)await this.initializeResource(J,...j.slice(0,1))}getDependencies(j){return this.resourceDependencies.get(j)??[]}async disposeResource(j,...D){if(!this.resources.has(j)&&!this.resourceFactories.has(j))return!1;if(this.initializedResourceKeys.has(j)){let G=this.resourceDisposers.get(j),$=this.resources.get(j);if(G&&$!==void 0){let J=D[0];await G($,J)}}return this.resources.delete(j),this.resourceFactories.delete(j),this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),this._changeSubscribers.delete(j),!0}onResourceChange(j,D){let G=this._changeSubscribers.get(j),$=G??new Set;if(!G){this._changeSubscribers.set(j,$);let X=this.resources.get(j);this._observedSnapshots.set(j,b(X))}let J=D;return $.add(J),()=>{if($.delete(J),$.size===0)this._changeSubscribers.delete(j),this._observedSnapshots.delete(j)}}notifyChange(j,D,G){if(Object.is(D,G))return;let $=this._changeSubscribers.get(j);if(!$||$.size===0)return;if(this._observedSnapshots.has(j))this._observedSnapshots.set(j,b(D));let J=[...$];for(let X of J)X(D,G)}isObserved(j){return this._observedSnapshots.has(j)}flushObserved(){if(this._observedSnapshots.size===0)return;for(let[j,D]of this._observedSnapshots){let G=this.resources.get(j);if(!t(G,D))continue;let $="$value"in D?D.$value:D,J=b(G),X=this._changeSubscribers.get(j);for(let Z of X)Z(G,$);this._observedSnapshots.set(j,J)}}async disposeResources(...j){let D=Array.from(this.initializedResourceKeys);if(D.length===0)return;let G=m(D,($)=>[...this.resourceDependencies.get($)??[]]).reverse();for(let $ of G)await this.disposeResource($,...j)}}class q{queries=new Map;entityManager;ecs;_hasParentHasQueries=!1;constructor(j,D){this.entityManager=j,this.ecs=D}get hasParentHasQueries(){return this._hasParentHasQueries}addQuery(j,D){let G={definition:D,matchingEntities:new Set};if(this.queries.set(j,G),D.parentHas?.length)this._hasParentHasQueries=!0;let $=this.entityManager.getEntitiesWithQuery(D.with,D.without??[]);for(let J of $)if(this.entityMatchesQuery(J,G.definition))G.matchingEntities.add(J.id),this._fireEnter(G.definition,J)}removeQuery(j){let D=this.queries.delete(j);if(D)this._recalcParentHasFlag();return D}entityMatchesQuery(j,D){return R(j,D.with,D.without,D.parentHas,this.entityManager)}_fireEnter(j,D){j.onEnter?.({entity:D,ecs:this.ecs})}_fireExit(j,D){j.onExit?.({entityId:D,ecs:this.ecs})}_applyQueryTransition(j,D){let G=D.matchingEntities.has(j.id),$=this.entityMatchesQuery(j,D.definition);if(!G&&$)D.matchingEntities.add(j.id),this._fireEnter(D.definition,j);else if(G&&!$)D.matchingEntities.delete(j.id),this._fireExit(D.definition,j.id)}onComponentAdded(j,D){for(let[,G]of this.queries)this._applyQueryTransition(j,G);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onComponentRemoved(j,D){for(let[,G]of this.queries)this._applyQueryTransition(j,G);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onEntityRemoved(j){for(let[D,G]of this.queries)if(G.matchingEntities.has(j))G.matchingEntities.delete(j),this._fireExit(G.definition,j)}recheckEntity(j){for(let[,D]of this.queries)this._applyQueryTransition(j,D)}recheckEntityAndChildren(j){if(this.recheckEntity(j),this._hasParentHasQueries)this._recheckChildren(j.id)}_recheckChildren(j){let D=this.entityManager.getChildren(j);for(let G of D){let $=this.entityManager.getEntity(G);if($)this.recheckEntity($)}}_recalcParentHasFlag(){this._hasParentHasQueries=!1;for(let[,j]of this.queries)if(j.definition.parentHas?.length){this._hasParentHasQueries=!0;return}}}class g{parent;commands=[];constructor(j){this.parent=j}removeEntity(j,D){this.commands.push((G)=>{G.removeEntity(j,D)})}addComponent(j,D,G){this.commands.push(($)=>{$.addComponent(j,D,G)})}removeComponent(j,D){this.commands.push((G)=>{G.removeComponent(j,D)})}spawn(j,D){let G=this._resolveScope(D);this.commands.push(($)=>{$.spawn(j,G)})}spawnChild(j,D,G){let $=this._resolveScope(G);this.commands.push((J)=>{J.spawnChild(j,D,$)})}_resolveScope(j){if(j?.scope!==void 0)return j;let D=this.parent?._getActiveScopeHint();if(!D)return j;return{scope:D}}addComponents(j,D){this.commands.push((G)=>{G.addComponents(j,D)})}setParent(j,D){this.commands.push((G)=>{G.setParent(j,D)})}mutateComponent(j,D,G){this.commands.push(($)=>{$.mutateComponent(j,D,G)})}markChanged(j,D){this.commands.push((G)=>{G.markChanged(j,D)})}removeParent(j){this.commands.push((D)=>{D.removeParent(j)})}playback(j){for(let D of this.commands)try{D(j)}catch(G){console.warn("CommandBuffer: Command failed during playback:",G)}this.commands.length=0}clear(){this.commands.length=0}get length(){return this.commands.length}}class s{_id;constructor(j){this._id=j}_systemDefaults;setSystemDefaults(j){return this._systemDefaults=j,this}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}withAssetTypes(){return this}withScreenTypes(){return this}withLabels(){return this}withGroups(){return this}withAssetGroupNames(){return this}withReactiveQueryNames(){return this}requires(){return this}install(j){return{id:this._id,install:j,...this._systemDefaults?{systemDefaults:this._systemDefaults}:{}}}}function E(j){return new s(j)}var c="__each";class x{_label;queries={};singletons={};processFunction;detachFunction;initializeFunction;eventHandlers;_priority=0;_phase="update";_groups=[];_inScreens;_excludeScreens;_requiredAssets;_runWhenEmpty=!1;_entityEnterHandlers={};_resourceKeys;constructor(j,D){this._label=j;if(D){if(D.phase!==void 0)this._phase=D.phase;if(D.priority!==void 0)this._priority=D.priority;if(D.inScreens!==void 0)this._inScreens=D.inScreens;if(D.excludeScreens!==void 0)this._excludeScreens=D.excludeScreens}}get label(){return this._label}_createSystemObject(){let j={label:this._label,entityQueries:this.queries,priority:this._priority,phase:this._phase};if(Object.keys(this.singletons).length>0)j.entitySingletons=this.singletons;if(this.processFunction)j.process=this.processFunction;if(this.detachFunction)j.onDetach=this.detachFunction;if(this.initializeFunction)j.onInitialize=this.initializeFunction;if(this.eventHandlers)j.eventHandlers=this.eventHandlers;if(this._groups.length>0)j.groups=[...this._groups];if(this._inScreens)j.inScreens=this._inScreens;if(this._excludeScreens)j.excludeScreens=this._excludeScreens;if(this._requiredAssets)j.requiredAssets=this._requiredAssets;if(this._runWhenEmpty)j.runWhenEmpty=!0;if(Object.keys(this._entityEnterHandlers).length>0)j.onEntityEnter={...this._entityEnterHandlers};return j}setPriority(j){return this._priority=j,this}inPhase(j){return this._phase=j,this}inGroup(j){if(!this._groups.includes(j))this._groups.push(j);return this}inScreens(j){return this._inScreens=[...j],this}excludeScreens(j){return this._excludeScreens=[...j],this}requiresAssets(j){return this._requiredAssets=[...j],this}runWhenEmpty(){return this._runWhenEmpty=!0,this}withResources(j){return this._resourceKeys=[...j],this}addQuery(j,D){let G=this;return G.queries={...this.queries,[j]:D},G}addSingleton(j,D){let G=this;return G.singletons={...this.singletons,[j]:D},G}setProcess(j){return this.processFunction=this._wrapWithResources(j),this}_wrapWithResources(j){if(!this._resourceKeys?.length)return j;let D=this._resourceKeys,G={},$=!1;return(J)=>{for(let X of D)if(!$||J.ecs.isResourceObserved(X))G[X]=J.ecs.getResource(X);$=!0,J.resources=G,j(J)}}setProcessEach(j,D){let G=this;if(Object.keys(G.queries).length>0||Object.keys(G.singletons).length>0||G.processFunction!==void 0)throw Error("setProcessEach requires a SystemBuilder with no prior queries, singletons, or process function. Use addQuery + setProcess for multi-query systems.");G.queries.__each=j;let $={entity:void 0,dt:0,ecs:void 0,resources:void 0},J=(X)=>{let Z=X,Y=Z.queries.__each;if(!Y)return;let F=j._mutatesIdx;$.dt=Z.dt,$.ecs=Z.ecs,$.resources=Z.resources;let O=Z.ecs.entityManager;for(let A=0;A<Y.length;A++){let W=Y[A];if(!W)continue;$.entity=W;let _=D($);if(F===void 0||_===!1)continue;for(let L=0;L<F.length;L++){let Q=F[L];if(Q!==void 0)O.markChangedByIdx(W.id,Q)}}};return G.processFunction=G._wrapWithResources(J),this}setOnEntityEnter(j,D){return this._entityEnterHandlers[j]=D,this}setOnDetach(j){return this.detachFunction=j,this}setOnInitialize(j){return this.initializeFunction=j,this}setEventHandlers(j){return this.eventHandlers=j,this}}function i(j,D,G){let $=new Set,J=[D];while(J.length>0){let X=J.pop();if(X===void 0)break;if(X===j)throw Error(`Circular required component dependency: '${String(j)}' -> '${String(D)}' -> ... -> '${String(j)}'`);if($.has(X))continue;$.add(X);let Z=G(X);if(Z)for(let Y of Z)J.push(Y.component)}}var y="0.19.2";class z{assets=new Map;groups=new Map;eventBus=null;setEventBus(j){this.eventBus=j}register(j,D){if(this.assets.set(j,{definition:D,status:"pending"}),D.group){let G=this.groups.get(D.group)??new Set;G.add(j),this.groups.set(D.group,G)}}async loadEagerAssets(){let j=[];for(let[D,G]of this.assets)if(G.definition.eager&&G.status==="pending")j.push(D);await Promise.all(j.map((D)=>this.loadAsset(D)))}async loadAsset(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);if(D.status==="loaded"&&D.value!==void 0)return D.value;if(D.status==="loading"&&D.loadPromise)return D.loadPromise;if(D.status==="failed")D.status="pending";D.status="loading",D.loadPromise=D.definition.loader();try{let G=await D.loadPromise;return D.value=G,D.status="loaded",D.loadPromise=void 0,this.eventBus?.publish("assetLoaded",{key:j}),this.checkGroupProgress(D.definition.group),G}catch(G){let $=G instanceof Error?G:Error(String(G));throw D.status="failed",D.error=$,D.loadPromise=void 0,this.eventBus?.publish("assetFailed",{key:j,error:$}),$}}async loadAssetGroup(j){let D=this.groups.get(j);if(!D||D.size===0)throw Error(`Asset group '${j}' not found or empty`);await Promise.all(Array.from(D).map((G)=>this.loadAsset(G)))}get(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);if(D.status!=="loaded"||D.value===void 0)throw Error(`Asset '${String(j)}' is not loaded (status: ${D.status})`);return D.value}tryGet(j){let D=this.assets.get(j);if(!D||D.status!=="loaded")return;return D.value}getHandle(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);let G=this;return{get status(){return D.status},get isLoaded(){return D.status==="loaded"},get(){return G.get(j)},tryGet(){return G.tryGet(j)}}}getStatus(j){let D=this.assets.get(j);if(!D)throw Error(`Asset '${String(j)}' not found`);return D.status}isLoaded(j){return this.assets.get(j)?.status==="loaded"}isGroupLoaded(j){let D=this.groups.get(j);if(!D||D.size===0)return!1;for(let G of D){let $=this.assets.get(G);if(!$||$.status!=="loaded")return!1}return!0}getGroupProgress(j){return this.getGroupProgressDetails(j).progress}getGroupProgressDetails(j){let D=this.groups.get(j);if(!D||D.size===0)return{loaded:0,total:0,progress:0};let G=0;for(let J of D)if(this.assets.get(J)?.status==="loaded")G++;let $=D.size;return{loaded:G,total:$,progress:G/$}}checkGroupProgress(j){if(!j||!this.eventBus)return;let D=j,G=this.getGroupProgressDetails(D);if(this.eventBus.publish("assetGroupProgress",{group:D,...G}),G.loaded===G.total)this.eventBus.publish("assetGroupLoaded",{group:D})}createResource(){let j=this;return{getStatus(D){return j.getStatus(D)},isLoaded(D){return j.isLoaded(D)},isGroupLoaded(D){return j.isGroupLoaded(D)},getGroupProgress(D){return j.getGroupProgress(D)},get(D){return j.get(D)},tryGet(D){return j.tryGet(D)},getHandle(D){return j.getHandle(D)}}}getKeys(){return Array.from(this.assets.keys())}getGroupNames(){return Array.from(this.groups.keys())}getGroupKeys(j){let D=this.groups.get(j);return D?Array.from(D):[]}}class d{manager;constructor(j){this.manager=j}add(j,D){return this.manager.register(j,{loader:D,eager:!0}),this}addWithConfig(j,D){return this.manager.register(j,D),this}addGroup(j,D){for(let[G,$]of Object.entries(D))this.manager.register(G,{loader:$,eager:!1,group:j});return this}getManager(){return this.manager}}function p(j){return new d(j??new z)}class P{screens=new Map;currentScreen=null;screenStack=[];eventBus=null;assetManager=null;ecs=null;setDependencies(j,D,G){this.eventBus=j,this.assetManager=D,this.ecs=G}requireEcs(){if(!this.ecs)throw Error("ScreenManager: dependencies not set. Call setDependencies() first.");return this.ecs}register(j,D){this.screens.set(j,{definition:D})}async setScreen(j,D){let G=this.screens.get(j);if(!G)throw Error(`Screen '${String(j)}' not found`);await this.verifyRequiredAssets(G.definition.requiredAssets,G.definition.requiredAssetGroups);while(this.screenStack.length>0){let J=this.screenStack.pop();if(J)await this.exitScreen(J.name)}if(this.currentScreen)await this.exitScreen(this.currentScreen.name);let $=G.definition.initialState(D);this.currentScreen={name:j,config:D,state:$},await G.definition.onEnter?.({config:D,ecs:this.requireEcs()}),this.eventBus?.publish("screenEnter",{screen:j,config:D})}async pushScreen(j,D){let G=this.screens.get(j);if(!G)throw Error(`Screen '${String(j)}' not found`);if(await this.verifyRequiredAssets(G.definition.requiredAssets,G.definition.requiredAssetGroups),this.currentScreen)this.screenStack.push(this.currentScreen);let $=G.definition.initialState(D);this.currentScreen={name:j,config:D,state:$},await G.definition.onEnter?.({config:D,ecs:this.requireEcs()}),this.eventBus?.publish("screenPush",{screen:j,config:D})}async popScreen(){if(this.screenStack.length===0)throw Error("Cannot pop screen: stack is empty");if(this.currentScreen)await this.exitScreen(this.currentScreen.name),this.eventBus?.publish("screenPop",{screen:this.currentScreen.name});let j=this.screenStack.pop();if(this.currentScreen=j??null,!j)return;await this.screens.get(j.name)?.definition.onResume?.({config:j.config,state:j.state,ecs:this.requireEcs()}),this.eventBus?.publish("screenResume",{screen:j.name,config:j.config,state:j.state})}async exitScreen(j){let D=this.screens.get(j);if(D?.definition.onExit)await D.definition.onExit(this.requireEcs());this.eventBus?.publish("screenExit",{screen:j})}async verifyRequiredAssets(j,D){if(!this.assetManager)return;if(j){for(let G of j)if(!this.assetManager.isLoaded(G))await this.assetManager.loadAsset(G)}if(D){for(let G of D)if(!this.assetManager.isGroupLoaded(G))await this.assetManager.loadAssetGroup(G)}}getCurrentScreen(){return this.currentScreen?.name??null}getConfig(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.config}tryGetConfig(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.config}getState(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.state}tryGetState(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.state}updateState(j,D){if(!this.currentScreen)throw Error("No current screen");if(D!==void 0&&this.currentScreen.name!==D)throw Error(`Expected current screen '${String(D)}', but current is '${String(this.currentScreen.name)}'`);let G=typeof j==="function"?j(this.currentScreen.state):j;this.currentScreen.state={...this.currentScreen.state,...G}}getStackDepth(){return this.screenStack.length}isOverlay(){return this.screenStack.length>0}isActive(j){if(this.currentScreen?.name===j)return!0;return this.screenStack.some((D)=>D.name===j)}isCurrent(j){return this.currentScreen?.name===j}createResource(){let j=this;return{get current(){return j.getCurrentScreen()},get config(){return j.tryGetConfig()??null},get state(){return j.tryGetState()??null},set state(D){if(j.currentScreen&&D!==null)j.currentScreen.state=D},get stack(){return j.screenStack},get isOverlay(){return j.isOverlay()},get stackDepth(){return j.getStackDepth()},isActive(D){return j.isActive(D)},isCurrent(D){return j.isCurrent(D)}}}getScreenNames(){return Array.from(this.screens.keys())}hasScreen(j){return this.screens.has(j)}}class o{manager;constructor(j){this.manager=j}add(j,D){return this.manager.register(j,D),this}getManager(){return this.manager}}function h(j){return new o(j??new P)}class I{assetConfigurator=null;screenConfigurator=null;pendingResources=[];pendingDisposeCallbacks=[];pendingRequiredComponents=[];pendingPlugins=[];_fixedDt=null;_disableChangeTracking=!1;constructor(){}withPlugin(j){return this.pendingPlugins.push(j),this}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}disableChangeTracking(){return this._disableChangeTracking=!0,this}withResource(j,D){return this.pendingResources.push({key:j,value:D}),this}withDispose(j,D){return this.pendingDisposeCallbacks.push({key:j,callback:D}),this}withRequired(j,D,G){return this.pendingRequiredComponents.push({trigger:j,required:D,factory:G}),this}withAssets(j){let D=p();return j(D),this.assetConfigurator=D,this}withScreens(j){let D=h();return j(D),this.screenConfigurator=D,this}withFixedTimestep(j){return this._fixedDt=j,this}withReactiveQueryNames(){return this}pluginFactory(){return(j)=>E(j.id).install(j.install)}build(){let j=new V;if(this._disableChangeTracking)j.entityManager.disableChangeTracking();for(let D of this.pendingPlugins)j._installPluginUnchecked(D);for(let{key:D,value:G}of this.pendingResources)j.addResource(D,G);for(let{key:D,callback:G}of this.pendingDisposeCallbacks)j.registerDispose(D,G);for(let{trigger:D,required:G,factory:$}of this.pendingRequiredComponents)j.registerRequired(D,G,$);if(this.assetConfigurator)j._setAssetManager(this.assetConfigurator.getManager());else if(j._hasPendingPluginAssets())j._setAssetManager(new z);if(this.screenConfigurator)j._setScreenManager(this.screenConfigurator.getManager());else if(j._hasPendingPluginScreens())j._setScreenManager(new P);if(this._fixedDt!==null)j._setFixedDt(this._fixedDt);return j}}var r=["preUpdate","fixedUpdate","update","postUpdate","render"];class V{static VERSION=y;_entityManager;_eventBus;_resourceManager;_commandBuffer;_systems=[];_phaseSystems={preUpdate:[],fixedUpdate:[],update:[],postUpdate:[],render:[]};_installedPlugins=new Set;_pluginCleanups=new Map;_currentSystemDefaults;_screenScopedEntities=new Map;_entityScreenScope=new Map;_activeScopeHint=null;_disabledGroups=new Set;_assetManager=null;_screenManager=null;_reactiveQueryManager;_postUpdateHooks=[];_currentTick=0;_systemLastSeqs=new Map;_changeThreshold=0;_fixedDt=0.016666666666666666;_fixedAccumulator=0;_interpolationAlpha=0;_maxFixedSteps=8;_requiredComponents=new Map;_pendingPluginAssets=[];_pendingPluginScreens=[];_diagnosticsEnabled=!1;_systemTimings=new Map;_phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0};_entityEnterTracking=new Map;_entityEnterFrameSet=new Set;_systemContexts=new WeakMap;_singletonScratch=[];_pendingFinalizers=[];_batchingRegistrations=!1;_initializeFired=!1;_systemsInitialized=new WeakSet;constructor(){this._entityManager=new T,this._eventBus=new w,this._resourceManager=new C,this._reactiveQueryManager=new q(this._entityManager,this),this._commandBuffer=new g(this),this._subscribeLifecycleHooks()}_subscribeLifecycleHooks(){this._entityManager.onAfterComponentAdded((j,D)=>{this._entityManager.markChanged(j,D);let G=this._requiredComponents.get(D);if(G){let $=this._entityManager.getEntity(j);if($){let J=$.components[D];for(let{component:X,factory:Z}of G){if(this._entityManager._pendingBatchKeys?.has(X))continue;if(!(X in $.components))this._entityManager.addComponent(j,X,Z(J))}}}}),this._entityManager.onAfterEntityMutated((j)=>{let D=this._entityManager.getEntity(j);if(D)this._reactiveQueryManager.recheckEntityAndChildren(D)}),this._entityManager.onAfterComponentRemoved((j,D)=>{let G=this._entityManager.getEntity(j);if(G)this._reactiveQueryManager.onComponentRemoved(G,D)}),this._entityManager.onBeforeEntityRemoved((j)=>{this._reactiveQueryManager.onEntityRemoved(j);let D=this._entityScreenScope.get(j);if(D!==void 0)this._entityScreenScope.delete(j),this._screenScopedEntities.get(D)?.delete(j)}),this._entityManager.onAfterParentChanged((j)=>{if(this._reactiveQueryManager.hasParentHasQueries){let D=this._entityManager.getEntity(j);if(D)this._reactiveQueryManager.recheckEntity(D)}})}static create(){return new I}addSystem(j){let D=new x(j,this._currentSystemDefaults);return this._pendingFinalizers.push(()=>{this._registerSystem(D._createSystemObject())}),D}_finalizePendingBuilders(){if(this._pendingFinalizers.length===0)return;this._batchingRegistrations=!0;while(this._pendingFinalizers.length>0){let j=this._pendingFinalizers;this._pendingFinalizers=[];for(let D of j)D()}this._batchingRegistrations=!1,this._rebuildPhaseSystems()}update(j){this._finalizePendingBuilders();let D=this._screenManager?.getCurrentScreen()??null,G=this._diagnosticsEnabled;this._runPhase("preUpdate",j,D,G);let $=G?performance.now():0;this._fixedAccumulator+=j;let J=0;while(this._fixedAccumulator>=this._fixedDt&&J<this._maxFixedSteps)this._executePhase(this._phaseSystems.fixedUpdate,this._fixedDt,D),this._commandBuffer.playback(this),this._fixedAccumulator-=this._fixedDt,J++;if(this._fixedAccumulator>=this._fixedDt)this._fixedAccumulator=0;if(G)this._phaseTimings.fixedUpdate=performance.now()-$;this._interpolationAlpha=this._fixedAccumulator/this._fixedDt,this._runPhase("update",j,D,G),this._runPhase("postUpdate",j,D,G);for(let X of this._postUpdateHooks)X({ecs:this,dt:j});this._runPhase("render",j,D,G),this._resourceManager.flushObserved(),this._changeThreshold=this._entityManager.changeSeq,this._currentTick++}_executePhase(j,D,G){for(let $ of j){if(!$.process&&!$.onEntityEnter)continue;if($.groups?.length){let W=!1;for(let _ of $.groups)if(this._disabledGroups.has(_)){W=!0;break}if(W)continue}if($.inScreens?.length){if(G===null||!$.inScreens.includes(G))continue}if($.excludeScreens?.length){if(G!==null&&$.excludeScreens.includes(G))continue}if($.requiredAssets?.length&&this._assetManager){let W=!0;for(let _ of $.requiredAssets)if(!this._assetManager.isLoaded(_)){W=!1;break}if(!W)continue}let J=this._systemLastSeqs.get($)??0;this._changeThreshold=J;let X=this._systemContexts.get($);if(!X)X={queries:{},dt:0,ecs:this},this._systemContexts.set($,X);X.dt=D;let Z=X.queries,Y=!1,F=!1;if($.entityQueries)for(let W in $.entityQueries){F=!0;let _=$.entityQueries[W];if(_){let Q=Z[W]??(Z[W]=[]);if(this._entityManager.getEntitiesWithQueryInto(Q,_.with,_.without||[],_.changed,_.changed?this._changeThreshold:void 0,_.parentHas,_._changedIdx),Q.length)Y=!0}}if($.entitySingletons){let W=this._singletonScratch;for(let _ in $.entitySingletons){F=!0;let L=$.entitySingletons[_];if(L){if(this._entityManager.getEntitiesWithQueryInto(W,L.with,L.without||[],L.changed,L.changed?this._changeThreshold:void 0,L.parentHas,L._changedIdx),Z[_]=W[0],W.length)Y=!0}}}let O=this._entityEnterTracking.get($);if(O&&$.onEntityEnter)for(let W in $.onEntityEnter){let _=Z[W],L=O.get(W);if(!_||!L)continue;let Q=$.onEntityEnter[W];if(!Q)continue;let K=this._entityEnterFrameSet;K.clear();for(let B of _)if(K.add(B.id),!L.has(B.id))L.add(B.id),Q({entity:B,ecs:this});for(let B of L)if(!K.has(B))L.delete(B)}if($.process){if(Y||$.runWhenEmpty||!F){let _=this._activeScopeHint;this._activeScopeHint=$.inScreens?.length&&G!==null?G:null;let L=this._diagnosticsEnabled?performance.now():0;try{$.process(X)}finally{if(this._activeScopeHint=_,this._diagnosticsEnabled)this._systemTimings.set($.label,performance.now()-L)}}}let A=$._autoMarkPairs;if(A){let W=this._entityManager;for(let _=0;_<A.length;_++){let L=A[_];if(!L)continue;let Q=L.mutatesIdx,K=Q.length;if(!W.hasAnySubscribed(Q))continue;if(L.kind==="list"){let B=Z[L.queryName];if(!B)continue;for(let U=0;U<B.length;U++){let M=B[U];if(!M)continue;for(let f=0;f<K;f++){let u=Q[f];if(u!==void 0)W.markChangedByIdx(M.id,u)}}}else{let B=Z[L.queryName];if(!B)continue;for(let U=0;U<K;U++){let M=Q[U];if(M!==void 0)W.markChangedByIdx(B.id,M)}}}}this._systemLastSeqs.set($,this._entityManager.changeSeq)}}_runPhase(j,D,G,$){if($){let J=performance.now();this._executePhase(this._phaseSystems[j],D,G),this._phaseTimings[j]=performance.now()-J}else this._executePhase(this._phaseSystems[j],D,G);this._commandBuffer.playback(this)}async initialize(){if(this._finalizePendingBuilders(),await this.initializeResources(),this._assetManager)this._assetManager.setEventBus(this._eventBus),await this._assetManager.loadEagerAssets(),this._resourceManager.add("$assets",this._assetManager.createResource());if(this._screenManager){let j=this._eventBus;this._screenManager.setDependencies(j,this._assetManager,this),this._resourceManager.add("$screen",this._screenManager.createResource()),j.subscribe("screenExit",({screen:D})=>{let G=this._screenScopedEntities.get(D);if(!G||G.size===0)return;this._screenScopedEntities.delete(D);for(let $ of Array.from(G))this._entityScreenScope.delete($),this.removeEntity($)})}for(let j of this._systems){if(this._systemsInitialized.has(j))continue;this._systemsInitialized.add(j),await j.onInitialize?.(this)}this._initializeFired=!0}async initializeResources(...j){await this._resourceManager.initializeResources(this,...j)}_rebuildPhaseSystems(){for(let j of r)this._phaseSystems[j]=[];for(let j of this._systems){let D=j.phase??"update";this._phaseSystems[D].push(j)}for(let j of r)this._phaseSystems[j].sort((D,G)=>{let $=D.priority??0;return(G.priority??0)-$})}updateSystemPriority(j,D){this._finalizePendingBuilders();let G=this._systems.find(($)=>$.label===j);if(!G)return!1;return G.priority=D,this._rebuildPhaseSystems(),!0}updateSystemPhase(j,D){this._finalizePendingBuilders();let G=this._systems.find(($)=>$.label===j);if(!G)return!1;return G.phase=D,this._rebuildPhaseSystems(),!0}get interpolationAlpha(){return this._interpolationAlpha}get fixedDt(){return this._fixedDt}disableSystemGroup(j){this._disabledGroups.add(j)}enableSystemGroup(j){this._disabledGroups.delete(j)}isSystemGroupEnabled(j){return!this._disabledGroups.has(j)}getSystemsInGroup(j){return this._finalizePendingBuilders(),this._systems.filter((D)=>D.groups?.includes(j)).map((D)=>D.label)}removeSystem(j){this._finalizePendingBuilders();let D=this._systems.findIndex(($)=>$.label===j);if(D===-1)return!1;let G=this._systems[D];if(!G)return!1;if(G.onDetach)G.onDetach(this);return this._systems.splice(D,1),this._systemLastSeqs.delete(G),this._entityEnterTracking.delete(G),this._systemsInitialized.delete(G),this._rebuildPhaseSystems(),!0}_registerSystem(j){if(this._systems.push(j),this._systemLastSeqs.set(j,this._changeThreshold),!this._batchingRegistrations)this._rebuildPhaseSystems();let D=[],G=this._entityManager,$=(J,X,Z)=>{let Y=X.changed;if(Y&&Y.length>0){let O=[];for(let A=0;A<Y.length;A++){let W=Y[A];if(W===void 0)continue;G.subscribeChanged(W),O.push(G.getOrAssignComponentIdx(W))}X._changedIdx=O}let F=X.mutates;if(F&&F.length>0){let O=[];for(let A=0;A<F.length;A++){let W=F[A];if(W!==void 0)O.push(G.getOrAssignComponentIdx(W))}if(X._mutatesIdx=O,J!==c)D.push({queryName:J,mutatesIdx:O,kind:Z})}};if(j.entityQueries)for(let J in j.entityQueries){let X=j.entityQueries[J];if(X)$(J,X,"list")}if(j.entitySingletons)for(let J in j.entitySingletons){let X=j.entitySingletons[J];if(X)$(J,X,"singleton")}if(j._autoMarkPairs=D.length>0?D:null,j.onEntityEnter){let J=new Map;for(let X in j.onEntityEnter)J.set(X,new Set);this._entityEnterTracking.set(j,J)}if(j.eventHandlers)for(let J in j.eventHandlers){let X=j.eventHandlers[J];if(X)this._eventBus.subscribe(J,(Z)=>{X({data:Z,ecs:this})})}if(this._initializeFired&&!this._systemsInitialized.has(j)){this._systemsInitialized.add(j);let J=j.onInitialize?.(this);if(J instanceof Promise)J.catch((X)=>{console.error(`onInitialize for system "${j.label}" rejected:`,X)})}}hasResource(j){return this._resourceManager.has(j)}getResource(j){if(!this._resourceManager.has(j))throw Error(`Resource '${String(j)}' not found. Available resources: [${this.getResourceKeys().map((D)=>String(D)).join(", ")}]`);return this._resourceManager.get(j,this)}tryGetResource(j){let D=j;if(!this._resourceManager.has(D))return;return this._resourceManager.get(D,this)}addResource(j,D){return this._resourceManager.add(j,D),this}removeResource(j){return this._resourceManager.remove(j)}async disposeResource(j){return this._resourceManager.disposeResource(j,this)}async disposeResources(){return this._resourceManager.disposeResources(this)}updateResource(j,D){let G=this.getResource(j),$=D(G);return this._resourceManager.add(j,$),this._resourceManager.notifyChange(j,$,G),this}setResource(j,D){let G=this.tryGetResource(j);if(this._resourceManager.add(j,D),G!==void 0)this._resourceManager.notifyChange(j,D,G);return this}onResourceChange(j,D){return this._resourceManager.onResourceChange(j,D)}isResourceObserved(j){return this._resourceManager.isObserved(j)}getResourceKeys(){return this._resourceManager.getKeys()}resourceNeedsInitialization(j){return this._resourceManager.needsInitialization(j)}getEntity(j){return this._entityManager.getEntity(j)}getComponent(j,D){return this._entityManager.getComponent(j,D)}addComponent(j,D,G){this._entityManager.addComponent(j,D,G)}addComponents(j,D){this._entityManager.addComponents(j,D)}removeComponent(j,D){this._entityManager.removeComponent(j,D)}hasComponent(j,D){return this._entityManager.getComponent(j,D)!==void 0}spawn(j,D){let G=this._entityManager.createEntity();return this._entityManager.addComponents(G.id,j),this._applyScreenScope(G.id,D),G}_getActiveScopeHint(){return this._activeScopeHint}_applyScreenScope(j,D){let G=D?.scope!==void 0?D.scope:this._activeScopeHint;if(G===null)return;let $=this._screenScopedEntities.get(G)??new Set;$.add(j),this._screenScopedEntities.set(G,$),this._entityScreenScope.set(j,G)}getEntitiesWithQuery(j,D=[],G,$){return this._entityManager.getEntitiesWithQuery(j,D,G,G?this._changeThreshold:void 0,$)}getSingleton(j,D=[]){let G=this._entityManager.getEntitiesWithQuery(j,D);if(G.length===0)throw Error(`getSingleton: no entity matches query with=[${String(j)}] without=[${String(D)}]`);if(G.length>1)throw Error(`getSingleton: expected 1 entity but found ${G.length} matching query with=[${String(j)}] without=[${String(D)}]`);let $=G[0];if(!$)throw Error("getSingleton: unexpected empty result");return $}tryGetSingleton(j,D=[]){let G=this._entityManager.getEntitiesWithQuery(j,D);if(G.length===0)return;if(G.length>1)throw Error(`tryGetSingleton: expected 0 or 1 entity but found ${G.length} matching query with=[${String(j)}] without=[${String(D)}]`);return G[0]}removeEntity(j,D){return this._entityManager.removeEntity(j,D)}spawnChild(j,D,G){let $=this._entityManager.spawnChild(j,D);return this._emitHierarchyChanged($.id,null,j),this._applyScreenScope($.id,G),$}setParent(j,D){let G=this._entityManager.getParent(j);return this._entityManager.setParent(j,D),this._emitHierarchyChanged(j,G,D),this}removeParent(j){let D=this._entityManager.getParent(j),G=this._entityManager.removeParent(j);if(G)this._emitHierarchyChanged(j,D,null);return G}getParent(j){return this._entityManager.getParent(j)}getChildren(j){return this._entityManager.getChildren(j)}getChildAt(j,D){return this._entityManager.getChildAt(j,D)}getChildIndex(j,D){return this._entityManager.getChildIndex(j,D)}getAncestors(j){return this._entityManager.getAncestors(j)}getDescendants(j){return this._entityManager.getDescendants(j)}getRoot(j){return this._entityManager.getRoot(j)}getSiblings(j){return this._entityManager.getSiblings(j)}isDescendantOf(j,D){return this._entityManager.isDescendantOf(j,D)}isAncestorOf(j,D){return this._entityManager.isAncestorOf(j,D)}getRootEntities(){return this._entityManager.getRootEntities()}forEachInHierarchy(j,D){this._entityManager.forEachInHierarchy(j,D)}hierarchyIterator(j){return this._entityManager.hierarchyIterator(j)}_emitHierarchyChanged(j,D,G){this._eventBus.publish("hierarchyChanged",{entityId:j,oldParent:D,newParent:G})}get installedPlugins(){return Array.from(this._installedPlugins)}get entityManager(){return this._entityManager}get eventBus(){return this._finalizePendingBuilders(),this._eventBus}get commands(){return this._commandBuffer}get currentTick(){return this._currentTick}get changeThreshold(){return this._changeThreshold}enableDiagnostics(j){if(this._diagnosticsEnabled=j,!j)this._systemTimings.clear(),this._phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0}}get diagnosticsEnabled(){return this._diagnosticsEnabled}get systemTimings(){return this._systemTimings}get phaseTimings(){return this._phaseTimings}get entityCount(){return this._entityManager.entityCount}mutateComponent(j,D,G){let $=this._entityManager.getComponent(j,D);if($===void 0)throw Error(`Entity ${j} does not have component "${String(D)}"`);return G($),this._entityManager.markChanged(j,D),$}markChanged(j,D){this._entityManager.markChanged(j,D)}registerDispose(j,D){this._entityManager.registerDispose(j,D)}registerRequired(j,D,G){if(String(j)===String(D))throw Error(`Cannot require a component to depend on itself: '${String(j)}'`);let $=this._requiredComponents.get(j)??[];if($.some((J)=>J.component===D))throw Error(`Required component '${String(D)}' already registered for trigger '${String(j)}'`);this._checkRequiredCycle(j,D),$.push({component:D,factory:G}),this._requiredComponents.set(j,$)}_checkRequiredCycle(j,D){i(j,D,(G)=>this._requiredComponents.get(G))}onComponentAdded(j,D){return this._entityManager.onComponentAdded(j,D)}onComponentRemoved(j,D){return this._entityManager.onComponentRemoved(j,D)}addReactiveQuery(j,D){this._reactiveQueryManager.addQuery(j,D)}removeReactiveQuery(j){return this._reactiveQueryManager.removeQuery(j)}on(j,D){return this._eventBus.subscribe(j,D)}off(j,D){return this._eventBus.unsubscribe(j,D)}onPostUpdate(j){return this._postUpdateHooks.push(j),()=>{let D=this._postUpdateHooks.indexOf(j);if(D!==-1)this._postUpdateHooks.splice(D,1)}}requireAssetManager(){if(!this._assetManager)throw Error("Asset manager not configured. Use withAssets() in builder.");return this._assetManager}getAsset(j){return this.requireAssetManager().get(j)}tryGetAsset(j){return this._assetManager?.tryGet(j)}getAssetHandle(j){return this.requireAssetManager().getHandle(j)}isAssetLoaded(j){return this._assetManager?.isLoaded(j)??!1}async loadAsset(j){return this.requireAssetManager().loadAsset(j)}async loadAssetGroup(j){return this.requireAssetManager().loadAssetGroup(j)}isAssetGroupLoaded(j){return this._assetManager?.isGroupLoaded(j)??!1}getAssetGroupProgress(j){return this._assetManager?.getGroupProgress(j)??0}requireScreenManager(){if(!this._screenManager)throw Error("Screen manager not configured. Use withScreens() in builder.");return this._screenManager}async setScreen(j,D){return this.requireScreenManager().setScreen(j,D)}async pushScreen(j,D){return this.requireScreenManager().pushScreen(j,D)}async popScreen(){return this.requireScreenManager().popScreen()}getCurrentScreen(){return this._screenManager?.getCurrentScreen()??null}getScreenConfig(j){return this.requireScreenManager().getConfig(j)}tryGetScreenConfig(j){return this._screenManager?.tryGetConfig(j)??void 0}getScreenState(j){return this.requireScreenManager().getState(j)}tryGetScreenState(j){return this._screenManager?.tryGetState(j)??void 0}updateScreenState(j,D){if(typeof j==="string")this.requireScreenManager().updateState(D,j);else this.requireScreenManager().updateState(j)}isCurrentScreen(j){return this._screenManager?.isCurrent(j)??!1}isScreenActive(j){return this._screenManager?.isActive(j)??!1}getScreenStackDepth(){return this._screenManager?.getStackDepth()??0}onScreenEnter(j,D){let G=this._eventBus,$=(Z)=>{if(Z.screen!==j)return;D({config:Z.config,ecs:this})},J=G.subscribe("screenEnter",$),X=G.subscribe("screenPush",$);return()=>{J(),X()}}onScreenResume(j,D){return this._eventBus.subscribe("screenResume",($)=>{if($.screen!==j)return;D({config:$.config,state:$.state,ecs:this})})}onScreenExit(j,D){return this._eventBus.subscribe("screenExit",($)=>{if($.screen!==j)return;D({ecs:this})})}_setAssetManager(j){this._assetManager=j;for(let[D,G]of this._pendingPluginAssets)this._assetManager.register(D,G);this._pendingPluginAssets=[]}_setScreenManager(j){this._screenManager=j;for(let[D,G]of this._pendingPluginScreens)this._screenManager.register(D,G);this._pendingPluginScreens=[]}_hasPendingPluginAssets(){return this._pendingPluginAssets.length>0}_hasPendingPluginScreens(){return this._pendingPluginScreens.length>0}_setFixedDt(j){this._fixedDt=j}_registerAsset(j,D){this._pendingPluginAssets.push([j,D])}_registerScreen(j,D){this._pendingPluginScreens.push([j,D])}installPlugin(j){return this._installPluginUnchecked(j)}_installPluginUnchecked(j){if(this._installedPlugins.has(j.id))return this;this._installedPlugins.add(j.id);let D=[];this._pluginCleanups.set(j.id,D);let G=(J)=>{D.push(J)},$=this._currentSystemDefaults;this._currentSystemDefaults=j.systemDefaults;try{j.install(this,G)}finally{this._currentSystemDefaults=$}return this}uninstallPlugin(j){if(!this._installedPlugins.has(j))return!1;let D=this._pluginCleanups.get(j);if(this._pluginCleanups.delete(j),this._installedPlugins.delete(j),D)for(let G=D.length-1;G>=0;G--){let $=D[G];if(!$)continue;try{$()}catch(J){console.warn(`Plugin '${j}' cleanup threw:`,J)}}return!0}dispose(){let j=Array.from(this._installedPlugins);for(let D=j.length-1;D>=0;D--){let G=j[D];if(G!==void 0)this.uninstallPlugin(G)}}pluginFactory(){return(j)=>E(j.id).install(j.install)}getHelpers(j){return j(this)}}function uj(j){return j}function mj(j,D){return{x:j,y:D}}function sj(){return{x:0,y:0}}function cj(j,D){return{x:j.x+D.x,y:j.y+D.y}}function ij(j,D){return{x:j.x-D.x,y:j.y-D.y}}function yj(j,D){return{x:j.x*D,y:j.y*D}}function dj(j){return{x:-j.x,y:-j.y}}function oj(j,D){return j.x*D.x+j.y*D.y}function rj(j,D){return j.x*D.y-j.y*D.x}function aj(j){return j.x*j.x+j.y*j.y}function nj(j){return Math.sqrt(j.x*j.x+j.y*j.y)}function tj(j){let D=Math.sqrt(j.x*j.x+j.y*j.y);if(D===0)return{x:0,y:0};return{x:j.x/D,y:j.y/D}}function ej(j,D){let G=j.x-D.x,$=j.y-D.y;return G*G+$*$}function j3(j,D){let G=j.x-D.x,$=j.y-D.y;return Math.sqrt(G*G+$*$)}function D3(j,D,G=0.0000000001){return Math.abs(j.x-D.x)<=G&&Math.abs(j.y-D.y)<=G}function G3(j,D,G){return{x:j,y:D,z:G}}function $3(){return{x:0,y:0,z:0}}function J3(j,D){return{x:j.x+D.x,y:j.y+D.y,z:j.z+D.z}}function X3(j,D){return{x:j.x-D.x,y:j.y-D.y,z:j.z-D.z}}function Z3(j,D){return{x:j.x*D,y:j.y*D,z:j.z*D}}function W3(j){return{x:-j.x,y:-j.y,z:-j.z}}function Y3(j,D){return j.x*D.x+j.y*D.y+j.z*D.z}function L3(j,D){return{x:j.y*D.z-j.z*D.y,y:j.z*D.x-j.x*D.z,z:j.x*D.y-j.y*D.x}}function F3(j){return j.x*j.x+j.y*j.y+j.z*j.z}function _3(j){return Math.sqrt(j.x*j.x+j.y*j.y+j.z*j.z)}function A3(j){let D=Math.sqrt(j.x*j.x+j.y*j.y+j.z*j.z);if(D===0)return{x:0,y:0,z:0};return{x:j.x/D,y:j.y/D,z:j.z/D}}function O3(j,D){let G=j.x-D.x,$=j.y-D.y,J=j.z-D.z;return G*G+$*$+J*J}function B3(j,D){let G=j.x-D.x,$=j.y-D.y,J=j.z-D.z;return Math.sqrt(G*G+$*$+J*J)}function Q3(j,D,G=0.0000000001){return Math.abs(j.x-D.x)<=G&&Math.abs(j.y-D.y)<=G&&Math.abs(j.z-D.z)<=G}var C3=V;export{$3 as vec3Zero,X3 as vec3Sub,Z3 as vec3Scale,A3 as vec3Normalize,W3 as vec3Negate,F3 as vec3LengthSq,_3 as vec3Length,Q3 as vec3Equals,Y3 as vec3Dot,O3 as vec3DistanceSq,B3 as vec3Distance,L3 as vec3Cross,J3 as vec3Add,G3 as vec3,sj as vec2Zero,ij as vec2Sub,yj as vec2Scale,tj as vec2Normalize,dj as vec2Negate,aj as vec2LengthSq,nj as vec2Length,D3 as vec2Equals,oj as vec2Dot,ej as vec2DistanceSq,j3 as vec2Distance,rj as vec2Cross,cj as vec2Add,mj as vec2,n as directValue,E as definePlugin,C3 as default,h as createScreenConfigurator,uj as createQueryDefinition,p as createAssetConfigurator,x as SystemBuilder,P as ScreenManager,z as AssetManager};
2
2
 
3
- //# debugId=9D4E010773480BFC64756E2164756E21
3
+ //# debugId=D58E2AF9DFCE535364756E2164756E21
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -22,6 +22,6 @@
22
22
  "import ECSpresso from './ecspresso';\nimport { SystemBuilder, type ProcessContext, type SystemLifecycleFn, type SystemProcessFn } from './system-builder';\nimport { type Plugin, type BasePluginOptions, type PluginCleanupRegistrar, definePlugin } from './plugin';\n\nexport * from './types';\nexport * from './asset-types';\nexport * from './screen-types';\nexport * from './utils/math';\nexport type { ReactiveQueryDefinition, ReactiveQueryEnterContext, ReactiveQueryExitContext } from './reactive-query-manager';\nexport { default as AssetManager, createAssetConfigurator } from './asset-manager';\nexport { default as ScreenManager, createScreenConfigurator } from './screen-manager';\nexport { SystemBuilder, type ProcessContext, type SystemLifecycleFn, type SystemProcessFn };\nexport { type Plugin, type BasePluginOptions, type PluginCleanupRegistrar, definePlugin };\nexport { directValue, type ResourceDirectValue } from './resource-manager';\nexport default ECSpresso;\n"
23
23
  ],
24
24
  "mappings": "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",
25
- "debugId": "9D4E010773480BFC64756E2164756E21",
25
+ "debugId": "D58E2AF9DFCE535364756E2164756E21",
26
26
  "names": []
27
27
  }
@@ -10,6 +10,11 @@
10
10
  * plus a typed blackboard for per-entity AI memory. One system processes all
11
11
  * behavior-tree entities each tick.
12
12
  *
13
+ * Top-level node helpers such as `action(...)` and `condition(...)` type the
14
+ * callback ECS as the behavior-tree plugin world. If a leaf needs app-specific
15
+ * components, resources, or events, use `ecs.getHelpers(createBehaviorTreeHelpers)`
16
+ * after `.build()` and destructure helpers from that bound result.
17
+ *
13
18
  * Node types:
14
19
  * Composites — sequence, selector, parallel
15
20
  * Decorators — inverter, repeat, cooldown, guard
@@ -303,7 +308,8 @@ export declare function resetBehaviorTree(ecs: BehaviorTreeWorld, entityId: numb
303
308
  /**
304
309
  * Typed helpers for the behavior tree plugin.
305
310
  * Creates helpers that validate callback parameters against the world type W.
306
- * Call after `.build()` using `typeof ecs`.
311
+ * Call after `.build()` so behavior-tree leaves can access app-specific
312
+ * components, resources, and events through the full built ECS type.
307
313
  */
308
314
  export interface BehaviorTreeHelpers<W extends BaseWorld<BehaviorTreeComponentTypes>> {
309
315
  defineBehaviorTree: <BB extends object>(id: string, config: {
@@ -323,9 +329,15 @@ export interface BehaviorTreeHelpers<W extends BaseWorld<BehaviorTreeComponentTy
323
329
  * ```typescript
324
330
  * const ecs = ECSpresso.create()
325
331
  * .withPlugin(createBehaviorTreePlugin())
332
+ * .withComponentTypes<{ enemy: { hp: number } }>()
326
333
  * .build();
327
334
  *
328
335
  * const { defineBehaviorTree, action, condition, guard } = ecs.getHelpers(createBehaviorTreeHelpers);
336
+ *
337
+ * action('read enemy', ({ ecs, entityId }) => {
338
+ * const enemy = ecs.getComponent(entityId, 'enemy');
339
+ * return enemy ? NodeStatus.Success : NodeStatus.Failure;
340
+ * });
329
341
  * ```
330
342
  */
331
343
  export declare function createBehaviorTreeHelpers<W extends BaseWorld<BehaviorTreeComponentTypes> = BehaviorTreeWorld>(_world?: W): BehaviorTreeHelpers<W>;
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/plugins/ai/behavior-tree.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Behavior Tree Plugin for ECSpresso\n *\n * Provides composable, priority-driven AI via behavior trees. Shared immutable\n * tree definitions drive per-entity runtime state. Uses hybrid traversal\n * (Approach C): re-evaluate from root each tick to preserve priority, resume\n * running leaves, and abort diverged running nodes via `onAbort`.\n *\n * Each entity gets a `behaviorTree` component referencing a shared definition\n * plus a typed blackboard for per-entity AI memory. One system processes all\n * behavior-tree entities each tick.\n *\n * Node types:\n * Composites — sequence, selector, parallel\n * Decorators — inverter, repeat, cooldown, guard\n * Leaves — action (tick → NodeStatus, optional onAbort), condition (predicate)\n */\n\nimport { definePlugin, type BasePluginOptions, type BaseWorld, type ComponentsConfig, type EventsConfig } from 'ecspresso';\n\n// ==================== NodeStatus ====================\n\n/**\n * Return value from behavior tree node ticks.\n *\n * - `Success` (0) — node completed successfully\n * - `Failure` (1) — node failed\n * - `Running` (2) — node still executing, will resume next tick\n */\nexport const NodeStatus = { Success: 0, Failure: 1, Running: 2 } as const;\nexport type NodeStatus = (typeof NodeStatus)[keyof typeof NodeStatus];\n\n// ==================== Callback Context ====================\n\n/** BaseWorld narrowed to behavior-tree components for typed access in helpers. */\ntype BehaviorTreeWorld = BaseWorld<BehaviorTreeComponentTypes>;\n\n/**\n * Context passed to all leaf node callbacks (action tick, condition check,\n * onAbort, guard predicates).\n *\n * @template BB - Blackboard type for per-entity AI memory\n * @template W - World interface type (default: BehaviorTreeWorld)\n */\nexport interface BehaviorTreeContext<\n\tBB extends object = Record<string, unknown>,\n\tW extends BaseWorld<BehaviorTreeComponentTypes> = BehaviorTreeWorld,\n> {\n\treadonly ecs: W;\n\treadonly entityId: number;\n\treadonly dt: number;\n\treadonly blackboard: BB;\n}\n\n// ==================== Node Types ====================\n\n/**\n * Action leaf — executes behavior each tick.\n * Returns `Running` for multi-frame actions. Optional `onAbort` fires\n * when a higher-priority branch preempts this running action.\n */\nexport interface ActionNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'action';\n\treadonly name: string;\n\treadonly tick: (ctx: BehaviorTreeContext<BB>) => NodeStatus;\n\treadonly onAbort?: (ctx: BehaviorTreeContext<BB>) => void;\n\tnodeIndex: number;\n}\n\n/**\n * Condition leaf — checks a predicate. Returns Success or Failure, never Running.\n */\nexport interface ConditionNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'condition';\n\treadonly name: string;\n\treadonly check: (ctx: BehaviorTreeContext<BB>) => boolean;\n\tnodeIndex: number;\n}\n\n/**\n * Sequence composite — runs children left-to-right.\n * Fails on first failure, succeeds when all succeed.\n * Resumes from stored child index when a running node exists.\n */\nexport interface SequenceNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'sequence';\n\treadonly children: readonly BehaviorTreeNode<BB>[];\n\tnodeIndex: number;\n}\n\n/**\n * Selector composite — runs children left-to-right.\n * Succeeds on first success, fails when all fail.\n * Always re-evaluates from child 0 to preserve priority ordering.\n */\nexport interface SelectorNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'selector';\n\treadonly children: readonly BehaviorTreeNode<BB>[];\n\tnodeIndex: number;\n}\n\n/**\n * Parallel composite — ticks all children each frame.\n * Configurable success/failure thresholds.\n *\n * Limitation (v1): only one running leaf is tracked for abort.\n * Other running children in a parallel stop being ticked if the\n * tree path diverges but do not receive an `onAbort` call.\n */\nexport interface ParallelNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'parallel';\n\treadonly children: readonly BehaviorTreeNode<BB>[];\n\treadonly successThreshold: number;\n\treadonly failureThreshold: number;\n\tnodeIndex: number;\n}\n\n/** Decorator — inverts child result (Success↔Failure), passes Running through. */\nexport interface InverterNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'inverter';\n\treadonly child: BehaviorTreeNode<BB>;\n\tnodeIndex: number;\n}\n\n/** Decorator — repeats child `count` times (or forever when count is -1). */\nexport interface RepeatNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'repeat';\n\treadonly child: BehaviorTreeNode<BB>;\n\treadonly count: number;\n\tnodeIndex: number;\n}\n\n/** Decorator — prevents child re-entry for `duration` seconds after completion. */\nexport interface CooldownNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'cooldown';\n\treadonly child: BehaviorTreeNode<BB>;\n\treadonly duration: number;\n\tnodeIndex: number;\n}\n\n/** Decorator — conditional gate. Ticks child only when condition passes. */\nexport interface GuardNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'guard';\n\treadonly child: BehaviorTreeNode<BB>;\n\treadonly condition: (ctx: BehaviorTreeContext<BB>) => boolean;\n\tnodeIndex: number;\n}\n\n/** Union of all behavior tree node types. */\nexport type BehaviorTreeNode<BB extends object = Record<string, unknown>> =\n\t| ActionNode<BB>\n\t| ConditionNode<BB>\n\t| SequenceNode<BB>\n\t| SelectorNode<BB>\n\t| ParallelNode<BB>\n\t| InverterNode<BB>\n\t| RepeatNode<BB>\n\t| CooldownNode<BB>\n\t| GuardNode<BB>;\n\n// ==================== Builder Functions ====================\n\n/**\n * Create an action leaf node.\n *\n * @param name - Human-readable name (used in abort events)\n * @param tick - Called each frame while this node is active; return NodeStatus\n * @param options - Optional `onAbort` callback fired when preempted by a higher-priority branch\n */\nexport function action<BB extends object>(\n\tname: string,\n\ttick: (ctx: BehaviorTreeContext<BB>) => NodeStatus,\n\toptions?: { onAbort?: (ctx: BehaviorTreeContext<BB>) => void },\n): ActionNode<BB> {\n\treturn { type: 'action', name, tick, onAbort: options?.onAbort, nodeIndex: -1 };\n}\n\n/**\n * Create a condition leaf node.\n *\n * @param name - Human-readable name\n * @param check - Predicate returning true (Success) or false (Failure). Never Running.\n */\nexport function condition<BB extends object>(\n\tname: string,\n\tcheck: (ctx: BehaviorTreeContext<BB>) => boolean,\n): ConditionNode<BB> {\n\treturn { type: 'condition', name, check, nodeIndex: -1 };\n}\n\n/**\n * Create a sequence composite. Runs children L→R, fails on first failure.\n */\nexport function sequence<BB extends object>(\n\tchildren: BehaviorTreeNode<BB>[],\n): SequenceNode<BB> {\n\treturn { type: 'sequence', children, nodeIndex: -1 };\n}\n\n/**\n * Create a selector composite. Runs children L→R, succeeds on first success.\n * Always starts from child 0 to re-evaluate priority.\n */\nexport function selector<BB extends object>(\n\tchildren: BehaviorTreeNode<BB>[],\n): SelectorNode<BB> {\n\treturn { type: 'selector', children, nodeIndex: -1 };\n}\n\n/**\n * Create a parallel composite. Ticks all children each frame.\n *\n * @param children - Child nodes to tick in parallel\n * @param options.successThreshold - Successes needed for parallel to succeed (default: all)\n * @param options.failureThreshold - Failures needed for parallel to fail (default: all)\n */\nexport function parallel<BB extends object>(\n\tchildren: BehaviorTreeNode<BB>[],\n\toptions?: { successThreshold?: number; failureThreshold?: number },\n): ParallelNode<BB> {\n\treturn {\n\t\ttype: 'parallel',\n\t\tchildren,\n\t\tsuccessThreshold: options?.successThreshold ?? children.length,\n\t\tfailureThreshold: options?.failureThreshold ?? children.length,\n\t\tnodeIndex: -1,\n\t};\n}\n\n/** Create an inverter decorator. Flips Success↔Failure, passes Running. */\nexport function inverter<BB extends object>(\n\tchild: BehaviorTreeNode<BB>,\n): InverterNode<BB> {\n\treturn { type: 'inverter', child, nodeIndex: -1 };\n}\n\n/**\n * Create a repeat decorator.\n *\n * @param child - Node to repeat\n * @param count - Number of repetitions, or -1 for infinite (default: -1)\n */\nexport function repeat<BB extends object>(\n\tchild: BehaviorTreeNode<BB>,\n\tcount = -1,\n): RepeatNode<BB> {\n\treturn { type: 'repeat', child, count, nodeIndex: -1 };\n}\n\n/**\n * Create a cooldown decorator. Prevents re-entry for `duration` seconds\n * after child completes (Success or Failure).\n */\nexport function cooldown<BB extends object>(\n\tchild: BehaviorTreeNode<BB>,\n\tduration: number,\n): CooldownNode<BB> {\n\treturn { type: 'cooldown', child, duration, nodeIndex: -1 };\n}\n\n/**\n * Create a guard decorator. Ticks child only when condition returns true.\n * Returns Failure when condition is false.\n */\nexport function guard<BB extends object>(\n\tcond: (ctx: BehaviorTreeContext<BB>) => boolean,\n\tchild: BehaviorTreeNode<BB>,\n): GuardNode<BB> {\n\treturn { type: 'guard', condition: cond, child, nodeIndex: -1 };\n}\n\n// ==================== Definition ====================\n\n/**\n * Immutable behavior tree definition. Shared across entities.\n *\n * @template BB - Blackboard type for per-entity AI memory\n */\nexport interface BehaviorTreeDefinition<BB extends object = Record<string, unknown>> {\n\treadonly id: string;\n\treadonly root: BehaviorTreeNode<BB>;\n\treadonly nodeCount: number;\n}\n\n/** Internal storage for definition data not exposed on the public interface. */\nconst defFlatNodes = new WeakMap<BehaviorTreeDefinition<object>, readonly BehaviorTreeNode<object>[]>();\nconst defDefaultBB = new WeakMap<BehaviorTreeDefinition<object>, object>();\n\n/**\n * Define a behavior tree with a typed blackboard.\n *\n * The `blackboard` value serves as both the type source and the default\n * initial state cloned for each entity via `createBehaviorTree`.\n *\n * @param id - Unique identifier for this tree definition\n * @param config - `{ blackboard, root }` — default blackboard + root node\n * @returns Frozen BehaviorTreeDefinition\n *\n * @example\n * ```typescript\n * const tree = defineBehaviorTree('patrol', {\n * blackboard: { targetId: null as number | null, timer: 0 },\n * root: selector([\n * guard(ctx => ctx.blackboard.targetId !== null, action('chase', ...)),\n * action('wander', ...),\n * ]),\n * });\n * ```\n */\nexport function defineBehaviorTree<BB extends object>(\n\tid: string,\n\tconfig: { blackboard: BB; root: BehaviorTreeNode<BB> },\n): BehaviorTreeDefinition<BB> {\n\tlet nextIndex = 0;\n\tconst flatNodes: BehaviorTreeNode<BB>[] = [];\n\n\tfunction indexTree(node: BehaviorTreeNode<BB>): void {\n\t\tnode.nodeIndex = nextIndex;\n\t\tflatNodes[nextIndex] = node;\n\t\tnextIndex++;\n\t\tif ('children' in node) {\n\t\t\tfor (const child of node.children) indexTree(child);\n\t\t}\n\t\tif ('child' in node) {\n\t\t\tindexTree(node.child);\n\t\t}\n\t}\n\tindexTree(config.root);\n\n\tconst def: BehaviorTreeDefinition<BB> = Object.freeze({ id, root: config.root, nodeCount: nextIndex });\n\tdefFlatNodes.set(def as BehaviorTreeDefinition<object>, flatNodes as readonly BehaviorTreeNode<object>[]);\n\tdefDefaultBB.set(def as BehaviorTreeDefinition<object>, config.blackboard);\n\treturn def;\n}\n\n// ==================== Per-Entity Component ====================\n\n/**\n * Runtime behavior tree state stored on each entity.\n *\n * The `blackboard` is typed as `object` at the component level.\n * Inside tree callbacks, the `BehaviorTreeContext<BB>` provides\n * typed access to the blackboard via the tree definition's generic.\n * Outside the tree, cast the blackboard to the specific BB type.\n */\nexport interface BehaviorTreeComponent {\n\treadonly definition: BehaviorTreeDefinition<Record<string, unknown>>;\n\tblackboard: object;\n\t/** Index of the currently running leaf, or -1 if none. */\n\trunningNodeIndex: number;\n\t/**\n\t * Dense per-node state array (sized to `definition.nodeCount`).\n\t * Semantics vary by node type:\n\t * - sequence/selector: child progress index\n\t * - repeat: completed iteration count\n\t * - cooldown: expiry timestamp (elapsedTime when cooldown ends)\n\t */\n\tnodeState: Float64Array;\n\t/** Accumulated time (seconds) for cooldown tracking. */\n\telapsedTime: number;\n}\n\n/**\n * Component types provided by the behavior tree plugin.\n */\nexport interface BehaviorTreeComponentTypes {\n\tbehaviorTree: BehaviorTreeComponent;\n}\n\n// ==================== Event Types ====================\n\n/**\n * Event published when a running action is preempted (aborted) by a\n * higher-priority branch taking over.\n */\nexport interface BehaviorTreeAbortEvent {\n\tentityId: number;\n\t/** nodeIndex of the aborted action */\n\tnodeIndex: number;\n\t/** Human-readable name of the aborted action */\n\tnodeName: string;\n\t/** Definition id of the behavior tree */\n\tdefinitionId: string;\n}\n\n/**\n * Event types provided by the behavior tree plugin.\n */\nexport interface BehaviorTreeEventTypes {\n\tbehaviorTreeAbort: BehaviorTreeAbortEvent;\n}\n\n// ==================== WorldConfig ====================\n\n/**\n * WorldConfig representing the behavior tree plugin's provided types.\n */\nexport type BehaviorTreeWorldConfig =\n\tComponentsConfig<BehaviorTreeComponentTypes>\n\t& EventsConfig<BehaviorTreeEventTypes>;\n\n// ==================== Helper Functions ====================\n\n/**\n * Create a `behaviorTree` component from a definition.\n *\n * @param definition - Shared tree definition\n * @param blackboard - Optional partial overrides for the default blackboard\n * @returns Component object suitable for spreading into spawn()\n *\n * @example\n * ```typescript\n * ecs.spawn({\n * ...createBehaviorTree(villagerTree, { hunger: 80 }),\n * ...createLocalTransform(100, 200),\n * });\n * ```\n */\nexport function createBehaviorTree<BB extends object>(\n\tdefinition: BehaviorTreeDefinition<BB>,\n\tblackboard?: Partial<BB>,\n): Pick<BehaviorTreeComponentTypes, 'behaviorTree'> {\n\tconst defaultBB = defDefaultBB.get(definition as BehaviorTreeDefinition<object>) as BB;\n\tconst bb = { ...defaultBB, ...blackboard };\n\treturn {\n\t\tbehaviorTree: {\n\t\t\tdefinition: definition as BehaviorTreeDefinition<Record<string, unknown>>,\n\t\t\tblackboard: bb,\n\t\t\trunningNodeIndex: -1,\n\t\t\tnodeState: new Float64Array(definition.nodeCount),\n\t\t\telapsedTime: 0,\n\t\t},\n\t};\n}\n\n/**\n * Check whether an entity's behavior tree has a running action.\n */\nexport function isBehaviorTreeRunning(\n\tecs: { getComponent(entityId: number, name: 'behaviorTree'): BehaviorTreeComponent | undefined },\n\tentityId: number,\n): boolean {\n\tconst bt = ecs.getComponent(entityId, 'behaviorTree');\n\treturn bt !== undefined && bt.runningNodeIndex !== -1;\n}\n\n/**\n * Reset an entity's behavior tree: abort any running action, clear all\n * composite progress, and optionally reset the blackboard.\n */\nexport function resetBehaviorTree(\n\tecs: BehaviorTreeWorld,\n\tentityId: number,\n\tblackboard?: Partial<Record<string, unknown>>,\n): void {\n\tconst bt = ecs.getComponent(entityId, 'behaviorTree');\n\tif (!bt) return;\n\n\tif (bt.runningNodeIndex !== -1) {\n\t\tconst flatNodes = defFlatNodes.get(bt.definition as BehaviorTreeDefinition<object>);\n\t\tconst node = flatNodes?.[bt.runningNodeIndex];\n\t\tif (node && node.type === 'action' && node.onAbort) {\n\t\t\tnode.onAbort({ ecs, entityId, dt: 0, blackboard: bt.blackboard as Record<string, unknown> });\n\t\t}\n\t\tbt.runningNodeIndex = -1;\n\t}\n\tbt.nodeState.fill(0);\n\tbt.elapsedTime = 0;\n\n\tif (blackboard) {\n\t\tObject.assign(bt.blackboard, blackboard);\n\t}\n}\n\n// ==================== Internal: Traversal ====================\n\n/** Internal shorthand — all runtime traversal uses the erased base types. */\ntype AnyNode = BehaviorTreeNode<Record<string, unknown>>;\n\n/** Mutable version of context for pre-allocation in the system loop. */\ninterface MutableCtx {\n\tecs: BehaviorTreeWorld;\n\tentityId: number;\n\tdt: number;\n\tblackboard: Record<string, unknown>;\n}\n\nfunction abortRunningNode(bt: BehaviorTreeComponent, ctx: MutableCtx): void {\n\tconst flatNodes = defFlatNodes.get(bt.definition as BehaviorTreeDefinition<object>);\n\tconst node = flatNodes?.[bt.runningNodeIndex] as AnyNode | undefined;\n\tif (node && node.type === 'action') {\n\t\tnode.onAbort?.(ctx);\n\t\tctx.ecs.eventBus.publish('behaviorTreeAbort', {\n\t\t\tentityId: ctx.entityId,\n\t\t\tnodeIndex: bt.runningNodeIndex,\n\t\t\tnodeName: node.name,\n\t\t\tdefinitionId: bt.definition.id,\n\t\t} satisfies BehaviorTreeAbortEvent);\n\t}\n\tbt.nodeState.fill(0);\n\tbt.runningNodeIndex = -1;\n}\n\nfunction tickNode(node: AnyNode, bt: BehaviorTreeComponent, ctx: MutableCtx): NodeStatus {\n\tswitch (node.type) {\n\t\tcase 'condition':\n\t\t\treturn node.check(ctx) ? NodeStatus.Success : NodeStatus.Failure;\n\n\t\tcase 'action': {\n\t\t\tconst result = node.tick(ctx);\n\t\t\tif (result === NodeStatus.Running) {\n\t\t\t\tif (bt.runningNodeIndex !== -1 && bt.runningNodeIndex !== node.nodeIndex) {\n\t\t\t\t\tabortRunningNode(bt, ctx);\n\t\t\t\t}\n\t\t\t\tbt.runningNodeIndex = node.nodeIndex;\n\t\t\t} else if (bt.runningNodeIndex === node.nodeIndex) {\n\t\t\t\tbt.runningNodeIndex = -1;\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tcase 'sequence': {\n\t\t\tconst startChild = (bt.runningNodeIndex !== -1)\n\t\t\t\t? (bt.nodeState[node.nodeIndex] ?? 0)\n\t\t\t\t: 0;\n\t\t\tfor (let i = startChild; i < node.children.length; i++) {\n\t\t\t\tconst status = tickNode(node.children[i]!, bt, ctx);\n\t\t\t\tif (status === NodeStatus.Failure) {\n\t\t\t\t\tbt.nodeState[node.nodeIndex] = 0;\n\t\t\t\t\treturn NodeStatus.Failure;\n\t\t\t\t}\n\t\t\t\tif (status === NodeStatus.Running) {\n\t\t\t\t\tbt.nodeState[node.nodeIndex] = i;\n\t\t\t\t\treturn NodeStatus.Running;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbt.nodeState[node.nodeIndex] = 0;\n\t\t\treturn NodeStatus.Success;\n\t\t}\n\n\t\tcase 'selector': {\n\t\t\tfor (let i = 0; i < node.children.length; i++) {\n\t\t\t\tconst status = tickNode(node.children[i]!, bt, ctx);\n\t\t\t\tif (status === NodeStatus.Success) return NodeStatus.Success;\n\t\t\t\tif (status === NodeStatus.Running) return NodeStatus.Running;\n\t\t\t}\n\t\t\treturn NodeStatus.Failure;\n\t\t}\n\n\t\tcase 'parallel': {\n\t\t\tlet successCount = 0;\n\t\t\tlet failureCount = 0;\n\t\t\tlet anyRunning = false;\n\t\t\tfor (let i = 0; i < node.children.length; i++) {\n\t\t\t\tconst status = tickNode(node.children[i]!, bt, ctx);\n\t\t\t\tif (status === NodeStatus.Success) successCount++;\n\t\t\t\telse if (status === NodeStatus.Failure) failureCount++;\n\t\t\t\telse anyRunning = true;\n\t\t\t}\n\t\t\tif (successCount >= node.successThreshold) return NodeStatus.Success;\n\t\t\tif (failureCount >= node.failureThreshold) return NodeStatus.Failure;\n\t\t\tif (anyRunning) return NodeStatus.Running;\n\t\t\treturn NodeStatus.Failure;\n\t\t}\n\n\t\tcase 'inverter': {\n\t\t\tconst status = tickNode(node.child, bt, ctx);\n\t\t\tif (status === NodeStatus.Success) return NodeStatus.Failure;\n\t\t\tif (status === NodeStatus.Failure) return NodeStatus.Success;\n\t\t\treturn NodeStatus.Running;\n\t\t}\n\n\t\tcase 'repeat': {\n\t\t\tconst iteration = bt.nodeState[node.nodeIndex] ?? 0;\n\t\t\tconst status = tickNode(node.child, bt, ctx);\n\t\t\tif (status === NodeStatus.Failure) {\n\t\t\t\tbt.nodeState[node.nodeIndex] = 0;\n\t\t\t\treturn NodeStatus.Failure;\n\t\t\t}\n\t\t\tif (status === NodeStatus.Running) return NodeStatus.Running;\n\t\t\tconst next = iteration + 1;\n\t\t\tif (node.count !== -1 && next >= node.count) {\n\t\t\t\tbt.nodeState[node.nodeIndex] = 0;\n\t\t\t\treturn NodeStatus.Success;\n\t\t\t}\n\t\t\tbt.nodeState[node.nodeIndex] = next;\n\t\t\treturn NodeStatus.Running;\n\t\t}\n\n\t\tcase 'cooldown': {\n\t\t\tconst expiresAt = bt.nodeState[node.nodeIndex] ?? 0;\n\t\t\tif (expiresAt > 0 && bt.elapsedTime < expiresAt) return NodeStatus.Failure;\n\t\t\tconst status = tickNode(node.child, bt, ctx);\n\t\t\tif (status !== NodeStatus.Running) {\n\t\t\t\tbt.nodeState[node.nodeIndex] = bt.elapsedTime + node.duration;\n\t\t\t}\n\t\t\treturn status;\n\t\t}\n\n\t\tcase 'guard': {\n\t\t\tif (!node.condition(ctx)) return NodeStatus.Failure;\n\t\t\treturn tickNode(node.child, bt, ctx);\n\t\t}\n\t}\n}\n\n// ==================== Typed Helpers ====================\n\n/**\n * Typed helpers for the behavior tree plugin.\n * Creates helpers that validate callback parameters against the world type W.\n * Call after `.build()` using `typeof ecs`.\n */\nexport interface BehaviorTreeHelpers<W extends BaseWorld<BehaviorTreeComponentTypes>> {\n\tdefineBehaviorTree: <BB extends object>(\n\t\tid: string,\n\t\tconfig: { blackboard: BB; root: BehaviorTreeNode<BB> },\n\t) => BehaviorTreeDefinition<BB>;\n\taction: <BB extends object>(\n\t\tname: string,\n\t\ttick: (ctx: BehaviorTreeContext<BB, W>) => NodeStatus,\n\t\toptions?: { onAbort?: (ctx: BehaviorTreeContext<BB, W>) => void },\n\t) => ActionNode<BB>;\n\tcondition: <BB extends object>(\n\t\tname: string,\n\t\tcheck: (ctx: BehaviorTreeContext<BB, W>) => boolean,\n\t) => ConditionNode<BB>;\n\tguard: <BB extends object>(\n\t\tcond: (ctx: BehaviorTreeContext<BB, W>) => boolean,\n\t\tchild: BehaviorTreeNode<BB>,\n\t) => GuardNode<BB>;\n}\n\n/**\n * Create typed behavior tree helpers bound to a specific world type.\n *\n * @example\n * ```typescript\n * const ecs = ECSpresso.create()\n * .withPlugin(createBehaviorTreePlugin())\n * .build();\n *\n * const { defineBehaviorTree, action, condition, guard } = ecs.getHelpers(createBehaviorTreeHelpers);\n * ```\n */\nexport function createBehaviorTreeHelpers<\n\tW extends BaseWorld<BehaviorTreeComponentTypes> = BehaviorTreeWorld,\n>(_world?: W): BehaviorTreeHelpers<W> {\n\treturn {\n\t\tdefineBehaviorTree: defineBehaviorTree as BehaviorTreeHelpers<W>['defineBehaviorTree'],\n\t\taction: action as BehaviorTreeHelpers<W>['action'],\n\t\tcondition: condition as BehaviorTreeHelpers<W>['condition'],\n\t\tguard: guard as BehaviorTreeHelpers<W>['guard'],\n\t};\n}\n\n// ==================== Plugin Options ====================\n\n/**\n * Configuration options for the behavior tree plugin.\n */\nexport interface BehaviorTreePluginOptions<G extends string = 'ai'> extends BasePluginOptions<G> {}\n\n// ==================== Plugin Factory ====================\n\n/**\n * Create a behavior tree plugin for ECSpresso.\n *\n * Provides composable, priority-driven AI via behavior trees with:\n * - Hybrid traversal: re-evaluate from root each tick, resume running leaves\n * - Automatic abort with `onAbort` callback when preempted\n * - Typed blackboard for per-entity AI memory\n * - `behaviorTreeAbort` events on preemption\n *\n * @example\n * ```typescript\n * const ecs = ECSpresso.create()\n * .withPlugin(createBehaviorTreePlugin())\n * .build();\n *\n * const { defineBehaviorTree, action, condition, guard } = ecs.getHelpers(createBehaviorTreeHelpers);\n *\n * const tree = defineBehaviorTree('villager', {\n * blackboard: { hunger: 100, targetId: null as number | null },\n * root: selector([\n * guard(ctx => ctx.blackboard.hunger < 30, action('eat', ...)),\n * action('wander', ...),\n * ]),\n * });\n *\n * ecs.spawn({\n * ...createBehaviorTree(tree),\n * ...createLocalTransform(100, 200),\n * });\n * ```\n */\nexport function createBehaviorTreePlugin<G extends string = 'ai'>(\n\toptions?: BehaviorTreePluginOptions<G>,\n) {\n\tconst {\n\t\tsystemGroup = 'ai',\n\t\tpriority = 0,\n\t\tphase = 'update',\n\t} = options ?? {};\n\n\treturn definePlugin('behaviorTree')\n\t\t.withComponentTypes<BehaviorTreeComponentTypes>()\n\t\t.withEventTypes<BehaviorTreeEventTypes>()\n\t\t.withLabels<'behavior-tree-update'>()\n\t\t.withGroups<G>()\n\t\t.install((world) => {\n\t\t\t// Dispose: abort running node on entity removal\n\t\t\tworld.registerDispose('behaviorTree', ({ value, entityId }) => {\n\t\t\t\tif (value.runningNodeIndex !== -1) {\n\t\t\t\t\tconst flatNodes = defFlatNodes.get(value.definition as BehaviorTreeDefinition<object>);\n\t\t\t\t\tconst node = flatNodes?.[value.runningNodeIndex] as AnyNode | undefined;\n\t\t\t\t\tif (node && node.type === 'action' && node.onAbort) {\n\t\t\t\t\t\tnode.onAbort({\n\t\t\t\t\t\t\tecs: world as unknown as BehaviorTreeWorld,\n\t\t\t\t\t\t\tentityId,\n\t\t\t\t\t\t\tdt: 0,\n\t\t\t\t\t\t\tblackboard: value.blackboard as Record<string, unknown>,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tworld\n\t\t\t\t.addSystem('behavior-tree-update')\n\t\t\t\t.setPriority(priority)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.addQuery('trees', {\n\t\t\t\t\twith: ['behaviorTree'],\n\t\t\t\t})\n\t\t\t\t.setProcess(({ queries, dt, ecs: ecsWorld }) => {\n\t\t\t\t\tconst ctx: MutableCtx = {\n\t\t\t\t\t\tecs: ecsWorld as unknown as BehaviorTreeWorld,\n\t\t\t\t\t\tentityId: 0,\n\t\t\t\t\t\tdt: 0,\n\t\t\t\t\t\tblackboard: {},\n\t\t\t\t\t};\n\n\t\t\t\t\tfor (const entity of queries.trees) {\n\t\t\t\t\t\tconst bt = entity.components.behaviorTree;\n\t\t\t\t\t\tctx.entityId = entity.id;\n\t\t\t\t\t\tctx.dt = dt;\n\t\t\t\t\t\tctx.blackboard = bt.blackboard as Record<string, unknown>;\n\t\t\t\t\t\tbt.elapsedTime += dt;\n\n\t\t\t\t\t\tconst result = tickNode(bt.definition.root as AnyNode, bt, ctx);\n\n\t\t\t\t\t\tif (result !== NodeStatus.Running && bt.runningNodeIndex !== -1) {\n\t\t\t\t\t\t\tabortRunningNode(bt, ctx);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n}\n"
5
+ "/**\n * Behavior Tree Plugin for ECSpresso\n *\n * Provides composable, priority-driven AI via behavior trees. Shared immutable\n * tree definitions drive per-entity runtime state. Uses hybrid traversal\n * (Approach C): re-evaluate from root each tick to preserve priority, resume\n * running leaves, and abort diverged running nodes via `onAbort`.\n *\n * Each entity gets a `behaviorTree` component referencing a shared definition\n * plus a typed blackboard for per-entity AI memory. One system processes all\n * behavior-tree entities each tick.\n *\n * Top-level node helpers such as `action(...)` and `condition(...)` type the\n * callback ECS as the behavior-tree plugin world. If a leaf needs app-specific\n * components, resources, or events, use `ecs.getHelpers(createBehaviorTreeHelpers)`\n * after `.build()` and destructure helpers from that bound result.\n *\n * Node types:\n * Composites — sequence, selector, parallel\n * Decorators — inverter, repeat, cooldown, guard\n * Leaves — action (tick → NodeStatus, optional onAbort), condition (predicate)\n */\n\nimport { definePlugin, type BasePluginOptions, type BaseWorld, type ComponentsConfig, type EventsConfig } from 'ecspresso';\n\n// ==================== NodeStatus ====================\n\n/**\n * Return value from behavior tree node ticks.\n *\n * - `Success` (0) — node completed successfully\n * - `Failure` (1) — node failed\n * - `Running` (2) — node still executing, will resume next tick\n */\nexport const NodeStatus = { Success: 0, Failure: 1, Running: 2 } as const;\nexport type NodeStatus = (typeof NodeStatus)[keyof typeof NodeStatus];\n\n// ==================== Callback Context ====================\n\n/** BaseWorld narrowed to behavior-tree components for typed access in helpers. */\ntype BehaviorTreeWorld = BaseWorld<BehaviorTreeComponentTypes>;\n\n/**\n * Context passed to all leaf node callbacks (action tick, condition check,\n * onAbort, guard predicates).\n *\n * @template BB - Blackboard type for per-entity AI memory\n * @template W - World interface type (default: BehaviorTreeWorld)\n */\nexport interface BehaviorTreeContext<\n\tBB extends object = Record<string, unknown>,\n\tW extends BaseWorld<BehaviorTreeComponentTypes> = BehaviorTreeWorld,\n> {\n\treadonly ecs: W;\n\treadonly entityId: number;\n\treadonly dt: number;\n\treadonly blackboard: BB;\n}\n\n// ==================== Node Types ====================\n\n/**\n * Action leaf — executes behavior each tick.\n * Returns `Running` for multi-frame actions. Optional `onAbort` fires\n * when a higher-priority branch preempts this running action.\n */\nexport interface ActionNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'action';\n\treadonly name: string;\n\treadonly tick: (ctx: BehaviorTreeContext<BB>) => NodeStatus;\n\treadonly onAbort?: (ctx: BehaviorTreeContext<BB>) => void;\n\tnodeIndex: number;\n}\n\n/**\n * Condition leaf — checks a predicate. Returns Success or Failure, never Running.\n */\nexport interface ConditionNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'condition';\n\treadonly name: string;\n\treadonly check: (ctx: BehaviorTreeContext<BB>) => boolean;\n\tnodeIndex: number;\n}\n\n/**\n * Sequence composite — runs children left-to-right.\n * Fails on first failure, succeeds when all succeed.\n * Resumes from stored child index when a running node exists.\n */\nexport interface SequenceNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'sequence';\n\treadonly children: readonly BehaviorTreeNode<BB>[];\n\tnodeIndex: number;\n}\n\n/**\n * Selector composite — runs children left-to-right.\n * Succeeds on first success, fails when all fail.\n * Always re-evaluates from child 0 to preserve priority ordering.\n */\nexport interface SelectorNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'selector';\n\treadonly children: readonly BehaviorTreeNode<BB>[];\n\tnodeIndex: number;\n}\n\n/**\n * Parallel composite — ticks all children each frame.\n * Configurable success/failure thresholds.\n *\n * Limitation (v1): only one running leaf is tracked for abort.\n * Other running children in a parallel stop being ticked if the\n * tree path diverges but do not receive an `onAbort` call.\n */\nexport interface ParallelNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'parallel';\n\treadonly children: readonly BehaviorTreeNode<BB>[];\n\treadonly successThreshold: number;\n\treadonly failureThreshold: number;\n\tnodeIndex: number;\n}\n\n/** Decorator — inverts child result (Success↔Failure), passes Running through. */\nexport interface InverterNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'inverter';\n\treadonly child: BehaviorTreeNode<BB>;\n\tnodeIndex: number;\n}\n\n/** Decorator — repeats child `count` times (or forever when count is -1). */\nexport interface RepeatNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'repeat';\n\treadonly child: BehaviorTreeNode<BB>;\n\treadonly count: number;\n\tnodeIndex: number;\n}\n\n/** Decorator — prevents child re-entry for `duration` seconds after completion. */\nexport interface CooldownNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'cooldown';\n\treadonly child: BehaviorTreeNode<BB>;\n\treadonly duration: number;\n\tnodeIndex: number;\n}\n\n/** Decorator — conditional gate. Ticks child only when condition passes. */\nexport interface GuardNode<BB extends object = Record<string, unknown>> {\n\treadonly type: 'guard';\n\treadonly child: BehaviorTreeNode<BB>;\n\treadonly condition: (ctx: BehaviorTreeContext<BB>) => boolean;\n\tnodeIndex: number;\n}\n\n/** Union of all behavior tree node types. */\nexport type BehaviorTreeNode<BB extends object = Record<string, unknown>> =\n\t| ActionNode<BB>\n\t| ConditionNode<BB>\n\t| SequenceNode<BB>\n\t| SelectorNode<BB>\n\t| ParallelNode<BB>\n\t| InverterNode<BB>\n\t| RepeatNode<BB>\n\t| CooldownNode<BB>\n\t| GuardNode<BB>;\n\n// ==================== Builder Functions ====================\n\n/**\n * Create an action leaf node.\n *\n * @param name - Human-readable name (used in abort events)\n * @param tick - Called each frame while this node is active; return NodeStatus\n * @param options - Optional `onAbort` callback fired when preempted by a higher-priority branch\n */\nexport function action<BB extends object>(\n\tname: string,\n\ttick: (ctx: BehaviorTreeContext<BB>) => NodeStatus,\n\toptions?: { onAbort?: (ctx: BehaviorTreeContext<BB>) => void },\n): ActionNode<BB> {\n\treturn { type: 'action', name, tick, onAbort: options?.onAbort, nodeIndex: -1 };\n}\n\n/**\n * Create a condition leaf node.\n *\n * @param name - Human-readable name\n * @param check - Predicate returning true (Success) or false (Failure). Never Running.\n */\nexport function condition<BB extends object>(\n\tname: string,\n\tcheck: (ctx: BehaviorTreeContext<BB>) => boolean,\n): ConditionNode<BB> {\n\treturn { type: 'condition', name, check, nodeIndex: -1 };\n}\n\n/**\n * Create a sequence composite. Runs children L→R, fails on first failure.\n */\nexport function sequence<BB extends object>(\n\tchildren: BehaviorTreeNode<BB>[],\n): SequenceNode<BB> {\n\treturn { type: 'sequence', children, nodeIndex: -1 };\n}\n\n/**\n * Create a selector composite. Runs children L→R, succeeds on first success.\n * Always starts from child 0 to re-evaluate priority.\n */\nexport function selector<BB extends object>(\n\tchildren: BehaviorTreeNode<BB>[],\n): SelectorNode<BB> {\n\treturn { type: 'selector', children, nodeIndex: -1 };\n}\n\n/**\n * Create a parallel composite. Ticks all children each frame.\n *\n * @param children - Child nodes to tick in parallel\n * @param options.successThreshold - Successes needed for parallel to succeed (default: all)\n * @param options.failureThreshold - Failures needed for parallel to fail (default: all)\n */\nexport function parallel<BB extends object>(\n\tchildren: BehaviorTreeNode<BB>[],\n\toptions?: { successThreshold?: number; failureThreshold?: number },\n): ParallelNode<BB> {\n\treturn {\n\t\ttype: 'parallel',\n\t\tchildren,\n\t\tsuccessThreshold: options?.successThreshold ?? children.length,\n\t\tfailureThreshold: options?.failureThreshold ?? children.length,\n\t\tnodeIndex: -1,\n\t};\n}\n\n/** Create an inverter decorator. Flips Success↔Failure, passes Running. */\nexport function inverter<BB extends object>(\n\tchild: BehaviorTreeNode<BB>,\n): InverterNode<BB> {\n\treturn { type: 'inverter', child, nodeIndex: -1 };\n}\n\n/**\n * Create a repeat decorator.\n *\n * @param child - Node to repeat\n * @param count - Number of repetitions, or -1 for infinite (default: -1)\n */\nexport function repeat<BB extends object>(\n\tchild: BehaviorTreeNode<BB>,\n\tcount = -1,\n): RepeatNode<BB> {\n\treturn { type: 'repeat', child, count, nodeIndex: -1 };\n}\n\n/**\n * Create a cooldown decorator. Prevents re-entry for `duration` seconds\n * after child completes (Success or Failure).\n */\nexport function cooldown<BB extends object>(\n\tchild: BehaviorTreeNode<BB>,\n\tduration: number,\n): CooldownNode<BB> {\n\treturn { type: 'cooldown', child, duration, nodeIndex: -1 };\n}\n\n/**\n * Create a guard decorator. Ticks child only when condition returns true.\n * Returns Failure when condition is false.\n */\nexport function guard<BB extends object>(\n\tcond: (ctx: BehaviorTreeContext<BB>) => boolean,\n\tchild: BehaviorTreeNode<BB>,\n): GuardNode<BB> {\n\treturn { type: 'guard', condition: cond, child, nodeIndex: -1 };\n}\n\n// ==================== Definition ====================\n\n/**\n * Immutable behavior tree definition. Shared across entities.\n *\n * @template BB - Blackboard type for per-entity AI memory\n */\nexport interface BehaviorTreeDefinition<BB extends object = Record<string, unknown>> {\n\treadonly id: string;\n\treadonly root: BehaviorTreeNode<BB>;\n\treadonly nodeCount: number;\n}\n\n/** Internal storage for definition data not exposed on the public interface. */\nconst defFlatNodes = new WeakMap<BehaviorTreeDefinition<object>, readonly BehaviorTreeNode<object>[]>();\nconst defDefaultBB = new WeakMap<BehaviorTreeDefinition<object>, object>();\n\n/**\n * Define a behavior tree with a typed blackboard.\n *\n * The `blackboard` value serves as both the type source and the default\n * initial state cloned for each entity via `createBehaviorTree`.\n *\n * @param id - Unique identifier for this tree definition\n * @param config - `{ blackboard, root }` — default blackboard + root node\n * @returns Frozen BehaviorTreeDefinition\n *\n * @example\n * ```typescript\n * const tree = defineBehaviorTree('patrol', {\n * blackboard: { targetId: null as number | null, timer: 0 },\n * root: selector([\n * guard(ctx => ctx.blackboard.targetId !== null, action('chase', ...)),\n * action('wander', ...),\n * ]),\n * });\n * ```\n */\nexport function defineBehaviorTree<BB extends object>(\n\tid: string,\n\tconfig: { blackboard: BB; root: BehaviorTreeNode<BB> },\n): BehaviorTreeDefinition<BB> {\n\tlet nextIndex = 0;\n\tconst flatNodes: BehaviorTreeNode<BB>[] = [];\n\n\tfunction indexTree(node: BehaviorTreeNode<BB>): void {\n\t\tnode.nodeIndex = nextIndex;\n\t\tflatNodes[nextIndex] = node;\n\t\tnextIndex++;\n\t\tif ('children' in node) {\n\t\t\tfor (const child of node.children) indexTree(child);\n\t\t}\n\t\tif ('child' in node) {\n\t\t\tindexTree(node.child);\n\t\t}\n\t}\n\tindexTree(config.root);\n\n\tconst def: BehaviorTreeDefinition<BB> = Object.freeze({ id, root: config.root, nodeCount: nextIndex });\n\tdefFlatNodes.set(def as BehaviorTreeDefinition<object>, flatNodes as readonly BehaviorTreeNode<object>[]);\n\tdefDefaultBB.set(def as BehaviorTreeDefinition<object>, config.blackboard);\n\treturn def;\n}\n\n// ==================== Per-Entity Component ====================\n\n/**\n * Runtime behavior tree state stored on each entity.\n *\n * The `blackboard` is typed as `object` at the component level.\n * Inside tree callbacks, the `BehaviorTreeContext<BB>` provides\n * typed access to the blackboard via the tree definition's generic.\n * Outside the tree, cast the blackboard to the specific BB type.\n */\nexport interface BehaviorTreeComponent {\n\treadonly definition: BehaviorTreeDefinition<Record<string, unknown>>;\n\tblackboard: object;\n\t/** Index of the currently running leaf, or -1 if none. */\n\trunningNodeIndex: number;\n\t/**\n\t * Dense per-node state array (sized to `definition.nodeCount`).\n\t * Semantics vary by node type:\n\t * - sequence/selector: child progress index\n\t * - repeat: completed iteration count\n\t * - cooldown: expiry timestamp (elapsedTime when cooldown ends)\n\t */\n\tnodeState: Float64Array;\n\t/** Accumulated time (seconds) for cooldown tracking. */\n\telapsedTime: number;\n}\n\n/**\n * Component types provided by the behavior tree plugin.\n */\nexport interface BehaviorTreeComponentTypes {\n\tbehaviorTree: BehaviorTreeComponent;\n}\n\n// ==================== Event Types ====================\n\n/**\n * Event published when a running action is preempted (aborted) by a\n * higher-priority branch taking over.\n */\nexport interface BehaviorTreeAbortEvent {\n\tentityId: number;\n\t/** nodeIndex of the aborted action */\n\tnodeIndex: number;\n\t/** Human-readable name of the aborted action */\n\tnodeName: string;\n\t/** Definition id of the behavior tree */\n\tdefinitionId: string;\n}\n\n/**\n * Event types provided by the behavior tree plugin.\n */\nexport interface BehaviorTreeEventTypes {\n\tbehaviorTreeAbort: BehaviorTreeAbortEvent;\n}\n\n// ==================== WorldConfig ====================\n\n/**\n * WorldConfig representing the behavior tree plugin's provided types.\n */\nexport type BehaviorTreeWorldConfig =\n\tComponentsConfig<BehaviorTreeComponentTypes>\n\t& EventsConfig<BehaviorTreeEventTypes>;\n\n// ==================== Helper Functions ====================\n\n/**\n * Create a `behaviorTree` component from a definition.\n *\n * @param definition - Shared tree definition\n * @param blackboard - Optional partial overrides for the default blackboard\n * @returns Component object suitable for spreading into spawn()\n *\n * @example\n * ```typescript\n * ecs.spawn({\n * ...createBehaviorTree(villagerTree, { hunger: 80 }),\n * ...createLocalTransform(100, 200),\n * });\n * ```\n */\nexport function createBehaviorTree<BB extends object>(\n\tdefinition: BehaviorTreeDefinition<BB>,\n\tblackboard?: Partial<BB>,\n): Pick<BehaviorTreeComponentTypes, 'behaviorTree'> {\n\tconst defaultBB = defDefaultBB.get(definition as BehaviorTreeDefinition<object>) as BB;\n\tconst bb = { ...defaultBB, ...blackboard };\n\treturn {\n\t\tbehaviorTree: {\n\t\t\tdefinition: definition as BehaviorTreeDefinition<Record<string, unknown>>,\n\t\t\tblackboard: bb,\n\t\t\trunningNodeIndex: -1,\n\t\t\tnodeState: new Float64Array(definition.nodeCount),\n\t\t\telapsedTime: 0,\n\t\t},\n\t};\n}\n\n/**\n * Check whether an entity's behavior tree has a running action.\n */\nexport function isBehaviorTreeRunning(\n\tecs: { getComponent(entityId: number, name: 'behaviorTree'): BehaviorTreeComponent | undefined },\n\tentityId: number,\n): boolean {\n\tconst bt = ecs.getComponent(entityId, 'behaviorTree');\n\treturn bt !== undefined && bt.runningNodeIndex !== -1;\n}\n\n/**\n * Reset an entity's behavior tree: abort any running action, clear all\n * composite progress, and optionally reset the blackboard.\n */\nexport function resetBehaviorTree(\n\tecs: BehaviorTreeWorld,\n\tentityId: number,\n\tblackboard?: Partial<Record<string, unknown>>,\n): void {\n\tconst bt = ecs.getComponent(entityId, 'behaviorTree');\n\tif (!bt) return;\n\n\tif (bt.runningNodeIndex !== -1) {\n\t\tconst flatNodes = defFlatNodes.get(bt.definition as BehaviorTreeDefinition<object>);\n\t\tconst node = flatNodes?.[bt.runningNodeIndex];\n\t\tif (node && node.type === 'action' && node.onAbort) {\n\t\t\tnode.onAbort({ ecs, entityId, dt: 0, blackboard: bt.blackboard as Record<string, unknown> });\n\t\t}\n\t\tbt.runningNodeIndex = -1;\n\t}\n\tbt.nodeState.fill(0);\n\tbt.elapsedTime = 0;\n\n\tif (blackboard) {\n\t\tObject.assign(bt.blackboard, blackboard);\n\t}\n}\n\n// ==================== Internal: Traversal ====================\n\n/** Internal shorthand — all runtime traversal uses the erased base types. */\ntype AnyNode = BehaviorTreeNode<Record<string, unknown>>;\n\n/** Mutable version of context for pre-allocation in the system loop. */\ninterface MutableCtx {\n\tecs: BehaviorTreeWorld;\n\tentityId: number;\n\tdt: number;\n\tblackboard: Record<string, unknown>;\n}\n\nfunction abortRunningNode(bt: BehaviorTreeComponent, ctx: MutableCtx): void {\n\tconst flatNodes = defFlatNodes.get(bt.definition as BehaviorTreeDefinition<object>);\n\tconst node = flatNodes?.[bt.runningNodeIndex] as AnyNode | undefined;\n\tif (node && node.type === 'action') {\n\t\tnode.onAbort?.(ctx);\n\t\tctx.ecs.eventBus.publish('behaviorTreeAbort', {\n\t\t\tentityId: ctx.entityId,\n\t\t\tnodeIndex: bt.runningNodeIndex,\n\t\t\tnodeName: node.name,\n\t\t\tdefinitionId: bt.definition.id,\n\t\t} satisfies BehaviorTreeAbortEvent);\n\t}\n\tbt.nodeState.fill(0);\n\tbt.runningNodeIndex = -1;\n}\n\nfunction tickNode(node: AnyNode, bt: BehaviorTreeComponent, ctx: MutableCtx): NodeStatus {\n\tswitch (node.type) {\n\t\tcase 'condition':\n\t\t\treturn node.check(ctx) ? NodeStatus.Success : NodeStatus.Failure;\n\n\t\tcase 'action': {\n\t\t\tconst result = node.tick(ctx);\n\t\t\tif (result === NodeStatus.Running) {\n\t\t\t\tif (bt.runningNodeIndex !== -1 && bt.runningNodeIndex !== node.nodeIndex) {\n\t\t\t\t\tabortRunningNode(bt, ctx);\n\t\t\t\t}\n\t\t\t\tbt.runningNodeIndex = node.nodeIndex;\n\t\t\t} else if (bt.runningNodeIndex === node.nodeIndex) {\n\t\t\t\tbt.runningNodeIndex = -1;\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tcase 'sequence': {\n\t\t\tconst startChild = (bt.runningNodeIndex !== -1)\n\t\t\t\t? (bt.nodeState[node.nodeIndex] ?? 0)\n\t\t\t\t: 0;\n\t\t\tfor (let i = startChild; i < node.children.length; i++) {\n\t\t\t\tconst status = tickNode(node.children[i]!, bt, ctx);\n\t\t\t\tif (status === NodeStatus.Failure) {\n\t\t\t\t\tbt.nodeState[node.nodeIndex] = 0;\n\t\t\t\t\treturn NodeStatus.Failure;\n\t\t\t\t}\n\t\t\t\tif (status === NodeStatus.Running) {\n\t\t\t\t\tbt.nodeState[node.nodeIndex] = i;\n\t\t\t\t\treturn NodeStatus.Running;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbt.nodeState[node.nodeIndex] = 0;\n\t\t\treturn NodeStatus.Success;\n\t\t}\n\n\t\tcase 'selector': {\n\t\t\tfor (let i = 0; i < node.children.length; i++) {\n\t\t\t\tconst status = tickNode(node.children[i]!, bt, ctx);\n\t\t\t\tif (status === NodeStatus.Success) return NodeStatus.Success;\n\t\t\t\tif (status === NodeStatus.Running) return NodeStatus.Running;\n\t\t\t}\n\t\t\treturn NodeStatus.Failure;\n\t\t}\n\n\t\tcase 'parallel': {\n\t\t\tlet successCount = 0;\n\t\t\tlet failureCount = 0;\n\t\t\tlet anyRunning = false;\n\t\t\tfor (let i = 0; i < node.children.length; i++) {\n\t\t\t\tconst status = tickNode(node.children[i]!, bt, ctx);\n\t\t\t\tif (status === NodeStatus.Success) successCount++;\n\t\t\t\telse if (status === NodeStatus.Failure) failureCount++;\n\t\t\t\telse anyRunning = true;\n\t\t\t}\n\t\t\tif (successCount >= node.successThreshold) return NodeStatus.Success;\n\t\t\tif (failureCount >= node.failureThreshold) return NodeStatus.Failure;\n\t\t\tif (anyRunning) return NodeStatus.Running;\n\t\t\treturn NodeStatus.Failure;\n\t\t}\n\n\t\tcase 'inverter': {\n\t\t\tconst status = tickNode(node.child, bt, ctx);\n\t\t\tif (status === NodeStatus.Success) return NodeStatus.Failure;\n\t\t\tif (status === NodeStatus.Failure) return NodeStatus.Success;\n\t\t\treturn NodeStatus.Running;\n\t\t}\n\n\t\tcase 'repeat': {\n\t\t\tconst iteration = bt.nodeState[node.nodeIndex] ?? 0;\n\t\t\tconst status = tickNode(node.child, bt, ctx);\n\t\t\tif (status === NodeStatus.Failure) {\n\t\t\t\tbt.nodeState[node.nodeIndex] = 0;\n\t\t\t\treturn NodeStatus.Failure;\n\t\t\t}\n\t\t\tif (status === NodeStatus.Running) return NodeStatus.Running;\n\t\t\tconst next = iteration + 1;\n\t\t\tif (node.count !== -1 && next >= node.count) {\n\t\t\t\tbt.nodeState[node.nodeIndex] = 0;\n\t\t\t\treturn NodeStatus.Success;\n\t\t\t}\n\t\t\tbt.nodeState[node.nodeIndex] = next;\n\t\t\treturn NodeStatus.Running;\n\t\t}\n\n\t\tcase 'cooldown': {\n\t\t\tconst expiresAt = bt.nodeState[node.nodeIndex] ?? 0;\n\t\t\tif (expiresAt > 0 && bt.elapsedTime < expiresAt) return NodeStatus.Failure;\n\t\t\tconst status = tickNode(node.child, bt, ctx);\n\t\t\tif (status !== NodeStatus.Running) {\n\t\t\t\tbt.nodeState[node.nodeIndex] = bt.elapsedTime + node.duration;\n\t\t\t}\n\t\t\treturn status;\n\t\t}\n\n\t\tcase 'guard': {\n\t\t\tif (!node.condition(ctx)) return NodeStatus.Failure;\n\t\t\treturn tickNode(node.child, bt, ctx);\n\t\t}\n\t}\n}\n\n// ==================== Typed Helpers ====================\n\n/**\n * Typed helpers for the behavior tree plugin.\n * Creates helpers that validate callback parameters against the world type W.\n * Call after `.build()` so behavior-tree leaves can access app-specific\n * components, resources, and events through the full built ECS type.\n */\nexport interface BehaviorTreeHelpers<W extends BaseWorld<BehaviorTreeComponentTypes>> {\n\tdefineBehaviorTree: <BB extends object>(\n\t\tid: string,\n\t\tconfig: { blackboard: BB; root: BehaviorTreeNode<BB> },\n\t) => BehaviorTreeDefinition<BB>;\n\taction: <BB extends object>(\n\t\tname: string,\n\t\ttick: (ctx: BehaviorTreeContext<BB, W>) => NodeStatus,\n\t\toptions?: { onAbort?: (ctx: BehaviorTreeContext<BB, W>) => void },\n\t) => ActionNode<BB>;\n\tcondition: <BB extends object>(\n\t\tname: string,\n\t\tcheck: (ctx: BehaviorTreeContext<BB, W>) => boolean,\n\t) => ConditionNode<BB>;\n\tguard: <BB extends object>(\n\t\tcond: (ctx: BehaviorTreeContext<BB, W>) => boolean,\n\t\tchild: BehaviorTreeNode<BB>,\n\t) => GuardNode<BB>;\n}\n\n/**\n * Create typed behavior tree helpers bound to a specific world type.\n *\n * @example\n * ```typescript\n * const ecs = ECSpresso.create()\n * .withPlugin(createBehaviorTreePlugin())\n * .withComponentTypes<{ enemy: { hp: number } }>()\n * .build();\n *\n * const { defineBehaviorTree, action, condition, guard } = ecs.getHelpers(createBehaviorTreeHelpers);\n *\n * action('read enemy', ({ ecs, entityId }) => {\n * const enemy = ecs.getComponent(entityId, 'enemy');\n * return enemy ? NodeStatus.Success : NodeStatus.Failure;\n * });\n * ```\n */\nexport function createBehaviorTreeHelpers<\n\tW extends BaseWorld<BehaviorTreeComponentTypes> = BehaviorTreeWorld,\n>(_world?: W): BehaviorTreeHelpers<W> {\n\treturn {\n\t\tdefineBehaviorTree: defineBehaviorTree as BehaviorTreeHelpers<W>['defineBehaviorTree'],\n\t\taction: action as BehaviorTreeHelpers<W>['action'],\n\t\tcondition: condition as BehaviorTreeHelpers<W>['condition'],\n\t\tguard: guard as BehaviorTreeHelpers<W>['guard'],\n\t};\n}\n\n// ==================== Plugin Options ====================\n\n/**\n * Configuration options for the behavior tree plugin.\n */\nexport interface BehaviorTreePluginOptions<G extends string = 'ai'> extends BasePluginOptions<G> {}\n\n// ==================== Plugin Factory ====================\n\n/**\n * Create a behavior tree plugin for ECSpresso.\n *\n * Provides composable, priority-driven AI via behavior trees with:\n * - Hybrid traversal: re-evaluate from root each tick, resume running leaves\n * - Automatic abort with `onAbort` callback when preempted\n * - Typed blackboard for per-entity AI memory\n * - `behaviorTreeAbort` events on preemption\n *\n * @example\n * ```typescript\n * const ecs = ECSpresso.create()\n * .withPlugin(createBehaviorTreePlugin())\n * .build();\n *\n * const { defineBehaviorTree, action, condition, guard } = ecs.getHelpers(createBehaviorTreeHelpers);\n *\n * const tree = defineBehaviorTree('villager', {\n * blackboard: { hunger: 100, targetId: null as number | null },\n * root: selector([\n * guard(ctx => ctx.blackboard.hunger < 30, action('eat', ...)),\n * action('wander', ...),\n * ]),\n * });\n *\n * ecs.spawn({\n * ...createBehaviorTree(tree),\n * ...createLocalTransform(100, 200),\n * });\n * ```\n */\nexport function createBehaviorTreePlugin<G extends string = 'ai'>(\n\toptions?: BehaviorTreePluginOptions<G>,\n) {\n\tconst {\n\t\tsystemGroup = 'ai',\n\t\tpriority = 0,\n\t\tphase = 'update',\n\t} = options ?? {};\n\n\treturn definePlugin('behaviorTree')\n\t\t.withComponentTypes<BehaviorTreeComponentTypes>()\n\t\t.withEventTypes<BehaviorTreeEventTypes>()\n\t\t.withLabels<'behavior-tree-update'>()\n\t\t.withGroups<G>()\n\t\t.install((world) => {\n\t\t\t// Dispose: abort running node on entity removal\n\t\t\tworld.registerDispose('behaviorTree', ({ value, entityId }) => {\n\t\t\t\tif (value.runningNodeIndex !== -1) {\n\t\t\t\t\tconst flatNodes = defFlatNodes.get(value.definition as BehaviorTreeDefinition<object>);\n\t\t\t\t\tconst node = flatNodes?.[value.runningNodeIndex] as AnyNode | undefined;\n\t\t\t\t\tif (node && node.type === 'action' && node.onAbort) {\n\t\t\t\t\t\tnode.onAbort({\n\t\t\t\t\t\t\tecs: world as unknown as BehaviorTreeWorld,\n\t\t\t\t\t\t\tentityId,\n\t\t\t\t\t\t\tdt: 0,\n\t\t\t\t\t\t\tblackboard: value.blackboard as Record<string, unknown>,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tworld\n\t\t\t\t.addSystem('behavior-tree-update')\n\t\t\t\t.setPriority(priority)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.addQuery('trees', {\n\t\t\t\t\twith: ['behaviorTree'],\n\t\t\t\t})\n\t\t\t\t.setProcess(({ queries, dt, ecs: ecsWorld }) => {\n\t\t\t\t\tconst ctx: MutableCtx = {\n\t\t\t\t\t\tecs: ecsWorld as unknown as BehaviorTreeWorld,\n\t\t\t\t\t\tentityId: 0,\n\t\t\t\t\t\tdt: 0,\n\t\t\t\t\t\tblackboard: {},\n\t\t\t\t\t};\n\n\t\t\t\t\tfor (const entity of queries.trees) {\n\t\t\t\t\t\tconst bt = entity.components.behaviorTree;\n\t\t\t\t\t\tctx.entityId = entity.id;\n\t\t\t\t\t\tctx.dt = dt;\n\t\t\t\t\t\tctx.blackboard = bt.blackboard as Record<string, unknown>;\n\t\t\t\t\t\tbt.elapsedTime += dt;\n\n\t\t\t\t\t\tconst result = tickNode(bt.definition.root as AnyNode, bt, ctx);\n\n\t\t\t\t\t\tif (result !== NodeStatus.Running && bt.runningNodeIndex !== -1) {\n\t\t\t\t\t\t\tabortRunningNode(bt, ctx);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n}\n"
6
6
  ],
7
- "mappings": "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",
7
+ "mappings": "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",
8
8
  "debugId": "71DF25393349415964756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -9,7 +9,8 @@
9
9
  *
10
10
  * The plugin's `projection` option must match the underlying camera's kind;
11
11
  * a mismatch throws at init. State is a discriminated union — perspective
12
- * cameras expose `fov` / `setFov`, orthographic cameras expose `zoom` / `setZoom`.
12
+ * cameras expose `fov` / `setFov`, orthographic cameras expose `zoom` / `setZoom`
13
+ * (clamped via `minZoom` / `maxZoom` plugin options, including wheel input).
13
14
  *
14
15
  * Import from 'ecspresso/plugins/spatial/camera3D'
15
16
  */
@@ -70,6 +71,7 @@ export interface Camera3DResourceTypes {
70
71
  camera3DState: Camera3DState;
71
72
  }
72
73
  export type Camera3DWorldConfig = ResourcesConfig<Camera3DResourceTypes>;
74
+ type Camera3DWheelMode = 'auto' | 'distance' | 'zoom' | 'disabled';
73
75
  export interface Camera3DBasePluginOptions<G extends string = 'camera3d'> {
74
76
  systemGroup?: G;
75
77
  phase?: SystemPhase;
@@ -87,6 +89,7 @@ export interface Camera3DBasePluginOptions<G extends string = 'camera3d'> {
87
89
  maxElevation?: number;
88
90
  orbitSensitivity?: number;
89
91
  dollySensitivity?: number;
92
+ wheelMode?: Camera3DWheelMode;
90
93
  enableOrbit?: boolean;
91
94
  follow?: Camera3DFollowOptions;
92
95
  shake?: boolean | Partial<Camera3DShakeOptions>;
@@ -98,6 +101,8 @@ export type Camera3DPluginOptions<G extends string = 'camera3d'> = Camera3DBaseP
98
101
  } | {
99
102
  projection: 'orthographic';
100
103
  zoom?: number;
104
+ minZoom?: number;
105
+ maxZoom?: number;
101
106
  });
102
107
  export type Camera3DLabels = 'camera3d-init' | 'camera3d-follow' | 'camera3d-shake' | 'camera3d-sync';
103
108
  /**
@@ -1,4 +1,4 @@
1
- var qq=((Q)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(Q,{get:(j,R)=>(typeof require<"u"?require:j)[R]}):Q)(function(Q){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+Q+'" is not supported')});import{definePlugin as e}from"ecspresso";var N={smoothing:5,offsetX:0,offsetY:0,offsetZ:0},H={traumaDecay:1,maxOffsetX:0.3,maxOffsetY:0.3,maxOffsetZ:0.3},E=Math.PI/2,L=0.001,K={x:0,y:0,z:0};function M(Q,j,R){return Math.max(j,Math.min(R,Q))}function a(Q){if(Q===!0)return{...H};return{traumaDecay:Q.traumaDecay??H.traumaDecay,maxOffsetX:Q.maxOffsetX??H.maxOffsetX,maxOffsetY:Q.maxOffsetY??H.maxOffsetY,maxOffsetZ:Q.maxOffsetZ??H.maxOffsetZ}}function f(Q,j,R,W){let z=Math.cos(j);W.x=R*z*Math.sin(Q),W.y=R*Math.sin(j),W.z=R*z*Math.cos(Q)}function Qq(Q){let{systemGroup:j="camera3d",phase:R="postUpdate",azimuth:W=0,elevation:z=0.5,distance:C=10,target:S,minDistance:k=1,maxDistance:x=100,minElevation:U=-E+L,maxElevation:u=E-L,orbitSensitivity:T=0.003,dollySensitivity:p=1.1,enableOrbit:D=!0,follow:G,shake:_,randomFn:w=Math.random}=Q??{},g=Q?.projection??"perspective",h=Q?.projection!=="orthographic"?Q?.fov??75:75,m=Q?.projection==="orthographic"?Q.zoom??1:1,y=_?a(_):H,l=y.traumaDecay,d=y.maxOffsetX,c=y.maxOffsetY,n=y.maxOffsetZ,i={targetX:S?.x??0,targetY:S?.y??0,targetZ:S?.z??0,azimuth:W,elevation:M(z,U,u),distance:M(C,k,x),followTarget:-1,followSmoothing:G?.smoothing??N.smoothing,followOffsetX:G?.offsetX??N.offsetX,followOffsetY:G?.offsetY??N.offsetY,followOffsetZ:G?.offsetZ??N.offsetZ,trauma:0,shakeOffsetX:0,shakeOffsetY:0,shakeOffsetZ:0},r={follow($,B){let I=typeof $==="number"?$:$.id;this.followTarget=I,this.followSmoothing=B?.smoothing??G?.smoothing??N.smoothing,this.followOffsetX=B?.offsetX??G?.offsetX??N.offsetX,this.followOffsetY=B?.offsetY??G?.offsetY??N.offsetY,this.followOffsetZ=B?.offsetZ??G?.offsetZ??N.offsetZ},unfollow(){this.followTarget=-1},setTarget($,B,I){this.targetX=$,this.targetY=B,this.targetZ=I},setOrbit($,B,I){this.azimuth=$,this.elevation=M(B,U,u),this.distance=M(I,k,x)},setDistance($){this.distance=M($,k,x)},addTrauma($){this.trauma=M(this.trauma+$,0,1)}};return e("camera3d").withResourceTypes().withLabels().withGroups().requires().install(($)=>{let B={active:!1,prevX:0,prevY:0,pendingDolly:0,el:null},q={...i,...r,...g==="orthographic"?{projection:"orthographic",zoom:m,setZoom(J){this.zoom=J}}:{projection:"perspective",fov:h,setFov(J){this.fov=J}}};$.addResource("camera3DState",q);function v(J){B.active=!0,B.prevX=J.clientX,B.prevY=J.clientY,B.el?.setPointerCapture(J.pointerId)}function P(J){if(!B.active)return;let Z=J.clientX-B.prevX,b=J.clientY-B.prevY;B.prevX=J.clientX,B.prevY=J.clientY,q.azimuth-=Z*T,q.elevation=M(q.elevation+b*T,U,u)}function F(J){B.active=!1,B.el?.releasePointerCapture(J.pointerId)}function O(J){J.preventDefault(),B.pendingDolly+=Math.sign(J.deltaY)}let V=null,X=null,Y=null;$.addSystem("camera3d-init").inGroup(j).setOnInitialize((J)=>{let Z=J.getResource("threeRenderer");if(V=J.getResource("camera"),V.isPerspectiveCamera)X=V;else if(V.isOrthographicCamera)Y=V;if(q.projection==="perspective"&&!X)throw Error("createCamera3DPlugin: configured as 'perspective' but the renderer's camera is not a PerspectiveCamera.");if(q.projection==="orthographic"&&!Y)throw Error("createCamera3DPlugin: configured as 'orthographic' but the renderer's camera is not an OrthographicCamera.");if(q.projection==="perspective"&&X)q.fov=X.fov;else if(q.projection==="orthographic"&&Y)q.zoom=Y.zoom;if(B.el=Z.domElement,D)B.el.addEventListener("pointerdown",v),B.el.addEventListener("pointermove",P),B.el.addEventListener("pointerup",F);B.el.addEventListener("wheel",O,{passive:!1}),f(q.azimuth,q.elevation,q.distance,K),V.position.set(q.targetX+K.x,q.targetY+K.y,q.targetZ+K.z),V.lookAt(q.targetX,q.targetY,q.targetZ)}).setOnDetach(()=>{if(!B.el)return;if(D)B.el.removeEventListener("pointerdown",v),B.el.removeEventListener("pointermove",P),B.el.removeEventListener("pointerup",F);B.el.removeEventListener("wheel",O),B.el=null,V=null,X=null,Y=null}),$.addSystem("camera3d-follow").setPriority(400).inPhase(R).inGroup(j).setProcess(({ecs:J,dt:Z})=>{if(q.followTarget<0)return;if(!J.getEntity(q.followTarget)){q.followTarget=-1;return}let b=J.getComponent(q.followTarget,"worldTransform3D");if(!b)return;let o=b.x+q.followOffsetX,s=b.y+q.followOffsetY,t=b.z+q.followOffsetZ,A=Math.min(1,q.followSmoothing*Z);q.targetX+=(o-q.targetX)*A,q.targetY+=(s-q.targetY)*A,q.targetZ+=(t-q.targetZ)*A}),$.addSystem("camera3d-shake").setPriority(390).inPhase(R).inGroup(j).setProcess(({dt:J})=>{if(q.trauma<=0){q.shakeOffsetX=0,q.shakeOffsetY=0,q.shakeOffsetZ=0;return}q.trauma=Math.max(0,q.trauma-l*J);let Z=q.trauma*q.trauma;q.shakeOffsetX=d*Z*(w()*2-1),q.shakeOffsetY=c*Z*(w()*2-1),q.shakeOffsetZ=n*Z*(w()*2-1)}),$.addSystem("camera3d-sync").setPriority(380).inPhase(R).inGroup(j).setProcess(()=>{if(!V)return;if(B.pendingDolly!==0)q.distance=M(q.distance*Math.pow(p,B.pendingDolly),k,x),B.pendingDolly=0;if(f(q.azimuth,q.elevation,q.distance,K),V.position.set(q.targetX+K.x+q.shakeOffsetX,q.targetY+K.y+q.shakeOffsetY,q.targetZ+K.z+q.shakeOffsetZ),V.lookAt(q.targetX+q.shakeOffsetX,q.targetY+q.shakeOffsetY,q.targetZ+q.shakeOffsetZ),q.projection==="perspective"&&X&&X.fov!==q.fov)X.fov=q.fov,X.updateProjectionMatrix();else if(q.projection==="orthographic"&&Y&&Y.zoom!==q.zoom)Y.zoom=q.zoom,Y.updateProjectionMatrix()})})}export{f as sphericalToCartesian,Qq as createCamera3DPlugin};
1
+ var bq=((J)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(J,{get:($,Y)=>(typeof require<"u"?require:$)[Y]}):J)(function(J){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+J+'" is not supported')});import{definePlugin as Qq}from"ecspresso";var b={smoothing:5,offsetX:0,offsetY:0,offsetZ:0},z={traumaDecay:1,maxOffsetX:0.3,maxOffsetY:0.3,maxOffsetZ:0.3},p=Math.PI/2,h=0.001,$q=1,Rq=179,Yq=0.1,jq=10,H={x:0,y:0,z:0};function G(J,$,Y){return Math.max($,Math.min(Y,J))}function Gq(J,$){return J==="auto"?$==="orthographic"?"zoom":"distance":J}function Vq(J,$){J.setDistance(J.distance*$)}function Xq(J,$){if(J.projection==="orthographic"){J.setZoom(J.zoom/$);return}J.setFov(G(J.fov*$,$q,Rq))}var Kq={distance:Vq,zoom:Xq,disabled:()=>{}};function Nq(J){if(J===!0)return{...z};return{traumaDecay:J.traumaDecay??z.traumaDecay,maxOffsetX:J.maxOffsetX??z.maxOffsetX,maxOffsetY:J.maxOffsetY??z.maxOffsetY,maxOffsetZ:J.maxOffsetZ??z.maxOffsetZ}}function m(J,$,Y,k){let x=Math.cos($);k.x=Y*x*Math.sin(J),k.y=Y*Math.sin($),k.z=Y*x*Math.cos(J)}function Zq(J){let{systemGroup:$="camera3d",phase:Y="postUpdate",azimuth:k=0,elevation:x=0.5,distance:l=10,target:W,minDistance:M=1,maxDistance:U=100,minElevation:u=-p+h,maxElevation:D=p-h,orbitSensitivity:v=0.003,dollySensitivity:d=1.1,wheelMode:n="auto",enableOrbit:_=!0,follow:N,shake:w,randomFn:T=Math.random}=J??{},E=J?.projection??"perspective",c=J?.projection!=="orthographic"?J?.fov??75:75,y=J?.projection==="orthographic"?J:void 0,L=y?.minZoom??Yq,f=y?.maxZoom??jq,i=y?G(y.zoom??1,L,f):1,P=Gq(n,E),S=w?Nq(w):z,r=S.traumaDecay,s=S.maxOffsetX,o=S.maxOffsetY,t=S.maxOffsetZ,a={targetX:W?.x??0,targetY:W?.y??0,targetZ:W?.z??0,azimuth:k,elevation:G(x,u,D),distance:G(l,M,U),followTarget:-1,followSmoothing:N?.smoothing??b.smoothing,followOffsetX:N?.offsetX??b.offsetX,followOffsetY:N?.offsetY??b.offsetY,followOffsetZ:N?.offsetZ??b.offsetZ,trauma:0,shakeOffsetX:0,shakeOffsetY:0,shakeOffsetZ:0},e={follow(R,B){let I=typeof R==="number"?R:R.id;this.followTarget=I,this.followSmoothing=B?.smoothing??N?.smoothing??b.smoothing,this.followOffsetX=B?.offsetX??N?.offsetX??b.offsetX,this.followOffsetY=B?.offsetY??N?.offsetY??b.offsetY,this.followOffsetZ=B?.offsetZ??N?.offsetZ??b.offsetZ},unfollow(){this.followTarget=-1},setTarget(R,B,I){this.targetX=R,this.targetY=B,this.targetZ=I},setOrbit(R,B,I){this.azimuth=R,this.elevation=G(B,u,D),this.distance=G(I,M,U)},setDistance(R){this.distance=G(R,M,U)},addTrauma(R){this.trauma=G(this.trauma+R,0,1)}};return Qq("camera3d").withResourceTypes().withLabels().withGroups().requires().install((R)=>{let B={active:!1,prevX:0,prevY:0,pendingWheel:0,el:null},q={...a,...e,...E==="orthographic"?{projection:"orthographic",zoom:i,setZoom(Q){this.zoom=G(Q,L,f)}}:{projection:"perspective",fov:c,setFov(Q){this.fov=Q}}};R.addResource("camera3DState",q);function F(Q){B.active=!0,B.prevX=Q.clientX,B.prevY=Q.clientY,B.el?.setPointerCapture(Q.pointerId)}function C(Q){if(!B.active)return;let K=Q.clientX-B.prevX,Z=Q.clientY-B.prevY;B.prevX=Q.clientX,B.prevY=Q.clientY,q.azimuth-=K*v,q.elevation=G(q.elevation+Z*v,u,D)}function O(Q){B.active=!1,B.el?.releasePointerCapture(Q.pointerId)}function g(Q){Q.preventDefault(),B.pendingWheel+=Math.sign(Q.deltaY)}let j=null,V=null,X=null;R.addSystem("camera3d-init").inGroup($).setOnInitialize((Q)=>{let K=Q.getResource("threeRenderer");if(j=Q.getResource("camera"),j.isPerspectiveCamera)V=j;else if(j.isOrthographicCamera)X=j;if(q.projection==="perspective"&&!V)throw Error("createCamera3DPlugin: configured as 'perspective' but the renderer's camera is not a PerspectiveCamera.");if(q.projection==="orthographic"&&!X)throw Error("createCamera3DPlugin: configured as 'orthographic' but the renderer's camera is not an OrthographicCamera.");if(q.projection==="perspective"&&V)q.fov=V.fov;else if(q.projection==="orthographic"&&X)q.setZoom(X.zoom);if(B.el=K.domElement,_)B.el.addEventListener("pointerdown",F),B.el.addEventListener("pointermove",C),B.el.addEventListener("pointerup",O);if(P!=="disabled")B.el.addEventListener("wheel",g,{passive:!1});m(q.azimuth,q.elevation,q.distance,H),j.position.set(q.targetX+H.x,q.targetY+H.y,q.targetZ+H.z),j.lookAt(q.targetX,q.targetY,q.targetZ)}).setOnDetach(()=>{if(!B.el)return;if(_)B.el.removeEventListener("pointerdown",F),B.el.removeEventListener("pointermove",C),B.el.removeEventListener("pointerup",O);if(P!=="disabled")B.el.removeEventListener("wheel",g);B.el=null,j=null,V=null,X=null}),R.addSystem("camera3d-follow").setPriority(400).inPhase(Y).inGroup($).setProcess(({ecs:Q,dt:K})=>{if(q.followTarget<0)return;if(!Q.getEntity(q.followTarget)){q.followTarget=-1;return}let Z=Q.getComponent(q.followTarget,"worldTransform3D");if(!Z)return;let qq=Z.x+q.followOffsetX,Bq=Z.y+q.followOffsetY,Jq=Z.z+q.followOffsetZ,A=Math.min(1,q.followSmoothing*K);q.targetX+=(qq-q.targetX)*A,q.targetY+=(Bq-q.targetY)*A,q.targetZ+=(Jq-q.targetZ)*A}),R.addSystem("camera3d-shake").setPriority(390).inPhase(Y).inGroup($).setProcess(({dt:Q})=>{if(q.trauma<=0){q.shakeOffsetX=0,q.shakeOffsetY=0,q.shakeOffsetZ=0;return}q.trauma=Math.max(0,q.trauma-r*Q);let K=q.trauma*q.trauma;q.shakeOffsetX=s*K*(T()*2-1),q.shakeOffsetY=o*K*(T()*2-1),q.shakeOffsetZ=t*K*(T()*2-1)}),R.addSystem("camera3d-sync").setPriority(380).inPhase(Y).inGroup($).setProcess(()=>{if(!j)return;if(B.pendingWheel!==0){let Q=Math.pow(d,B.pendingWheel);Kq[P](q,Q),B.pendingWheel=0}if(m(q.azimuth,q.elevation,q.distance,H),j.position.set(q.targetX+H.x+q.shakeOffsetX,q.targetY+H.y+q.shakeOffsetY,q.targetZ+H.z+q.shakeOffsetZ),j.lookAt(q.targetX+q.shakeOffsetX,q.targetY+q.shakeOffsetY,q.targetZ+q.shakeOffsetZ),q.projection==="perspective"&&V&&V.fov!==q.fov)V.fov=q.fov,V.updateProjectionMatrix();else if(q.projection==="orthographic"&&X&&X.zoom!==q.zoom)X.zoom=q.zoom,X.updateProjectionMatrix()})})}export{m as sphericalToCartesian,Zq as createCamera3DPlugin};
2
2
 
3
- //# debugId=E7D2111F51674CD764756E2164756E21
3
+ //# debugId=C47E3BD9B6CC20E664756E2164756E21
4
4
  //# sourceMappingURL=camera3D.js.map
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/plugins/spatial/camera3D.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Camera 3D Plugin for ECSpresso\n *\n * Orbit/follow/shake camera controls for a Three.js PerspectiveCamera or\n * OrthographicCamera managed by renderer3D. Purely resource-based (no camera\n * entity). The renderer3D `camera` resource is the single camera target.\n * Orbit via pointer drag + scroll wheel, follow via entity tracking, shake\n * via trauma-based offsets.\n *\n * The plugin's `projection` option must match the underlying camera's kind;\n * a mismatch throws at init. State is a discriminated union — perspective\n * cameras expose `fov` / `setFov`, orthographic cameras expose `zoom` / `setZoom`.\n *\n * Import from 'ecspresso/plugins/spatial/camera3D'\n */\n\nimport { definePlugin } from 'ecspresso';\nimport type { SystemPhase } from 'ecspresso';\nimport type { ComponentsConfig, ResourcesConfig } from '../../type-utils';\nimport type { Transform3DComponentTypes } from './transform3D';\nimport type { Renderer3DResourceTypes } from '../rendering/renderer3D';\nimport type { OrthographicCamera, PerspectiveCamera } from 'three';\n\n// ==================== Dependency Types ====================\n\ntype Camera3DRequiredConfig =\n\tComponentsConfig<Transform3DComponentTypes>\n\t& ResourcesConfig<Renderer3DResourceTypes>;\n\n// ==================== Resource Types ====================\n\nexport interface Camera3DFollowOptions {\n\tsmoothing?: number;\n\toffsetX?: number;\n\toffsetY?: number;\n\toffsetZ?: number;\n}\n\nexport interface Camera3DShakeOptions {\n\ttraumaDecay?: number;\n\tmaxOffsetX?: number;\n\tmaxOffsetY?: number;\n\tmaxOffsetZ?: number;\n}\n\nexport interface Camera3DBaseState {\n\t// Orbit / spherical state\n\ttargetX: number;\n\ttargetY: number;\n\ttargetZ: number;\n\tazimuth: number;\n\televation: number;\n\tdistance: number;\n\n\t// Follow\n\tfollowTarget: number;\n\tfollowSmoothing: number;\n\tfollowOffsetX: number;\n\tfollowOffsetY: number;\n\tfollowOffsetZ: number;\n\n\t// Shake (read by sync, written by shake system)\n\ttrauma: number;\n\tshakeOffsetX: number;\n\tshakeOffsetY: number;\n\tshakeOffsetZ: number;\n\n\t// Mutation methods\n\tfollow(target: number | { id: number }, options?: Camera3DFollowOptions): void;\n\tunfollow(): void;\n\tsetTarget(x: number, y: number, z: number): void;\n\tsetOrbit(azimuth: number, elevation: number, distance: number): void;\n\tsetDistance(distance: number): void;\n\taddTrauma(amount: number): void;\n}\n\nexport interface PerspectiveCamera3DState extends Camera3DBaseState {\n\tprojection: 'perspective';\n\tfov: number;\n\tsetFov(fov: number): void;\n}\n\nexport interface OrthographicCamera3DState extends Camera3DBaseState {\n\tprojection: 'orthographic';\n\tzoom: number;\n\tsetZoom(zoom: number): void;\n}\n\nexport type Camera3DState = PerspectiveCamera3DState | OrthographicCamera3DState;\n\nexport interface Camera3DResourceTypes {\n\tcamera3DState: Camera3DState;\n}\n\nexport type Camera3DWorldConfig = ResourcesConfig<Camera3DResourceTypes>;\n\n// ==================== Plugin Options ====================\n\nexport interface Camera3DBasePluginOptions<G extends string = 'camera3d'> {\n\tsystemGroup?: G;\n\tphase?: SystemPhase;\n\n\t// Initial orbit state\n\tazimuth?: number;\n\televation?: number;\n\tdistance?: number;\n\ttarget?: { x: number; y: number; z: number };\n\n\t// Orbit constraints\n\tminDistance?: number;\n\tmaxDistance?: number;\n\tminElevation?: number;\n\tmaxElevation?: number;\n\n\t// Sensitivity\n\torbitSensitivity?: number;\n\tdollySensitivity?: number;\n\n\t// Disable pointer-drag orbit (zoom/dolly via wheel is unaffected)\n\tenableOrbit?: boolean;\n\n\t// Follow\n\tfollow?: Camera3DFollowOptions;\n\n\t// Shake\n\tshake?: boolean | Partial<Camera3DShakeOptions>;\n\n\t// Injectable RNG for deterministic shake\n\trandomFn?: () => number;\n}\n\nexport type Camera3DPluginOptions<G extends string = 'camera3d'> =\n\tCamera3DBasePluginOptions<G> & (\n\t\t| { projection?: 'perspective'; fov?: number }\n\t\t| { projection: 'orthographic'; zoom?: number }\n\t);\n\n// ==================== Labels ====================\n\nexport type Camera3DLabels =\n\t| 'camera3d-init'\n\t| 'camera3d-follow'\n\t| 'camera3d-shake'\n\t| 'camera3d-sync';\n\n// ==================== Constants ====================\n\nconst DEFAULT_FOLLOW: Readonly<Required<Camera3DFollowOptions>> = {\n\tsmoothing: 5,\n\toffsetX: 0,\n\toffsetY: 0,\n\toffsetZ: 0,\n};\n\nconst DEFAULT_SHAKE: Readonly<Required<Camera3DShakeOptions>> = {\n\ttraumaDecay: 1,\n\tmaxOffsetX: 0.3,\n\tmaxOffsetY: 0.3,\n\tmaxOffsetZ: 0.3,\n};\n\nconst HALF_PI = Math.PI / 2;\nconst ELEVATION_EPSILON = 0.001;\n\n// ==================== Scratch Objects ====================\n\nconst _camPos = { x: 0, y: 0, z: 0 };\n\n// ==================== Helpers ====================\n\nfunction clamp(value: number, min: number, max: number): number {\n\treturn Math.max(min, Math.min(max, value));\n}\n\nfunction resolveShakeOptions(config: true | Partial<Camera3DShakeOptions>): Required<Camera3DShakeOptions> {\n\tif (config === true) return { ...DEFAULT_SHAKE };\n\treturn {\n\t\ttraumaDecay: config.traumaDecay ?? DEFAULT_SHAKE.traumaDecay,\n\t\tmaxOffsetX: config.maxOffsetX ?? DEFAULT_SHAKE.maxOffsetX,\n\t\tmaxOffsetY: config.maxOffsetY ?? DEFAULT_SHAKE.maxOffsetY,\n\t\tmaxOffsetZ: config.maxOffsetZ ?? DEFAULT_SHAKE.maxOffsetZ,\n\t};\n}\n\n/**\n * Convert spherical coordinates to cartesian. Y-up convention (Three.js default).\n * Azimuth rotates in the XZ plane; elevation goes from XZ plane toward +Y.\n */\nexport function sphericalToCartesian(\n\tazimuth: number,\n\televation: number,\n\tdistance: number,\n\tout: { x: number; y: number; z: number },\n): void {\n\tconst cosElev = Math.cos(elevation);\n\tout.x = distance * cosElev * Math.sin(azimuth);\n\tout.y = distance * Math.sin(elevation);\n\tout.z = distance * cosElev * Math.cos(azimuth);\n}\n\n// ==================== Plugin Factory ====================\n\nexport function createCamera3DPlugin<G extends string = 'camera3d'>(\n\toptions?: Camera3DPluginOptions<G>,\n) {\n\tconst {\n\t\tsystemGroup = 'camera3d',\n\t\tphase = 'postUpdate',\n\t\tazimuth: initialAzimuth = 0,\n\t\televation: initialElevation = 0.5,\n\t\tdistance: initialDistance = 10,\n\t\ttarget: initialTarget,\n\t\tminDistance = 1,\n\t\tmaxDistance = 100,\n\t\tminElevation = -HALF_PI + ELEVATION_EPSILON,\n\t\tmaxElevation = HALF_PI - ELEVATION_EPSILON,\n\t\torbitSensitivity = 0.003,\n\t\tdollySensitivity = 1.1,\n\t\tenableOrbit = true,\n\t\tfollow: followConfig,\n\t\tshake: shakeConfig,\n\t\trandomFn = Math.random,\n\t} = options ?? {};\n\n\tconst projection: 'perspective' | 'orthographic' = options?.projection ?? 'perspective';\n\tconst initialFov = options?.projection !== 'orthographic' ? (options?.fov ?? 75) : 75;\n\tconst initialZoom = options?.projection === 'orthographic' ? (options.zoom ?? 1) : 1;\n\n\tconst resolvedShake = shakeConfig ? resolveShakeOptions(shakeConfig) : DEFAULT_SHAKE;\n\tconst shakeDecay = resolvedShake.traumaDecay;\n\tconst shakeMaxX = resolvedShake.maxOffsetX;\n\tconst shakeMaxY = resolvedShake.maxOffsetY;\n\tconst shakeMaxZ = resolvedShake.maxOffsetZ;\n\n\t// Base fields + mutators shared between variants. Mutators use an explicit `this`\n\t// parameter so they type-check against `Camera3DBaseState` regardless of variant.\n\tconst baseFields = {\n\t\ttargetX: initialTarget?.x ?? 0,\n\t\ttargetY: initialTarget?.y ?? 0,\n\t\ttargetZ: initialTarget?.z ?? 0,\n\t\tazimuth: initialAzimuth,\n\t\televation: clamp(initialElevation, minElevation, maxElevation),\n\t\tdistance: clamp(initialDistance, minDistance, maxDistance),\n\n\t\tfollowTarget: -1,\n\t\tfollowSmoothing: followConfig?.smoothing ?? DEFAULT_FOLLOW.smoothing,\n\t\tfollowOffsetX: followConfig?.offsetX ?? DEFAULT_FOLLOW.offsetX,\n\t\tfollowOffsetY: followConfig?.offsetY ?? DEFAULT_FOLLOW.offsetY,\n\t\tfollowOffsetZ: followConfig?.offsetZ ?? DEFAULT_FOLLOW.offsetZ,\n\n\t\ttrauma: 0,\n\t\tshakeOffsetX: 0,\n\t\tshakeOffsetY: 0,\n\t\tshakeOffsetZ: 0,\n\t};\n\n\tconst baseMutators = {\n\t\tfollow(this: Camera3DBaseState, target: number | { id: number }, opts?: Camera3DFollowOptions) {\n\t\t\tconst targetId = typeof target === 'number' ? target : target.id;\n\t\t\tthis.followTarget = targetId;\n\t\t\tthis.followSmoothing = opts?.smoothing ?? followConfig?.smoothing ?? DEFAULT_FOLLOW.smoothing;\n\t\t\tthis.followOffsetX = opts?.offsetX ?? followConfig?.offsetX ?? DEFAULT_FOLLOW.offsetX;\n\t\t\tthis.followOffsetY = opts?.offsetY ?? followConfig?.offsetY ?? DEFAULT_FOLLOW.offsetY;\n\t\t\tthis.followOffsetZ = opts?.offsetZ ?? followConfig?.offsetZ ?? DEFAULT_FOLLOW.offsetZ;\n\t\t},\n\t\tunfollow(this: Camera3DBaseState) {\n\t\t\tthis.followTarget = -1;\n\t\t},\n\t\tsetTarget(this: Camera3DBaseState, x: number, y: number, z: number) {\n\t\t\tthis.targetX = x;\n\t\t\tthis.targetY = y;\n\t\t\tthis.targetZ = z;\n\t\t},\n\t\tsetOrbit(this: Camera3DBaseState, az: number, el: number, dist: number) {\n\t\t\tthis.azimuth = az;\n\t\t\tthis.elevation = clamp(el, minElevation, maxElevation);\n\t\t\tthis.distance = clamp(dist, minDistance, maxDistance);\n\t\t},\n\t\tsetDistance(this: Camera3DBaseState, d: number) {\n\t\t\tthis.distance = clamp(d, minDistance, maxDistance);\n\t\t},\n\t\taddTrauma(this: Camera3DBaseState, amount: number) {\n\t\t\tthis.trauma = clamp(this.trauma + amount, 0, 1);\n\t\t},\n\t};\n\n\treturn definePlugin('camera3d')\n\t\t.withResourceTypes<Camera3DResourceTypes>()\n\t\t.withLabels<Camera3DLabels>()\n\t\t.withGroups<G>()\n\t\t.requires<Camera3DRequiredConfig>()\n\t\t.install((world) => {\n\n\t\t\t// ==================== DOM State ====================\n\n\t\t\tconst drag = { active: false, prevX: 0, prevY: 0, pendingDolly: 0, el: null as HTMLElement | null };\n\n\t\t\t// ==================== Resource ====================\n\n\t\t\tconst variantFields = projection === 'orthographic'\n\t\t\t\t? {\n\t\t\t\t\tprojection: 'orthographic' as const,\n\t\t\t\t\tzoom: initialZoom,\n\t\t\t\t\tsetZoom(this: OrthographicCamera3DState, z: number) { this.zoom = z; },\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\tprojection: 'perspective' as const,\n\t\t\t\t\tfov: initialFov,\n\t\t\t\t\tsetFov(this: PerspectiveCamera3DState, f: number) { this.fov = f; },\n\t\t\t\t};\n\n\t\t\tconst state: Camera3DState = {\n\t\t\t\t...baseFields,\n\t\t\t\t...baseMutators,\n\t\t\t\t...variantFields,\n\t\t\t};\n\n\t\t\tworld.addResource('camera3DState', state);\n\n\t\t\t// ==================== DOM Handlers ====================\n\n\t\t\tfunction onPointerDown(e: PointerEvent) {\n\t\t\t\tdrag.active = true;\n\t\t\t\tdrag.prevX = e.clientX;\n\t\t\t\tdrag.prevY = e.clientY;\n\t\t\t\tdrag.el?.setPointerCapture(e.pointerId);\n\t\t\t}\n\n\t\t\tfunction onPointerMove(e: PointerEvent) {\n\t\t\t\tif (!drag.active) return;\n\t\t\t\tconst deltaX = e.clientX - drag.prevX;\n\t\t\t\tconst deltaY = e.clientY - drag.prevY;\n\t\t\t\tdrag.prevX = e.clientX;\n\t\t\t\tdrag.prevY = e.clientY;\n\n\t\t\t\tstate.azimuth -= deltaX * orbitSensitivity;\n\t\t\t\tstate.elevation = clamp(\n\t\t\t\t\tstate.elevation + deltaY * orbitSensitivity,\n\t\t\t\t\tminElevation,\n\t\t\t\t\tmaxElevation,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfunction onPointerUp(e: PointerEvent) {\n\t\t\t\tdrag.active = false;\n\t\t\t\tdrag.el?.releasePointerCapture(e.pointerId);\n\t\t\t}\n\n\t\t\tfunction onWheel(e: WheelEvent) {\n\t\t\t\te.preventDefault();\n\t\t\t\tdrag.pendingDolly += Math.sign(e.deltaY);\n\t\t\t}\n\n\t\t\t// ==================== Init System ====================\n\n\t\t\t// Camera ref cached once at init — never changes at runtime\n\t\t\tlet cachedCamera: Renderer3DResourceTypes['camera'] | null = null;\n\t\t\tlet cachedPerspCamera: PerspectiveCamera | null = null;\n\t\t\tlet cachedOrthoCamera: OrthographicCamera | null = null;\n\n\t\t\tworld\n\t\t\t\t.addSystem('camera3d-init')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize((ecs) => {\n\t\t\t\t\tconst threeRenderer = ecs.getResource('threeRenderer');\n\t\t\t\t\tcachedCamera = ecs.getResource('camera');\n\n\t\t\t\t\t// Narrow to the concrete camera variant once\n\t\t\t\t\tif ((cachedCamera as PerspectiveCamera).isPerspectiveCamera) {\n\t\t\t\t\t\tcachedPerspCamera = cachedCamera as PerspectiveCamera;\n\t\t\t\t\t} else if ((cachedCamera as OrthographicCamera).isOrthographicCamera) {\n\t\t\t\t\t\tcachedOrthoCamera = cachedCamera as OrthographicCamera;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Guard: plugin `projection` option must match the resolved camera kind\n\t\t\t\t\tif (state.projection === 'perspective' && !cachedPerspCamera) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t'createCamera3DPlugin: configured as \\'perspective\\' but the renderer\\'s camera is not a PerspectiveCamera.',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (state.projection === 'orthographic' && !cachedOrthoCamera) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t'createCamera3DPlugin: configured as \\'orthographic\\' but the renderer\\'s camera is not an OrthographicCamera.',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Sync initial variant-specific value from the actual camera\n\t\t\t\t\tif (state.projection === 'perspective' && cachedPerspCamera) {\n\t\t\t\t\t\tstate.fov = cachedPerspCamera.fov;\n\t\t\t\t\t} else if (state.projection === 'orthographic' && cachedOrthoCamera) {\n\t\t\t\t\t\tstate.zoom = cachedOrthoCamera.zoom;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Attach DOM listeners\n\t\t\t\t\tdrag.el = threeRenderer.domElement;\n\t\t\t\t\tif (enableOrbit) {\n\t\t\t\t\t\tdrag.el.addEventListener('pointerdown', onPointerDown);\n\t\t\t\t\t\tdrag.el.addEventListener('pointermove', onPointerMove);\n\t\t\t\t\t\tdrag.el.addEventListener('pointerup', onPointerUp);\n\t\t\t\t\t}\n\t\t\t\t\tdrag.el.addEventListener('wheel', onWheel as EventListener, { passive: false });\n\n\t\t\t\t\t// Initial camera position sync\n\t\t\t\t\tsphericalToCartesian(state.azimuth, state.elevation, state.distance, _camPos);\n\t\t\t\t\tcachedCamera.position.set(\n\t\t\t\t\t\tstate.targetX + _camPos.x,\n\t\t\t\t\t\tstate.targetY + _camPos.y,\n\t\t\t\t\t\tstate.targetZ + _camPos.z,\n\t\t\t\t\t);\n\t\t\t\t\tcachedCamera.lookAt(state.targetX, state.targetY, state.targetZ);\n\t\t\t\t})\n\t\t\t\t.setOnDetach(() => {\n\t\t\t\t\tif (!drag.el) return;\n\t\t\t\t\tif (enableOrbit) {\n\t\t\t\t\t\tdrag.el.removeEventListener('pointerdown', onPointerDown);\n\t\t\t\t\t\tdrag.el.removeEventListener('pointermove', onPointerMove);\n\t\t\t\t\t\tdrag.el.removeEventListener('pointerup', onPointerUp);\n\t\t\t\t\t}\n\t\t\t\t\tdrag.el.removeEventListener('wheel', onWheel as EventListener);\n\t\t\t\t\tdrag.el = null;\n\t\t\t\t\tcachedCamera = null;\n\t\t\t\t\tcachedPerspCamera = null;\n\t\t\t\t\tcachedOrthoCamera = null;\n\t\t\t\t});\n\n\t\t\t// ==================== Follow System ====================\n\n\t\t\tworld\n\t\t\t\t.addSystem('camera3d-follow')\n\t\t\t\t.setPriority(400)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setProcess(({ ecs, dt }) => {\n\t\t\t\t\tif (state.followTarget < 0) return;\n\n\t\t\t\t\tif (!ecs.getEntity(state.followTarget)) {\n\t\t\t\t\t\tstate.followTarget = -1;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst worldTransform = ecs.getComponent(state.followTarget, 'worldTransform3D');\n\t\t\t\t\tif (!worldTransform) return;\n\n\t\t\t\t\tconst goalX = worldTransform.x + state.followOffsetX;\n\t\t\t\t\tconst goalY = worldTransform.y + state.followOffsetY;\n\t\t\t\t\tconst goalZ = worldTransform.z + state.followOffsetZ;\n\n\t\t\t\t\tconst factor = Math.min(1, state.followSmoothing * dt);\n\t\t\t\t\tstate.targetX += (goalX - state.targetX) * factor;\n\t\t\t\t\tstate.targetY += (goalY - state.targetY) * factor;\n\t\t\t\t\tstate.targetZ += (goalZ - state.targetZ) * factor;\n\t\t\t\t});\n\n\t\t\t// ==================== Shake System ====================\n\n\t\t\tworld\n\t\t\t\t.addSystem('camera3d-shake')\n\t\t\t\t.setPriority(390)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setProcess(({ dt }) => {\n\t\t\t\t\tif (state.trauma <= 0) {\n\t\t\t\t\t\tstate.shakeOffsetX = 0;\n\t\t\t\t\t\tstate.shakeOffsetY = 0;\n\t\t\t\t\t\tstate.shakeOffsetZ = 0;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.trauma = Math.max(0, state.trauma - shakeDecay * dt);\n\n\t\t\t\t\tconst intensity = state.trauma * state.trauma;\n\t\t\t\t\tstate.shakeOffsetX = shakeMaxX * intensity * (randomFn() * 2 - 1);\n\t\t\t\t\tstate.shakeOffsetY = shakeMaxY * intensity * (randomFn() * 2 - 1);\n\t\t\t\t\tstate.shakeOffsetZ = shakeMaxZ * intensity * (randomFn() * 2 - 1);\n\t\t\t\t});\n\n\t\t\t// ==================== Sync System ====================\n\n\t\t\tworld\n\t\t\t\t.addSystem('camera3d-sync')\n\t\t\t\t.setPriority(380)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setProcess(() => {\n\t\t\t\t\tif (!cachedCamera) return;\n\n\t\t\t\t\t// Process pending dolly\n\t\t\t\t\tif (drag.pendingDolly !== 0) {\n\t\t\t\t\t\tstate.distance = clamp(\n\t\t\t\t\t\t\tstate.distance * Math.pow(dollySensitivity, drag.pendingDolly),\n\t\t\t\t\t\t\tminDistance,\n\t\t\t\t\t\t\tmaxDistance,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdrag.pendingDolly = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Compute camera position from spherical coords. Shake is applied as a\n\t\t\t\t\t// pure view translation — both position and lookAt target shift by the\n\t\t\t\t\t// same offset so the view pans instead of rotating. This keeps the effect\n\t\t\t\t\t// visible under orthographic projection (which has no parallax) and also\n\t\t\t\t\t// makes perspective shake magnitudes feel consistent regardless of distance.\n\t\t\t\t\tsphericalToCartesian(state.azimuth, state.elevation, state.distance, _camPos);\n\t\t\t\t\tcachedCamera.position.set(\n\t\t\t\t\t\tstate.targetX + _camPos.x + state.shakeOffsetX,\n\t\t\t\t\t\tstate.targetY + _camPos.y + state.shakeOffsetY,\n\t\t\t\t\t\tstate.targetZ + _camPos.z + state.shakeOffsetZ,\n\t\t\t\t\t);\n\t\t\t\t\tcachedCamera.lookAt(\n\t\t\t\t\t\tstate.targetX + state.shakeOffsetX,\n\t\t\t\t\t\tstate.targetY + state.shakeOffsetY,\n\t\t\t\t\t\tstate.targetZ + state.shakeOffsetZ,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (state.projection === 'perspective' && cachedPerspCamera && cachedPerspCamera.fov !== state.fov) {\n\t\t\t\t\t\tcachedPerspCamera.fov = state.fov;\n\t\t\t\t\t\tcachedPerspCamera.updateProjectionMatrix();\n\t\t\t\t\t} else if (state.projection === 'orthographic' && cachedOrthoCamera && cachedOrthoCamera.zoom !== state.zoom) {\n\t\t\t\t\t\tcachedOrthoCamera.zoom = state.zoom;\n\t\t\t\t\t\tcachedOrthoCamera.updateProjectionMatrix();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n}\n"
5
+ "/**\n * Camera 3D Plugin for ECSpresso\n *\n * Orbit/follow/shake camera controls for a Three.js PerspectiveCamera or\n * OrthographicCamera managed by renderer3D. Purely resource-based (no camera\n * entity). The renderer3D `camera` resource is the single camera target.\n * Orbit via pointer drag + scroll wheel, follow via entity tracking, shake\n * via trauma-based offsets.\n *\n * The plugin's `projection` option must match the underlying camera's kind;\n * a mismatch throws at init. State is a discriminated union — perspective\n * cameras expose `fov` / `setFov`, orthographic cameras expose `zoom` / `setZoom`\n * (clamped via `minZoom` / `maxZoom` plugin options, including wheel input).\n *\n * Import from 'ecspresso/plugins/spatial/camera3D'\n */\n\nimport { definePlugin } from 'ecspresso';\nimport type { SystemPhase } from 'ecspresso';\nimport type { ComponentsConfig, ResourcesConfig } from '../../type-utils';\nimport type { Transform3DComponentTypes } from './transform3D';\nimport type { Renderer3DResourceTypes } from '../rendering/renderer3D';\nimport type { OrthographicCamera, PerspectiveCamera } from 'three';\n\n// ==================== Dependency Types ====================\n\ntype Camera3DRequiredConfig =\n\tComponentsConfig<Transform3DComponentTypes>\n\t& ResourcesConfig<Renderer3DResourceTypes>;\n\n// ==================== Resource Types ====================\n\nexport interface Camera3DFollowOptions {\n\tsmoothing?: number;\n\toffsetX?: number;\n\toffsetY?: number;\n\toffsetZ?: number;\n}\n\nexport interface Camera3DShakeOptions {\n\ttraumaDecay?: number;\n\tmaxOffsetX?: number;\n\tmaxOffsetY?: number;\n\tmaxOffsetZ?: number;\n}\n\nexport interface Camera3DBaseState {\n\t// Orbit / spherical state\n\ttargetX: number;\n\ttargetY: number;\n\ttargetZ: number;\n\tazimuth: number;\n\televation: number;\n\tdistance: number;\n\n\t// Follow\n\tfollowTarget: number;\n\tfollowSmoothing: number;\n\tfollowOffsetX: number;\n\tfollowOffsetY: number;\n\tfollowOffsetZ: number;\n\n\t// Shake (read by sync, written by shake system)\n\ttrauma: number;\n\tshakeOffsetX: number;\n\tshakeOffsetY: number;\n\tshakeOffsetZ: number;\n\n\t// Mutation methods\n\tfollow(target: number | { id: number }, options?: Camera3DFollowOptions): void;\n\tunfollow(): void;\n\tsetTarget(x: number, y: number, z: number): void;\n\tsetOrbit(azimuth: number, elevation: number, distance: number): void;\n\tsetDistance(distance: number): void;\n\taddTrauma(amount: number): void;\n}\n\nexport interface PerspectiveCamera3DState extends Camera3DBaseState {\n\tprojection: 'perspective';\n\tfov: number;\n\tsetFov(fov: number): void;\n}\n\nexport interface OrthographicCamera3DState extends Camera3DBaseState {\n\tprojection: 'orthographic';\n\tzoom: number;\n\tsetZoom(zoom: number): void;\n}\n\nexport type Camera3DState = PerspectiveCamera3DState | OrthographicCamera3DState;\n\nexport interface Camera3DResourceTypes {\n\tcamera3DState: Camera3DState;\n}\n\nexport type Camera3DWorldConfig = ResourcesConfig<Camera3DResourceTypes>;\ntype Camera3DWheelMode = 'auto' | 'distance' | 'zoom' | 'disabled';\ntype ResolvedCamera3DWheelMode = Exclude<Camera3DWheelMode, 'auto'>;\n\n// ==================== Plugin Options ====================\n\nexport interface Camera3DBasePluginOptions<G extends string = 'camera3d'> {\n\tsystemGroup?: G;\n\tphase?: SystemPhase;\n\n\t// Initial orbit state\n\tazimuth?: number;\n\televation?: number;\n\tdistance?: number;\n\ttarget?: { x: number; y: number; z: number };\n\n\t// Orbit constraints\n\tminDistance?: number;\n\tmaxDistance?: number;\n\tminElevation?: number;\n\tmaxElevation?: number;\n\n\t// Sensitivity\n\torbitSensitivity?: number;\n\tdollySensitivity?: number;\n\twheelMode?: Camera3DWheelMode;\n\n\t// Disable pointer-drag orbit. Wheel input is controlled separately by wheelMode.\n\tenableOrbit?: boolean;\n\n\t// Follow\n\tfollow?: Camera3DFollowOptions;\n\n\t// Shake\n\tshake?: boolean | Partial<Camera3DShakeOptions>;\n\n\t// Injectable RNG for deterministic shake\n\trandomFn?: () => number;\n}\n\nexport type Camera3DPluginOptions<G extends string = 'camera3d'> =\n\tCamera3DBasePluginOptions<G> & (\n\t\t| { projection?: 'perspective'; fov?: number }\n\t\t| { projection: 'orthographic'; zoom?: number; minZoom?: number; maxZoom?: number }\n\t);\n\n// ==================== Labels ====================\n\nexport type Camera3DLabels =\n\t| 'camera3d-init'\n\t| 'camera3d-follow'\n\t| 'camera3d-shake'\n\t| 'camera3d-sync';\n\n// ==================== Constants ====================\n\nconst DEFAULT_FOLLOW: Readonly<Required<Camera3DFollowOptions>> = {\n\tsmoothing: 5,\n\toffsetX: 0,\n\toffsetY: 0,\n\toffsetZ: 0,\n};\n\nconst DEFAULT_SHAKE: Readonly<Required<Camera3DShakeOptions>> = {\n\ttraumaDecay: 1,\n\tmaxOffsetX: 0.3,\n\tmaxOffsetY: 0.3,\n\tmaxOffsetZ: 0.3,\n};\n\nconst HALF_PI = Math.PI / 2;\nconst ELEVATION_EPSILON = 0.001;\nconst MIN_FOV = 1;\nconst MAX_FOV = 179;\nconst DEFAULT_MIN_ZOOM = 0.1;\nconst DEFAULT_MAX_ZOOM = 10;\n\n// ==================== Scratch Objects ====================\n\nconst _camPos = { x: 0, y: 0, z: 0 };\n\n// ==================== Helpers ====================\n\nfunction clamp(value: number, min: number, max: number): number {\n\treturn Math.max(min, Math.min(max, value));\n}\n\nfunction resolveWheelMode(mode: Camera3DWheelMode, projection: 'perspective' | 'orthographic'): ResolvedCamera3DWheelMode {\n\treturn mode === 'auto' ? (projection === 'orthographic' ? 'zoom' : 'distance') : mode;\n}\n\nfunction applyDistanceWheel(state: Camera3DState, wheelFactor: number): void {\n\tstate.setDistance(state.distance * wheelFactor);\n}\n\nfunction applyZoomWheel(state: Camera3DState, wheelFactor: number): void {\n\tif (state.projection === 'orthographic') {\n\t\tstate.setZoom(state.zoom / wheelFactor);\n\t\treturn;\n\t}\n\tstate.setFov(clamp(state.fov * wheelFactor, MIN_FOV, MAX_FOV));\n}\n\nconst wheelHandlers = {\n\tdistance: applyDistanceWheel,\n\tzoom: applyZoomWheel,\n\tdisabled: () => {},\n} satisfies Record<ResolvedCamera3DWheelMode, (state: Camera3DState, wheelFactor: number) => void>;\n\nfunction resolveShakeOptions(config: true | Partial<Camera3DShakeOptions>): Required<Camera3DShakeOptions> {\n\tif (config === true) return { ...DEFAULT_SHAKE };\n\treturn {\n\t\ttraumaDecay: config.traumaDecay ?? DEFAULT_SHAKE.traumaDecay,\n\t\tmaxOffsetX: config.maxOffsetX ?? DEFAULT_SHAKE.maxOffsetX,\n\t\tmaxOffsetY: config.maxOffsetY ?? DEFAULT_SHAKE.maxOffsetY,\n\t\tmaxOffsetZ: config.maxOffsetZ ?? DEFAULT_SHAKE.maxOffsetZ,\n\t};\n}\n\n/**\n * Convert spherical coordinates to cartesian. Y-up convention (Three.js default).\n * Azimuth rotates in the XZ plane; elevation goes from XZ plane toward +Y.\n */\nexport function sphericalToCartesian(\n\tazimuth: number,\n\televation: number,\n\tdistance: number,\n\tout: { x: number; y: number; z: number },\n): void {\n\tconst cosElev = Math.cos(elevation);\n\tout.x = distance * cosElev * Math.sin(azimuth);\n\tout.y = distance * Math.sin(elevation);\n\tout.z = distance * cosElev * Math.cos(azimuth);\n}\n\n// ==================== Plugin Factory ====================\n\nexport function createCamera3DPlugin<G extends string = 'camera3d'>(\n\toptions?: Camera3DPluginOptions<G>,\n) {\n\tconst {\n\t\tsystemGroup = 'camera3d',\n\t\tphase = 'postUpdate',\n\t\tazimuth: initialAzimuth = 0,\n\t\televation: initialElevation = 0.5,\n\t\tdistance: initialDistance = 10,\n\t\ttarget: initialTarget,\n\t\tminDistance = 1,\n\t\tmaxDistance = 100,\n\t\tminElevation = -HALF_PI + ELEVATION_EPSILON,\n\t\tmaxElevation = HALF_PI - ELEVATION_EPSILON,\n\t\torbitSensitivity = 0.003,\n\t\tdollySensitivity = 1.1,\n\t\twheelMode = 'auto',\n\t\tenableOrbit = true,\n\t\tfollow: followConfig,\n\t\tshake: shakeConfig,\n\t\trandomFn = Math.random,\n\t} = options ?? {};\n\n\tconst projection: 'perspective' | 'orthographic' = options?.projection ?? 'perspective';\n\tconst initialFov = options?.projection !== 'orthographic' ? (options?.fov ?? 75) : 75;\n\tconst orthoOpts = options?.projection === 'orthographic' ? options : undefined;\n\tconst minZoom = orthoOpts?.minZoom ?? DEFAULT_MIN_ZOOM;\n\tconst maxZoom = orthoOpts?.maxZoom ?? DEFAULT_MAX_ZOOM;\n\tconst initialZoom = orthoOpts ? clamp(orthoOpts.zoom ?? 1, minZoom, maxZoom) : 1;\n\tconst resolvedWheelMode = resolveWheelMode(wheelMode, projection);\n\n\tconst resolvedShake = shakeConfig ? resolveShakeOptions(shakeConfig) : DEFAULT_SHAKE;\n\tconst shakeDecay = resolvedShake.traumaDecay;\n\tconst shakeMaxX = resolvedShake.maxOffsetX;\n\tconst shakeMaxY = resolvedShake.maxOffsetY;\n\tconst shakeMaxZ = resolvedShake.maxOffsetZ;\n\n\t// Base fields + mutators shared between variants. Mutators use an explicit `this`\n\t// parameter so they type-check against `Camera3DBaseState` regardless of variant.\n\tconst baseFields = {\n\t\ttargetX: initialTarget?.x ?? 0,\n\t\ttargetY: initialTarget?.y ?? 0,\n\t\ttargetZ: initialTarget?.z ?? 0,\n\t\tazimuth: initialAzimuth,\n\t\televation: clamp(initialElevation, minElevation, maxElevation),\n\t\tdistance: clamp(initialDistance, minDistance, maxDistance),\n\n\t\tfollowTarget: -1,\n\t\tfollowSmoothing: followConfig?.smoothing ?? DEFAULT_FOLLOW.smoothing,\n\t\tfollowOffsetX: followConfig?.offsetX ?? DEFAULT_FOLLOW.offsetX,\n\t\tfollowOffsetY: followConfig?.offsetY ?? DEFAULT_FOLLOW.offsetY,\n\t\tfollowOffsetZ: followConfig?.offsetZ ?? DEFAULT_FOLLOW.offsetZ,\n\n\t\ttrauma: 0,\n\t\tshakeOffsetX: 0,\n\t\tshakeOffsetY: 0,\n\t\tshakeOffsetZ: 0,\n\t};\n\n\tconst baseMutators = {\n\t\tfollow(this: Camera3DBaseState, target: number | { id: number }, opts?: Camera3DFollowOptions) {\n\t\t\tconst targetId = typeof target === 'number' ? target : target.id;\n\t\t\tthis.followTarget = targetId;\n\t\t\tthis.followSmoothing = opts?.smoothing ?? followConfig?.smoothing ?? DEFAULT_FOLLOW.smoothing;\n\t\t\tthis.followOffsetX = opts?.offsetX ?? followConfig?.offsetX ?? DEFAULT_FOLLOW.offsetX;\n\t\t\tthis.followOffsetY = opts?.offsetY ?? followConfig?.offsetY ?? DEFAULT_FOLLOW.offsetY;\n\t\t\tthis.followOffsetZ = opts?.offsetZ ?? followConfig?.offsetZ ?? DEFAULT_FOLLOW.offsetZ;\n\t\t},\n\t\tunfollow(this: Camera3DBaseState) {\n\t\t\tthis.followTarget = -1;\n\t\t},\n\t\tsetTarget(this: Camera3DBaseState, x: number, y: number, z: number) {\n\t\t\tthis.targetX = x;\n\t\t\tthis.targetY = y;\n\t\t\tthis.targetZ = z;\n\t\t},\n\t\tsetOrbit(this: Camera3DBaseState, az: number, el: number, dist: number) {\n\t\t\tthis.azimuth = az;\n\t\t\tthis.elevation = clamp(el, minElevation, maxElevation);\n\t\t\tthis.distance = clamp(dist, minDistance, maxDistance);\n\t\t},\n\t\tsetDistance(this: Camera3DBaseState, d: number) {\n\t\t\tthis.distance = clamp(d, minDistance, maxDistance);\n\t\t},\n\t\taddTrauma(this: Camera3DBaseState, amount: number) {\n\t\t\tthis.trauma = clamp(this.trauma + amount, 0, 1);\n\t\t},\n\t};\n\n\treturn definePlugin('camera3d')\n\t\t.withResourceTypes<Camera3DResourceTypes>()\n\t\t.withLabels<Camera3DLabels>()\n\t\t.withGroups<G>()\n\t\t.requires<Camera3DRequiredConfig>()\n\t\t.install((world) => {\n\n\t\t\t// ==================== DOM State ====================\n\n\t\t\tconst drag = { active: false, prevX: 0, prevY: 0, pendingWheel: 0, el: null as HTMLElement | null };\n\n\t\t\t// ==================== Resource ====================\n\n\t\t\tconst variantFields = projection === 'orthographic'\n\t\t\t\t? {\n\t\t\t\t\tprojection: 'orthographic' as const,\n\t\t\t\t\tzoom: initialZoom,\n\t\t\t\t\tsetZoom(this: OrthographicCamera3DState, z: number) { this.zoom = clamp(z, minZoom, maxZoom); },\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\tprojection: 'perspective' as const,\n\t\t\t\t\tfov: initialFov,\n\t\t\t\t\tsetFov(this: PerspectiveCamera3DState, f: number) { this.fov = f; },\n\t\t\t\t};\n\n\t\t\tconst state: Camera3DState = {\n\t\t\t\t...baseFields,\n\t\t\t\t...baseMutators,\n\t\t\t\t...variantFields,\n\t\t\t};\n\n\t\t\tworld.addResource('camera3DState', state);\n\n\t\t\t// ==================== DOM Handlers ====================\n\n\t\t\tfunction onPointerDown(e: PointerEvent) {\n\t\t\t\tdrag.active = true;\n\t\t\t\tdrag.prevX = e.clientX;\n\t\t\t\tdrag.prevY = e.clientY;\n\t\t\t\tdrag.el?.setPointerCapture(e.pointerId);\n\t\t\t}\n\n\t\t\tfunction onPointerMove(e: PointerEvent) {\n\t\t\t\tif (!drag.active) return;\n\t\t\t\tconst deltaX = e.clientX - drag.prevX;\n\t\t\t\tconst deltaY = e.clientY - drag.prevY;\n\t\t\t\tdrag.prevX = e.clientX;\n\t\t\t\tdrag.prevY = e.clientY;\n\n\t\t\t\tstate.azimuth -= deltaX * orbitSensitivity;\n\t\t\t\tstate.elevation = clamp(\n\t\t\t\t\tstate.elevation + deltaY * orbitSensitivity,\n\t\t\t\t\tminElevation,\n\t\t\t\t\tmaxElevation,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfunction onPointerUp(e: PointerEvent) {\n\t\t\t\tdrag.active = false;\n\t\t\t\tdrag.el?.releasePointerCapture(e.pointerId);\n\t\t\t}\n\n\t\t\tfunction onWheel(e: WheelEvent) {\n\t\t\t\te.preventDefault();\n\t\t\t\tdrag.pendingWheel += Math.sign(e.deltaY);\n\t\t\t}\n\n\t\t\t// ==================== Init System ====================\n\n\t\t\t// Camera ref cached once at init — never changes at runtime\n\t\t\tlet cachedCamera: Renderer3DResourceTypes['camera'] | null = null;\n\t\t\tlet cachedPerspCamera: PerspectiveCamera | null = null;\n\t\t\tlet cachedOrthoCamera: OrthographicCamera | null = null;\n\n\t\t\tworld\n\t\t\t\t.addSystem('camera3d-init')\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize((ecs) => {\n\t\t\t\t\tconst threeRenderer = ecs.getResource('threeRenderer');\n\t\t\t\t\tcachedCamera = ecs.getResource('camera');\n\n\t\t\t\t\t// Narrow to the concrete camera variant once\n\t\t\t\t\tif ((cachedCamera as PerspectiveCamera).isPerspectiveCamera) {\n\t\t\t\t\t\tcachedPerspCamera = cachedCamera as PerspectiveCamera;\n\t\t\t\t\t} else if ((cachedCamera as OrthographicCamera).isOrthographicCamera) {\n\t\t\t\t\t\tcachedOrthoCamera = cachedCamera as OrthographicCamera;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Guard: plugin `projection` option must match the resolved camera kind\n\t\t\t\t\tif (state.projection === 'perspective' && !cachedPerspCamera) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t'createCamera3DPlugin: configured as \\'perspective\\' but the renderer\\'s camera is not a PerspectiveCamera.',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (state.projection === 'orthographic' && !cachedOrthoCamera) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t'createCamera3DPlugin: configured as \\'orthographic\\' but the renderer\\'s camera is not an OrthographicCamera.',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Sync initial variant-specific value from the actual camera\n\t\t\t\t\tif (state.projection === 'perspective' && cachedPerspCamera) {\n\t\t\t\t\t\tstate.fov = cachedPerspCamera.fov;\n\t\t\t\t\t} else if (state.projection === 'orthographic' && cachedOrthoCamera) {\n\t\t\t\t\t\tstate.setZoom(cachedOrthoCamera.zoom);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Attach DOM listeners\n\t\t\t\t\tdrag.el = threeRenderer.domElement;\n\t\t\t\t\tif (enableOrbit) {\n\t\t\t\t\t\tdrag.el.addEventListener('pointerdown', onPointerDown);\n\t\t\t\t\t\tdrag.el.addEventListener('pointermove', onPointerMove);\n\t\t\t\t\t\tdrag.el.addEventListener('pointerup', onPointerUp);\n\t\t\t\t\t}\n\t\t\t\t\tif (resolvedWheelMode !== 'disabled') {\n\t\t\t\t\t\tdrag.el.addEventListener('wheel', onWheel as EventListener, { passive: false });\n\t\t\t\t\t}\n\n\t\t\t\t\t// Initial camera position sync\n\t\t\t\t\tsphericalToCartesian(state.azimuth, state.elevation, state.distance, _camPos);\n\t\t\t\t\tcachedCamera.position.set(\n\t\t\t\t\t\tstate.targetX + _camPos.x,\n\t\t\t\t\t\tstate.targetY + _camPos.y,\n\t\t\t\t\t\tstate.targetZ + _camPos.z,\n\t\t\t\t\t);\n\t\t\t\t\tcachedCamera.lookAt(state.targetX, state.targetY, state.targetZ);\n\t\t\t\t})\n\t\t\t\t.setOnDetach(() => {\n\t\t\t\t\tif (!drag.el) return;\n\t\t\t\t\tif (enableOrbit) {\n\t\t\t\t\t\tdrag.el.removeEventListener('pointerdown', onPointerDown);\n\t\t\t\t\t\tdrag.el.removeEventListener('pointermove', onPointerMove);\n\t\t\t\t\t\tdrag.el.removeEventListener('pointerup', onPointerUp);\n\t\t\t\t\t}\n\t\t\t\t\tif (resolvedWheelMode !== 'disabled') {\n\t\t\t\t\t\tdrag.el.removeEventListener('wheel', onWheel as EventListener);\n\t\t\t\t\t}\n\t\t\t\t\tdrag.el = null;\n\t\t\t\t\tcachedCamera = null;\n\t\t\t\t\tcachedPerspCamera = null;\n\t\t\t\t\tcachedOrthoCamera = null;\n\t\t\t\t});\n\n\t\t\t// ==================== Follow System ====================\n\n\t\t\tworld\n\t\t\t\t.addSystem('camera3d-follow')\n\t\t\t\t.setPriority(400)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setProcess(({ ecs, dt }) => {\n\t\t\t\t\tif (state.followTarget < 0) return;\n\n\t\t\t\t\tif (!ecs.getEntity(state.followTarget)) {\n\t\t\t\t\t\tstate.followTarget = -1;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst worldTransform = ecs.getComponent(state.followTarget, 'worldTransform3D');\n\t\t\t\t\tif (!worldTransform) return;\n\n\t\t\t\t\tconst goalX = worldTransform.x + state.followOffsetX;\n\t\t\t\t\tconst goalY = worldTransform.y + state.followOffsetY;\n\t\t\t\t\tconst goalZ = worldTransform.z + state.followOffsetZ;\n\n\t\t\t\t\tconst factor = Math.min(1, state.followSmoothing * dt);\n\t\t\t\t\tstate.targetX += (goalX - state.targetX) * factor;\n\t\t\t\t\tstate.targetY += (goalY - state.targetY) * factor;\n\t\t\t\t\tstate.targetZ += (goalZ - state.targetZ) * factor;\n\t\t\t\t});\n\n\t\t\t// ==================== Shake System ====================\n\n\t\t\tworld\n\t\t\t\t.addSystem('camera3d-shake')\n\t\t\t\t.setPriority(390)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setProcess(({ dt }) => {\n\t\t\t\t\tif (state.trauma <= 0) {\n\t\t\t\t\t\tstate.shakeOffsetX = 0;\n\t\t\t\t\t\tstate.shakeOffsetY = 0;\n\t\t\t\t\t\tstate.shakeOffsetZ = 0;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.trauma = Math.max(0, state.trauma - shakeDecay * dt);\n\n\t\t\t\t\tconst intensity = state.trauma * state.trauma;\n\t\t\t\t\tstate.shakeOffsetX = shakeMaxX * intensity * (randomFn() * 2 - 1);\n\t\t\t\t\tstate.shakeOffsetY = shakeMaxY * intensity * (randomFn() * 2 - 1);\n\t\t\t\t\tstate.shakeOffsetZ = shakeMaxZ * intensity * (randomFn() * 2 - 1);\n\t\t\t\t});\n\n\t\t\t// ==================== Sync System ====================\n\n\t\t\tworld\n\t\t\t\t.addSystem('camera3d-sync')\n\t\t\t\t.setPriority(380)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setProcess(() => {\n\t\t\t\t\tif (!cachedCamera) return;\n\n\t\t\t\t\t// Process pending wheel input\n\t\t\t\t\tif (drag.pendingWheel !== 0) {\n\t\t\t\t\t\tconst wheelFactor = Math.pow(dollySensitivity, drag.pendingWheel);\n\t\t\t\t\t\twheelHandlers[resolvedWheelMode](state, wheelFactor);\n\t\t\t\t\t\tdrag.pendingWheel = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Compute camera position from spherical coords. Shake is applied as a\n\t\t\t\t\t// pure view translation — both position and lookAt target shift by the\n\t\t\t\t\t// same offset so the view pans instead of rotating. This keeps the effect\n\t\t\t\t\t// visible under orthographic projection (which has no parallax) and also\n\t\t\t\t\t// makes perspective shake magnitudes feel consistent regardless of distance.\n\t\t\t\t\tsphericalToCartesian(state.azimuth, state.elevation, state.distance, _camPos);\n\t\t\t\t\tcachedCamera.position.set(\n\t\t\t\t\t\tstate.targetX + _camPos.x + state.shakeOffsetX,\n\t\t\t\t\t\tstate.targetY + _camPos.y + state.shakeOffsetY,\n\t\t\t\t\t\tstate.targetZ + _camPos.z + state.shakeOffsetZ,\n\t\t\t\t\t);\n\t\t\t\t\tcachedCamera.lookAt(\n\t\t\t\t\t\tstate.targetX + state.shakeOffsetX,\n\t\t\t\t\t\tstate.targetY + state.shakeOffsetY,\n\t\t\t\t\t\tstate.targetZ + state.shakeOffsetZ,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (state.projection === 'perspective' && cachedPerspCamera && cachedPerspCamera.fov !== state.fov) {\n\t\t\t\t\t\tcachedPerspCamera.fov = state.fov;\n\t\t\t\t\t\tcachedPerspCamera.updateProjectionMatrix();\n\t\t\t\t\t} else if (state.projection === 'orthographic' && cachedOrthoCamera && cachedOrthoCamera.zoom !== state.zoom) {\n\t\t\t\t\t\tcachedOrthoCamera.zoom = state.zoom;\n\t\t\t\t\t\tcachedOrthoCamera.updateProjectionMatrix();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "E7D2111F51674CD764756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "C47E3BD9B6CC20E664756E2164756E21",
9
9
  "names": []
10
10
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ecspresso",
3
- "version": "0.19.0",
3
+ "version": "0.19.2",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",