API Documentation for:
Show:

File:MemSequence.js

import Composite from '../core/Composite';
import {SUCCESS, RUNNING} from '../constants';

/**
 * MemSequence is similar to Sequence node, but when a child returns a
 * `RUNNING` state, its index is recorded and in the next tick the
 * MemPriority call the child recorded directly, without calling previous
 * children again.
 *
 * @module b3
 * @class MemSequence
 * @extends Composite
 **/

export default class MemSequence extends Composite {

  /**
   * Creates an instance of MemSequence.
   * @param {Object} params 
   * @param {Array} params.children 
   * @memberof MemSequence
   */
  constructor({children = []} = {}){
    super({
      name: 'MemSequence',
      children
    });
  }

  /**
   * Open method.
   * @method open
   * @param {b3.Tick} tick A tick instance.
   **/
  open(tick) {
    tick.blackboard.set('runningChild', 0, tick.tree.id, this.id);
  }

  /**
   * Tick method.
   * @method tick
   * @param {b3.Tick} tick A tick instance.
   * @return {Constant} A state constant.
   **/
  tick(tick) {
    var child = tick.blackboard.get('runningChild', tick.tree.id, this.id);
    for (var i=child; i<this.children.length; i++) {
      var status = this.children[i]._execute(tick);

      if (status !== SUCCESS) {
        if (status === RUNNING) {
          tick.blackboard.set('runningChild', i, tick.tree.id, this.id);
        }
        return status;
      }
    }

    return SUCCESS;
  }
};