phaser4-rex-plugins
Version:
191 lines (140 loc) • 5.66 kB
JavaScript
import { RUNNING, IDLE, SUCCESS } from '../../../behaviortree';
import RemoveItem from '../../../../utils/array/Remove.js';
export var OpenEventSheet = function (eventSheetManager, eventsheet) {
var blackboard = eventSheetManager.blackboard;
var commandExecutor = eventSheetManager.commandExecutor;
var result = eventsheet.start(blackboard, commandExecutor);
if (!result) {
return;
}
if (eventsheet.conditionPassed) {
eventSheetManager.emit('eventsheet.enter', eventsheet.title, this.name, eventSheetManager);
} else {
eventSheetManager.emit('eventsheet.catch', eventsheet.title, this.name, eventSheetManager);
}
}
export var TickEventSheet = function (eventSheetManager, eventsheet) {
var blackboard = eventSheetManager.blackboard;
var commandExecutor = eventSheetManager.commandExecutor;
var status = eventsheet.tick(blackboard, commandExecutor);
return status;
}
export var CloseEventSheet = function (eventSheetManager, eventsheet) {
if (eventsheet.conditionPassed) {
eventSheetManager.emit('eventsheet.exit', eventsheet.title, this.name, eventSheetManager);
}
}
export default {
/*
A round :
- Normal case :
- Start from condition-eval,
- End to eventsheet.roundComplete (SUCCESS/FAILURE/ERROR state)
- Cross rounds :
- Start from condition-eval or RUNNING state,
- End to eventsheet.roundComplete (RUNNING/SUCCESS/FAILURE/ERROR state)
*/
start() {
/*
Start a round :
- sequence : Add all trees to pendingTrees
- parallel : Open all event sheets(eventsheet), add them to pendingTrees
Then, invoke continue()
*/
if (this.isRunning) {
return this;
}
this.isRunning = true;
var eventSheetManager = this.parent;
var trees = this.trees;
var pendingTrees = this.pendingTrees;
var blackboard = eventSheetManager.blackboard;
eventSheetManager.emit('start', this.name, eventSheetManager);
// pendingTrees.length = 0;
// Run parallel eventsheet, will return running, or failure
for (var i = 0, cnt = trees.length; i < cnt; i++) {
var eventsheet = trees[i];
if (!eventsheet.active) {
continue;
}
eventsheet.resetState(blackboard);
if (eventsheet.parallel) {
// Open all event sheets
OpenEventSheet.call(this, eventSheetManager, eventsheet);
}
pendingTrees.push(eventsheet);
}
this.continue();
return this;
},
continue() {
/*
Tick event sheets(eventsheet) until all trees are at SUCCESS/FAILURE/ERROR state
- Open (if not opened) and tick event sheet(eventsheet)
- TaskAction's complete event will invoke this method to run remainder nodes
- Close(remove from pendingTrees) SUCCESS/FAILURE/ERROR event sheets(eventsheet)
- Complete this round if pendingTrees is empty. i.e. all trees are return SUCCESS/FAILURE/ERROR.
*/
if (!this.isRunning) {
return this;
}
var eventSheetManager = this.parent;
var trees = this.pendingTrees;
var closedTrees = this.closedTrees;
var blackboard = eventSheetManager.blackboard;
closedTrees.length = 0;
for (var i = 0, cnt = trees.length; i < cnt; i++) {
var eventsheet = trees[i];
// Do nothing if event sheet has been opened
OpenEventSheet.call(this, eventSheetManager, eventsheet);
if (!this.isRunning) {
// Can break here
break;
}
// Will goto RUNNING, or SUCCESS/FAILURE/ERROR state
var status = TickEventSheet(eventSheetManager, eventsheet);
if (eventsheet.roundComplete) {
closedTrees.push(eventsheet);
CloseEventSheet.call(this, eventSheetManager, eventsheet);
} else if (status === RUNNING) {
// Stall command execution here
break;
}
if (!this.isRunning) {
// Can break here
break;
}
}
blackboard.eventSheetGroup = undefined;
if (closedTrees.length > 0) {
RemoveItem(trees, closedTrees);
}
if (trees.length === 0) {
this.isRunning = false;
eventSheetManager.emit('complete', this.name, eventSheetManager);
}
return this;
},
startTree(title, ignoreCondition = true) {
// Run a single event sheet(eventsheet)
if (this.isRunning) {
return this;
}
var eventsheet = this.getTree(title);
if (!eventsheet) {
return this;
}
this.isRunning = true;
var eventSheetManager = this.parent;
var pendingTrees = this.pendingTrees;
var blackboard = eventSheetManager.blackboard;
pendingTrees.length = 0;
eventsheet.resetState(blackboard);
eventsheet.setConditionEnable(!ignoreCondition);
OpenEventSheet.call(this, eventSheetManager, eventsheet);
eventsheet.setConditionEnable(true);
pendingTrees.push(eventsheet);
this.continue();
return this;
}
}