ecspresso
Version:
A minimal Entity-Component-System library for typescript and javascript.
5 lines (3 loc) • 2.37 kB
JavaScript
var Y=((b)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(b,{get:(j,z)=>(typeof require<"u"?require:j)[z]}):b)(function(b){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+b+'" is not supported')});import{definePlugin as W}from"ecspresso";function X(b,j){return Object.freeze({id:b,initial:j.initial,states:Object.freeze(j.states)})}function $(b,j){let z=j?.initial??b.initial;return{stateMachine:{definition:b,current:z,previous:null,stateTime:0}}}function L(b,j,z,A){let H=z.definition.states,D=H[z.current],B=H[A];if(!B)return!1;return D?.onExit?.({ecs:b,entityId:j}),z.previous=z.current,z.current=A,z.stateTime=0,B.onEnter?.({ecs:b,entityId:j}),b.markChanged(j,"stateMachine"),b.eventBus.publish("stateTransition",{entityId:j,from:z.previous,to:z.current,definitionId:z.definition.id}),!0}function E(b,j,z){let A=b.getComponent(j,"stateMachine");if(!A)return!1;return L(b,j,A,z)}function G(b,j,z){let A=b.getComponent(j,"stateMachine");if(!A)return!1;let D=A.definition.states[A.current];if(!D?.on)return!1;let B=D.on[z];if(B===void 0)return!1;if(typeof B==="string")return L(b,j,A,B);if(!B.guard({ecs:b,entityId:j}))return!1;return L(b,j,A,B.target)}function M(b,j){return b.getComponent(j,"stateMachine")?.current}function P(b){return{defineStateMachine:X}}function q(b){let{systemGroup:j="stateMachine",priority:z=0,phase:A="update"}=b??{};return W("stateMachine").withComponentTypes().withEventTypes().withLabels().withGroups().install((H)=>{H.addSystem("state-machine-update").setPriority(z).inPhase(A).inGroup(j).addQuery("machines",{with:["stateMachine"]}).setOnEntityEnter("machines",({entity:D,ecs:B})=>{let K=D.components.stateMachine,Q=K.definition.states,F=B;Q[K.current]?.onEnter?.({ecs:F,entityId:D.id})}).setProcess(({queries:D,dt:B,ecs:K})=>{let F={ecs:K,entityId:0,dt:0};for(let O of D.machines){let J=O.components.stateMachine,R=J.definition.states;F.entityId=O.id,F.dt=B,J.stateTime+=B,R[J.current]?.onUpdate?.(F);let U=R[J.current];if(U?.transitions){for(let V of U.transitions)if(V.guard(F)){L(F.ecs,O.id,J,V.target);break}}}})})}export{E as transitionTo,G as sendEvent,M as getStateMachineState,X as defineStateMachine,q as createStateMachinePlugin,P as createStateMachineHelpers,$ as createStateMachine};
//# debugId=6ADF9D5235D78F5264756E2164756E21
//# sourceMappingURL=state-machine.js.map