phaser4-rex-plugins
Version:
110 lines (92 loc) • 3.4 kB
JavaScript
import { Action, } from '../../../../behaviortree/index.js';
import PauseEventSheetMethods from './PauseEventSheetMethods.js';
import IsEventEmitter from '../../../../../utils/system/IsEventEmitter.js';
import Compile from '../../../../../math/expressionparser/utils/Complile.js';
import mustache from 'mustache';
class TaskAction extends Action {
constructor(config) {
// config: {name, parameters:{...} }
super({
name: 'TaskAction',
title: config.name,
properties: config,
});
var sourceParameters = config.parameters;
var taskParameters = {};
for (var name in sourceParameters) {
taskParameters[name] = CompileExpression(sourceParameters[name]);
}
this.taskParameters = taskParameters;
this.isRunning = false;
this.waitId = 0;
}
open(tick) {
this.isRunning = false;
var taskData = this.properties;
var taskName = taskData.name;
if (!taskName) {
return;
}
var blackboard = tick.blackboard;
var eventSheetManager = blackboard.eventSheetManager;
var eventSheet = tick.tree;
var memory = eventSheetManager.memory;
var taskParameters = this.taskParameters;
var parametersCopy = {};
for (var name in taskParameters) {
var value = taskParameters[name];
if (typeof (value) === 'function') {
value = value(memory);
}
parametersCopy[name] = value;
}
eventSheetManager.bindTaskActionNode(tick, this);
// Invoke eventSheetManager.pauseEventSheet() to generate new resumeEventName
var commandExecutor = tick.target;
var eventEmitter;
var handler = commandExecutor[taskName];
if (handler) {
eventEmitter = handler.call(commandExecutor, parametersCopy, eventSheetManager, eventSheet);
} else {
handler = commandExecutor.defaultHandler;
if (handler) {
eventEmitter = handler.call(commandExecutor, taskName, parametersCopy, eventSheetManager, eventSheet);
}
}
eventSheetManager.unBindTaskAction(tick, this);
// Event-emitter mode
if (!this.isRunning && IsEventEmitter(eventEmitter)) {
this.pauseEventSheetUnitlEvent(tick, eventEmitter);
}
}
tick(tick) {
return (this.isRunning) ? this.RUNNING : this.SUCCESS;
}
close(tick) {
}
abort(tick) {
if (this.removeTaskCompleteCallback) {
this.removeTaskCompleteCallback();
}
}
}
var CompileExpression = function (s) {
if (typeof (s) === 'string') {
if (s.startsWith('#(') && s.endsWith(')')) {
// Eval string to get number/boolean
s = Compile(s.substring(2, s.length - 1));
} else if ((s.indexOf('{{') > -1) && (s.indexOf('}}') > -1)) {
// Might be a string template
var template = s;
s = function (data) {
return mustache.render(template, data);
}
}
}
return s;
}
Object.assign(
TaskAction.prototype,
PauseEventSheetMethods,
)
export default TaskAction