@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 +150 -47
- package/dist/cover/CoverAccessAdapter.js +1 -1
- package/dist/cover/CoverAccessAdapter.js.map +1 -1
- package/dist/goap/GOAPDirector.d.ts +89 -0
- package/dist/goap/GOAPDirector.d.ts.map +1 -0
- package/dist/goap/GOAPDirector.js +142 -0
- package/dist/goap/GOAPDirector.js.map +1 -0
- package/dist/goap/index.d.ts +2 -0
- package/dist/goap/index.d.ts.map +1 -1
- package/dist/goap/index.js +1 -0
- package/dist/goap/index.js.map +1 -1
- package/dist/states/INPCContext.d.ts +64 -0
- package/dist/states/INPCContext.d.ts.map +1 -1
- package/dist/states/INPCOnlineState.d.ts +22 -0
- package/dist/states/INPCOnlineState.d.ts.map +1 -1
- package/dist/states/NPCOnlineState.d.ts.map +1 -1
- package/dist/states/NPCOnlineState.js +2 -0
- package/dist/states/NPCOnlineState.js.map +1 -1
- package/dist/states/OnlineAIDriver.d.ts +34 -0
- package/dist/states/OnlineAIDriver.d.ts.map +1 -1
- package/dist/states/OnlineAIDriver.js +49 -0
- package/dist/states/OnlineAIDriver.js.map +1 -1
- package/dist/states/handlers/_utils.d.ts +21 -0
- package/dist/states/handlers/_utils.d.ts.map +1 -1
- package/dist/states/handlers/_utils.js +36 -0
- package/dist/states/handlers/_utils.js.map +1 -1
- package/dist/states/index.d.ts +1 -1
- package/dist/states/index.d.ts.map +1 -1
- package/dist/states/index.js.map +1 -1
- package/package.json +1 -1
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
|
-
- **
|
|
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
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
//
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
176
|
-
//
|
|
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:
|
|
245
|
-
danger:
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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 `
|
|
421
|
-
| 2 `
|
|
422
|
-
| 3 `
|
|
423
|
-
| 4 `
|
|
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,
|
|
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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"}
|
package/dist/goap/index.d.ts
CHANGED
|
@@ -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
|
package/dist/goap/index.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/goap/index.js
CHANGED
|
@@ -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
|
package/dist/goap/index.js.map
CHANGED
|
@@ -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":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMtD;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,iBAAiB,IAAI,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE5F;;;OAGG;IACH,gBAAgB,IAAI,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAExE;;;OAGG;IACH,cAAc,IAAI,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEpF,yEAAyE;IACzE,eAAe,IAAI,OAAO,CAAC;IAE3B;;;;;;OAMG;IACH,gBAAgB,CAAC,IAAI,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE5F;;;;;;;;;OASG;IACH,iBAAiB,CAAC,IAAI,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE7F;;;;;;;;;;;;;OAaG;IACH,iBAAiB,CAAC,IAAI,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3E;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,0BAA0B;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,iDAAiD;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;;;;OAKG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;OASG;IACH,SAAS,CACP,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAEnC;;;;;;;;;;;;OAYG;IACH,aAAa,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAEvD;;;;;;;OAOG;IACH,SAAS,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE7C;;;;;;OAMG;IACH,gBAAgB,CACd,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACjE;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAE5C;;;;;OAKG;IACH,gBAAgB,CACd,MAAM,EAAE,aAAa,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAC9C,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpC;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAE5C;;;;;;;;;;OAUG;IACH,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvD;;;;;;OAMG;IACH,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtE;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,QAAQ,IAAI,MAAM,CAAC;IAEnB;;;;;OAKG;IACH,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7C;;;OAGG;IACH,oBAAoB,IAAI;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAExD;;;;;;;;;OASG;IACH,GAAG,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/E;;;OAGG;IACH,aAAa,IAAI,IAAI,CAAC;IAEtB;;;;;;OAMG;IACH,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;OAMG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1D;;;OAGG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI,CAAC;IAE7B,4DAA4D;IAC5D,cAAc,IAAI,MAAM,CAAC;IAEzB;;;;OAIG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC;;;;;;;;OAQG;IACH,eAAe,CAAC,IAAI,iBAAiB,GAAG,IAAI,CAAC;CAC9C;AAMD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,CAAC,EAAE,MAAM,CAAC;IACV,mCAAmC;IACnC,CAAC,EAAE,MAAM,CAAC;IACV,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,WAAW;IAK1B,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAM5B,uCAAuC;IACvC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAEnB,uCAAuC;IACvC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAMnB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAMhC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAE3C;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAMnC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1C,4DAA4D;IAC5D,IAAI,IAAI,IAAI,CAAC;IAEb;;;;OAIG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAErC;;;OAGG;IACH,cAAc,IAAI,IAAI,CAAC;IAMvB;;;;;;;OAOG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAErC,wDAAwD;IACxD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAMhC;;;;OAIG;IACH,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAExC;;;;OAIG;IACH,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAE9C;;;;OAIG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAErC;;;;;OAKG;IACH,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAM/C;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAEpC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAEtC;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAEvD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAEpC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAElC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAE7C;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;
|
|
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":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAMpE;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC3C,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,MAAM,EAAE,OAAO,CAAC;IAChB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;IAChB,kFAAkF;IAClF,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,MAAM,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,yCAAyC;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAK9B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;IAExB,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAM1B,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IAErB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IAEtB,+FAA+F;IAC/F,oBAAoB,EAAE,MAAM,CAAC;IAE7B,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IAEpB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IAEpB,kDAAkD;IAClD,kBAAkB,EAAE,MAAM,CAAC;IAE3B,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;IAEtB,kEAAkE;IAClE,qBAAqB,EAAE,MAAM,CAAC;IAE9B,8DAA8D;IAC9D,mBAAmB,EAAE,MAAM,CAAC;IAE5B,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;IAErB,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;;OAMG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B,gHAAgH;IAChH,cAAc,EAAE,MAAM,CAAC;IAEvB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IAErB,oDAAoD;IACpD,kBAAkB,EAAE,MAAM,CAAC;IAE3B,+GAA+G;IAC/G,4BAA4B,EAAE,MAAM,CAAC;IAMrC,0EAA0E;IAC1E,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,gFAAgF;IAChF,kBAAkB,EAAE,MAAM,CAAC;IAE3B,yGAAyG;IACzG,wBAAwB,EAAE,MAAM,CAAC;IAEjC,sFAAsF;IACtF,YAAY,EAAE,MAAM,CAAC;IAErB,sFAAsF;IACtF,YAAY,EAAE,MAAM,CAAC;IAMrB,2EAA2E;IAC3E,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,gFAAgF;IAChF,kBAAkB,EAAE,MAAM,CAAC;IAE3B,qEAAqE;IACrE,qBAAqB,EAAE,MAAM,CAAC;IAE9B,yEAAyE;IACzE,uBAAuB,EAAE,MAAM,CAAC;IAEhC,kFAAkF;IAClF,yBAAyB,EAAE,MAAM,CAAC;IAElC,iEAAiE;IACjE,qBAAqB,EAAE,MAAM,CAAC;IAE9B,4EAA4E;IAC5E,uBAAuB,EAAE,MAAM,CAAC;IAEhC,gFAAgF;IAChF,kBAAkB,EAAE,MAAM,CAAC;IAE3B,gFAAgF;IAChF,kBAAkB,EAAE,MAAM,CAAC;IAM3B,2GAA2G;IAC3G,mBAAmB,EAAE,MAAM,CAAC;IAM5B,mEAAmE;IACnE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,+EAA+E;IAC/E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IAErB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IAMpB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IAEjB,wDAAwD;IACxD,aAAa,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB,8FAA8F;IAC9F,WAAW,EAAE,MAAM,CAAC;IAEpB,8FAA8F;IAC9F,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAEhC;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAM1B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,YAAY,CAAC;IAE3B,uCAAuC;IACvC,UAAU,CAAC,EAAE,WAAW,CAAC;IAEzB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,UAAU,CAAC;IAEvB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;;OAIG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC;IAEjC;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAM5B;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IAM9C;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC"}
|
|
@@ -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,
|
|
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"}
|
|
@@ -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;
|
|
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;
|
|
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":"AAAA,2BAA2B;AAC3B,8CAA8C;AAC9C,EAAE;AACF,QAAQ;AACR,kEAAkE;AAClE,2DAA2D;AAC3D,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,mCAAmC;AACnC,EAAE;AACF,sCAAsC;AACtC,qCAAqC;AACrC,qDAAqD;AAIrD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAkBpD,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,cAAc;
|
|
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":"AAAA,4BAA4B;AAC5B,qDAAqD;AACrD,0EAA0E;AAG1E,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAGxH;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;IACvE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;IACxE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,yDAAyD;AACzD,MAAM,aAAa,GAAG,2BAA2B,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;AAEnG;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CACxB,GAAgB,EAChB,OAAe,EACf,OAAe,EACf,KAAa;IAEb,MAAM,EAAE,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAE1C,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;IACtB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;IAEtB,8DAA8D;IAC9D,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IACxD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,WAAW,CAAC,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;QAC1C,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CACtB,GAAgB,EAChB,KAAa,EACb,KAAa,EACb,KAAa;IAEb,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IACzB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAE1C,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;QACf,uEAAuE;QACvE,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IAED,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1D,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAgB,EAChB,MAA+C,EAC/C,MAAuB,EACvB,SAAiB,EACjB,SAAiB,EACjB,KAAa,EACb,MAAM,GAAG,IAAI;IAEb,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAChF,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,uEAAuE;AACvE,wEAAwE;AACxE,OAAO,EAAE,2BAA2B,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"_utils.js","sourceRoot":"","sources":["../../../src/states/handlers/_utils.ts"],"names":[],"mappings":"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"}
|
package/dist/states/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/states/index.js.map
CHANGED
|
@@ -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;
|
|
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"}
|