Files
esengine/packages/behavior-tree/src/execution/Executors/BlackboardCompare.ts

74 lines
2.3 KiB
TypeScript
Raw Normal View History

import { TaskStatus, NodeType } from '../../Types/TaskStatus';
import { INodeExecutor, NodeExecutionContext, BindingHelper } from '../NodeExecutor';
import { NodeExecutorMetadata } from '../NodeMetadata';
/**
*
*
*
*/
@NodeExecutorMetadata({
implementationType: 'BlackboardCompare',
nodeType: NodeType.Condition,
displayName: '黑板比较',
description: '比较黑板中的值',
category: 'Condition',
configSchema: {
key: {
type: 'string',
default: '',
description: '黑板变量名'
},
compareValue: {
type: 'object',
description: '比较值',
supportBinding: true
},
operator: {
type: 'string',
default: 'equals',
description: '比较运算符',
options: ['equals', 'notEquals', 'greaterThan', 'lessThan', 'greaterOrEqual', 'lessOrEqual']
}
}
})
export class BlackboardCompare implements INodeExecutor {
execute(context: NodeExecutionContext): TaskStatus {
const { runtime } = context;
const key = BindingHelper.getValue<string>(context, 'key', '');
const compareValue = BindingHelper.getValue(context, 'compareValue');
const operator = BindingHelper.getValue<string>(context, 'operator', 'equals');
if (!key) {
return TaskStatus.Failure;
}
const actualValue = runtime.getBlackboardValue(key);
if (this.compare(actualValue, compareValue, operator)) {
return TaskStatus.Success;
}
return TaskStatus.Failure;
}
private compare(actualValue: any, compareValue: any, operator: string): boolean {
switch (operator) {
case 'equals':
return actualValue === compareValue;
case 'notEquals':
return actualValue !== compareValue;
case 'greaterThan':
return actualValue > compareValue;
case 'lessThan':
return actualValue < compareValue;
case 'greaterOrEqual':
return actualValue >= compareValue;
case 'lessOrEqual':
return actualValue <= compareValue;
default:
return false;
}
}
}