]> git.r.bdr.sh - rbdr/serpentity/blobdiff - lib/serpentity.js
Make node components event emitters
[rbdr/serpentity] / lib / serpentity.js
index 1360f92aafffcb594b6542d6f130a70580945304..c5c3850c9946d468f65976f55005a8a7a181d626 100644 (file)
-'use strict';
+export { Component } from './serpentity/component.js';
+export { Entity } from './serpentity/entity.js';
+export { Node } from './serpentity/node.js';
+export { System } from './serpentity/system.js';
 
 
-/*
-Serpentity is a simple entity framework inspired by Ash.
-
-Usage:
-
-    let Serpentity = require('serpentity');
-
-## Instantiating an engine
-
-    let engine = Serpentity();
-
-Add entities or systems, systems are added with a priority (the smaller
-the number, the earlier it will be called):
-
-    engine.addEntity(entityFactory());
-    engine.addSystem(new GameSystem(), priority);
-
-Update all systems:
-
-    engine.update(dt);
-
-Remove entities or systems:
-
-    engine.removeEntity(entityReference);
-    engine.removeSystem(systemReference);
-
-## Creating Entities
-
-Entities are the basic object of Serpentity, and they do nothing.
-
-    let entity = new Serpentity.Entity();
-
-All the behavior is added through components
-
-## Creating Components
-
-Components define data that we can add to an entity. This data will
-eventually be consumed by "Systems"
-
-    let PositionComponent = class PositionComponent extends Serpentity.Component {
-      constructor (config) {
-        this.x = 0;
-        this.y = 0;
-
-        super(config);
-      }
-    };
-
-You can add components to entities by using the add method:
-
-    entity.addComponent(new PositionComponent());
-
-
-Systems can refer to entities by requesting nodes.
-
-## Working with Nodes
+import { NodeCollection } from './serpentity/node_collection.js';
 
 
-Nodes are sets of components that you define, so your system can require
-entities that always follow the API defined in the node.
-
-    let MovementNode = class MovementNode extends Serpentity.Node;
-    MovementNode.position = PositionComponent;
-    MovementNode.motion = MotionComponent;
-
-You can then request an array of all the nodes representing entities
-that comply with that API
-
-    engine.getNodes(MovementNode);
-
-## Creating Systems
-
-Systems are called on every update, and they use components through nodes.
-
-    let TestSystem = class TestSystem extends Serpentity.System {
-      added (engine){
-        this.nodeList = engine.getNodes(MovementNode);
-      },
-      removed (engine){
-        this.nodeList = undefined;
-      }
-      update (dt){
-        let node;
-        for (node of this.nodeList) {
-          console.log(`Current position is: ${node.position.x},${node.position.y}`);
-        }
-      }
-    };
-
-## That's it
-
-Just run `engine.update(dt)` in your game loop :D
+/*
+ * Serpentity is the main engine class
+ */
+export default class Serpentity {
 
 
-*/
-let Serpentity = class Serpentity {
+  constructor(config) {
 
 
-  constructor (config) {
     this.systems = [];
     this.entities = [];
     this._nodeCollections = [];
     this._nodeCollectionKeys = [];
 
     this.systems = [];
     this.entities = [];
     this._nodeCollections = [];
     this._nodeCollectionKeys = [];
 
-    Object.assign(this, config || {});
+    Object.assign(this, config);
   }
 
   /*
   }
 
   /*
@@ -110,8 +26,7 @@ let Serpentity = class Serpentity {
    *
    * returns true if added succesfully, false if already added
    */
    *
    * returns true if added succesfully, false if already added
    */
-  addSystem (system, priority) {
-    let lastIndex, found;
+  addSystem(system, priority) {
 
     if (this.systems.indexOf(system) >= 0) {
       return false;
 
     if (this.systems.indexOf(system) >= 0) {
       return false;
@@ -119,13 +34,12 @@ let Serpentity = class Serpentity {
 
     system.priority = priority;
 
 
     system.priority = priority;
 
-    found = false;
-    lastIndex = 0;
+    let lastIndex = 0;
+
+    const found = this.systems.some((existingSystem, i) => {
 
 
-    this.systems.some(function findPriority(existingSystem, i) {
       lastIndex = i;
       if (existingSystem.priority >= system.priority) {
       lastIndex = i;
       if (existingSystem.priority >= system.priority) {
-        found = true;
         return true;
       }
     });
         return true;
       }
     });
@@ -145,10 +59,9 @@ let Serpentity = class Serpentity {
    *
    * returns true if removed succesfully, false if already added
    */
    *
    * returns true if removed succesfully, false if already added
    */
-  removeSystem (system) {
-    let position;
+  removeSystem(system) {
 
 
-    position = this.systems.indexOf(system);
+    const position = this.systems.indexOf(system);
     if (position >= 0) {
       this.systems[position].removed(this);
       this.systems.splice(position, 1);
     if (position >= 0) {
       this.systems[position].removed(this);
       this.systems.splice(position, 1);
@@ -163,15 +76,17 @@ let Serpentity = class Serpentity {
    *
    * returns true if added, false if already there
    */
    *
    * returns true if added, false if already there
    */
-  addEntity (entity) {
+  addEntity(entity) {
+
     if (this.entities.indexOf(entity) >= 0) {
       return false;
     }
     if (this.entities.indexOf(entity) >= 0) {
       return false;
     }
+
     this.entities.push(entity);
 
     this.entities.push(entity);
 
-    this._nodeCollections.forEach(function (collection) {
+    for (const collection of this._nodeCollections) {
       collection.add(entity);
       collection.add(entity);
-    });
+    }
 
     return true;
   }
 
     return true;
   }
@@ -181,14 +96,13 @@ let Serpentity = class Serpentity {
    *
    * returns true if removed, false if not present
    */
    *
    * returns true if removed, false if not present
    */
-  removeEntity (entity) {
-    let position;
+  removeEntity(entity) {
 
 
-    position = this.entities.indexOf(entity);
+    const position = this.entities.indexOf(entity);
     if (position >= 0) {
     if (position >= 0) {
-      this._nodeCollections.forEach(function (collection) {
+      for (const collection of this._nodeCollections) {
         collection.remove(entity);
         collection.remove(entity);
-      });
+      }
 
       this.entities.splice(position, 1);
       return true;
 
       this.entities.splice(position, 1);
       return true;
@@ -201,46 +115,35 @@ let Serpentity = class Serpentity {
    * Given a Node Class, retrieves a list of all the nodes for each
    * applicable entity.
    */
    * Given a Node Class, retrieves a list of all the nodes for each
    * applicable entity.
    */
-  getNodes (nodeType) {
-    let position, nodeCollection;
+  getNodes(nodeType) {
 
 
-    position = this._nodeCollectionKeys.indexOf(nodeType);
+    const position = this._nodeCollectionKeys.indexOf(nodeType);
 
     if (position >= 0) {
 
     if (position >= 0) {
-      return this._nodeCollections[position].nodes;
+      return this._nodeCollections[position];
     }
 
     }
 
-    nodeCollection = new Serpentity.NodeCollection({
-      type : nodeType
+    const nodeCollection = new NodeCollection({
+      type: nodeType
     });
 
     this._nodeCollectionKeys.push(nodeType);
     this._nodeCollections.push(nodeCollection);
 
     });
 
     this._nodeCollectionKeys.push(nodeType);
     this._nodeCollections.push(nodeCollection);
 
-    this.entities.forEach(function (entity) {
+    for (const entity of this.entities) {
       nodeCollection.add(entity);
       nodeCollection.add(entity);
-    });
+    }
 
 
-    return nodeCollection.nodes;
+    return nodeCollection;
   }
 
   /*
    * Calls update for every loaded system.
    */
   }
 
   /*
    * Calls update for every loaded system.
    */
-  update (dt) {
-    this.systems.forEach(function (system) {
+  update(dt) {
+
+    for (const system of this.systems) {
       system.update(dt);
       system.update(dt);
-    });
+    }
   }
   }
-};
-
-// Add namespaced objects.
-if (typeof module !== 'undefined' && this.module !== module) {
-  Serpentity.Component = require('./serpentity/component.js');
-  Serpentity.Entity = require('./serpentity/entity.js');
-  Serpentity.Node = require('./serpentity/node.js');
-  Serpentity.NodeCollection = require('./serpentity/node_collection.js');
-  Serpentity.System = require('./serpentity/system.js');
-
-  module.exports = Serpentity;
 }
 }