206 lines
6.1 KiB
TypeScript
Raw Normal View History

2025-02-20 11:27:28 +08:00
import { Status } from "../header";
import { Ticker } from "../Ticker";
import { BaseNode } from "./BaseNode";
/**
*
*
*/
export abstract class Composite extends BaseNode {
constructor(...children: BaseNode[]) {
super(children);
}
}
/**
*
* FAILURE
* Child Node返回不为 FAILURE, Node向自己的Parent Node也返回Child Node状态
*/
export class MemSelector extends Composite {
2025-03-07 16:02:00 +08:00
/**
*
* @param {Ticker} ticker
*/
public open(ticker: Ticker): void {
2025-02-20 11:27:28 +08:00
super.open(ticker);
ticker.blackboard.set("runningChild", 0, ticker.tree.id, this.id);
}
2025-03-07 16:02:00 +08:00
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
public tick(ticker: Ticker): Status {
2025-02-20 11:27:28 +08:00
let childIndex = ticker.blackboard.get("runningChild", ticker.tree.id, this.id) as number;
for (let i = childIndex; i < this.children.length; i++) {
let status = this.children[i]._execute(ticker);
if (status !== Status.FAILURE) {
if (status === Status.RUNNING) {
ticker.blackboard.set("runningChild", i, ticker.tree.id, this.id);
}
return status;
}
}
return Status.FAILURE;
}
}
/**
*
* RUNING , , RUNING
* RUNING FAILURE
* Child Node返回不为 SUCCESS, Node向自己的Parent Node也返回Child Node状态
* SUCCESS, SUCCESS
*/
export class MemSequence extends Composite {
2025-03-07 16:02:00 +08:00
/**
*
* @param {Ticker} ticker
*/
public open(ticker: Ticker): void {
2025-02-20 11:27:28 +08:00
super.open(ticker);
ticker.blackboard.set("runningChild", 0, ticker.tree.id, this.id);
}
2025-03-07 16:02:00 +08:00
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
public tick(ticker: Ticker): Status {
2025-02-20 11:27:28 +08:00
let childIndex = ticker.blackboard.get("runningChild", ticker.tree.id, this.id) as number;
for (let i = childIndex; i < this.children.length; i++) {
let status = this.children[i]._execute(ticker);
if (status !== Status.SUCCESS) {
if (status === Status.RUNNING) {
ticker.blackboard.set("runningChild", i, ticker.tree.id, this.id);
}
return status;
}
}
return Status.SUCCESS;
}
}
/**
*
* Child Node中随机选择一个执行
*/
export class RandomSelector extends Composite {
2025-03-07 16:02:00 +08:00
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
public tick(ticker: Ticker): Status {
2025-02-20 11:27:28 +08:00
let childIndex = (Math.random() * this.children.length) | 0;
let child = this.children[childIndex];
let status = child._execute(ticker);
return status;
}
}
/**
* FAILURE
* Node时begin到end迭代执行自己的Child Node
* Child Node执行后返回 SUCCESS RUNINGNode向自己的Parent Node也返回 SUCCESS RUNING
*/
export class Selector extends Composite {
2025-03-07 16:02:00 +08:00
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
public tick(ticker: Ticker): Status {
2025-02-20 11:27:28 +08:00
for (let i = 0; i < this.children.length; i++) {
let status = this.children[i]._execute(ticker);
if (status !== Status.FAILURE) {
return status;
}
}
return Status.FAILURE;
}
}
/**
*
* Node时begin到end迭代执行自己的Child Node
* FAILURE RUNING, FAILURE RUNING
* SUCCESS, SUCCESS
*/
export class Sequence extends Composite {
2025-03-07 16:02:00 +08:00
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
2025-02-20 11:27:28 +08:00
public tick(ticker: Ticker): Status {
for (let i = 0; i < this.children.length; i++) {
let status = this.children[i]._execute(ticker);
if (status !== Status.SUCCESS) {
return status;
}
}
return Status.SUCCESS;
}
}
/**
*
* Node时begin到end迭代执行自己的Child Node
* 1. Child Node执行后返回 FAILURE, FAILURE
* 2. Child Node执行后返回 RUNING, RUNING
* SUCCESS, SUCCESS
*/
export class Parallel extends Composite {
2025-03-07 16:02:00 +08:00
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
2025-02-20 11:27:28 +08:00
public tick(ticker: Ticker): Status {
let result = Status.SUCCESS;
for (let i = 0; i < this.children.length; i++) {
let status = this.children[i]._execute(ticker);
if (status == Status.FAILURE) {
result = Status.FAILURE;
} else if (result == Status.SUCCESS && status == Status.RUNNING) {
result = Status.RUNNING;
}
}
return result;
}
}
/**
*
* Node时begin到end迭代执行自己的Child Node
* 1. Child Node执行后返回 FAILURE, FAILURE
* 2. Child Node SUCCESS, SUCCESS
* RUNNING
*/
export class ParallelAnySuccess extends Composite {
2025-03-07 16:02:00 +08:00
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
2025-02-20 11:27:28 +08:00
public tick(ticker: Ticker): Status {
let result = Status.RUNNING;
for (let i = 0; i < this.children.length; i++) {
let status = this.children[i]._execute(ticker);
if (status == Status.FAILURE) {
result = Status.FAILURE;
} else if (result == Status.RUNNING && status == Status.SUCCESS) {
result = Status.SUCCESS;
}
}
return result;
}
}