diff --git a/src/BehaviorTreeImporter.js b/src/BehaviorTreeImporter.js index 3215a49..57bfeea 100644 --- a/src/BehaviorTreeImporter.js +++ b/src/BehaviorTreeImporter.js @@ -5,6 +5,7 @@ import Sequence from './Sequence' import Task from './Task' import AlwaysFailDecorator from './decorators/AlwaysFailDecorator' import AlwaysSucceedDecorator from './decorators/AlwaysSucceedDecorator' +import AlwaysRunningDecorator from './decorators/AlwaysRunningDecorator' import CooldownDecorator from './decorators/CooldownDecorator' import InvertDecorator from './decorators/InvertDecorator' import LoopDecorator from './decorators/LoopDecorator' @@ -20,6 +21,7 @@ export default class BehaviorTreeImporter { invert: InvertDecorator, fail: AlwaysFailDecorator, succeed: AlwaysSucceedDecorator, + running: AlwaysRunningDecorator, cooldown: CooldownDecorator, loop: LoopDecorator } diff --git a/src/decorators/AlwaysRunningDecorator.js b/src/decorators/AlwaysRunningDecorator.js new file mode 100644 index 0000000..942c036 --- /dev/null +++ b/src/decorators/AlwaysRunningDecorator.js @@ -0,0 +1,12 @@ +import { RUNNING, SUCCESS } from '../constants' +import Decorator from '../Decorator' + +export default class AlwaysRunningDecorator extends Decorator { + nodeType = 'AlwaysRunningDecorator' + + decorate (run) { + const result = run() + if ([RUNNING, SUCCESS].indexOf(result) !== -1) return RUNNING + return result + } +} diff --git a/src/decorators/AlwaysRunningDecorator.spec.js b/src/decorators/AlwaysRunningDecorator.spec.js new file mode 100644 index 0000000..df00741 --- /dev/null +++ b/src/decorators/AlwaysRunningDecorator.spec.js @@ -0,0 +1,22 @@ +/* eslint-env jest */ +import { RUNNING, SUCCESS, FAILURE } from '../constants' +import AlwaysRunningDecorator from './AlwaysRunningDecorator' +import Task from '../Task' + +describe('AlwaysRunningDecorator', () => { + const task = new Task({ + run (blackboard) { + return blackboard.result + } + }) + const decoratedTask = new AlwaysRunningDecorator({ node: task }) + + it('changes SUCCESS to RUNNING', () => { + expect(decoratedTask.run({ result: SUCCESS })).toEqual(RUNNING) + expect(decoratedTask.run({ result: RUNNING })).toEqual(RUNNING) + }) + + it('fails on FAILURE', () => { + expect(decoratedTask.run({ result: FAILURE })).toEqual(FAILURE) + }) +}) diff --git a/src/decorators/index.js b/src/decorators/index.js index 44b1cdd..4303ade 100644 --- a/src/decorators/index.js +++ b/src/decorators/index.js @@ -1,4 +1,5 @@ export AlwaysFailDecorator from './AlwaysFailDecorator' +export AlwaysRunningDecorator from './AlwaysRunningDecorator' export AlwaysSucceedDecorator from './AlwaysSucceedDecorator' export CooldownDecorator from './CooldownDecorator' export InvertDecorator from './InvertDecorator'