ecspresso
Version:
A minimal Entity-Component-System library for typescript and javascript.
5 lines (3 loc) • 2.43 kB
JavaScript
var Z=((v)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(v,{get:(E,H)=>(typeof require<"u"?require:E)[H]}):v)(function(v){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+v+'" is not supported')});import{definePlugin as Y}from"ecspresso";function b(v,E,H){return{projectile:{damage:v,speed:E,sourceId:H}}}function B(v){return{projectileTarget:{entityId:v}}}function S(v,E){let H=Math.sqrt(v*v+E*E);if(H===0)return{projectileDirection:{x:0,y:-1}};return{projectileDirection:{x:v/H,y:E/H}}}function G(v){let{systemGroup:E="combat",priority:H=300,phase:U="update",publishDamage:X=!0}=v??{};return Y("projectile").withComponentTypes().withEventTypes().withLabels().withGroups().requires().install((R)=>{R.addSystem("projectile-homing").setPriority(H).inPhase(U).inGroup(E).addQuery("homing",{with:["projectile","projectileTarget","localTransform"]}).setProcess(({queries:C,ecs:k,dt:M})=>{for(let K of C.homing){let{projectile:L,projectileTarget:F,localTransform:z}=K.components;if(!k.getEntity(F.entityId)){k.commands.removeEntity(K.id);continue}let J=k.getComponent(F.entityId,"worldTransform");if(!J){k.commands.removeEntity(K.id);continue}let N=J.x-z.x,O=J.y-z.y,V=N*N+O*O,Q=L.speed*M;if(V<=Q*Q)z.x=J.x,z.y=J.y;else{let W=Math.sqrt(V);z.x+=N/W*Q,z.y+=O/W*Q,z.rotation=Math.atan2(O,N)}k.markChanged(K.id,"localTransform")}}),R.addSystem("projectile-linear").setPriority(H).inPhase(U).inGroup(E).addQuery("linear",{with:["projectile","projectileDirection","localTransform"]}).setProcess(({queries:C,dt:k})=>{for(let M of C.linear){let{projectile:K,projectileDirection:L,localTransform:F}=M.components,z=K.speed*k;F.x+=L.x*z,F.y+=L.y*z}}),R.addSystem("projectile-collision").inGroup(E).setEventHandlers({collision({data:C,ecs:k}){if(!k.getEntity(C.entityA)||!k.getEntity(C.entityB))return;let M=k.getComponent(C.entityA,"projectile"),K=k.getComponent(C.entityB,"projectile"),L=M!==void 0,F=L?M:K;if(!F)return;let z=L?C.entityA:C.entityB,J=L?C.entityB:C.entityA;if(J===F.sourceId)return;if(k.eventBus.publish("projectileHit",{projectileId:z,targetId:J,damage:F.damage}),X)k.eventBus.publish("damage",{entityId:J,amount:F.damage,sourceId:F.sourceId});k.commands.removeEntity(z)}})})}export{B as createProjectileTarget,G as createProjectilePlugin,S as createProjectileDirection,b as createProjectile};
//# debugId=D0756C0A27AA8CAC64756E2164756E21
//# sourceMappingURL=projectile.js.map