API Documentation for:
Show:

File:MemPriority.js

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

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

export default class MemPriority extends Composite {

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

  /**
   * 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 !== FAILURE) {
        if (status === RUNNING) {
          tick.blackboard.set('runningChild', i, tick.tree.id, this.id);
        }

        return status;
      }
    }

    return FAILURE;
  }
};