Files
kunpocc-behaviortree/src/behaviortree/BTNode/Action.ts

189 lines
4.0 KiB
TypeScript
Raw Normal View History

2025-06-04 23:10:59 +08:00
import { Status } from "../header";
import { Ticker } from "../Ticker";
import { BaseNode } from "./BaseNode";
/**
*
*
*/
export abstract class Action extends BaseNode {
constructor() {
super();
}
}
/**
* ()
* FAILURE
*/
export class Failure extends Action {
/** 执行函数 @internal */
private _func: () => void;
constructor(func: () => void) {
super();
this._func = func;
}
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
public tick(ticker: Ticker): Status {
this._func();
return Status.FAILURE;
}
}
/**
* ()
* RUNING
*/
export class Running extends Action {
/** 执行函数 @internal */
private _func: () => void;
constructor(func: () => void) {
super();
this._func = func;
}
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
public tick(ticker: Ticker): Status {
this._func();
return Status.RUNNING;
}
}
/**
*
* SUCCESS
*/
export class Success extends Action {
/** 执行函数 @internal */
private _func: () => void;
constructor(func: () => void) {
super();
this._func = func;
}
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
public tick(ticker: Ticker): Status {
this._func();
return Status.SUCCESS;
}
}
/**
* ()
* RUNING
* SUCCESS
*/
export class WaitTicks extends Action {
/** 最大次数 @internal */
private _maxTicks: number;
/** 经过的次数 @internal */
private _elapsedTicks: number;
constructor(maxTicks: number = 0) {
super();
this._maxTicks = maxTicks;
this._elapsedTicks = 0;
}
/**
*
* @param {Ticker} ticker
*/
public open(ticker: Ticker): void {
this._elapsedTicks = 0;
}
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
public tick(ticker: Ticker): Status {
if (++this._elapsedTicks >= this._maxTicks) {
this._elapsedTicks = 0;
return Status.SUCCESS;
}
return Status.RUNNING;
}
}
/**
* ()
* SUCCESSRUNING
*/
export class WaitTime extends Action {
/** 等待时间(秒 s) @internal */
2025-06-04 23:10:59 +08:00
private _duration: number;
constructor(duration: number = 0) {
super();
this._duration = duration * 1000;
}
/**
*
* @param {Ticker} ticker
*/
public open(ticker: Ticker): void {
let startTime = new Date().getTime();
ticker.blackboard.set("startTime", startTime, ticker.tree.id, this.id);
}
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
public tick(ticker: Ticker): Status {
let currTime = new Date().getTime();
let startTime = ticker.blackboard.get("startTime", ticker.tree.id, this.id);
if (currTime - startTime >= this._duration) {
return Status.SUCCESS;
}
return Status.RUNNING;
}
}
/**
*
* SUCCESS
* InterruptDefendCancel
*/
export class InterruptDefend extends Action {
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
public tick(ticker: Ticker): Status {
ticker.blackboard.interruptDefend = true;
return Status.SUCCESS;
}
}
/**
*
* SUCCESS
* InterruptDefend
*/
export class InterruptDefendCancel extends Action {
/**
*
* @param {Ticker} ticker
* @returns {Status}
*/
public tick(ticker: Ticker): Status {
ticker.blackboard.interruptDefend = false;
return Status.SUCCESS;
}
}