@alife-sdk/core 0.1.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -2
- package/dist/ai/BehaviorTree.d.ts +174 -0
- package/dist/ai/BehaviorTree.d.ts.map +1 -0
- package/dist/ai/BehaviorTree.js +280 -0
- package/dist/ai/BehaviorTree.js.map +1 -0
- package/dist/ai/GOAPAction.d.ts +21 -1
- package/dist/ai/GOAPAction.d.ts.map +1 -1
- package/dist/ai/GOAPPlanner.d.ts +4 -3
- package/dist/ai/GOAPPlanner.d.ts.map +1 -1
- package/dist/ai/GOAPPlanner.js +31 -3
- package/dist/ai/GOAPPlanner.js.map +1 -1
- package/dist/ai/StateMachine.d.ts +38 -0
- package/dist/ai/StateMachine.d.ts.map +1 -1
- package/dist/ai/StateMachine.js +80 -0
- package/dist/ai/StateMachine.js.map +1 -1
- package/dist/ai/WorldState.d.ts +8 -0
- package/dist/ai/WorldState.d.ts.map +1 -1
- package/dist/ai/WorldState.js +14 -0
- package/dist/ai/WorldState.js.map +1 -1
- package/dist/ai/index.d.ts +5 -1
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +1 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/core/ReactiveQuery.d.ts +85 -0
- package/dist/core/ReactiveQuery.d.ts.map +1 -0
- package/dist/core/ReactiveQuery.js +154 -0
- package/dist/core/ReactiveQuery.js.map +1 -0
- package/dist/entity/EntityHandle.d.ts +76 -0
- package/dist/entity/EntityHandle.d.ts.map +1 -0
- package/dist/entity/EntityHandle.js +133 -0
- package/dist/entity/EntityHandle.js.map +1 -0
- package/dist/entity/index.d.ts +2 -0
- package/dist/entity/index.d.ts.map +1 -1
- package/dist/entity/index.js +1 -1
- package/dist/entity/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/registry/AIStateRegistry.d.ts +4 -0
- package/dist/registry/AIStateRegistry.d.ts.map +1 -1
- package/dist/registry/AIStateRegistry.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -198,9 +198,27 @@ Every online NPC runs a `StateMachine` over states registered in `AIStateRegistr
|
|
|
198
198
|
Each state has `enter / update / exit` handlers and optional auto-transition rules.
|
|
199
199
|
|
|
200
200
|
Elite NPCs (rank ≥ 5) additionally run a `GOAPPlanner` — an A* planner over
|
|
201
|
-
a `WorldState`
|
|
201
|
+
a `WorldState` that picks the optimal action sequence to achieve a goal.
|
|
202
202
|
|
|
203
|
-
|
|
203
|
+
Actions are registered as plain objects — no subclassing required:
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
import { GOAPPlanner, WorldState } from '@alife-sdk/core/ai';
|
|
207
|
+
|
|
208
|
+
const planner = new GOAPPlanner();
|
|
209
|
+
|
|
210
|
+
planner.registerAction({
|
|
211
|
+
id: 'heal_self', cost: 2,
|
|
212
|
+
preconditions: { hasMedkit: true, isHealthy: false },
|
|
213
|
+
effects: { hasMedkit: false, isHealthy: true },
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
const current = WorldState.from({ isHealthy: false, hasMedkit: true });
|
|
217
|
+
const goal = WorldState.from({ isHealthy: true });
|
|
218
|
+
const plan = planner.plan(current, goal); // ['heal_self']
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
See [`ai/README.md`](src/ai/README.md) for the full API including class-based `GOAPAction` for complex multi-frame logic.
|
|
204
222
|
|
|
205
223
|
### Offline simulation — LevelGraph + SmartTerrain
|
|
206
224
|
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Behavior Tree — hierarchical AI task composition.
|
|
3
|
+
*
|
|
4
|
+
* Pairs well with GOAP: GOAP decides *what* goal to pursue, the BT decides
|
|
5
|
+
* *how* to execute it step by step. The BT is driven externally by calling
|
|
6
|
+
* `tree.tick(blackboard)` each frame or simulation step.
|
|
7
|
+
*
|
|
8
|
+
* Node types:
|
|
9
|
+
* Composites — Sequence, Selector, Parallel
|
|
10
|
+
* Decorators — Inverter, Repeater, AlwaysSucceed, AlwaysFail, Cooldown
|
|
11
|
+
* Leaves — Task (action), Condition
|
|
12
|
+
*
|
|
13
|
+
* Blackboard:
|
|
14
|
+
* Typed key-value store shared across all nodes in one tick. Nodes read
|
|
15
|
+
* perception data from it and write intermediate results to it.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const bb = new Blackboard({ canSeeTarget: false, ammoCount: 10 });
|
|
20
|
+
*
|
|
21
|
+
* const tree = new Selector([
|
|
22
|
+
* new Sequence([
|
|
23
|
+
* new Condition((bb) => bb.get('canSeeTarget')),
|
|
24
|
+
* new Condition((bb) => bb.get('ammoCount') > 0),
|
|
25
|
+
* new Task((bb) => { shoot(); return 'success'; }),
|
|
26
|
+
* ]),
|
|
27
|
+
* new Task(() => { patrol(); return 'running'; }),
|
|
28
|
+
* ]);
|
|
29
|
+
*
|
|
30
|
+
* // Each frame:
|
|
31
|
+
* tree.tick(bb);
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
/** Result returned by every node's `tick()`. */
|
|
35
|
+
export type TaskStatus = 'success' | 'failure' | 'running';
|
|
36
|
+
/**
|
|
37
|
+
* Typed key-value store shared across all nodes during a single tick.
|
|
38
|
+
*
|
|
39
|
+
* Initialize it with a plain object; the keys become the allowed set of keys
|
|
40
|
+
* via the generic type parameter.
|
|
41
|
+
*/
|
|
42
|
+
export declare class Blackboard<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
43
|
+
private readonly data;
|
|
44
|
+
constructor(initial?: Partial<T>);
|
|
45
|
+
get<K extends keyof T>(key: K): T[K] | undefined;
|
|
46
|
+
/** Return the value for `key`, or `defaultValue` if the key is unset. */
|
|
47
|
+
getOr<K extends keyof T>(key: K, defaultValue: NonNullable<T[K]>): NonNullable<T[K]>;
|
|
48
|
+
set<K extends keyof T>(key: K, value: T[K]): void;
|
|
49
|
+
has(key: keyof T): boolean;
|
|
50
|
+
delete(key: keyof T): void;
|
|
51
|
+
}
|
|
52
|
+
/** Every node in the tree implements this single interface. */
|
|
53
|
+
export interface ITreeNode<TBB extends Blackboard = Blackboard> {
|
|
54
|
+
tick(blackboard: TBB): TaskStatus;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Task (action leaf).
|
|
58
|
+
* Runs an arbitrary callback; the callback returns the status directly.
|
|
59
|
+
*/
|
|
60
|
+
export declare class Task<TBB extends Blackboard = Blackboard> implements ITreeNode<TBB> {
|
|
61
|
+
private readonly action;
|
|
62
|
+
constructor(action: (bb: TBB) => TaskStatus);
|
|
63
|
+
tick(bb: TBB): TaskStatus;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Condition (boolean leaf).
|
|
67
|
+
* Returns 'success' when the predicate is true, 'failure' otherwise.
|
|
68
|
+
*/
|
|
69
|
+
export declare class Condition<TBB extends Blackboard = Blackboard> implements ITreeNode<TBB> {
|
|
70
|
+
private readonly predicate;
|
|
71
|
+
constructor(predicate: (bb: TBB) => boolean);
|
|
72
|
+
tick(bb: TBB): TaskStatus;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Sequence — AND gate.
|
|
76
|
+
* Ticks children left-to-right. Returns 'failure' on the first failing child,
|
|
77
|
+
* 'running' on the first running child, 'success' when all succeed.
|
|
78
|
+
*/
|
|
79
|
+
export declare class Sequence<TBB extends Blackboard = Blackboard> implements ITreeNode<TBB> {
|
|
80
|
+
private readonly children;
|
|
81
|
+
constructor(children: ITreeNode<TBB>[]);
|
|
82
|
+
tick(bb: TBB): TaskStatus;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Selector — OR gate.
|
|
86
|
+
* Ticks children left-to-right. Returns 'success' on the first succeeding
|
|
87
|
+
* child, 'running' on the first running child, 'failure' when all fail.
|
|
88
|
+
*/
|
|
89
|
+
export declare class Selector<TBB extends Blackboard = Blackboard> implements ITreeNode<TBB> {
|
|
90
|
+
private readonly children;
|
|
91
|
+
constructor(children: ITreeNode<TBB>[]);
|
|
92
|
+
tick(bb: TBB): TaskStatus;
|
|
93
|
+
}
|
|
94
|
+
/** Policy for the Parallel node. */
|
|
95
|
+
export type ParallelPolicy = 'require-all' | 'require-one';
|
|
96
|
+
/**
|
|
97
|
+
* Parallel — ticks ALL children every tick simultaneously.
|
|
98
|
+
*
|
|
99
|
+
* `require-all` (default — AND semantics):
|
|
100
|
+
* - Success: all children succeed.
|
|
101
|
+
* - Failure: any child fails.
|
|
102
|
+
* - Running: otherwise.
|
|
103
|
+
*
|
|
104
|
+
* `require-one` (OR semantics):
|
|
105
|
+
* - Success: at least one child succeeds.
|
|
106
|
+
* - Failure: all children fail.
|
|
107
|
+
* - Running: otherwise (some running, none succeeded yet).
|
|
108
|
+
*/
|
|
109
|
+
export declare class Parallel<TBB extends Blackboard = Blackboard> implements ITreeNode<TBB> {
|
|
110
|
+
private readonly children;
|
|
111
|
+
private readonly successPolicy;
|
|
112
|
+
constructor(children: ITreeNode<TBB>[], successPolicy?: ParallelPolicy);
|
|
113
|
+
tick(bb: TBB): TaskStatus;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Inverter — flips 'success' ↔ 'failure'; passes 'running' unchanged.
|
|
117
|
+
*/
|
|
118
|
+
export declare class Inverter<TBB extends Blackboard = Blackboard> implements ITreeNode<TBB> {
|
|
119
|
+
private readonly child;
|
|
120
|
+
constructor(child: ITreeNode<TBB>);
|
|
121
|
+
tick(bb: TBB): TaskStatus;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* AlwaysSucceed — maps any child result to 'success'.
|
|
125
|
+
*/
|
|
126
|
+
export declare class AlwaysSucceed<TBB extends Blackboard = Blackboard> implements ITreeNode<TBB> {
|
|
127
|
+
private readonly child;
|
|
128
|
+
constructor(child: ITreeNode<TBB>);
|
|
129
|
+
tick(bb: TBB): TaskStatus;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* AlwaysFail — maps any child result to 'failure'.
|
|
133
|
+
*/
|
|
134
|
+
export declare class AlwaysFail<TBB extends Blackboard = Blackboard> implements ITreeNode<TBB> {
|
|
135
|
+
private readonly child;
|
|
136
|
+
constructor(child: ITreeNode<TBB>);
|
|
137
|
+
tick(bb: TBB): TaskStatus;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Repeater — ticks its child N times, returning 'success' after all iterations.
|
|
141
|
+
* If the child returns 'failure' the repeater short-circuits with 'failure'.
|
|
142
|
+
* Pass `Infinity` for an endless loop (returns 'running' every tick).
|
|
143
|
+
*/
|
|
144
|
+
export declare class Repeater<TBB extends Blackboard = Blackboard> implements ITreeNode<TBB> {
|
|
145
|
+
private readonly child;
|
|
146
|
+
private readonly times;
|
|
147
|
+
private remaining;
|
|
148
|
+
constructor(child: ITreeNode<TBB>, times: number);
|
|
149
|
+
tick(bb: TBB): TaskStatus;
|
|
150
|
+
/** Reset the repeat counter to allow reuse. */
|
|
151
|
+
reset(): void;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Cooldown — blocks its child while a cooldown timer is active.
|
|
155
|
+
*
|
|
156
|
+
* When the cooldown is inactive: ticks the child normally. If the child
|
|
157
|
+
* succeeds, starts the cooldown and returns 'success'. While the cooldown
|
|
158
|
+
* is active: immediately returns 'failure' (the action is on cooldown).
|
|
159
|
+
*
|
|
160
|
+
* `now` defaults to `Date.now` — inject a custom clock for deterministic tests.
|
|
161
|
+
*/
|
|
162
|
+
export declare class Cooldown<TBB extends Blackboard = Blackboard> implements ITreeNode<TBB> {
|
|
163
|
+
private readonly child;
|
|
164
|
+
private readonly durationMs;
|
|
165
|
+
private readonly clock;
|
|
166
|
+
private readyAt;
|
|
167
|
+
constructor(child: ITreeNode<TBB>, durationMs: number, clock?: () => number);
|
|
168
|
+
tick(bb: TBB): TaskStatus;
|
|
169
|
+
/** Force the cooldown to expire immediately. */
|
|
170
|
+
reset(): void;
|
|
171
|
+
/** `true` while the cooldown timer is active. */
|
|
172
|
+
get isOnCooldown(): boolean;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=BehaviorTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BehaviorTree.d.ts","sourceRoot":"","sources":["../../src/ai/BehaviorTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Behavior Tree — hierarchical AI task composition.
|
|
3
|
+
*
|
|
4
|
+
* Pairs well with GOAP: GOAP decides *what* goal to pursue, the BT decides
|
|
5
|
+
* *how* to execute it step by step. The BT is driven externally by calling
|
|
6
|
+
* `tree.tick(blackboard)` each frame or simulation step.
|
|
7
|
+
*
|
|
8
|
+
* Node types:
|
|
9
|
+
* Composites — Sequence, Selector, Parallel
|
|
10
|
+
* Decorators — Inverter, Repeater, AlwaysSucceed, AlwaysFail, Cooldown
|
|
11
|
+
* Leaves — Task (action), Condition
|
|
12
|
+
*
|
|
13
|
+
* Blackboard:
|
|
14
|
+
* Typed key-value store shared across all nodes in one tick. Nodes read
|
|
15
|
+
* perception data from it and write intermediate results to it.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const bb = new Blackboard({ canSeeTarget: false, ammoCount: 10 });
|
|
20
|
+
*
|
|
21
|
+
* const tree = new Selector([
|
|
22
|
+
* new Sequence([
|
|
23
|
+
* new Condition((bb) => bb.get('canSeeTarget')),
|
|
24
|
+
* new Condition((bb) => bb.get('ammoCount') > 0),
|
|
25
|
+
* new Task((bb) => { shoot(); return 'success'; }),
|
|
26
|
+
* ]),
|
|
27
|
+
* new Task(() => { patrol(); return 'running'; }),
|
|
28
|
+
* ]);
|
|
29
|
+
*
|
|
30
|
+
* // Each frame:
|
|
31
|
+
* tree.tick(bb);
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Blackboard
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
/**
|
|
38
|
+
* Typed key-value store shared across all nodes during a single tick.
|
|
39
|
+
*
|
|
40
|
+
* Initialize it with a plain object; the keys become the allowed set of keys
|
|
41
|
+
* via the generic type parameter.
|
|
42
|
+
*/
|
|
43
|
+
export class Blackboard {
|
|
44
|
+
constructor(initial = {}) {
|
|
45
|
+
this.data = new Map(Object.entries(initial));
|
|
46
|
+
}
|
|
47
|
+
get(key) {
|
|
48
|
+
return this.data.get(key);
|
|
49
|
+
}
|
|
50
|
+
/** Return the value for `key`, or `defaultValue` if the key is unset. */
|
|
51
|
+
getOr(key, defaultValue) {
|
|
52
|
+
const v = this.data.get(key);
|
|
53
|
+
return (v !== undefined && v !== null ? v : defaultValue);
|
|
54
|
+
}
|
|
55
|
+
set(key, value) {
|
|
56
|
+
this.data.set(key, value);
|
|
57
|
+
}
|
|
58
|
+
has(key) {
|
|
59
|
+
return this.data.has(key);
|
|
60
|
+
}
|
|
61
|
+
delete(key) {
|
|
62
|
+
this.data.delete(key);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Leaf nodes
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
/**
|
|
69
|
+
* Task (action leaf).
|
|
70
|
+
* Runs an arbitrary callback; the callback returns the status directly.
|
|
71
|
+
*/
|
|
72
|
+
export class Task {
|
|
73
|
+
constructor(action) {
|
|
74
|
+
this.action = action;
|
|
75
|
+
}
|
|
76
|
+
tick(bb) {
|
|
77
|
+
return this.action(bb);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Condition (boolean leaf).
|
|
82
|
+
* Returns 'success' when the predicate is true, 'failure' otherwise.
|
|
83
|
+
*/
|
|
84
|
+
export class Condition {
|
|
85
|
+
constructor(predicate) {
|
|
86
|
+
this.predicate = predicate;
|
|
87
|
+
}
|
|
88
|
+
tick(bb) {
|
|
89
|
+
return this.predicate(bb) ? 'success' : 'failure';
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Composite nodes
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
/**
|
|
96
|
+
* Sequence — AND gate.
|
|
97
|
+
* Ticks children left-to-right. Returns 'failure' on the first failing child,
|
|
98
|
+
* 'running' on the first running child, 'success' when all succeed.
|
|
99
|
+
*/
|
|
100
|
+
export class Sequence {
|
|
101
|
+
constructor(children) {
|
|
102
|
+
this.children = children;
|
|
103
|
+
}
|
|
104
|
+
tick(bb) {
|
|
105
|
+
for (const child of this.children) {
|
|
106
|
+
const status = child.tick(bb);
|
|
107
|
+
if (status !== 'success')
|
|
108
|
+
return status;
|
|
109
|
+
}
|
|
110
|
+
return 'success';
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Selector — OR gate.
|
|
115
|
+
* Ticks children left-to-right. Returns 'success' on the first succeeding
|
|
116
|
+
* child, 'running' on the first running child, 'failure' when all fail.
|
|
117
|
+
*/
|
|
118
|
+
export class Selector {
|
|
119
|
+
constructor(children) {
|
|
120
|
+
this.children = children;
|
|
121
|
+
}
|
|
122
|
+
tick(bb) {
|
|
123
|
+
for (const child of this.children) {
|
|
124
|
+
const status = child.tick(bb);
|
|
125
|
+
if (status !== 'failure')
|
|
126
|
+
return status;
|
|
127
|
+
}
|
|
128
|
+
return 'failure';
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Parallel — ticks ALL children every tick simultaneously.
|
|
133
|
+
*
|
|
134
|
+
* `require-all` (default — AND semantics):
|
|
135
|
+
* - Success: all children succeed.
|
|
136
|
+
* - Failure: any child fails.
|
|
137
|
+
* - Running: otherwise.
|
|
138
|
+
*
|
|
139
|
+
* `require-one` (OR semantics):
|
|
140
|
+
* - Success: at least one child succeeds.
|
|
141
|
+
* - Failure: all children fail.
|
|
142
|
+
* - Running: otherwise (some running, none succeeded yet).
|
|
143
|
+
*/
|
|
144
|
+
export class Parallel {
|
|
145
|
+
constructor(children, successPolicy = 'require-all') {
|
|
146
|
+
this.children = children;
|
|
147
|
+
this.successPolicy = successPolicy;
|
|
148
|
+
}
|
|
149
|
+
tick(bb) {
|
|
150
|
+
let successCount = 0;
|
|
151
|
+
let failureCount = 0;
|
|
152
|
+
for (const child of this.children) {
|
|
153
|
+
const status = child.tick(bb);
|
|
154
|
+
if (status === 'success')
|
|
155
|
+
successCount++;
|
|
156
|
+
else if (status === 'failure')
|
|
157
|
+
failureCount++;
|
|
158
|
+
}
|
|
159
|
+
if (this.successPolicy === 'require-all') {
|
|
160
|
+
if (failureCount > 0)
|
|
161
|
+
return 'failure';
|
|
162
|
+
if (successCount === this.children.length)
|
|
163
|
+
return 'success';
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
if (successCount > 0)
|
|
167
|
+
return 'success';
|
|
168
|
+
if (failureCount === this.children.length)
|
|
169
|
+
return 'failure';
|
|
170
|
+
}
|
|
171
|
+
return 'running';
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
// Decorator nodes
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
/**
|
|
178
|
+
* Inverter — flips 'success' ↔ 'failure'; passes 'running' unchanged.
|
|
179
|
+
*/
|
|
180
|
+
export class Inverter {
|
|
181
|
+
constructor(child) {
|
|
182
|
+
this.child = child;
|
|
183
|
+
}
|
|
184
|
+
tick(bb) {
|
|
185
|
+
const status = this.child.tick(bb);
|
|
186
|
+
if (status === 'success')
|
|
187
|
+
return 'failure';
|
|
188
|
+
if (status === 'failure')
|
|
189
|
+
return 'success';
|
|
190
|
+
return 'running';
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* AlwaysSucceed — maps any child result to 'success'.
|
|
195
|
+
*/
|
|
196
|
+
export class AlwaysSucceed {
|
|
197
|
+
constructor(child) {
|
|
198
|
+
this.child = child;
|
|
199
|
+
}
|
|
200
|
+
tick(bb) {
|
|
201
|
+
this.child.tick(bb);
|
|
202
|
+
return 'success';
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* AlwaysFail — maps any child result to 'failure'.
|
|
207
|
+
*/
|
|
208
|
+
export class AlwaysFail {
|
|
209
|
+
constructor(child) {
|
|
210
|
+
this.child = child;
|
|
211
|
+
}
|
|
212
|
+
tick(bb) {
|
|
213
|
+
this.child.tick(bb);
|
|
214
|
+
return 'failure';
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Repeater — ticks its child N times, returning 'success' after all iterations.
|
|
219
|
+
* If the child returns 'failure' the repeater short-circuits with 'failure'.
|
|
220
|
+
* Pass `Infinity` for an endless loop (returns 'running' every tick).
|
|
221
|
+
*/
|
|
222
|
+
export class Repeater {
|
|
223
|
+
constructor(child, times) {
|
|
224
|
+
this.child = child;
|
|
225
|
+
this.times = times;
|
|
226
|
+
this.remaining = times;
|
|
227
|
+
}
|
|
228
|
+
tick(bb) {
|
|
229
|
+
if (this.remaining <= 0)
|
|
230
|
+
return 'success';
|
|
231
|
+
const status = this.child.tick(bb);
|
|
232
|
+
if (status === 'failure')
|
|
233
|
+
return 'failure';
|
|
234
|
+
if (status === 'success') {
|
|
235
|
+
this.remaining--;
|
|
236
|
+
if (this.remaining <= 0)
|
|
237
|
+
return 'success';
|
|
238
|
+
}
|
|
239
|
+
return 'running';
|
|
240
|
+
}
|
|
241
|
+
/** Reset the repeat counter to allow reuse. */
|
|
242
|
+
reset() {
|
|
243
|
+
this.remaining = this.times;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Cooldown — blocks its child while a cooldown timer is active.
|
|
248
|
+
*
|
|
249
|
+
* When the cooldown is inactive: ticks the child normally. If the child
|
|
250
|
+
* succeeds, starts the cooldown and returns 'success'. While the cooldown
|
|
251
|
+
* is active: immediately returns 'failure' (the action is on cooldown).
|
|
252
|
+
*
|
|
253
|
+
* `now` defaults to `Date.now` — inject a custom clock for deterministic tests.
|
|
254
|
+
*/
|
|
255
|
+
export class Cooldown {
|
|
256
|
+
constructor(child, durationMs, clock = Date.now) {
|
|
257
|
+
this.child = child;
|
|
258
|
+
this.durationMs = durationMs;
|
|
259
|
+
this.clock = clock;
|
|
260
|
+
this.readyAt = 0;
|
|
261
|
+
}
|
|
262
|
+
tick(bb) {
|
|
263
|
+
if (this.clock() < this.readyAt)
|
|
264
|
+
return 'failure';
|
|
265
|
+
const status = this.child.tick(bb);
|
|
266
|
+
if (status === 'success') {
|
|
267
|
+
this.readyAt = this.clock() + this.durationMs;
|
|
268
|
+
}
|
|
269
|
+
return status;
|
|
270
|
+
}
|
|
271
|
+
/** Force the cooldown to expire immediately. */
|
|
272
|
+
reset() {
|
|
273
|
+
this.readyAt = 0;
|
|
274
|
+
}
|
|
275
|
+
/** `true` while the cooldown timer is active. */
|
|
276
|
+
get isOnCooldown() {
|
|
277
|
+
return this.clock() < this.readyAt;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=BehaviorTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BehaviorTree.js","sourceRoot":"","sources":["../../src/ai/BehaviorTree.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/GOAPAction.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* 2. execute() -- called every tick; returns RUNNING / SUCCESS / FAILURE
|
|
13
13
|
* 3. abort() -- called when the action is interrupted (default no-op)
|
|
14
14
|
*/
|
|
15
|
-
import type { WorldState } from './WorldState';
|
|
15
|
+
import type { WorldState, WorldStateValue } from './WorldState';
|
|
16
16
|
import type { IEntity } from '../entity/IEntity';
|
|
17
17
|
export declare const ActionStatus: {
|
|
18
18
|
readonly RUNNING: "running";
|
|
@@ -42,4 +42,24 @@ export declare abstract class GOAPAction {
|
|
|
42
42
|
/** Called when the action is interrupted. Override for cleanup. */
|
|
43
43
|
abort(_entity: IEntity): void;
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Plain-object descriptor for a GOAP action.
|
|
47
|
+
* Alternative to subclassing {@link GOAPAction} for simple cases.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* planner.registerAction({
|
|
51
|
+
* id: 'TakePosition',
|
|
52
|
+
* cost: 1,
|
|
53
|
+
* preconditions: { inPosition: false },
|
|
54
|
+
* effects: { inPosition: true },
|
|
55
|
+
* });
|
|
56
|
+
*/
|
|
57
|
+
export interface GOAPActionDef {
|
|
58
|
+
readonly id: string;
|
|
59
|
+
readonly cost: number;
|
|
60
|
+
readonly preconditions: Record<string, WorldStateValue>;
|
|
61
|
+
readonly effects: Record<string, WorldStateValue>;
|
|
62
|
+
isValid?(entity: IEntity): boolean;
|
|
63
|
+
execute?(entity: IEntity, delta: number): ActionStatus;
|
|
64
|
+
}
|
|
45
65
|
//# sourceMappingURL=GOAPAction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GOAPAction.d.ts","sourceRoot":"","sources":["../../src/ai/GOAPAction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"GOAPAction.d.ts","sourceRoot":"","sources":["../../src/ai/GOAPAction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAMjD,eAAO,MAAM,YAAY;;;;CAIf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAM5E,8BAAsB,UAAU;IAC9B,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAE7B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B,mEAAmE;IACnE,QAAQ,CAAC,gBAAgB,IAAI,UAAU;IAEvC,oEAAoE;IACpE,QAAQ,CAAC,UAAU,IAAI,UAAU;IAEjC,mEAAmE;IACnE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;IAE1C;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY;IAE9D,mEAAmE;IACnE,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAG9B;AAMD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAQ,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxD,OAAO,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IACnC,OAAO,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;CACxD"}
|
package/dist/ai/GOAPPlanner.d.ts
CHANGED
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
* Time: O(b^d) where b = |availableActions|, d = plan depth (<= maxDepth)
|
|
14
14
|
* Space: O(b^d) for the open/closed sets, bounded by maxDepth
|
|
15
15
|
*/
|
|
16
|
-
import
|
|
17
|
-
import type {
|
|
16
|
+
import { GOAPAction } from './GOAPAction';
|
|
17
|
+
import type { GOAPActionDef } from './GOAPAction';
|
|
18
|
+
import { WorldState } from './WorldState';
|
|
18
19
|
export declare class GOAPPlanner {
|
|
19
20
|
private readonly actions;
|
|
20
21
|
private readonly defaultMaxDepth;
|
|
@@ -24,7 +25,7 @@ export declare class GOAPPlanner {
|
|
|
24
25
|
private readonly _open;
|
|
25
26
|
constructor(defaultMaxDepth?: number);
|
|
26
27
|
/** Register an action that the planner can use when building plans. */
|
|
27
|
-
registerAction(action: GOAPAction): void;
|
|
28
|
+
registerAction(action: GOAPAction | GOAPActionDef): void;
|
|
28
29
|
/**
|
|
29
30
|
* Find the optimal action sequence from the current state to the goal.
|
|
30
31
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GOAPPlanner.d.ts","sourceRoot":"","sources":["../../src/ai/GOAPPlanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"GOAPPlanner.d.ts","sourceRoot":"","sources":["../../src/ai/GOAPPlanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAgB,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAkC1C,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAG7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAGjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;gBAE5B,eAAe,GAAE,MAA0B;IAIvD,uEAAuE;IACvE,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAWxD;;;;;;;OAOG;IACH,IAAI,CACF,YAAY,EAAE,UAAU,EACxB,IAAI,EAAE,UAAU,EAChB,QAAQ,GAAE,MAA6B,GACtC,UAAU,EAAE,GAAG,IAAI;IA+EtB,0EAA0E;IAC1E,OAAO,CAAC,eAAe;IAiBvB,qCAAqC;IACrC,OAAO,CAAC,SAAS;IAKjB,gEAAgE;IAChE,OAAO,CAAC,QAAQ;IAchB,iDAAiD;IACjD,OAAO,CAAC,WAAW;IAYnB,mDAAmD;IACnD,OAAO,CAAC,aAAa;IAiBrB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,WAAW;IA2BnB;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;CAYxB"}
|
package/dist/ai/GOAPPlanner.js
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
* Time: O(b^d) where b = |availableActions|, d = plan depth (<= maxDepth)
|
|
14
14
|
* Space: O(b^d) for the open/closed sets, bounded by maxDepth
|
|
15
15
|
*/
|
|
16
|
+
import { GOAPAction, ActionStatus } from './GOAPAction';
|
|
17
|
+
import { WorldState } from './WorldState';
|
|
16
18
|
// ---------------------------------------------------------------------------
|
|
17
19
|
// Constants
|
|
18
20
|
// ---------------------------------------------------------------------------
|
|
@@ -34,11 +36,14 @@ export class GOAPPlanner {
|
|
|
34
36
|
}
|
|
35
37
|
/** Register an action that the planner can use when building plans. */
|
|
36
38
|
registerAction(action) {
|
|
37
|
-
|
|
39
|
+
const resolved = isGOAPActionDef(action)
|
|
40
|
+
? new InlineGOAPAction(action)
|
|
41
|
+
: action;
|
|
42
|
+
this.actions.push(resolved);
|
|
38
43
|
// P21: Cache action keys incrementally.
|
|
39
|
-
for (const k of
|
|
44
|
+
for (const k of resolved.getPreconditions().keys())
|
|
40
45
|
this._actionKeys.add(k);
|
|
41
|
-
for (const k of
|
|
46
|
+
for (const k of resolved.getEffects().keys())
|
|
42
47
|
this._actionKeys.add(k);
|
|
43
48
|
}
|
|
44
49
|
/**
|
|
@@ -256,4 +261,27 @@ export class GOAPPlanner {
|
|
|
256
261
|
return h | 0x80000000;
|
|
257
262
|
}
|
|
258
263
|
}
|
|
264
|
+
// ---------------------------------------------------------------------------
|
|
265
|
+
// Plain-object action support (module-private)
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
function isGOAPActionDef(a) {
|
|
268
|
+
return !(a instanceof GOAPAction);
|
|
269
|
+
}
|
|
270
|
+
class InlineGOAPAction extends GOAPAction {
|
|
271
|
+
constructor(def) {
|
|
272
|
+
super();
|
|
273
|
+
this.id = def.id;
|
|
274
|
+
this.cost = def.cost;
|
|
275
|
+
this._pre = WorldState.from(def.preconditions);
|
|
276
|
+
this._eff = WorldState.from(def.effects);
|
|
277
|
+
this._isValid = def.isValid;
|
|
278
|
+
this._execute = def.execute;
|
|
279
|
+
}
|
|
280
|
+
getPreconditions() { return this._pre; }
|
|
281
|
+
getEffects() { return this._eff; }
|
|
282
|
+
isValid(entity) { return this._isValid ? this._isValid(entity) : true; }
|
|
283
|
+
execute(entity, delta) {
|
|
284
|
+
return this._execute ? this._execute(entity, delta) : ActionStatus.SUCCESS;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
259
287
|
//# sourceMappingURL=GOAPPlanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GOAPPlanner.js","sourceRoot":"","sources":["../../src/ai/GOAPPlanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"GOAPPlanner.js","sourceRoot":"","sources":["../../src/ai/GOAPPlanner.ts"],"names":[],"mappings":"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"}
|