NPM Version Build Status Coverage Status

transvolve.js

The ECS engine you can react to!

Getting Started

These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.

Installing

Getting all set up is easy.

First, install the npm package to you project.

npm install transvolve

Then, go ahead and import it into your code and run.

import { Engine } from 'transvolve';

const engine = new Engine();

Take a gander at the transvolve.js GitHub Page and the API Documentation.

Running the tests

Test can be ran using:

npm run test

Example code that demonstrates the engine

   var transvolve = require('transvolve');
   var Engine = transvolve.Engine;
   var System = transvolve.System;
   var Entity = transvolve.Entity;
   var Component = transvolve.Component;

   function random(min, max) {
     var MIN = Math.ceil(min);
     var MAX = Math.floor(max);
     return Math.floor(Math.random() * (MAX - MIN)) + MIN;
   }

   var engine = new Engine();

   function onTick() {
     var entity = new Entity();
     var healthComponent = new Component('health', { hp: 100 });
     var decayComponent = new Component('decay');

     entity.addComponents(healthComponent, decayComponent);
     engine.addEntities(entity);
   }

   var decaySystem = new System({
     name: 'decay',
     requirements: ['decay'],
     interval: 100,
     executor: (context) => {
       var entity = context.entity;

       var timer = entity.getComponents('decay').getState('timer');
       timer = timer - context.time.delta;

       if (timer > 0) {
         entity.getComponents('decay').setState('timer', timer);
       } else {
         var hp = entity.getComponents('health').getState('hp');
         var loss = random(0, 100);

         hp = (hp - loss) > 0 ? hp - loss : 0;
         entity.getComponents('health').setState('hp', hp);

         if (hp === 0) {
           if (random(0, 100) >= 50) {
             entity.removeComponents('decay');
             entity.addComponents(new Component('death', { timer: 5000 }));
             console.log(entity.getId() + ' has perished.');
           } else {
             entity.dispose();
           }
         } else {
           entity.getComponents('decay').setState('timer', 1000);
         }
       }
     },
   });

   var resurrectSystem = new System({
     name: 'resurrect',
     requirements: ['death'],
     interval: 1000,
     executor: (context) => {
       var entity = context.entity;
       var timer = entity.getComponents('death').getState('timer');
       timer = timer - context.time.delta;

       if (timer <= 0) {
         entity.removeComponents('death');
         entity.getComponents('health').setState('hp', 100);
         entity.addComponents(new Component('decay', { timer: 1000 }));
         console.log(entity.getId() + ' has revived.');
       } else {
         entity.getComponents('death').setState('timer', timer);
       }
     },
   });

   engine.addSystems(decaySystem, resurrectSystem);
   engine.subscribe('tick', onTick);

   engine.init()
     .then(() => {
       engine.start();
     });

Contributing

Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.

Versioning

We use SemVer for versioning. For the versions available, see the tags on this repository.

Authors

  • Joe Cimaszewski - Initial work - joechimo

See also the list of contributors who participated in this project.

License

This project is licensed under the MIT License - see the LICENSE.md file for details

Acknowledgments

  • Just me, right now.