@alife-sdk/ai 0.4.1 → 0.5.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 CHANGED
@@ -22,7 +22,8 @@ view and must behave in real-time.
22
22
  - **Cover system** — 6 evaluators, loophole peek/fire cycles, TTL-based cover locking
23
23
  - **Perception** — FOV queries, hearing radius, intel freshness filters
24
24
  - **GOAP** — elite NPC goal-oriented planning over a 16-property world state bitmask
25
- - **Navigation** — Catmull-Rom + Dubins arc path smoothing, restricted zones, pack steering
25
+ - **GOAPDirector** — built-in bridge between GOAP planner and FSM; replans on entry, dispatches actions as sub-states, handles interrupts and plan lifecycle
26
+ - **Navigation** — Catmull-Rom + Dubins arc path smoothing, restricted zones, pack steering, pluggable `IPathfindingAccess` for grid/navmesh A*
26
27
  - **Squad tactics** — situational assessment, 6 commands, shared target table
27
28
  - **Animation** — 8-direction state→key mapping, layered debounced controller
28
29
  - **Suspicion** — stimulus accumulation → alert threshold crossing
@@ -81,10 +82,19 @@ function update(deltaMs: number): void {
81
82
  // 6. Read current state
82
83
  const state = driver.currentStateId; // e.g. 'COMBAT'
83
84
 
84
- // 7. Force a state transition from within a state handler (e.g. on NPC death)
85
- // Transitions happen via ctx.transition(), called from inside a state handler:
86
- // ctx.transition(ONLINE_STATE.DEAD);
87
- // To force a transition externally, call driver.update() after mutating ctx.state.
85
+ // 7. Force a state transition from OUTSIDE a handler (new!)
86
+ driver.forceTransition(ONLINE_STATE.DEAD);
87
+
88
+ // 8. Listen to state transitions (new!)
89
+ const unsub = driver.onTransition((from, to) => {
90
+ console.log(`NPC ${npcId}: ${from} → ${to}`);
91
+ });
92
+ // unsub() to remove the listener
93
+
94
+ // 9. Store game-specific data in the extensible state bag (new!)
95
+ ctx.state.custom ??= {};
96
+ ctx.state.custom.ammo = 30;
97
+ ctx.state.custom.goapPlan = planner.plan(worldState, goal);
88
98
  ```
89
99
 
90
100
  ---
@@ -100,7 +110,7 @@ Each module has its own import path for optimal tree-shaking:
100
110
  | `@alife-sdk/ai/states` | `OnlineAIDriver`, `StateHandlerMap`, `ONLINE_STATE`, all handlers, builder functions | [states/](src/states/) |
101
111
  | `@alife-sdk/ai/cover` | `CoverRegistry`, `CoverLockRegistry`, 6 evaluators, `LoopholeGenerator` | [cover/](src/cover/) |
102
112
  | `@alife-sdk/ai/perception` | `NPCSensors`, `isInFOV`, `filterVisibleEntities`, `filterHearingEntities`, `filterHostileEntities`, `filterFriendlyEntities`, `filterFreshIntel`, `distanceSq`, `findClosest`, `scanForEnemies` | [perception/](src/perception/) |
103
- | `@alife-sdk/ai/goap` | `GOAPController`, `buildWorldState`, `selectGoal`, `EvadeHazardAction` | [goap/](src/goap/) |
113
+ | `@alife-sdk/ai/goap` | `GOAPController`, `GOAPDirector`, `buildWorldState`, `selectGoal`, `EvadeHazardAction` | [goap/](src/goap/) |
104
114
  | `@alife-sdk/ai/navigation` | `smoothPath`, `smoothPathWithTurning`, `SmoothPathFollower`, `RestrictedZoneManager`, `SteeringBehaviors` | [navigation/](src/navigation/) |
105
115
  | `@alife-sdk/ai/squad` | `evaluateSituation`, `SquadCommand`, `SquadSharedTargetTable` | [squad/](src/squad/) |
106
116
  | `@alife-sdk/ai/animation` | `getDirection`, `getAnimationKey`, `getAnimationRequest`, `AnimationController`, `DirectionCache`, `CompassIndex`, `AnimLayer`, `DEFAULT_STATE_ANIM_MAP`, `DEFAULT_WEAPON_SUFFIXES` | [animation/](src/animation/) |
@@ -117,43 +127,47 @@ Each module has its own import path for optimal tree-shaking:
117
127
  ## Architecture
118
128
 
119
129
  ```
120
- ┌────────────────────────────────────────┐
121
- ALifeKernel
122
- (from @alife-sdk/core)
123
- └──────────────┬─────────────────────────┘
124
- │ kernel.use(aiPlugin)
125
- ┌──────────────▼─────────────────────────┐
126
- AIPlugin
127
- │ CoverRegistry · CoverLockRegistry
128
- │ RestrictedZoneManager
129
- │ createCoverAccess(npcId) ─────────────┼──► ICoverAccess (per NPC)
130
- └────────────────────────────────────────┘
130
+ ┌───────────────────────────────────────────────────────────┐
131
+ ALifeKernel
132
+ (from @alife-sdk/core)
133
+ └──────────────────────────┬────────────────────────────────┘
134
+ │ kernel.use(aiPlugin)
135
+ ┌──────────────────────────▼────────────────────────────────┐
136
+ AIPlugin
137
+ │ CoverRegistry · CoverLockRegistry
138
+ │ RestrictedZoneManager
139
+ │ createCoverAccess(npcId) ──► ICoverAccess (per NPC)
140
+ └───────────────────────────────────────────────────────────┘
131
141
 
132
142
  Per-NPC (created on online transition):
133
- ┌──────────────────────────────────────────────────────┐
134
- │ OnlineAIDriver
135
-
136
- │ StateHandlerMap ──► IOnlineStateHandler
137
- DEAD · IDLE · PATROL · ALERT · FLEE · SEARCH
138
- CAMP · SLEEP · COMBAT · TAKE_COVER · GRENADE
139
- EVADE_GRENADE · WOUNDED · RETREAT
140
- CHARGE · STALK · LEAP · PSI_ATTACK
141
-
142
- │ INPCContext ─┬─ INPCPerception (FOV / hearing)
143
- │ ├─ INPCHealth (hp / morale)
144
- │ ├─ ICoverAccess (find / lock cover)
145
- │ ├─ IDangerAccess (DangerManager port)
146
- │ ├─ ISquadAccess (commands / target)
147
- │ ├─ ISuspicionAccess
148
- └─ IConditionAccess
149
- └──────────────────────────────────────────────────────┘
143
+ ┌───────────────────────────────────────────────────────────┐
144
+ │ OnlineAIDriver
145
+
146
+ │ StateHandlerMap ──► IOnlineStateHandler
147
+ DEAD · IDLE · PATROL · ALERT · FLEE · SEARCH
148
+ CAMP · SLEEP · COMBAT · TAKE_COVER · GRENADE
149
+ EVADE_GRENADE · WOUNDED · RETREAT
150
+ CHARGE · STALK · LEAP · PSI_ATTACK
151
+
152
+ │ INPCContext ─┬─ INPCPerception (FOV / hearing)
153
+ │ ├─ INPCHealth (hp / morale)
154
+ │ ├─ ICoverAccess (find / lock cover)
155
+ │ ├─ IDangerAccess (DangerManager port)
156
+ │ ├─ IPathfindingAccess (A* / NavMesh port)
157
+ │ ├─ ISquadAccess (commands / target)
158
+ ├─ ISuspicionAccess
159
+ │ └─ IConditionAccess │
160
+ │ │
161
+ │ state.custom ── extensible Record<string, unknown> bag │
162
+ └───────────────────────────────────────────────────────────┘
150
163
 
151
164
  Shared systems (optional, compose as needed):
152
165
  NPCSensors filterVisibleEntities / filterHearingEntities
153
- GOAPController elite NPC A* planning (rank 5)
166
+ GOAPController elite NPC A* planning (rank >= 5)
167
+ GOAPDirector GOAP -> FSM bridge (register as COMBAT handler)
154
168
  SmoothPathFollower Catmull-Rom + Dubins arc path cursor
155
169
  AnimationController layered, debounced animation dispatch
156
- SuspicionAccumulator stimulus alert threshold crossing
170
+ SuspicionAccumulator stimulus -> alert threshold crossing
157
171
  ConditionBank multi-channel boolean state
158
172
  ```
159
173
 
@@ -172,13 +186,21 @@ const driver = new OnlineAIDriver(ctx, handlers, ONLINE_STATE.IDLE);
172
186
 
173
187
  driver.update(deltaMs); // call every frame
174
188
  driver.currentStateId; // current state ID string
175
- // Transitions happen via ctx.transition() from inside a state handler:
176
- // ctx.transition('PATROL');
189
+
190
+ // Transitions from inside a handler:
191
+ ctx.transition('PATROL');
192
+
193
+ // Transitions from OUTSIDE a handler (e.g. GOAP director, scripted events):
194
+ driver.forceTransition('DEAD');
195
+
196
+ // Listen to transitions:
197
+ driver.onTransition((from, to) => console.log(`${from} → ${to}`));
177
198
  ```
178
199
 
179
200
  Each state handler is a stateless object — all per-NPC runtime data lives in
180
201
  `INPCOnlineState` (position, target, phase flags, timer, etc.), not in the handler.
181
202
  The handler map can be shared across all NPCs of the same type.
203
+ Game-specific data (GOAP plans, ammo, personality) goes in `ctx.state.custom`.
182
204
 
183
205
  ### StateHandlerMap — three built-in presets
184
206
 
@@ -241,11 +263,12 @@ const ctx: INPCContext = {
241
263
  faction: npc.faction,
242
264
  perception: new MyPerception(npc), // INPCPerception | null
243
265
  health: new MyHealth(npc), // INPCHealth | null
244
- cover: coverAccess, // ICoverAccess | null (from AIPlugin)
245
- danger: dangerAdapter, // IDangerAccess | null
246
- squad: squadAccess, // ISquadAccess | null
247
- suspicion: suspicionAccess, // ISuspicionAccess | null
248
- conditions: conditionAccess, // IConditionAccess | null
266
+ cover: coverAccess, // ICoverAccess | null (from AIPlugin)
267
+ danger: dangerAdapter, // IDangerAccess | null
268
+ pathfinding: gridPathfinding, // IPathfindingAccess | null (A* / NavMesh)
269
+ squad: squadAccess, // ISquadAccess | null
270
+ suspicion: suspicionAccess, // ISuspicionAccess | null
271
+ conditions: conditionAccess, // IConditionAccess | null
249
272
  // pack, restrictedZones also nullable — omit if not used
250
273
  emitShoot: (payload) => fireWeapon(npc, payload),
251
274
  emitMeleeHit:(payload) => applyMelee(npc, payload),
@@ -258,6 +281,85 @@ const ctx: INPCContext = {
258
281
  > Omitting a subsystem (setting it to `null`) silently disables the
259
282
  > features that depend on it, with no code changes required in the handlers.
260
283
 
284
+ ### GOAPDirector — GOAP-to-FSM bridge
285
+
286
+ `GOAPDirector` bridges `GOAPPlanner` with the FSM. Register it as the `COMBAT`
287
+ handler — when NPCs enter combat, the director replans and dispatches each
288
+ action as a sub-state with full lifecycle management.
289
+
290
+ ```ts
291
+ import { GOAPDirector } from '@alife-sdk/ai/goap';
292
+ import type { IGOAPActionHandler } from '@alife-sdk/ai/goap';
293
+
294
+ const director = new GOAPDirector(planner, {
295
+ buildWorldState: (ctx) => WorldState.from({
296
+ isHealthy: ctx.health!.hpPercent >= 0.5,
297
+ inCover: ctx.state.hasTakenCover,
298
+ seeEnemy: ctx.perception?.hasVisibleEnemy() ?? false,
299
+ }),
300
+ goal: WorldState.from({ targetEliminated: true }),
301
+ actionHandlers: {
302
+ TakeCover: {
303
+ enter(ctx) { ctx.pathfinding?.findPath(coverX, coverY); },
304
+ update(ctx, dt) { return ctx.pathfinding?.isNavigating() ? 'running' : 'success'; },
305
+ exit(ctx) {},
306
+ },
307
+ Suppress: {
308
+ enter(ctx) { /* start firing */ },
309
+ update(ctx, dt) { return shotsFired >= 4 ? 'success' : 'running'; },
310
+ exit(ctx) {},
311
+ },
312
+ Attack: {
313
+ enter(ctx) { /* engage */ },
314
+ update(ctx, dt) { return 'running'; }, // terminal — stays until interrupted
315
+ exit(ctx) {},
316
+ },
317
+ },
318
+ interrupts: [
319
+ { condition: ctx => ctx.state.moraleState === 'PANICKED', targetState: 'FLEE' },
320
+ { condition: ctx => ctx.health!.hpPercent < 0.2, targetState: 'WOUNDED' },
321
+ ],
322
+ onNoPlan: (ctx, dt) => { /* fallback when plan is empty */ },
323
+ });
324
+
325
+ handlers.register(ONLINE_STATE.COMBAT, director);
326
+ ```
327
+
328
+ The director:
329
+ - **Replans** on every entry (including after interrupts like WOUNDED → COMBAT)
330
+ - **Dispatches** actions: calls `enter()` → `update()` each tick → `exit()` on success/failure
331
+ - **Advances** to the next action on `'success'`, replans on `'failure'`
332
+ - **Checks interrupts** every tick before the action handler runs
333
+ - **Prevents infinite replans** — stops after 3 consecutive empty plans
334
+ - Stores plan state in `ctx.state.custom` (keys prefixed with `__goap`)
335
+
336
+ ### IPathfindingAccess — pluggable pathfinding
337
+
338
+ State handlers can use obstacle-aware navigation via the optional `IPathfindingAccess`
339
+ subsystem. When provided, `moveAlongPath()` follows waypoints from the pathfinder
340
+ instead of moving in a straight line.
341
+
342
+ ```ts
343
+ // Host implements IPathfindingAccess (e.g. wrapping PathFinding.js, EasyStar, or NavMesh)
344
+ class GridPathfinding implements IPathfindingAccess {
345
+ findPath(targetX, targetY) { /* A* search on grid */ }
346
+ getNextWaypoint() { /* return next waypoint, advance cursor */ }
347
+ setPath(waypoints) { /* replace current path */ }
348
+ isNavigating() { /* true if cursor < path.length */ }
349
+ clearPath() { /* stop following path */ }
350
+ }
351
+
352
+ // Wire to NPC context:
353
+ const ctx = { ..., pathfinding: new GridPathfinding(npc) };
354
+
355
+ // In action handlers:
356
+ ctx.pathfinding?.findPath(target.x, target.y); // compute path
357
+ ctx.pathfinding?.isNavigating(); // check if walking
358
+ ctx.pathfinding?.clearPath(); // stop
359
+ ```
360
+
361
+ When `ctx.pathfinding` is null, all handlers fall back to direct straight-line movement.
362
+
261
363
  ### Cover system
262
364
 
263
365
  The cover module provides a full pipeline from raw cover points to per-NPC
@@ -417,10 +519,11 @@ number wins):
417
519
  | Priority | Goal | Trigger |
418
520
  |---|---|---|
419
521
  | 0 `CRITICALLY_WOUNDED` | Heal + disengage | `hpRatio <= healHpThreshold` |
420
- | 1 `ENEMY_PRESENT` | Eliminate enemy | `snapshot.enemyPresent` |
421
- | 2 `DANGER` | Evade danger | `snapshot.hasDanger` |
422
- | 3 `ANOMALY_AVOID` | Exit anomaly zone | `snapshot.nearAnomalyZone` |
423
- | 4 `DEFAULT` | Patrol / idle | always (fallback) |
522
+ | 1 `PANIC_FLEE` | Flee (morale collapsed) | `isPanicked && hasDanger` |
523
+ | 2 `ENEMY_PRESENT` | Eliminate enemy | `snapshot.enemyPresent` |
524
+ | 3 `DANGER` | Evade danger | `snapshot.hasDanger` |
525
+ | 4 `ANOMALY_AVOID` | Exit anomaly zone | `snapshot.nearAnomalyZone` |
526
+ | 5 `DEFAULT` | Patrol / idle | always (fallback) |
424
527
 
425
528
  #### Integration example
426
529
 
@@ -44,7 +44,7 @@ export class CoverAccessAdapter {
44
44
  // ICoverAccess
45
45
  // -------------------------------------------------------------------------
46
46
  findCover(x, y, enemyX, enemyY, type) {
47
- const coverType = type ?? CoverTypeConst.BALANCED;
47
+ const coverType = type?.toLowerCase() ?? CoverTypeConst.BALANCED;
48
48
  const point = this._registry.findCover(coverType, { x, y }, [{ x: enemyX, y: enemyY }], this._npcId);
49
49
  this._lastFoundId = point?.id ?? null;
50
50
  return point !== null ? { x: point.x, y: point.y } : null;
@@ -1 +1 @@
1
- {"version":3,"file":"CoverAccessAdapter.js","sourceRoot":"","sources":["../../src/cover/CoverAccessAdapter.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,yEAAyE;AACzE,sCAAsC;AAItC,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAInE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAO,kBAAkB;IAG7B;;;;;;OAMG;IACH,YACmB,SAAwB,EACxB,aAAwC,EACxC,MAAc;QAFd,cAAS,GAAT,SAAS,CAAe;QACxB,kBAAa,GAAb,aAAa,CAA2B;QACxC,WAAM,GAAN,MAAM,CAAQ;QAZzB,iBAAY,GAAkB,IAAI,CAAC;IAaxC,CAAC;IAEJ,4EAA4E;IAC5E,eAAe;IACf,4EAA4E;IAE5E,SAAS,CACP,CAAS,EACT,CAAS,EACT,MAAc,EACd,MAAc,EACd,IAAa;QAEb,MAAM,SAAS,GAAe,IAAkB,IAAI,cAAc,CAAC,QAAQ,CAAC;QAE5E,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CACpC,SAAS,EACT,EAAE,CAAC,EAAE,CAAC,EAAE,EACR,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAC1B,IAAI,CAAC,MAAM,CACZ,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC;QAEtC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC;IAED;;;;;;;;OAQG;IACH,aAAa,CAAC,KAAa,EAAE,KAAc;QACzC,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC3E,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAC/B,IAAI,CAAC,YAAY,EACjB,KAAK,EACL,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAC5C,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;CACF"}
1
+ {"version":3,"file":"CoverAccessAdapter.js","sourceRoot":"","sources":["../../src/cover/CoverAccessAdapter.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,yEAAyE;AACzE,sCAAsC;AAItC,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAInE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAO,kBAAkB;IAG7B;;;;;;OAMG;IACH,YACmB,SAAwB,EACxB,aAAwC,EACxC,MAAc;QAFd,cAAS,GAAT,SAAS,CAAe;QACxB,kBAAa,GAAb,aAAa,CAA2B;QACxC,WAAM,GAAN,MAAM,CAAQ;QAZzB,iBAAY,GAAkB,IAAI,CAAC;IAaxC,CAAC;IAEJ,4EAA4E;IAC5E,eAAe;IACf,4EAA4E;IAE5E,SAAS,CACP,CAAS,EACT,CAAS,EACT,MAAc,EACd,MAAc,EACd,IAAa;QAEb,MAAM,SAAS,GAAe,IAAI,EAAE,WAAW,EAAgB,IAAI,cAAc,CAAC,QAAQ,CAAC;QAE3F,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CACpC,SAAS,EACT,EAAE,CAAC,EAAE,CAAC,EAAE,EACR,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAC1B,IAAI,CAAC,MAAM,CACZ,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC;QAEtC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC;IAED;;;;;;;;OAQG;IACH,aAAa,CAAC,KAAa,EAAE,KAAc;QACzC,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC3E,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAC/B,IAAI,CAAC,YAAY,EACjB,KAAK,EACL,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAC5C,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,89 @@
1
+ import type { IOnlineStateHandler } from '../states/IOnlineStateHandler';
2
+ import type { INPCContext } from '../states/INPCContext';
3
+ import type { WorldState } from '@alife-sdk/core';
4
+ /**
5
+ * Minimal planner interface — accepts any object with a `plan()` method.
6
+ * This allows passing a GOAPPlanner instance, a dynamic wrapper, or a mock.
7
+ */
8
+ export interface IGOAPPlannerLike {
9
+ plan(worldState: WorldState, goal: WorldState): Array<{
10
+ id: string;
11
+ }> | null;
12
+ }
13
+ /**
14
+ * Handler for a single GOAP action execution.
15
+ *
16
+ * Stateless — per-NPC data should be stored in `ctx.state.custom`.
17
+ * Return 'running' to continue, 'success' to advance, 'failure' to replan.
18
+ */
19
+ export interface IGOAPActionHandler {
20
+ /** Called when this action starts executing. */
21
+ enter(ctx: INPCContext): void;
22
+ /** Called each frame. */
23
+ update(ctx: INPCContext, deltaMs: number): 'running' | 'success' | 'failure';
24
+ /** Called when action completes or is interrupted. */
25
+ exit(ctx: INPCContext): void;
26
+ }
27
+ /**
28
+ * Interrupt condition — checked every tick before action execution.
29
+ * If condition returns true, the director transitions to targetState.
30
+ */
31
+ export interface IGOAPInterrupt {
32
+ readonly condition: (ctx: INPCContext) => boolean;
33
+ readonly targetState: string;
34
+ }
35
+ /**
36
+ * Configuration for the GOAP Director.
37
+ */
38
+ export interface IGOAPDirectorConfig {
39
+ /** Build a WorldState snapshot from the current NPC context. */
40
+ buildWorldState: (ctx: INPCContext) => WorldState;
41
+ /** The goal to achieve. */
42
+ goal: WorldState;
43
+ /** Map GOAP action ID to handler. Unmatched actions are skipped. */
44
+ actionHandlers: Record<string, IGOAPActionHandler>;
45
+ /** Interrupt conditions checked every tick (evaluated in order). */
46
+ interrupts?: IGOAPInterrupt[];
47
+ /** Called when the plan is empty or exhausted (optional fallback). */
48
+ onNoPlan?: (ctx: INPCContext, deltaMs: number) => void;
49
+ }
50
+ /**
51
+ * Built-in GOAP Director — register as the COMBAT handler.
52
+ *
53
+ * On enter: replans via the provided planner + buildWorldState.
54
+ * Each tick: checks interrupts, then ticks the active action handler.
55
+ * On action success: advances to next action.
56
+ * On action failure or plan exhaustion: replans.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * const director = new GOAPDirector(planner, {
61
+ * buildWorldState: (ctx) => WorldState.from({ ... }),
62
+ * goal: WorldState.from({ targetEliminated: true }),
63
+ * actionHandlers: {
64
+ * TakeCover: { enter(ctx) { ... }, update(ctx, dt) { return 'running'; }, exit(ctx) {} },
65
+ * Attack: { enter(ctx) { ... }, update(ctx, dt) { return 'success'; }, exit(ctx) {} },
66
+ * },
67
+ * interrupts: [
68
+ * { condition: ctx => ctx.state.moraleState === 'PANICKED', targetState: 'FLEE' },
69
+ * ],
70
+ * });
71
+ * handlers.register('COMBAT', director);
72
+ * ```
73
+ */
74
+ export declare class GOAPDirector implements IOnlineStateHandler {
75
+ private readonly planner;
76
+ private readonly config;
77
+ constructor(planner: IGOAPPlannerLike, config: IGOAPDirectorConfig);
78
+ enter(ctx: INPCContext): void;
79
+ update(ctx: INPCContext, deltaMs: number): void;
80
+ exit(ctx: INPCContext): void;
81
+ /** Read a GOAP key from ctx.state.custom (always fresh, never cached). */
82
+ private _read;
83
+ /** Write a single GOAP key to ctx.state.custom (always fresh, never cached). */
84
+ private _write;
85
+ private _replan;
86
+ private _advanceAction;
87
+ private _exitCurrentAction;
88
+ }
89
+ //# sourceMappingURL=GOAPDirector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GOAPDirector.d.ts","sourceRoot":"","sources":["../../src/goap/GOAPDirector.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;CAC9E;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,yBAAyB;IACzB,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7E,sDAAsD;IACtD,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,eAAe,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,UAAU,CAAC;IAClD,2BAA2B;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACnD,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD;AAQD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,YAAa,YAAW,mBAAmB;IAEpD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,mBAAmB;IAG9C,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAI7B,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAuD/C,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAQ5B,0EAA0E;IAC1E,OAAO,CAAC,KAAK;IAIb,gFAAgF;IAChF,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,kBAAkB;CAO3B"}
@@ -0,0 +1,142 @@
1
+ // goap/GOAPDirector.ts
2
+ // Built-in GOAP Director — bridges GOAPPlanner with the FSM.
3
+ //
4
+ // Register as the COMBAT state handler. On every entry the director
5
+ // replans and dispatches actions as sub-states. Each action handler
6
+ // reports running/success/failure; on success the director advances
7
+ // to the next action. On failure or plan exhaustion the director
8
+ // replans from scratch.
9
+ //
10
+ // Interrupts (morale panic, low HP, grenade) are checked every tick
11
+ // and can abort the current action to transition to a built-in FSM state.
12
+ // Custom state keys used by the director (stored in ctx.state.custom).
13
+ const GOAP_PLAN_KEY = '__goapPlan';
14
+ const GOAP_INDEX_KEY = '__goapIndex';
15
+ const GOAP_HANDLER_KEY = '__goapActiveHandler';
16
+ const GOAP_EMPTY_COUNT_KEY = '__goapEmptyCount';
17
+ /**
18
+ * Built-in GOAP Director — register as the COMBAT handler.
19
+ *
20
+ * On enter: replans via the provided planner + buildWorldState.
21
+ * Each tick: checks interrupts, then ticks the active action handler.
22
+ * On action success: advances to next action.
23
+ * On action failure or plan exhaustion: replans.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * const director = new GOAPDirector(planner, {
28
+ * buildWorldState: (ctx) => WorldState.from({ ... }),
29
+ * goal: WorldState.from({ targetEliminated: true }),
30
+ * actionHandlers: {
31
+ * TakeCover: { enter(ctx) { ... }, update(ctx, dt) { return 'running'; }, exit(ctx) {} },
32
+ * Attack: { enter(ctx) { ... }, update(ctx, dt) { return 'success'; }, exit(ctx) {} },
33
+ * },
34
+ * interrupts: [
35
+ * { condition: ctx => ctx.state.moraleState === 'PANICKED', targetState: 'FLEE' },
36
+ * ],
37
+ * });
38
+ * handlers.register('COMBAT', director);
39
+ * ```
40
+ */
41
+ export class GOAPDirector {
42
+ constructor(planner, config) {
43
+ this.planner = planner;
44
+ this.config = config;
45
+ }
46
+ enter(ctx) {
47
+ this._replan(ctx);
48
+ }
49
+ update(ctx, deltaMs) {
50
+ // 1. Check interrupts (highest priority).
51
+ if (this.config.interrupts) {
52
+ for (const interrupt of this.config.interrupts) {
53
+ if (interrupt.condition(ctx)) {
54
+ this._exitCurrentAction(ctx);
55
+ ctx.transition(interrupt.targetState);
56
+ return;
57
+ }
58
+ }
59
+ }
60
+ // 2. Get current plan and action.
61
+ const plan = this._read(ctx, GOAP_PLAN_KEY);
62
+ const index = this._read(ctx, GOAP_INDEX_KEY) ?? 0;
63
+ if (!plan || index >= plan.length) {
64
+ if (this.config.onNoPlan) {
65
+ this.config.onNoPlan(ctx, deltaMs);
66
+ }
67
+ return;
68
+ }
69
+ // 3. Get or enter the action handler.
70
+ const action = plan[index];
71
+ const handler = this.config.actionHandlers[action.id];
72
+ if (!handler) {
73
+ this._advanceAction(ctx);
74
+ return;
75
+ }
76
+ const activeHandlerId = this._read(ctx, GOAP_HANDLER_KEY);
77
+ if (activeHandlerId !== action.id) {
78
+ if (activeHandlerId) {
79
+ const prevHandler = this.config.actionHandlers[activeHandlerId];
80
+ prevHandler?.exit(ctx);
81
+ }
82
+ handler.enter(ctx);
83
+ this._write(ctx, GOAP_HANDLER_KEY, action.id);
84
+ }
85
+ // 4. Tick the action handler.
86
+ const result = handler.update(ctx, deltaMs);
87
+ if (result === 'success') {
88
+ handler.exit(ctx);
89
+ this._write(ctx, GOAP_HANDLER_KEY, undefined);
90
+ this._advanceAction(ctx);
91
+ }
92
+ else if (result === 'failure') {
93
+ handler.exit(ctx);
94
+ this._write(ctx, GOAP_HANDLER_KEY, undefined);
95
+ this._replan(ctx);
96
+ }
97
+ }
98
+ exit(ctx) {
99
+ this._exitCurrentAction(ctx);
100
+ }
101
+ // -----------------------------------------------------------------------
102
+ // Internal helpers
103
+ // -----------------------------------------------------------------------
104
+ /** Read a GOAP key from ctx.state.custom (always fresh, never cached). */
105
+ _read(ctx, key) {
106
+ return (ctx.state.custom ?? {})[key];
107
+ }
108
+ /** Write a single GOAP key to ctx.state.custom (always fresh, never cached). */
109
+ _write(ctx, key, value) {
110
+ ctx.state.custom = { ...(ctx.state.custom ?? {}), [key]: value };
111
+ }
112
+ _replan(ctx) {
113
+ const ws = this.config.buildWorldState(ctx);
114
+ const plan = this.planner.plan(ws, this.config.goal);
115
+ const resultPlan = plan ?? [];
116
+ let emptyCount = this._read(ctx, GOAP_EMPTY_COUNT_KEY) ?? 0;
117
+ emptyCount = resultPlan.length === 0 ? emptyCount + 1 : 0;
118
+ this._write(ctx, GOAP_PLAN_KEY, resultPlan);
119
+ this._write(ctx, GOAP_INDEX_KEY, 0);
120
+ this._write(ctx, GOAP_HANDLER_KEY, undefined);
121
+ this._write(ctx, GOAP_EMPTY_COUNT_KEY, emptyCount);
122
+ }
123
+ _advanceAction(ctx) {
124
+ const index = (this._read(ctx, GOAP_INDEX_KEY) ?? 0) + 1;
125
+ const plan = this._read(ctx, GOAP_PLAN_KEY);
126
+ this._write(ctx, GOAP_INDEX_KEY, index);
127
+ if (!plan || index >= plan.length) {
128
+ const emptyCount = this._read(ctx, GOAP_EMPTY_COUNT_KEY) ?? 0;
129
+ if (emptyCount < 3) {
130
+ this._replan(ctx);
131
+ }
132
+ }
133
+ }
134
+ _exitCurrentAction(ctx) {
135
+ const activeId = this._read(ctx, GOAP_HANDLER_KEY);
136
+ if (activeId) {
137
+ this.config.actionHandlers[activeId]?.exit(ctx);
138
+ this._write(ctx, GOAP_HANDLER_KEY, undefined);
139
+ }
140
+ }
141
+ }
142
+ //# sourceMappingURL=GOAPDirector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GOAPDirector.js","sourceRoot":"","sources":["../../src/goap/GOAPDirector.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,6 @@ export { GOAPController } from './GOAPController';
6
6
  export type { IGOAPUpdateResult, IGOAPControllerState } from './GOAPController';
7
7
  export type { IHazardZoneAccess } from './IHazardZoneAccess';
8
8
  export { EvadeHazardAction } from './EvadeHazardAction';
9
+ export { GOAPDirector } from './GOAPDirector';
10
+ export type { IGOAPDirectorConfig, IGOAPActionHandler, IGOAPInterrupt, IGOAPPlannerLike } from './GOAPDirector';
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/goap/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AACvF,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAChF,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/goap/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AACvF,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAChF,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -3,4 +3,5 @@ export { buildWorldState, DEFAULT_WORLD_PROPERTY_BUILDERS } from './WorldStateBu
3
3
  export { selectGoal, DEFAULT_GOAL_RULES } from './GoalSelector';
4
4
  export { GOAPController } from './GOAPController';
5
5
  export { EvadeHazardAction } from './EvadeHazardAction';
6
+ export { GOAPDirector } from './GOAPDirector';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/goap/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAEvF,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/goap/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAEvF,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -305,6 +305,62 @@ export interface ISuspicionAccess {
305
305
  */
306
306
  clear(): void;
307
307
  }
308
+ /**
309
+ * Pathfinding query interface.
310
+ *
311
+ * Wraps the engine-specific pathfinding system (A*, NavMesh, etc.) so
312
+ * state handlers can request paths without importing game-layer classes.
313
+ *
314
+ * The host implements this interface by delegating to its pathfinding
315
+ * engine (e.g. PathFinding.js, EasyStar, or a NavMesh adapter).
316
+ *
317
+ * If not provided (`ctx.pathfinding === null`), state handlers fall back
318
+ * to direct straight-line movement via `moveToward()`.
319
+ */
320
+ export interface IPathfindingAccess {
321
+ /**
322
+ * Compute a path from the NPC's current position to the target.
323
+ * The implementation should cache the result until `setPath()` or
324
+ * a new `findPath()` call replaces it.
325
+ *
326
+ * @param targetX - Destination world X (px).
327
+ * @param targetY - Destination world Y (px).
328
+ * @returns Array of world-space waypoints, or null if no path exists.
329
+ */
330
+ findPath(targetX: number, targetY: number): ReadonlyArray<{
331
+ x: number;
332
+ y: number;
333
+ }> | null;
334
+ /**
335
+ * Get the next waypoint the NPC should move toward.
336
+ * Manages an internal cursor — advances when the NPC reaches each waypoint.
337
+ *
338
+ * @returns Next waypoint, or null if path is complete or no path is set.
339
+ */
340
+ getNextWaypoint(): {
341
+ x: number;
342
+ y: number;
343
+ } | null;
344
+ /**
345
+ * Replace the current path with new waypoints.
346
+ * Resets the internal cursor to the first waypoint.
347
+ *
348
+ * @param waypoints - World-space path waypoints.
349
+ */
350
+ setPath(waypoints: ReadonlyArray<{
351
+ x: number;
352
+ y: number;
353
+ }>): void;
354
+ /**
355
+ * True if the NPC is actively following a path (cursor not at end).
356
+ */
357
+ isNavigating(): boolean;
358
+ /**
359
+ * Stop following the current path and clear waypoints.
360
+ * After this call, `isNavigating()` returns false.
361
+ */
362
+ clearPath(): void;
363
+ }
308
364
  /**
309
365
  * Squad communication interface.
310
366
  *
@@ -531,6 +587,14 @@ export interface INPCContext {
531
587
  * PatrolState and IdleState use this to detect accumulated threat and trigger ALERT.
532
588
  */
533
589
  readonly suspicion: ISuspicionAccess | null;
590
+ /**
591
+ * Pathfinding system accessor, or null if no pathfinding is registered.
592
+ *
593
+ * When provided, state handlers can use `moveAlongPath()` instead of
594
+ * `moveToward()` for obstacle-aware navigation. When null, handlers
595
+ * fall back to direct straight-line movement.
596
+ */
597
+ readonly pathfinding: IPathfindingAccess | null;
534
598
  /**
535
599
  * Return the current elapsed time in milliseconds.
536
600
  *
@@ -1 +1 @@
1
- {"version":3,"file":"INPCContext.d.ts","sourceRoot":"","sources":["../../src/states/INPCContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"INPCContext.d.ts","sourceRoot":"","sources":["../../src/states/INPCContext.ts"],"names":[],"mappings":"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"}
@@ -228,5 +228,27 @@ export interface INPCOnlineState {
228
228
  * - PANICKED : morale <= panicMoraleThreshold
229
229
  */
230
230
  moraleState: 'STABLE' | 'SHAKEN' | 'PANICKED';
231
+ /**
232
+ * Extensible key-value bag for game-specific data.
233
+ *
234
+ * Use this for data that doesn't fit the built-in fields: GOAP plans,
235
+ * ammo counts, personality tags, enemy velocity tracking, etc.
236
+ *
237
+ * Handlers access it via `ctx.state.custom?.myKey`. The SDK never
238
+ * reads or writes this field — it's entirely owned by the game layer.
239
+ *
240
+ * **Key namespacing:** To avoid collisions between different systems
241
+ * writing to `custom`, prefix your keys. The SDK reserves the `__goap`
242
+ * prefix for the built-in GOAPDirector. Example: `custom.__goapPlan`.
243
+ * Game code should use its own prefix: `custom.myGame_ammo`.
244
+ *
245
+ * @example
246
+ * ```ts
247
+ * ctx.state.custom ??= {};
248
+ * ctx.state.custom.goapPlan = planner.plan(ws, goal);
249
+ * ctx.state.custom.ammo = 30;
250
+ * ```
251
+ */
252
+ custom?: Record<string, unknown>;
231
253
  }
232
254
  //# sourceMappingURL=INPCOnlineState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"INPCOnlineState.d.ts","sourceRoot":"","sources":["../../src/states/INPCOnlineState.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"INPCOnlineState.d.ts","sourceRoot":"","sources":["../../src/states/INPCOnlineState.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NPCOnlineState.d.ts","sourceRoot":"","sources":["../../src/states/NPCOnlineState.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,IAAI,eAAe,CA+D7D"}
1
+ {"version":3,"file":"NPCOnlineState.d.ts","sourceRoot":"","sources":["../../src/states/NPCOnlineState.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,IAAI,eAAe,CAkE7D"}
@@ -71,6 +71,8 @@ export function createDefaultNPCOnlineState() {
71
71
  // Morale
72
72
  morale: 0,
73
73
  moraleState: 'STABLE',
74
+ // Extensible game-specific state
75
+ custom: {},
74
76
  };
75
77
  }
76
78
  //# sourceMappingURL=NPCOnlineState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NPCOnlineState.js","sourceRoot":"","sources":["../../src/states/NPCOnlineState.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,2EAA2E;AAI3E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,kBAAkB;QAClB,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,CAAC;QAClB,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE,CAAC;QAEpB,8DAA8D;QAC9D,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,CAAC;QAChB,oBAAoB,EAAE,CAAC;QACvB,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,CAAC;QACd,kBAAkB,EAAE,CAAC;QACrB,aAAa,EAAE,CAAC;QAChB,qBAAqB,EAAE,CAAC;QACxB,mBAAmB,EAAE,CAAC;QACtB,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,CAAC;QACjB,oBAAoB,EAAE,CAAC;QACvB,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;QACf,kBAAkB,EAAE,CAAC;QACrB,4BAA4B,EAAE,CAAC,CAAC;QAEhC,mBAAmB,EAAE,IAAI;QACzB,kBAAkB,EAAE,CAAC;QACrB,wBAAwB,EAAE,CAAC,CAAC;QAC5B,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QAEf,mBAAmB,EAAE,IAAI;QACzB,kBAAkB,EAAE,CAAC;QACrB,qBAAqB,EAAE,CAAC,CAAC;QACzB,uBAAuB,EAAE,CAAC,CAAC;QAC3B,yBAAyB,EAAE,CAAC,CAAC;QAC7B,qBAAqB,EAAE,CAAC;QACxB,uBAAuB,EAAE,CAAC,CAAC;QAC3B,kBAAkB,EAAE,CAAC;QACrB,kBAAkB,EAAE,CAAC;QAErB,mBAAmB,EAAE,CAAC;QAEtB,UAAU;QACV,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,IAAI;QACrB,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,CAAC;QAEd,cAAc;QACd,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,KAAK;QACpB,eAAe,EAAE,CAAC;QAClB,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,IAAI;QACd,iBAAiB,EAAE,CAAC;QAEpB,SAAS;QACT,MAAM,EAAE,CAAC;QACT,WAAW,EAAE,QAAQ;KACtB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"NPCOnlineState.js","sourceRoot":"","sources":["../../src/states/NPCOnlineState.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,2EAA2E;AAI3E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,kBAAkB;QAClB,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,CAAC;QAClB,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE,CAAC;QAEpB,8DAA8D;QAC9D,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,CAAC;QAChB,oBAAoB,EAAE,CAAC;QACvB,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,CAAC;QACd,kBAAkB,EAAE,CAAC;QACrB,aAAa,EAAE,CAAC;QAChB,qBAAqB,EAAE,CAAC;QACxB,mBAAmB,EAAE,CAAC;QACtB,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,CAAC;QACjB,oBAAoB,EAAE,CAAC;QACvB,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;QACf,kBAAkB,EAAE,CAAC;QACrB,4BAA4B,EAAE,CAAC,CAAC;QAEhC,mBAAmB,EAAE,IAAI;QACzB,kBAAkB,EAAE,CAAC;QACrB,wBAAwB,EAAE,CAAC,CAAC;QAC5B,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QAEf,mBAAmB,EAAE,IAAI;QACzB,kBAAkB,EAAE,CAAC;QACrB,qBAAqB,EAAE,CAAC,CAAC;QACzB,uBAAuB,EAAE,CAAC,CAAC;QAC3B,yBAAyB,EAAE,CAAC,CAAC;QAC7B,qBAAqB,EAAE,CAAC;QACxB,uBAAuB,EAAE,CAAC,CAAC;QAC3B,kBAAkB,EAAE,CAAC;QACrB,kBAAkB,EAAE,CAAC;QAErB,mBAAmB,EAAE,CAAC;QAEtB,UAAU;QACV,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,IAAI;QACrB,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,CAAC;QAEd,cAAc;QACd,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,KAAK;QACpB,eAAe,EAAE,CAAC;QAClB,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,IAAI;QACd,iBAAiB,EAAE,CAAC;QAEpB,SAAS;QACT,MAAM,EAAE,CAAC;QACT,WAAW,EAAE,QAAQ;QAErB,iCAAiC;QACjC,MAAM,EAAE,EAAE;KACX,CAAC;AACJ,CAAC"}
@@ -36,6 +36,8 @@ export declare class OnlineAIDriver {
36
36
  private readonly ctx;
37
37
  /** True while a transition is in progress (guards against re-entrant transitions). */
38
38
  private _transitioning;
39
+ /** Transition event listeners. */
40
+ private _transitionListeners;
39
41
  /** True after destroy() has been called. Guards against use-after-destroy. */
40
42
  private _destroyed;
41
43
  constructor(host: IOnlineDriverHost, handlers: StateHandlerMap | ReadonlyMap<string, IOnlineStateHandler>, initialState: string);
@@ -57,6 +59,38 @@ export declare class OnlineAIDriver {
57
59
  * Call when the NPC entity is destroyed or the scene shuts down.
58
60
  */
59
61
  destroy(): void;
62
+ /**
63
+ * Force an FSM state transition from outside the handler.
64
+ *
65
+ * Calls exit() on the current state and enter() on the new one,
66
+ * exactly like an internal ctx.transition() call. Useful for
67
+ * GOAP directors, scripted events, or any external system that
68
+ * needs to steer the FSM.
69
+ *
70
+ * No-op if the driver has been destroyed.
71
+ * Re-entrant calls are silently ignored (same as internal transitions).
72
+ *
73
+ * @param newStateId - Target state identifier.
74
+ */
75
+ forceTransition(newStateId: string): void;
76
+ /**
77
+ * Register a callback that fires after every state transition.
78
+ *
79
+ * Returns an unsubscribe function. Listeners fire synchronously
80
+ * after enter() completes on the new state, in registration order.
81
+ *
82
+ * @param cb - Callback receiving the previous and new state IDs.
83
+ * @returns Unsubscribe function.
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * const unsub = driver.onTransition((from, to) => {
88
+ * console.log(`${npcId}: ${from} → ${to}`);
89
+ * });
90
+ * // Later: unsub();
91
+ * ```
92
+ */
93
+ onTransition(cb: (from: string, to: string) => void): () => void;
60
94
  /** @internal Called by {@link DriverContext.transition}. */
61
95
  _doTransition(newStateId: string): void;
62
96
  private getHandler;
@@ -1 +1 @@
1
- {"version":3,"file":"OnlineAIDriver.d.ts","sourceRoot":"","sources":["../../src/states/OnlineAIDriver.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMpD;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,gBAAgB,CAAC,CAAC;AAMnF;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAElC,sFAAsF;IACtF,OAAO,CAAC,cAAc,CAAS;IAE/B,8EAA8E;IAC9E,OAAO,CAAC,UAAU,CAAS;gBAGzB,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,eAAe,GAAG,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACpE,YAAY,EAAE,MAAM;IAkBtB,gDAAgD;IAChD,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK7B;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAUf,4DAA4D;IAC5D,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAqBvC,OAAO,CAAC,UAAU;CAOnB"}
1
+ {"version":3,"file":"OnlineAIDriver.d.ts","sourceRoot":"","sources":["../../src/states/OnlineAIDriver.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMpD;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,gBAAgB,CAAC,CAAC;AAMnF;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAElC,sFAAsF;IACtF,OAAO,CAAC,cAAc,CAAS;IAE/B,kCAAkC;IAClC,OAAO,CAAC,oBAAoB,CAAiD;IAE7E,8EAA8E;IAC9E,OAAO,CAAC,UAAU,CAAS;gBAGzB,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,eAAe,GAAG,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACpE,YAAY,EAAE,MAAM;IAkBtB,gDAAgD;IAChD,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK7B;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAMf;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAKzC;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAWhE,4DAA4D;IAC5D,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAyBvC,OAAO,CAAC,UAAU;CAOnB"}
@@ -39,6 +39,8 @@ export class OnlineAIDriver {
39
39
  constructor(host, handlers, initialState) {
40
40
  /** True while a transition is in progress (guards against re-entrant transitions). */
41
41
  this._transitioning = false;
42
+ /** Transition event listeners. */
43
+ this._transitionListeners = [];
42
44
  /** True after destroy() has been called. Guards against use-after-destroy. */
43
45
  this._destroyed = false;
44
46
  this.handlers = handlers instanceof StateHandlerMap ? handlers.toMap() : handlers;
@@ -82,6 +84,47 @@ export class OnlineAIDriver {
82
84
  this._destroyed = true;
83
85
  this.getHandler(this._currentStateId).exit(this.ctx);
84
86
  }
87
+ /**
88
+ * Force an FSM state transition from outside the handler.
89
+ *
90
+ * Calls exit() on the current state and enter() on the new one,
91
+ * exactly like an internal ctx.transition() call. Useful for
92
+ * GOAP directors, scripted events, or any external system that
93
+ * needs to steer the FSM.
94
+ *
95
+ * No-op if the driver has been destroyed.
96
+ * Re-entrant calls are silently ignored (same as internal transitions).
97
+ *
98
+ * @param newStateId - Target state identifier.
99
+ */
100
+ forceTransition(newStateId) {
101
+ if (this._destroyed)
102
+ return;
103
+ this._doTransition(newStateId);
104
+ }
105
+ /**
106
+ * Register a callback that fires after every state transition.
107
+ *
108
+ * Returns an unsubscribe function. Listeners fire synchronously
109
+ * after enter() completes on the new state, in registration order.
110
+ *
111
+ * @param cb - Callback receiving the previous and new state IDs.
112
+ * @returns Unsubscribe function.
113
+ *
114
+ * @example
115
+ * ```ts
116
+ * const unsub = driver.onTransition((from, to) => {
117
+ * console.log(`${npcId}: ${from} → ${to}`);
118
+ * });
119
+ * // Later: unsub();
120
+ * ```
121
+ */
122
+ onTransition(cb) {
123
+ this._transitionListeners.push(cb);
124
+ return () => {
125
+ this._transitionListeners = this._transitionListeners.filter(l => l !== cb);
126
+ };
127
+ }
85
128
  // -------------------------------------------------------------------------
86
129
  // Internal — called by DriverContext
87
130
  // -------------------------------------------------------------------------
@@ -93,10 +136,15 @@ export class OnlineAIDriver {
93
136
  return;
94
137
  }
95
138
  this._transitioning = true;
139
+ const previousStateId = this._currentStateId;
96
140
  try {
97
141
  this.getHandler(this._currentStateId).exit(this.ctx);
98
142
  this._currentStateId = newStateId;
99
143
  this.getHandler(newStateId).enter(this.ctx);
144
+ // Copy to avoid issues if a listener unsubscribes during iteration.
145
+ const listeners = [...this._transitionListeners];
146
+ for (const cb of listeners)
147
+ cb(previousStateId, newStateId);
100
148
  }
101
149
  finally {
102
150
  this._transitioning = false;
@@ -149,6 +197,7 @@ class DriverContext {
149
197
  get pack() { return this.host.pack; }
150
198
  get conditions() { return this.host.conditions; }
151
199
  get suspicion() { return this.host.suspicion; }
200
+ get pathfinding() { return this.host.pathfinding; }
152
201
  // Movement & rendering — delegate to host
153
202
  setVelocity(vx, vy) { this.host.setVelocity(vx, vy); }
154
203
  halt() { this.host.halt(); }
@@ -1 +1 @@
1
- {"version":3,"file":"OnlineAIDriver.js","sourceRoot":"","sources":["../../src/states/OnlineAIDriver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OnlineAIDriver.js","sourceRoot":"","sources":["../../src/states/OnlineAIDriver.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,27 @@ export declare function angleToward(ax: number, ay: number, bx: number, by: numb
20
20
  * avoid jitter; no rotation change is applied.
21
21
  */
22
22
  export declare function moveToward(ctx: INPCContext, targetX: number, targetY: number, speed: number): void;
23
+ /**
24
+ * Move an NPC along a pathfinding-computed route, falling back to direct
25
+ * movement if no pathfinding system is available.
26
+ *
27
+ * When `ctx.pathfinding` is present:
28
+ * 1. If not currently navigating, computes a new path to (targetX, targetY).
29
+ * 2. Reads the next waypoint from the path cursor.
30
+ * 3. Moves toward that waypoint using `moveToward()` (which applies steering).
31
+ *
32
+ * When `ctx.pathfinding` is null:
33
+ * Falls back to `moveToward(ctx, targetX, targetY, speed)` — direct movement.
34
+ *
35
+ * **Path lifecycle:** `findPath()` is called only when `isNavigating()` returns
36
+ * false (path complete or not started). The host's `IPathfindingAccess` implementation
37
+ * is responsible for detecting when the target has moved significantly and invalidating
38
+ * the current path by returning `isNavigating() === false`.
39
+ *
40
+ * Handlers can use this as a drop-in replacement for `moveToward()` to gain
41
+ * obstacle avoidance without changing their logic.
42
+ */
43
+ export declare function moveAlongPath(ctx: INPCContext, targetX: number, targetY: number, speed: number): void;
23
44
  /**
24
45
  * Set the NPC's velocity so it moves directly away from (fromX, fromY) at the
25
46
  * given speed (px/s). Also updates the NPC's rotation to face away.
@@ -1 +1 @@
1
- {"version":3,"file":"_utils.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/_utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAyC,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACxH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAE1E;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAIjF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAElF;AAKD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,IAAI,CAqBN;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,IAAI,CAcN;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,aAAa,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/C,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,SAAO,GACZ,IAAI,CAMN;AAID,OAAO,EAAE,2BAA2B,EAAE,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"_utils.d.ts","sourceRoot":"","sources":["../../../src/states/handlers/_utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAyC,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACxH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAE1E;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAIjF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAElF;AAKD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,IAAI,CAqBN;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,IAAI,CAiBN;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,IAAI,CAcN;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,aAAa,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/C,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,SAAO,GACZ,IAAI,CAMN;AAID,OAAO,EAAE,2BAA2B,EAAE,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -48,6 +48,42 @@ export function moveToward(ctx, targetX, targetY, speed) {
48
48
  ctx.setRotation(Math.atan2(dy, dx));
49
49
  }
50
50
  }
51
+ /**
52
+ * Move an NPC along a pathfinding-computed route, falling back to direct
53
+ * movement if no pathfinding system is available.
54
+ *
55
+ * When `ctx.pathfinding` is present:
56
+ * 1. If not currently navigating, computes a new path to (targetX, targetY).
57
+ * 2. Reads the next waypoint from the path cursor.
58
+ * 3. Moves toward that waypoint using `moveToward()` (which applies steering).
59
+ *
60
+ * When `ctx.pathfinding` is null:
61
+ * Falls back to `moveToward(ctx, targetX, targetY, speed)` — direct movement.
62
+ *
63
+ * **Path lifecycle:** `findPath()` is called only when `isNavigating()` returns
64
+ * false (path complete or not started). The host's `IPathfindingAccess` implementation
65
+ * is responsible for detecting when the target has moved significantly and invalidating
66
+ * the current path by returning `isNavigating() === false`.
67
+ *
68
+ * Handlers can use this as a drop-in replacement for `moveToward()` to gain
69
+ * obstacle avoidance without changing their logic.
70
+ */
71
+ export function moveAlongPath(ctx, targetX, targetY, speed) {
72
+ if (ctx.pathfinding) {
73
+ // Start a new path if not currently navigating.
74
+ if (!ctx.pathfinding.isNavigating()) {
75
+ ctx.pathfinding.findPath(targetX, targetY);
76
+ }
77
+ // Follow the next waypoint.
78
+ const wp = ctx.pathfinding.getNextWaypoint();
79
+ if (wp) {
80
+ moveToward(ctx, wp.x, wp.y, speed);
81
+ return;
82
+ }
83
+ }
84
+ // Fallback: direct straight-line movement (existing behavior).
85
+ moveToward(ctx, targetX, targetY, speed);
86
+ }
51
87
  /**
52
88
  * Set the NPC's velocity so it moves directly away from (fromX, fromY) at the
53
89
  * given speed (px/s). Also updates the NPC's rotation to face away.
@@ -1 +1 @@
1
- {"version":3,"file":"_utils.js","sourceRoot":"","sources":["../../../src/states/handlers/_utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"_utils.js","sourceRoot":"","sources":["../../../src/states/handlers/_utils.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ export { createDefaultStateConfig } from './IStateConfig';
3
3
  export * from './IStateTransitionMap';
4
4
  export type { ILoopholeState, IChargePhase, IStalkPhase, ILeapPhase, IPsiPhase, INPCOnlineState, } from './INPCOnlineState';
5
5
  export { createDefaultNPCOnlineState } from './NPCOnlineState';
6
- export type { INPCPerception, INPCHealth, ICoverAccess, IDangerAccess, IRestrictedZoneAccess, ISquadAccess, IConditionAccess, ISuspicionAccess, IShootPayload, IMeleeHitPayload, INPCContext, } from './INPCContext';
6
+ export type { INPCPerception, INPCHealth, ICoverAccess, IDangerAccess, IRestrictedZoneAccess, ISquadAccess, IConditionAccess, ISuspicionAccess, IPathfindingAccess, IShootPayload, IMeleeHitPayload, INPCContext, } from './INPCContext';
7
7
  export type { IPackAccess, IPackTarget, PackAlertLevel } from './pack/IPackAccess';
8
8
  export { PACK_ALERT_ORDER } from './pack/IPackAccess';
9
9
  export type { IOnlineStateHandler } from './IOnlineStateHandler';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/states/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClH,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,cAAc,uBAAuB,CAAC;AAEtC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAE/D,YAAY,EACV,cAAc,EACd,UAAU,EACV,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,cAAc,kBAAkB,CAAC;AAEjC,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/states/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClH,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,cAAc,uBAAuB,CAAC;AAEtC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAE/D,YAAY,EACV,cAAc,EACd,UAAU,EACV,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,cAAc,kBAAkB,CAAC;AAEjC,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/states/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,8DAA8D;AAG9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,cAAc,uBAAuB,CAAC;AAWtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAiB/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/states/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,8DAA8D;AAG9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,cAAc,uBAAuB,CAAC;AAWtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAkB/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alife-sdk/ai",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "description": "Online frame-based NPC behavior system",
5
5
  "type": "module",
6
6
  "sideEffects": false,