Skip to content

Commit 8724ce7

Browse files
committed
Changing TimeData to StateData, allow passing state
1 parent c31e998 commit 8724ce7

16 files changed

+170
-156
lines changed

src/BehaviorTreeBuilder.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import ParallelNode from "./Node/ParallelNode";
99
import ParentBehaviorTreeNodeInterface from "./Node/ParentBehaviorTreeNodeInterface";
1010
import SelectorNode from "./Node/SelectorNode";
1111
import SequenceNode from "./Node/SequenceNode";
12-
import TimeData from "./TimeData";
12+
import StateData from "./StateData";
1313

1414
export default class BehaviorTreeBuilder {
1515
/**
@@ -28,10 +28,10 @@ export default class BehaviorTreeBuilder {
2828
* Create an action node.
2929
*
3030
* @param {string} name
31-
* @param {(time: TimeData) => BehaviorTreeStatus} fn
31+
* @param {(state: StateData) => BehaviorTreeStatus} fn
3232
* @returns {BehaviorTreeBuilder}
3333
*/
34-
public do(name: string, fn: (time: TimeData) => Promise<BehaviorTreeStatus>): BehaviorTreeBuilder {
34+
public do(name: string, fn: (state: StateData) => Promise<BehaviorTreeStatus>): BehaviorTreeBuilder {
3535
if (this.parentNodeStack.isEmpty()) {
3636
throw new BehaviorTreeError(Errors.UNNESTED_ACTION_NODE);
3737
}
@@ -46,10 +46,10 @@ export default class BehaviorTreeBuilder {
4646
* Like an action node... but the function can return true/false and is mapped to success/failure.
4747
*
4848
* @param {string} name
49-
* @param {(time: TimeData) => boolean} fn
49+
* @param {(state: StateData) => boolean} fn
5050
* @returns {BehaviorTreeBuilder}
5151
*/
52-
public condition(name: string, fn: (time: TimeData) => Promise<boolean>): BehaviorTreeBuilder {
52+
public condition(name: string, fn: (state: StateData) => Promise<boolean>): BehaviorTreeBuilder {
5353
return this.do(name, async (t) => await fn(t) ? BehaviorTreeStatus.Success : BehaviorTreeStatus.Failure);
5454
}
5555

src/Node/ActionNode.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
import BehaviorTreeStatus from "../BehaviorTreeStatus";
2-
import TimeData from "../TimeData";
2+
import StateData from "../StateData";
33
import BehaviorTreeNodeInterface from "./BehaviorTreeNodeInterface";
44

55
/**
66
* A behavior tree leaf node for running an action
77
*
8-
* @property {string} name - The name of the node
9-
* @property {(time: TimeData) => BehaviorTreeStatus} fn - Function to invoke for the action.
8+
* @property {string} name - The name of the node
9+
* @property {(state: StateData) => BehaviorTreeStatus} fn - Function to invoke for the action.
1010
*/
1111
export default class ActionNode implements BehaviorTreeNodeInterface {
1212
public constructor(
1313
public readonly name: string,
14-
public readonly fn: (time: TimeData) => Promise<BehaviorTreeStatus>,
14+
public readonly fn: (state: StateData) => Promise<BehaviorTreeStatus>,
1515
) {
1616
}
1717

18-
public async tick(time: TimeData): Promise<BehaviorTreeStatus> {
19-
return await this.fn(time);
18+
public async tick(state: StateData): Promise<BehaviorTreeStatus> {
19+
return await this.fn(state);
2020
}
2121
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import BehaviorTreeStatus from "../BehaviorTreeStatus";
2-
import TimeData from "../TimeData";
2+
import StateData from "../StateData";
33

44
export default interface BehaviorTreeNodeInterface {
5-
tick(time: TimeData): Promise<BehaviorTreeStatus>;
5+
tick(state: StateData): Promise<BehaviorTreeStatus>;
66
}

src/Node/InverterNode.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import BehaviorTreeStatus from "../BehaviorTreeStatus";
22
import BehaviorTreeError from "../Error/BehaviorTreeError";
33
import Errors from "../Error/Errors";
4-
import TimeData from "../TimeData";
4+
import StateData from "../StateData";
55
import BehaviorTreeNodeInterface from "./BehaviorTreeNodeInterface";
66
import ParentBehaviorTreeNodeInterface from "./ParentBehaviorTreeNodeInterface";
77

@@ -19,12 +19,12 @@ export default class InverterNode implements ParentBehaviorTreeNodeInterface {
1919
public constructor(public readonly name: string) {
2020
}
2121

22-
public async tick(time: TimeData): Promise<BehaviorTreeStatus> {
22+
public async tick(state: StateData): Promise<BehaviorTreeStatus> {
2323
if (!this.childNode) {
2424
throw new BehaviorTreeError(Errors.INVERTER_NO_CHILDREN);
2525
}
2626

27-
const result = await this.childNode.tick(time);
27+
const result = await this.childNode.tick(state);
2828
if (result === BehaviorTreeStatus.Failure) {
2929
return BehaviorTreeStatus.Success;
3030
} else if (result === BehaviorTreeStatus.Success) {

src/Node/ParallelNode.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import BehaviorTreeStatus from "../BehaviorTreeStatus";
2-
import TimeData from "../TimeData";
2+
import StateData from "../StateData";
33
import BehaviorTreeNodeInterface from "./BehaviorTreeNodeInterface";
44
import ParentBehaviorTreeNodeInterface from "./ParentBehaviorTreeNodeInterface";
55

@@ -25,8 +25,8 @@ export default class ParallelNode implements ParentBehaviorTreeNodeInterface {
2525
) {
2626
}
2727

28-
public async tick(time: TimeData): Promise<BehaviorTreeStatus> {
29-
const statuses: BehaviorTreeStatus[] = await Promise.all(this.children.map((c) => this.tickChildren(time, c)));
28+
public async tick(state: StateData): Promise<BehaviorTreeStatus> {
29+
const statuses: BehaviorTreeStatus[] = await Promise.all(this.children.map((c) => this.tickChildren(state, c)));
3030
const succeeded = statuses.filter((x) => x === BehaviorTreeStatus.Success).length;
3131
const failed = statuses.filter((x) => x === BehaviorTreeStatus.Failure).length;
3232

@@ -44,9 +44,9 @@ export default class ParallelNode implements ParentBehaviorTreeNodeInterface {
4444
this.children.push(child);
4545
}
4646

47-
private async tickChildren(time: TimeData, child: BehaviorTreeNodeInterface): Promise<BehaviorTreeStatus> {
47+
private async tickChildren(state: StateData, child: BehaviorTreeNodeInterface): Promise<BehaviorTreeStatus> {
4848
try {
49-
return await child.tick(time);
49+
return await child.tick(state);
5050
} catch (e) {
5151
return BehaviorTreeStatus.Failure;
5252
}

src/Node/SelectorNode.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import BehaviorTreeStatus from "../BehaviorTreeStatus";
22
import NodeEnumerator from "../NodeEnumerator";
3-
import TimeData from "../TimeData";
3+
import StateData from "../StateData";
44
import BehaviorTreeNodeInterface from "./BehaviorTreeNodeInterface";
55
import ParentBehaviorTreeNodeInterface from "./ParentBehaviorTreeNodeInterface";
66

@@ -29,7 +29,7 @@ export default class SelectorNode implements ParentBehaviorTreeNodeInterface {
2929
this.enumerator = new NodeEnumerator(this.children);
3030
}
3131

32-
public async tick(time: TimeData): Promise<BehaviorTreeStatus> {
32+
public async tick(state: StateData): Promise<BehaviorTreeStatus> {
3333
if (!this.enumerator) {
3434
this.init();
3535
}
@@ -39,7 +39,7 @@ export default class SelectorNode implements ParentBehaviorTreeNodeInterface {
3939
}
4040

4141
do {
42-
const status = await this.enumerator.current.tick(time);
42+
const status = await this.enumerator.current.tick(state);
4343
if (status !== BehaviorTreeStatus.Failure) {
4444
if (status === BehaviorTreeStatus.Success) {
4545
this.enumerator.reset();

src/Node/SequenceNode.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import BehaviorTreeStatus from "../BehaviorTreeStatus";
22
import NodeEnumerator from "../NodeEnumerator";
3-
import TimeData from "../TimeData";
3+
import StateData from "../StateData";
44
import BehaviorTreeNodeInterface from "./BehaviorTreeNodeInterface";
55
import ParentBehaviorTreeNodeInterface from "./ParentBehaviorTreeNodeInterface";
66

@@ -29,7 +29,7 @@ export default class SequenceNode implements ParentBehaviorTreeNodeInterface {
2929
this.enumerator = new NodeEnumerator(this.children);
3030
}
3131

32-
public async tick(time: TimeData): Promise<BehaviorTreeStatus> {
32+
public async tick(state: StateData): Promise<BehaviorTreeStatus> {
3333
if (!this.enumerator) {
3434
this.init();
3535
}
@@ -39,7 +39,7 @@ export default class SequenceNode implements ParentBehaviorTreeNodeInterface {
3939
}
4040

4141
do {
42-
const status = await this.enumerator.current.tick(time);
42+
const status = await this.enumerator.current.tick(state);
4343
if (status !== BehaviorTreeStatus.Success) {
4444
if (status === BehaviorTreeStatus.Failure) {
4545
this.enumerator.reset();

src/StateData.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Represents time and state. Used to pass time values to behavior tree nodes.
3+
*
4+
* @property {number} deltaTime - The current time of this state representation
5+
* @property {object} state - Any state data you would like to pass to the nodes.
6+
*/
7+
export default class StateData {
8+
public constructor(public readonly deltaTime: number = 0, public readonly state: any = {}) {
9+
}
10+
}

src/TimeData.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import ParallelNode from "./Node/ParallelNode";
99
import ParentBehaviorTreeNodeInterface from "./Node/ParentBehaviorTreeNodeInterface";
1010
import SelectorNode from "./Node/SelectorNode";
1111
import SequenceNode from "./Node/SequenceNode";
12-
import TimeData from "./TimeData";
12+
import TimeData from "./StateData";
1313

1414
export {
1515
BehaviorTreeBuilder,

0 commit comments

Comments
 (0)