diff --git a/app/ecs/components/collider.js b/app/ecs/components/collider.js index 9a265b0..de74c66 100644 --- a/app/ecs/components/collider.js +++ b/app/ecs/components/collider.js @@ -46,13 +46,19 @@ export default class Collider extends Component { const script = this.$$collisionEnd.clone(); script.context.other = otherEntity; script.context.pair = [body, otherBody]; - thisEntity.Ticking.add(script.ticker()); + const ticker = script.ticker(); + ecs.addDestructionDependency(thisEntity.id, ticker); + ecs.addDestructionDependency(otherEntity.id, ticker); + thisEntity.Ticking.add(ticker); } if (other.$$collisionEnd) { const script = other.$$collisionEnd.clone(); script.context.other = thisEntity; script.context.pair = [otherBody, body]; - otherEntity.Ticking.add(script.ticker()); + const ticker = script.ticker(); + ecs.addDestructionDependency(thisEntity.id, ticker); + ecs.addDestructionDependency(otherEntity.id, ticker); + otherEntity.Ticking.add(ticker); } } this.$$intersections.delete(other); @@ -102,13 +108,19 @@ export default class Collider extends Component { const script = this.$$collisionStart.clone(); script.context.other = otherEntity; script.context.pair = [body, otherBody]; - thisEntity.Ticking.add(script.ticker()); + const ticker = script.ticker(); + ecs.addDestructionDependency(otherEntity.id, ticker); + ecs.addDestructionDependency(thisEntity.id, ticker); + thisEntity.Ticking.add(ticker); } if (other.$$collisionStart) { const script = other.$$collisionStart.clone(); script.context.other = thisEntity; script.context.pair = [otherBody, body]; - otherEntity.Ticking.add(script.ticker()); + const ticker = script.ticker(); + ecs.addDestructionDependency(otherEntity.id, ticker); + ecs.addDestructionDependency(thisEntity.id, ticker); + otherEntity.Ticking.add(ticker); } activeIntersections.add(intersection); } diff --git a/app/ecs/components/owned.js b/app/ecs/components/owned.js new file mode 100644 index 0000000..e10cbc5 --- /dev/null +++ b/app/ecs/components/owned.js @@ -0,0 +1,7 @@ +import Component from '@/ecs/component.js'; + +export default class Owned extends Component { + static properties = { + owner: {type: 'string'}, + }; +} diff --git a/app/ecs/components/vulnerable.js b/app/ecs/components/vulnerable.js new file mode 100644 index 0000000..9c0eacd --- /dev/null +++ b/app/ecs/components/vulnerable.js @@ -0,0 +1,4 @@ +import Component from '@/ecs/component.js'; + +export default class Vulnerable extends Component { +} diff --git a/app/server/create/homestead.js b/app/server/create/homestead.js index 7c1b352..95be263 100644 --- a/app/server/create/homestead.js +++ b/app/server/create/homestead.js @@ -191,8 +191,9 @@ export default async function createHomestead(id) { Tags: {tags: ['kittan']}, Ticking: {}, VisibleAabb: {}, + Vulnerable: {}, }; - for (let i = 0; i < 30; ++i) { + for (let i = 0; i < 10; ++i) { entities.push(kitty); } entities.push({ diff --git a/app/server/engine.js b/app/server/engine.js index ad38a09..81d5ae5 100644 --- a/app/server/engine.js +++ b/app/server/engine.js @@ -48,6 +48,9 @@ export default class Engine { get frame() { return engine.frame; } + lookupPlayerEntity(id) { + return engine.lookupPlayerEntity(id); + } async readAsset(uri) { if (!cache.has(uri)) { const {promise, resolve, reject} = withResolvers(); @@ -325,6 +328,14 @@ export default class Engine { return player; } + lookupPlayerEntity(id) { + for (const [, player] of this.connectedPlayers) { + if (player.id == id) { + return player.entity; + } + } + } + async saveEcs(path, ecs) { const view = this.Ecs.serialize(ecs); await this.server.writeData(path, view); diff --git a/public/assets/magic-swords/collision-start.js b/public/assets/magic-swords/collision-start.js new file mode 100644 index 0000000..7dee41a --- /dev/null +++ b/public/assets/magic-swords/collision-start.js @@ -0,0 +1,4 @@ +const playerEntity = ecs.lookupPlayerEntity(entity.Owned.owner); +if (playerEntity !== other && other.Vulnerable) { + ecs.destroy(other.id); +} diff --git a/public/assets/magic-swords/start.js b/public/assets/magic-swords/start.js index 9455344..7e068ca 100644 --- a/public/assets/magic-swords/start.js +++ b/public/assets/magic-swords/start.js @@ -1,4 +1,4 @@ -const {Position} = wielder; +const {Player, Position} = wielder; const shots = []; @@ -23,10 +23,12 @@ for (let i = 0; i < N; ++i) { unstoppable: 1, }, ], + collisionStartScript: '/assets/magic-swords/collision-start.js', }, Controlled: {}, Direction: {direction: Math.TAU * (i / N)}, Forces: {}, + Owned: {owner: Player ? Player.id : 0}, Position: {x: Position.x, y: Position.y}, Speed: {}, Sprite: { @@ -73,6 +75,8 @@ while (shots.length > 0) { shot.Direction.direction = (Math.TAU + toward) % Math.TAU; if (Math.distance(where, shot.Position) < 4) { delete accumulated[shot.id]; + shot.Sprite.alpha = 0; + ecs.destroy(shot.id); destroying.push(shot); } } @@ -80,8 +84,6 @@ while (shots.length > 0) { } for (let i = 0; i < destroying.length; ++i) { shots.splice(shots.indexOf(destroying[i]), 1); - destroying[i] = destroying[i].id; } - ecs.destroyMany(destroying); - await wait(0) + await wait(0); }