summaryrefslogtreecommitdiff
path: root/src/systems/collision.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/systems/collision.js')
-rw-r--r--src/systems/collision.js49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/systems/collision.js b/src/systems/collision.js
new file mode 100644
index 0000000..7739bae
--- /dev/null
+++ b/src/systems/collision.js
@@ -0,0 +1,49 @@
+game.system.Collision = (entitiesGrid) => {
+ const update = (elapsedTime, entities, changedIds) => {
+ for (let entity of Object.keys(entities).map((id) => entities[id])) {
+ if (entity.hasComponent("controllable") && entity.hasComponent("gridPosition") && entity.hasComponent("momentum")) {
+ const momentum = unitize(entity.components.momentum);
+
+ let found;
+ const proposed = {x: entity.components.gridPosition.x + momentum.dx, y: entity.components.gridPosition.y + momentum.dy};
+ const entitiesToPush = [];
+ let wall = false;
+ do {
+ const proposedClampedInBounds = clamp(proposed, game.config.xDim-1, game.config.yDim-1);
+ if (!equivalence(proposed, proposedClampedInBounds)) {
+ break;
+ }
+
+ found = false;
+
+ const entitiesInCell = entitiesGrid[proposed.y][proposed.x];
+
+ for (let next of entitiesInCell.values()) {
+ if (next.hasComponent("stop")) {
+ console.log("WALL FOUND")
+ wall = next;
+ found = false;
+ break;
+ }
+ if (next.hasComponent("pushable")) {
+ entitiesToPush.push(next);
+ found = true;
+ }
+ }
+
+ proposed.x += momentum.dx;
+ proposed.y += momentum.dy;
+ } while(found);
+
+ if (wall) {
+ console.log("WALL")
+ entity.removeComponent("momentum");
+ } else {
+ entitiesToPush.map((e) => e.addComponent(game.components.Momentum({...momentum})));
+ }
+ }
+ }
+ return new Set();
+ };
+ return { update };
+};