feat(bt): implement subtree status clearing in TaskRunner
Introduce `clearSubtree` to recursively reset status for an entity and all its descendants. This ensures that when a task reaches a terminal state, its entire branch is properly reset. Also refactor the Tetris example to use a sequential task node within the behavior tree.
This commit is contained in:
+10
-2
@@ -44,6 +44,14 @@ function clearStatus(world: World, entity: Entity): void {
|
||||
if (world.has(entity, Running)) world.remove(entity, Running);
|
||||
}
|
||||
|
||||
/** Recursively clear status from an entity and all its descendants. */
|
||||
function clearSubtree(world: World, entity: Entity): void {
|
||||
clearStatus(world, entity);
|
||||
for (const child of childrenOf(world, entity)) {
|
||||
clearSubtree(world, child);
|
||||
}
|
||||
}
|
||||
|
||||
function childrenOf(world: World, parent: Entity): Entity[] {
|
||||
return world.getRelatedTo(parent, ChildOf);
|
||||
}
|
||||
@@ -258,9 +266,9 @@ export class TaskRunner {
|
||||
|
||||
const child = children[0];
|
||||
|
||||
// If child reached a terminal, reset it and schedule again
|
||||
// If child reached a terminal, reset the entire subtree and schedule again
|
||||
if (isTerminal(this._world, child)) {
|
||||
clearStatus(this._world, child);
|
||||
clearSubtree(this._world, child);
|
||||
this._world.add(child, Scheduled);
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user