]> git.r.bdr.sh - rbdr/sumo/blobdiff - lib/sumo.js
Deploy to Pages
[rbdr/sumo] / lib / sumo.js
index 81f948f74848695144ca298d546e6a6b66714fa5..835e910ff48c18ea256af2bf9eca8d4e9e42caa8 100644 (file)
@@ -1,7 +1,35 @@
+import 'babel-polyfill';
+
+import Config from './config';
+
+// Systems
+
+import ApplyForceSystem from './systems/apply_force';
+import CreateCouplingLineSystem from './systems/create_coupling_line';
+import ControlMapperSystem from './systems/control_mapper';
+import DashSystem from './systems/dash';
+import DetectPointsCollisionSystem from './systems/detect_points_collision';
+import DetectWinnerSystem from './systems/detect_winner';
+import DrawDashSystem from './systems/draw_dash';
+import DrawGrabSystem from './systems/draw_grab';
+import ElasticSystem from './systems/elastic';
+import GrabSystem from './systems/grab';
+import PhysicsWorldControlSystem from './systems/physics_world_control';
+import PhysicsToAttributesSystem from './systems/physics_to_attributes';
+import RenderPointsSystem from './systems/render_points';
 import RenderSystem from './systems/render';
+import RenderWinnerSystem from './systems/render_winner';
+import AttributesToRenderableSystem from './systems/attributes_to_renderable';
+
+// Factories
+
 import SumoFactory from './factories/sumo';
+
+// External Dependencies
+
 import Serpentity from '@serpentity/serpentity';
 import { Application } from 'pixi.js';
+import { Engine } from 'matter-js';
 
 /* global window document */
 
@@ -13,13 +41,13 @@ const internals = {
 
   onLoad() {
 
-    const sumo = new internals.Sumo({
+    const sumo = new internals.Sumo(Object.assign({
       element: document.getElementById('sumo-app-entry-point')
-    });
+    }, Config));
 
     sumo.startLoop();
 
-    internals.exports.sumo = sumo;
+    window.sumo = sumo;
   }
 };
 
@@ -43,6 +71,7 @@ internals.Sumo = class Sumo {
 
   constructor(config) {
 
+    // These defaults can get overridden by config
     this.fps = 60;
     this.aspectRatio = [2.76, 1];
     this.verticalResolution = 224;
@@ -60,6 +89,7 @@ internals.Sumo = class Sumo {
 
     // Initialization functions
     this._initializeCanvas();
+    this._initializeMatter();
     this._initializePixi();
     this._initializeSystems();
     this._initializeEntities();
@@ -109,7 +139,7 @@ internals.Sumo = class Sumo {
 
       // We're sending the currentTime since it gives better results for
       // this type of renderer, though usually we expect the delta
-      this._engine.update(currentTime);
+      this._engine.update(currentFrameDuration);
       this._previousTime = currentTime;
     }
   }
@@ -124,6 +154,15 @@ internals.Sumo = class Sumo {
     window.addEventListener('resize', this._resizeCanvas.bind(this));
   }
 
+  // Initialize MatterJs
+
+  _initializeMatter() {
+
+    this._matterJs = Engine.create();
+
+    this._matterJs.world.gravity.y = 0;
+  }
+
   // Initialize Pixi
 
   _initializePixi() {
@@ -160,6 +199,44 @@ internals.Sumo = class Sumo {
 
   _initializeSystems() {
 
+    this._engine.addSystem(new ControlMapperSystem());
+
+    this._engine.addSystem(new DashSystem());
+
+    this._engine.addSystem(new GrabSystem({
+      engine: this._matterJs
+    }));
+
+    this._engine.addSystem(new ApplyForceSystem());
+
+    this._engine.addSystem(new PhysicsWorldControlSystem({
+      engine: this._matterJs
+    }));
+
+    this._engine.addSystem(new DetectPointsCollisionSystem());
+
+    this._engine.addSystem(new DetectWinnerSystem());
+
+    this._engine.addSystem(new RenderPointsSystem({
+      application: this._pixi
+    }));
+
+    this._engine.addSystem(new RenderWinnerSystem({
+      application: this._pixi
+    }));
+
+    this._engine.addSystem(new ElasticSystem());
+
+    this._engine.addSystem(new PhysicsToAttributesSystem());
+
+    this._engine.addSystem(new AttributesToRenderableSystem());
+
+    this._engine.addSystem(new CreateCouplingLineSystem());
+
+    this._engine.addSystem(new DrawDashSystem());
+
+    this._engine.addSystem(new DrawGrabSystem());
+
     this._engine.addSystem(new RenderSystem({
       application: this._pixi
     }));
@@ -169,19 +246,96 @@ internals.Sumo = class Sumo {
 
   _initializeEntities() {
 
-    SumoFactory.createSumo(this._engine, {
+    SumoFactory.createArena(this._engine, {
+      position: {
+        x: this.horizontalResolution / 2,
+        y: this.verticalResolution / 2
+      }
+    });
+
+    const sumoA = SumoFactory.createPlayer1Sumo(null, {
+      position: {
+        x: this.horizontalResolution / 2 - 100,
+        y: this.verticalResolution / 2
+      }
+    });
+
+    const sumoB = SumoFactory.createPlayer2Sumo(null, {
+      position: {
+        x: this.horizontalResolution / 2 + 100,
+        y: this.verticalResolution / 2
+      }
+    });
+
+    const harness = SumoFactory.createHarness(null, {
+      position: {
+        x: this.horizontalResolution / 2,
+        y: this.verticalResolution / 2
+      }
+    });
+
+    SumoFactory.createRubberBand(this._engine, {
+      entityA: sumoA,
+      entityB: harness
+    });
+
+    SumoFactory.createRubberBand(this._engine, {
+      entityA: sumoB,
+      entityB: harness
+    });
+
+    // Walls
+
+    SumoFactory.createInvisibleBlock(this._engine, {
+      width: this.horizontalResolution * 2,
+      height: this.verticalResolution * 0.1,
+      position: {
+        x: this.horizontalResolution / 2,
+        y: -this.verticalResolution * 0.1
+      }
+    });
+
+    SumoFactory.createInvisibleBlock(this._engine, {
+      width: this.horizontalResolution * 2,
+      height: this.verticalResolution * 0.1,
       position: {
-        x: 50,
-        y: 50
+        x: this.horizontalResolution / 2,
+        y: this.verticalResolution + this.verticalResolution * 0.1
       }
     });
 
-    SumoFactory.createSumo(this._engine, {
+    // Points Detector
+
+    SumoFactory.createPointsCollider(this._engine, {
+      collisionTarget: sumoA,
+      pointsTarget: 'red',
+      height: this.verticalResolution,
+      width: this.horizontalResolution,
+      position: {
+        x: this.horizontalResolution + this.horizontalResolution / 2,
+        y: this.verticalResolution / 2
+      }
+    });
+
+    SumoFactory.createPointsCollider(this._engine, {
+      collisionTarget: sumoB,
+      pointsTarget: 'blue',
+      height: this.verticalResolution,
+      width: this.horizontalResolution,
       position: {
-        x: 309,
-        y: 112
+        x: -this.horizontalResolution / 2,
+        y: this.verticalResolution / 2
       }
     });
+
+    // The game state
+    SumoFactory.createGameState(this._engine);
+
+    // To keep the coupling behind, we'll manually add the sumos later
+
+    this._engine.addEntity(sumoA);
+    this._engine.addEntity(sumoB);
+    this._engine.addEntity(harness);
   }
 };