@sharpee/engine 0.9.93 → 0.9.96
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/command-executor.d.ts +9 -2
- package/command-executor.d.ts.map +1 -1
- package/command-executor.js +21 -10
- package/command-executor.js.map +1 -1
- package/game-engine.d.ts +7 -8
- package/game-engine.d.ts.map +1 -1
- package/game-engine.js +40 -84
- package/game-engine.js.map +1 -1
- package/index.d.ts +0 -3
- package/index.d.ts.map +1 -1
- package/index.js +2 -9
- package/index.js.map +1 -1
- package/language-provider-interface.d.ts +31 -0
- package/language-provider-interface.d.ts.map +1 -0
- package/language-provider-interface.js +18 -0
- package/language-provider-interface.js.map +1 -0
- package/package.json +12 -12
- package/save-restore-service.d.ts.map +1 -1
- package/save-restore-service.js +3 -6
- package/save-restore-service.js.map +1 -1
- package/turn-event-processor.d.ts +17 -5
- package/turn-event-processor.d.ts.map +1 -1
- package/turn-event-processor.js +61 -7
- package/turn-event-processor.js.map +1 -1
- package/types.d.ts +2 -20
- package/types.d.ts.map +1 -1
package/command-executor.d.ts
CHANGED
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
*
|
|
10
10
|
* All event creation is owned by the action components themselves.
|
|
11
11
|
*/
|
|
12
|
-
import { ISystemEvent, IGenericEventSource } from "../core/index";
|
|
13
|
-
import { IParser, IParsedCommand } from "../world-model/index";
|
|
12
|
+
import { ISystemEvent, IGenericEventSource, Result } from "../core/index";
|
|
13
|
+
import { IParser, IValidatedCommand, IParsedCommand, IValidationError } from "../world-model/index";
|
|
14
14
|
import { WorldModel } from "../world-model/index";
|
|
15
15
|
import { EventProcessor } from "../event-processor/index";
|
|
16
16
|
import { ActionRegistry } from "../stdlib/index";
|
|
@@ -33,6 +33,13 @@ export declare class CommandExecutor {
|
|
|
33
33
|
private scopeResolver?;
|
|
34
34
|
private parsedCommandTransformers;
|
|
35
35
|
constructor(world: WorldModel, actionRegistry: ActionRegistry, eventProcessor: EventProcessor, parser: IParser, systemEvents?: IGenericEventSource<ISystemEvent>);
|
|
36
|
+
/**
|
|
37
|
+
* Validate a parsed command against the world model.
|
|
38
|
+
*
|
|
39
|
+
* @param command - The parsed command to validate
|
|
40
|
+
* @returns Result with validated command or validation error
|
|
41
|
+
*/
|
|
42
|
+
validateCommand(command: IParsedCommand): Result<IValidatedCommand, IValidationError>;
|
|
36
43
|
/**
|
|
37
44
|
* Register a transformer that can modify parsed commands before validation.
|
|
38
45
|
* Transformers are called in order of registration.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-executor.d.ts","sourceRoot":"","sources":["../../../../../repos/sharpee/packages/engine/src/command-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAkB,YAAY,EAAE,mBAAmB,EAA0B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"command-executor.d.ts","sourceRoot":"","sources":["../../../../../repos/sharpee/packages/engine/src/command-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAkB,YAAY,EAAE,mBAAmB,EAA0B,MAAM,EAAE,MAAM,eAAe,CAAC;AAClH,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGpG,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAEL,cAAc,EAKf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAWhE;;;;;;;;GAQG;AACH,MAAM,MAAM,wBAAwB,GAAG,CACrC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,UAAU,KACd,cAAc,CAAC;AAEpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,yBAAyB,CAAkC;gBAGjE,KAAK,EAAE,UAAU,EACjB,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,OAAO,EACf,YAAY,CAAC,EAAE,mBAAmB,CAAC,YAAY,CAAC;IAgBlD;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;IAIrF;;;;;OAKG;IACH,gCAAgC,CAAC,WAAW,EAAE,wBAAwB,GAAG,IAAI;IAI7E;;;;;OAKG;IACH,kCAAkC,CAAC,WAAW,EAAE,wBAAwB,GAAG,OAAO;IAS5E,OAAO,CACX,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,UAAU,CAAC;CA8SvB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,EACjB,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,OAAO,EACf,YAAY,CAAC,EAAE,mBAAmB,CAAC,YAAY,CAAC,GAC/C,eAAe,CAEjB"}
|
package/command-executor.js
CHANGED
|
@@ -17,7 +17,6 @@ const core_1 = require("../core/index.js");
|
|
|
17
17
|
const parser_interface_1 = require("./parser-interface");
|
|
18
18
|
const shared_data_keys_1 = require("./shared-data-keys");
|
|
19
19
|
const stdlib_1 = require("../stdlib/index.js");
|
|
20
|
-
const event_sequencer_1 = require("./event-sequencer");
|
|
21
20
|
const action_context_factory_1 = require("./action-context-factory");
|
|
22
21
|
const capability_dispatch_helper_1 = require("./capability-dispatch-helper");
|
|
23
22
|
class CommandExecutor {
|
|
@@ -44,6 +43,15 @@ class CommandExecutor {
|
|
|
44
43
|
this.actionRegistry = actionRegistry;
|
|
45
44
|
this.eventProcessor = eventProcessor;
|
|
46
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Validate a parsed command against the world model.
|
|
48
|
+
*
|
|
49
|
+
* @param command - The parsed command to validate
|
|
50
|
+
* @returns Result with validated command or validation error
|
|
51
|
+
*/
|
|
52
|
+
validateCommand(command) {
|
|
53
|
+
return this.validator.validate(command);
|
|
54
|
+
}
|
|
47
55
|
/**
|
|
48
56
|
* Register a transformer that can modify parsed commands before validation.
|
|
49
57
|
* Transformers are called in order of registration.
|
|
@@ -69,7 +77,6 @@ class CommandExecutor {
|
|
|
69
77
|
}
|
|
70
78
|
async execute(input, world, context, config) {
|
|
71
79
|
const turn = context.currentTurn;
|
|
72
|
-
event_sequencer_1.eventSequencer.resetTurn(turn);
|
|
73
80
|
// Timing tracking
|
|
74
81
|
const startTime = config?.collectTiming ? Date.now() : 0;
|
|
75
82
|
let parseTime = 0;
|
|
@@ -88,7 +95,7 @@ class CommandExecutor {
|
|
|
88
95
|
parseTime = Date.now() - parseStart;
|
|
89
96
|
}
|
|
90
97
|
if (!parseResult.success) {
|
|
91
|
-
throw new Error(`Parse failed: ${parseResult.error
|
|
98
|
+
throw new Error(`Parse failed: ${parseResult.error?.code || 'UNKNOWN'}`);
|
|
92
99
|
}
|
|
93
100
|
// Phase 1.5: Apply parsed command transformers
|
|
94
101
|
// Allows stories to modify parsed commands before validation
|
|
@@ -104,8 +111,11 @@ class CommandExecutor {
|
|
|
104
111
|
const details = validationResult.error.details || {};
|
|
105
112
|
const candidates = details.ambiguousEntities || [];
|
|
106
113
|
// Emit client.query event for disambiguation
|
|
107
|
-
const queryEvent =
|
|
114
|
+
const queryEvent = {
|
|
115
|
+
id: `query_disambig_${turn}_${Date.now()}`,
|
|
108
116
|
type: 'client.query',
|
|
117
|
+
timestamp: Date.now(),
|
|
118
|
+
entities: {},
|
|
109
119
|
data: {
|
|
110
120
|
source: core_1.QuerySource.DISAMBIGUATION,
|
|
111
121
|
type: core_1.QueryType.DISAMBIGUATION,
|
|
@@ -114,7 +124,7 @@ class CommandExecutor {
|
|
|
114
124
|
searchText: details.searchText,
|
|
115
125
|
originalCommand: parsedCommand
|
|
116
126
|
}
|
|
117
|
-
}
|
|
127
|
+
};
|
|
118
128
|
// Return early with query pending
|
|
119
129
|
return {
|
|
120
130
|
turn,
|
|
@@ -277,13 +287,11 @@ class CommandExecutor {
|
|
|
277
287
|
allEvents = [...events, ...processed.reactions];
|
|
278
288
|
}
|
|
279
289
|
}
|
|
280
|
-
// Preserve all event properties (including requiresClientAction for platform events)
|
|
281
|
-
const sequenced = event_sequencer_1.eventSequencer.sequenceAll(allEvents, turn);
|
|
282
290
|
const result = {
|
|
283
291
|
turn,
|
|
284
292
|
input,
|
|
285
293
|
success: !events.some(e => e.type === 'action.error'),
|
|
286
|
-
events:
|
|
294
|
+
events: allEvents,
|
|
287
295
|
actionId: command.actionId,
|
|
288
296
|
parsedCommand: command.parsed,
|
|
289
297
|
validatedCommand: command
|
|
@@ -304,10 +312,13 @@ class CommandExecutor {
|
|
|
304
312
|
turn,
|
|
305
313
|
input,
|
|
306
314
|
success: false,
|
|
307
|
-
events: [
|
|
315
|
+
events: [{
|
|
316
|
+
id: `cmd_failed_${turn}_${Date.now()}`,
|
|
308
317
|
type: 'command.failed',
|
|
318
|
+
timestamp: Date.now(),
|
|
319
|
+
entities: {},
|
|
309
320
|
data: { reason: error.message, input }
|
|
310
|
-
}
|
|
321
|
+
}],
|
|
311
322
|
error: error.message
|
|
312
323
|
};
|
|
313
324
|
// Add timing data even for errors if requested
|
package/command-executor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../../../../../repos/sharpee/packages/engine/src/command-executor.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;
|
|
1
|
+
{"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../../../../../repos/sharpee/packages/engine/src/command-executor.ts"],"names":[],"mappings":"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"}
|
package/game-engine.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { ITextService } from "../text-service/index";
|
|
|
11
11
|
import { ITextBlock } from "../text-blocks/index";
|
|
12
12
|
import { ISemanticEvent, ISaveRestoreHooks, ISemanticEventSource } from "../core/index";
|
|
13
13
|
import { PluginRegistry } from "../plugins/index";
|
|
14
|
-
import { GameContext, TurnResult, EngineConfig
|
|
14
|
+
import { GameContext, TurnResult, EngineConfig } from './types';
|
|
15
15
|
import { Story } from './story';
|
|
16
16
|
import { NarrativeSettings } from './narrative';
|
|
17
17
|
import { ParsedCommandTransformer } from './command-executor';
|
|
@@ -22,7 +22,7 @@ export interface GameEngineEvents {
|
|
|
22
22
|
'turn:start': (turn: number, input: string) => void;
|
|
23
23
|
'turn:complete': (result: TurnResult) => void;
|
|
24
24
|
'turn:failed': (error: Error, turn: number) => void;
|
|
25
|
-
'event': (event:
|
|
25
|
+
'event': (event: ISemanticEvent) => void;
|
|
26
26
|
'state:changed': (context: GameContext) => void;
|
|
27
27
|
'game:over': (context: GameContext) => void;
|
|
28
28
|
'text:output': (blocks: ITextBlock[], turn: number) => void;
|
|
@@ -209,6 +209,10 @@ export declare class GameEngine {
|
|
|
209
209
|
* Register save/restore hooks
|
|
210
210
|
*/
|
|
211
211
|
registerSaveRestoreHooks(hooks: ISaveRestoreHooks): void;
|
|
212
|
+
/**
|
|
213
|
+
* Get currently registered save/restore hooks
|
|
214
|
+
*/
|
|
215
|
+
getSaveRestoreHooks(): ISaveRestoreHooks | undefined;
|
|
212
216
|
/**
|
|
213
217
|
* Register a transformer for parsed commands.
|
|
214
218
|
* Transformers are called after parsing but before validation,
|
|
@@ -269,7 +273,7 @@ export declare class GameEngine {
|
|
|
269
273
|
/**
|
|
270
274
|
* Get recent events
|
|
271
275
|
*/
|
|
272
|
-
getRecentEvents(count?: number):
|
|
276
|
+
getRecentEvents(count?: number): ISemanticEvent[];
|
|
273
277
|
/**
|
|
274
278
|
* Update vocabulary for an entity
|
|
275
279
|
*/
|
|
@@ -304,11 +308,6 @@ export declare class GameEngine {
|
|
|
304
308
|
* Emit an event to listeners
|
|
305
309
|
*/
|
|
306
310
|
private emit;
|
|
307
|
-
/**
|
|
308
|
-
* Dispatch an event to entity handlers (entity.on)
|
|
309
|
-
* Entities can define handlers for specific event types
|
|
310
|
-
*/
|
|
311
|
-
private dispatchEntityHandlers;
|
|
312
311
|
/**
|
|
313
312
|
* Check if game is over
|
|
314
313
|
*/
|
package/game-engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-engine.d.ts","sourceRoot":"","sources":["../../../../../repos/sharpee/packages/engine/src/game-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,UAAU,EACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"game-engine.d.ts","sourceRoot":"","sources":["../../../../../repos/sharpee/packages/engine/src/game-engine.ts"],"names":[],"mappings":"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"}
|
package/game-engine.js
CHANGED
|
@@ -15,12 +15,12 @@ const plugins_1 = require("../plugins/index.js");
|
|
|
15
15
|
const narrative_1 = require("./narrative");
|
|
16
16
|
const command_executor_1 = require("./command-executor");
|
|
17
17
|
const action_context_factory_1 = require("./action-context-factory");
|
|
18
|
-
const
|
|
19
|
-
const event_adapter_1 = require("./event-adapter");
|
|
18
|
+
const turn_event_processor_1 = require("./turn-event-processor");
|
|
20
19
|
const parser_interface_1 = require("./parser-interface");
|
|
20
|
+
const language_provider_interface_1 = require("./language-provider-interface");
|
|
21
21
|
const vocabulary_manager_1 = require("./vocabulary-manager");
|
|
22
22
|
const save_restore_service_1 = require("./save-restore-service");
|
|
23
|
-
const
|
|
23
|
+
const turn_event_processor_2 = require("./turn-event-processor");
|
|
24
24
|
/**
|
|
25
25
|
* Main game engine
|
|
26
26
|
*/
|
|
@@ -95,7 +95,7 @@ class GameEngine {
|
|
|
95
95
|
registerHandler: (eventType, handler) => {
|
|
96
96
|
this.eventProcessor.registerHandler(eventType, (event, _query) => {
|
|
97
97
|
// The adapted handler doesn't need WorldQuery, it captures world in closure
|
|
98
|
-
// Cast to Effect[] since handler returns unknown[] (to avoid circular deps)
|
|
98
|
+
// Cast to Effect[] since wiring handler returns unknown[] (to avoid circular deps)
|
|
99
99
|
return handler(event);
|
|
100
100
|
});
|
|
101
101
|
}
|
|
@@ -111,12 +111,10 @@ class GameEngine {
|
|
|
111
111
|
this.systemEventSource.subscribe((event) => {
|
|
112
112
|
this.emit('event', {
|
|
113
113
|
id: event.id,
|
|
114
|
-
timestamp: new Date(event.timestamp),
|
|
115
114
|
type: `system.${event.type}`,
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
scope: 'global'
|
|
115
|
+
timestamp: event.timestamp,
|
|
116
|
+
entities: {},
|
|
117
|
+
data: event.data
|
|
120
118
|
});
|
|
121
119
|
});
|
|
122
120
|
this.pluginRegistry = new plugins_1.PluginRegistry();
|
|
@@ -127,7 +125,7 @@ class GameEngine {
|
|
|
127
125
|
this.saveRestoreService = (0, save_restore_service_1.createSaveRestoreService)({
|
|
128
126
|
maxSnapshots: this.config.maxUndoSnapshots ?? 10
|
|
129
127
|
});
|
|
130
|
-
this.turnEventProcessor = (0,
|
|
128
|
+
this.turnEventProcessor = (0, turn_event_processor_2.createTurnEventProcessor)(this.perceptionService);
|
|
131
129
|
// Set provided dependencies
|
|
132
130
|
this.languageProvider = options.language;
|
|
133
131
|
this.parser = options.parser;
|
|
@@ -260,11 +258,11 @@ class GameEngine {
|
|
|
260
258
|
this.sessionTurns = 0;
|
|
261
259
|
this.sessionMoves = 0;
|
|
262
260
|
// Keep currentTurn as is (already 1 from constructor)
|
|
263
|
-
// Get version info from StoryInfoTrait
|
|
264
|
-
const storyInfoEntities = this.world.findByTrait(
|
|
265
|
-
const storyInfoTrait = storyInfoEntities[0]?.get(
|
|
266
|
-
const engineVersion = storyInfoTrait?.engineVersion
|
|
267
|
-
const clientVersion = storyInfoTrait?.clientVersion
|
|
261
|
+
// Get version info from StoryInfoTrait
|
|
262
|
+
const storyInfoEntities = this.world.findByTrait(world_model_1.TraitType.STORY_INFO);
|
|
263
|
+
const storyInfoTrait = storyInfoEntities[0]?.get(world_model_1.StoryInfoTrait);
|
|
264
|
+
const engineVersion = storyInfoTrait?.engineVersion;
|
|
265
|
+
const clientVersion = storyInfoTrait?.clientVersion;
|
|
268
266
|
// Emit game started event
|
|
269
267
|
const startedEvent = (0, core_1.createGameStartedEvent)({
|
|
270
268
|
id: this.story?.config.id,
|
|
@@ -389,13 +387,16 @@ class GameEngine {
|
|
|
389
387
|
const turn = this.context.currentTurn;
|
|
390
388
|
// Validate input
|
|
391
389
|
if (input === null || input === undefined) {
|
|
392
|
-
const errorEvent =
|
|
390
|
+
const errorEvent = {
|
|
391
|
+
id: `cmd_failed_${turn}_${Date.now()}`,
|
|
393
392
|
type: 'command.failed',
|
|
393
|
+
timestamp: Date.now(),
|
|
394
|
+
entities: {},
|
|
394
395
|
data: {
|
|
395
396
|
reason: 'Input cannot be null or undefined',
|
|
396
397
|
input: input
|
|
397
398
|
}
|
|
398
|
-
}
|
|
399
|
+
};
|
|
399
400
|
return {
|
|
400
401
|
turn,
|
|
401
402
|
input: input,
|
|
@@ -432,7 +433,7 @@ class GameEngine {
|
|
|
432
433
|
turn,
|
|
433
434
|
input: metaResult.input,
|
|
434
435
|
success: metaResult.success,
|
|
435
|
-
events: metaResult.events
|
|
436
|
+
events: metaResult.events,
|
|
436
437
|
error: metaResult.error,
|
|
437
438
|
actionId: metaResult.actionId
|
|
438
439
|
};
|
|
@@ -450,11 +451,8 @@ class GameEngine {
|
|
|
450
451
|
playerId: this.context.player.id,
|
|
451
452
|
locationId: playerLocation
|
|
452
453
|
};
|
|
453
|
-
// Store events for this turn (
|
|
454
|
-
let semanticEvents = result.events.map(e =>
|
|
455
|
-
const semantic = (0, event_adapter_1.toSemanticEvent)(e);
|
|
456
|
-
return (0, event_adapter_1.processEvent)(semantic, enrichmentContext);
|
|
457
|
-
});
|
|
454
|
+
// Store events for this turn (process through enrichment pipeline)
|
|
455
|
+
let semanticEvents = result.events.map(e => (0, turn_event_processor_1.processEvent)(e, enrichmentContext));
|
|
458
456
|
// Apply perception filtering if service is configured
|
|
459
457
|
// This transforms events based on what the player can perceive
|
|
460
458
|
if (this.perceptionService) {
|
|
@@ -491,9 +489,8 @@ class GameEngine {
|
|
|
491
489
|
let victoryDetails = null;
|
|
492
490
|
for (const event of result.events) {
|
|
493
491
|
this.emit('event', event);
|
|
494
|
-
// NOTE: Entity handlers (
|
|
495
|
-
// event-processor in the command executor
|
|
496
|
-
// dispatchEntityHandlers here to avoid duplicate handler invocations.
|
|
492
|
+
// NOTE: Entity `on` handlers removed (ISSUE-068). Story-level handlers
|
|
493
|
+
// are dispatched by the event-processor in the command executor.
|
|
497
494
|
// Check for story victory event but don't stop immediately
|
|
498
495
|
// (we're still processing the turn)
|
|
499
496
|
if (event.type === 'story.victory') {
|
|
@@ -545,7 +542,7 @@ class GameEngine {
|
|
|
545
542
|
await this.processPlatformOperations(turn);
|
|
546
543
|
// Update result.events with any platform completion events
|
|
547
544
|
const allTurnEvents = this.turnEvents.get(turn) || [];
|
|
548
|
-
result.events = allTurnEvents;
|
|
545
|
+
result.events = allTurnEvents;
|
|
549
546
|
}
|
|
550
547
|
// Process text output (ADR-096, ADR-133)
|
|
551
548
|
if (this.textService) {
|
|
@@ -600,7 +597,7 @@ class GameEngine {
|
|
|
600
597
|
const events = [];
|
|
601
598
|
try {
|
|
602
599
|
// Validate the command
|
|
603
|
-
const validationResult = this.commandExecutor.
|
|
600
|
+
const validationResult = this.commandExecutor.validateCommand(parsedCommand);
|
|
604
601
|
if (!validationResult.success) {
|
|
605
602
|
// Validation failed - emit error event using domain event pattern
|
|
606
603
|
const errorEvent = {
|
|
@@ -956,7 +953,7 @@ class GameEngine {
|
|
|
956
953
|
*/
|
|
957
954
|
configureLanguageProviderNarrative(player) {
|
|
958
955
|
// Check if language provider supports narrative settings
|
|
959
|
-
if (!this.languageProvider || !(
|
|
956
|
+
if (!this.languageProvider || !(0, language_provider_interface_1.hasNarrativeSettings)(this.languageProvider)) {
|
|
960
957
|
return;
|
|
961
958
|
}
|
|
962
959
|
// Build narrative context for language provider
|
|
@@ -971,16 +968,17 @@ class GameEngine {
|
|
|
971
968
|
}
|
|
972
969
|
else {
|
|
973
970
|
// Fall back to player entity's ActorTrait
|
|
974
|
-
const actorTrait = player.get(
|
|
971
|
+
const actorTrait = player.get(world_model_1.ActorTrait);
|
|
975
972
|
if (actorTrait?.pronouns) {
|
|
976
973
|
// Handle both single PronounSet and array of PronounSets
|
|
977
|
-
|
|
974
|
+
const pronounSet = Array.isArray(actorTrait.pronouns)
|
|
978
975
|
? actorTrait.pronouns[0]
|
|
979
976
|
: actorTrait.pronouns;
|
|
977
|
+
narrativeContext.playerPronouns = pronounSet;
|
|
980
978
|
}
|
|
981
979
|
}
|
|
982
980
|
}
|
|
983
|
-
// Configure language provider
|
|
981
|
+
// Configure language provider (type narrowed by hasNarrativeSettings guard)
|
|
984
982
|
this.languageProvider.setNarrativeSettings(narrativeContext);
|
|
985
983
|
}
|
|
986
984
|
/**
|
|
@@ -1036,6 +1034,12 @@ class GameEngine {
|
|
|
1036
1034
|
registerSaveRestoreHooks(hooks) {
|
|
1037
1035
|
this.saveRestoreHooks = hooks;
|
|
1038
1036
|
}
|
|
1037
|
+
/**
|
|
1038
|
+
* Get currently registered save/restore hooks
|
|
1039
|
+
*/
|
|
1040
|
+
getSaveRestoreHooks() {
|
|
1041
|
+
return this.saveRestoreHooks;
|
|
1042
|
+
}
|
|
1039
1043
|
/**
|
|
1040
1044
|
* Register a transformer for parsed commands.
|
|
1041
1045
|
* Transformers are called after parsing but before validation,
|
|
@@ -1139,7 +1143,7 @@ class GameEngine {
|
|
|
1139
1143
|
playerId: this.context.player.id,
|
|
1140
1144
|
locationId: playerLocation ?? undefined
|
|
1141
1145
|
};
|
|
1142
|
-
let processed = events.map(e => (0,
|
|
1146
|
+
let processed = events.map(e => (0, turn_event_processor_1.processEvent)(e, enrichmentContext));
|
|
1143
1147
|
if (this.perceptionService) {
|
|
1144
1148
|
processed = this.perceptionService.filterEvents(processed, this.context.player, this.world);
|
|
1145
1149
|
}
|
|
@@ -1161,7 +1165,6 @@ class GameEngine {
|
|
|
1161
1165
|
}
|
|
1162
1166
|
for (const event of processed) {
|
|
1163
1167
|
this.emit('event', event);
|
|
1164
|
-
this.dispatchEntityHandlers(event);
|
|
1165
1168
|
}
|
|
1166
1169
|
}
|
|
1167
1170
|
/**
|
|
@@ -1205,8 +1208,8 @@ class GameEngine {
|
|
|
1205
1208
|
for (const turn of recentTurns) {
|
|
1206
1209
|
allEvents.push(...turn.events);
|
|
1207
1210
|
}
|
|
1208
|
-
//
|
|
1209
|
-
return
|
|
1211
|
+
// Return most recent
|
|
1212
|
+
return allEvents.slice(-count);
|
|
1210
1213
|
}
|
|
1211
1214
|
/**
|
|
1212
1215
|
* Update vocabulary for an entity
|
|
@@ -1548,19 +1551,7 @@ class GameEngine {
|
|
|
1548
1551
|
* (IGameEvent with `payload` is deprecated - see ADR-097)
|
|
1549
1552
|
*/
|
|
1550
1553
|
emitGameEvent(event) {
|
|
1551
|
-
|
|
1552
|
-
const gameEvent = {
|
|
1553
|
-
type: event.type,
|
|
1554
|
-
data: {
|
|
1555
|
-
...(typeof event.data === 'object' && event.data !== null ? event.data : {}),
|
|
1556
|
-
id: event.id,
|
|
1557
|
-
timestamp: event.timestamp,
|
|
1558
|
-
entities: event.entities || {}
|
|
1559
|
-
}
|
|
1560
|
-
};
|
|
1561
|
-
// Sequence and emit
|
|
1562
|
-
const sequencedEvent = event_sequencer_1.eventSequencer.sequence(gameEvent, this.context.currentTurn);
|
|
1563
|
-
this.emit('event', sequencedEvent);
|
|
1554
|
+
this.emit('event', event);
|
|
1564
1555
|
// Store in turn events for text-service processing
|
|
1565
1556
|
if (this.context.currentTurn > 0) {
|
|
1566
1557
|
const turnEvents = this.turnEvents.get(this.context.currentTurn) || [];
|
|
@@ -1584,41 +1575,6 @@ class GameEngine {
|
|
|
1584
1575
|
}
|
|
1585
1576
|
}
|
|
1586
1577
|
}
|
|
1587
|
-
/**
|
|
1588
|
-
* Dispatch an event to entity handlers (entity.on)
|
|
1589
|
-
* Entities can define handlers for specific event types
|
|
1590
|
-
*/
|
|
1591
|
-
dispatchEntityHandlers(event) {
|
|
1592
|
-
// Get all entities that might have handlers
|
|
1593
|
-
const entities = this.world.getAllEntities();
|
|
1594
|
-
for (const entity of entities) {
|
|
1595
|
-
// Check if entity has event handlers defined
|
|
1596
|
-
const handlers = entity.on;
|
|
1597
|
-
if (!handlers || typeof handlers !== 'object') {
|
|
1598
|
-
continue;
|
|
1599
|
-
}
|
|
1600
|
-
// Check if there's a handler for this event type
|
|
1601
|
-
const handler = handlers[event.type];
|
|
1602
|
-
if (typeof handler === 'function') {
|
|
1603
|
-
try {
|
|
1604
|
-
// Call the handler with the event and world
|
|
1605
|
-
const result = handler(event, this.world);
|
|
1606
|
-
// If handler returns events, add them to the current turn
|
|
1607
|
-
if (Array.isArray(result)) {
|
|
1608
|
-
const turnEvents = this.turnEvents.get(this.context.currentTurn) || [];
|
|
1609
|
-
for (const reactionEvent of result) {
|
|
1610
|
-
turnEvents.push(reactionEvent);
|
|
1611
|
-
this.emit('event', reactionEvent);
|
|
1612
|
-
}
|
|
1613
|
-
this.turnEvents.set(this.context.currentTurn, turnEvents);
|
|
1614
|
-
}
|
|
1615
|
-
}
|
|
1616
|
-
catch (error) {
|
|
1617
|
-
console.error(`Error in entity handler for ${entity.id} on ${event.type}:`, error);
|
|
1618
|
-
}
|
|
1619
|
-
}
|
|
1620
|
-
}
|
|
1621
|
-
}
|
|
1622
1578
|
/**
|
|
1623
1579
|
* Check if game is over
|
|
1624
1580
|
*/
|