@sharpee/engine 0.9.60-beta

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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +328 -0
  3. package/dist/action-context-factory.d.ts +11 -0
  4. package/dist/action-context-factory.d.ts.map +1 -0
  5. package/dist/action-context-factory.js +258 -0
  6. package/dist/action-context-factory.js.map +1 -0
  7. package/dist/capability-dispatch-helper.d.ts +106 -0
  8. package/dist/capability-dispatch-helper.d.ts.map +1 -0
  9. package/dist/capability-dispatch-helper.js +269 -0
  10. package/dist/capability-dispatch-helper.js.map +1 -0
  11. package/dist/command-executor.d.ts +53 -0
  12. package/dist/command-executor.d.ts.map +1 -0
  13. package/dist/command-executor.js +329 -0
  14. package/dist/command-executor.js.map +1 -0
  15. package/dist/event-adapter.d.ts +44 -0
  16. package/dist/event-adapter.d.ts.map +1 -0
  17. package/dist/event-adapter.js +127 -0
  18. package/dist/event-adapter.js.map +1 -0
  19. package/dist/event-sequencer.d.ts +73 -0
  20. package/dist/event-sequencer.d.ts.map +1 -0
  21. package/dist/event-sequencer.js +134 -0
  22. package/dist/event-sequencer.js.map +1 -0
  23. package/dist/events/event-emitter.d.ts +34 -0
  24. package/dist/events/event-emitter.d.ts.map +1 -0
  25. package/dist/events/event-emitter.js +67 -0
  26. package/dist/events/event-emitter.js.map +1 -0
  27. package/dist/game-engine.d.ts +292 -0
  28. package/dist/game-engine.d.ts.map +1 -0
  29. package/dist/game-engine.js +1631 -0
  30. package/dist/game-engine.js.map +1 -0
  31. package/dist/index.d.ts +27 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +62 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/narrative/index.d.ts +5 -0
  36. package/dist/narrative/index.d.ts.map +1 -0
  37. package/dist/narrative/index.js +10 -0
  38. package/dist/narrative/index.js.map +1 -0
  39. package/dist/narrative/narrative-settings.d.ts +73 -0
  40. package/dist/narrative/narrative-settings.d.ts.map +1 -0
  41. package/dist/narrative/narrative-settings.js +28 -0
  42. package/dist/narrative/narrative-settings.js.map +1 -0
  43. package/dist/parser-interface.d.ts +77 -0
  44. package/dist/parser-interface.d.ts.map +1 -0
  45. package/dist/parser-interface.js +48 -0
  46. package/dist/parser-interface.js.map +1 -0
  47. package/dist/platform-operations.d.ts +83 -0
  48. package/dist/platform-operations.d.ts.map +1 -0
  49. package/dist/platform-operations.js +218 -0
  50. package/dist/platform-operations.js.map +1 -0
  51. package/dist/save-restore-service.d.ts +133 -0
  52. package/dist/save-restore-service.d.ts.map +1 -0
  53. package/dist/save-restore-service.js +446 -0
  54. package/dist/save-restore-service.js.map +1 -0
  55. package/dist/scheduler/index.d.ts +9 -0
  56. package/dist/scheduler/index.d.ts.map +1 -0
  57. package/dist/scheduler/index.js +25 -0
  58. package/dist/scheduler/index.js.map +1 -0
  59. package/dist/scheduler/scheduler-service.d.ts +75 -0
  60. package/dist/scheduler/scheduler-service.d.ts.map +1 -0
  61. package/dist/scheduler/scheduler-service.js +310 -0
  62. package/dist/scheduler/scheduler-service.js.map +1 -0
  63. package/dist/scheduler/seeded-random.d.ts +7 -0
  64. package/dist/scheduler/seeded-random.d.ts.map +1 -0
  65. package/dist/scheduler/seeded-random.js +11 -0
  66. package/dist/scheduler/seeded-random.js.map +1 -0
  67. package/dist/scheduler/types.d.ts +134 -0
  68. package/dist/scheduler/types.d.ts.map +1 -0
  69. package/dist/scheduler/types.js +9 -0
  70. package/dist/scheduler/types.js.map +1 -0
  71. package/dist/shared-data-keys.d.ts +53 -0
  72. package/dist/shared-data-keys.d.ts.map +1 -0
  73. package/dist/shared-data-keys.js +29 -0
  74. package/dist/shared-data-keys.js.map +1 -0
  75. package/dist/story.d.ts +211 -0
  76. package/dist/story.d.ts.map +1 -0
  77. package/dist/story.js +60 -0
  78. package/dist/story.js.map +1 -0
  79. package/dist/test-helpers/mock-text-service.d.ts +11 -0
  80. package/dist/test-helpers/mock-text-service.d.ts.map +1 -0
  81. package/dist/test-helpers/mock-text-service.js +47 -0
  82. package/dist/test-helpers/mock-text-service.js.map +1 -0
  83. package/dist/turn-event-processor.d.ts +89 -0
  84. package/dist/turn-event-processor.d.ts.map +1 -0
  85. package/dist/turn-event-processor.js +144 -0
  86. package/dist/turn-event-processor.js.map +1 -0
  87. package/dist/types.d.ts +214 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +8 -0
  90. package/dist/types.js.map +1 -0
  91. package/dist/vocabulary-manager.d.ts +35 -0
  92. package/dist/vocabulary-manager.d.ts.map +1 -0
  93. package/dist/vocabulary-manager.js +74 -0
  94. package/dist/vocabulary-manager.js.map +1 -0
  95. package/package.json +70 -0
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * Event Sequencer - Manages event ordering within turns
4
+ *
5
+ * Ensures all events have proper sequence numbers for ordering
6
+ * and grouping within a turn.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.eventSequencer = exports.EventSequenceUtils = void 0;
10
+ /**
11
+ * Event sequencer class
12
+ */
13
+ class EventSequencer {
14
+ counter = Date.now();
15
+ /**
16
+ * Get next sequence number
17
+ */
18
+ next() {
19
+ return ++this.counter;
20
+ }
21
+ /**
22
+ * Reset turn counter (optional, for testing)
23
+ */
24
+ resetTurn(turn) {
25
+ // No-op in this implementation
26
+ }
27
+ /**
28
+ * Sequence a single event
29
+ */
30
+ sequence(event, turn) {
31
+ return {
32
+ ...event,
33
+ sequence: this.next(),
34
+ timestamp: new Date(),
35
+ turn,
36
+ scope: 'turn'
37
+ };
38
+ }
39
+ /**
40
+ * Sequence multiple events
41
+ */
42
+ sequenceAll(events, turn) {
43
+ return events.map(event => this.sequence(event, turn));
44
+ }
45
+ }
46
+ /**
47
+ * Event sequence utilities
48
+ */
49
+ class EventSequenceUtils {
50
+ /**
51
+ * Sort events by sequence number
52
+ */
53
+ static sort(events) {
54
+ return [...events].sort((a, b) => a.sequence - b.sequence);
55
+ }
56
+ /**
57
+ * Filter events by type
58
+ */
59
+ static filterByType(events, type) {
60
+ return events.filter(e => e.type === type);
61
+ }
62
+ /**
63
+ * Filter events by turn
64
+ */
65
+ static filterByTurn(events, turn) {
66
+ return events.filter(e => e.turn === turn);
67
+ }
68
+ /**
69
+ * Filter events by scope
70
+ */
71
+ static filterByScope(events, scope) {
72
+ return events.filter(e => e.scope === scope);
73
+ }
74
+ /**
75
+ * Group events by type
76
+ */
77
+ static groupByType(events) {
78
+ const groups = {};
79
+ for (const event of events) {
80
+ if (!groups[event.type]) {
81
+ groups[event.type] = [];
82
+ }
83
+ groups[event.type].push(event);
84
+ }
85
+ return groups;
86
+ }
87
+ /**
88
+ * Group events by turn
89
+ */
90
+ static groupByTurn(events) {
91
+ const groups = {};
92
+ for (const event of events) {
93
+ if (!groups[event.turn]) {
94
+ groups[event.turn] = [];
95
+ }
96
+ groups[event.turn].push(event);
97
+ }
98
+ return groups;
99
+ }
100
+ /**
101
+ * Get latest event by type
102
+ */
103
+ static getLatestByType(events, type) {
104
+ const filtered = this.filterByType(events, type);
105
+ if (filtered.length === 0)
106
+ return undefined;
107
+ return filtered.reduce((latest, current) => current.sequence > latest.sequence ? current : latest);
108
+ }
109
+ /**
110
+ * Count events by type
111
+ */
112
+ static countByType(events) {
113
+ const counts = {};
114
+ for (const event of events) {
115
+ counts[event.type] = (counts[event.type] || 0) + 1;
116
+ }
117
+ return counts;
118
+ }
119
+ /**
120
+ * Get events in sequence range
121
+ */
122
+ static getInRange(events, start, end, inclusive = true) {
123
+ if (inclusive) {
124
+ return events.filter(e => e.sequence >= start && e.sequence <= end);
125
+ }
126
+ else {
127
+ return events.filter(e => e.sequence > start && e.sequence < end);
128
+ }
129
+ }
130
+ }
131
+ exports.EventSequenceUtils = EventSequenceUtils;
132
+ // Export singleton instance
133
+ exports.eventSequencer = new EventSequencer();
134
+ //# sourceMappingURL=event-sequencer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-sequencer.js","sourceRoot":"","sources":["../src/event-sequencer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Event emitter for managing game events
3
+ */
4
+ import { ISemanticEvent } from '@sharpee/core';
5
+ import { IGameEvent, SimpleEventHandler } from '@sharpee/world-model';
6
+ /**
7
+ * Simple event emitter for the game event system
8
+ * Used for story-level event handlers (daemons)
9
+ */
10
+ export declare class EventEmitter {
11
+ private handlers;
12
+ /**
13
+ * Register a handler for an event type
14
+ */
15
+ on(eventType: string, handler: SimpleEventHandler): void;
16
+ /**
17
+ * Remove a handler for an event type
18
+ */
19
+ off(eventType: string, handler: SimpleEventHandler): void;
20
+ /**
21
+ * Emit an event to all registered handlers
22
+ * Returns any semantic events generated by handlers
23
+ */
24
+ emit(event: IGameEvent): ISemanticEvent[];
25
+ /**
26
+ * Clear all handlers for a specific event type
27
+ */
28
+ clear(eventType?: string): void;
29
+ /**
30
+ * Get count of handlers for an event type
31
+ */
32
+ listenerCount(eventType: string): number;
33
+ }
34
+ //# sourceMappingURL=event-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/events/event-emitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEtE;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAgD;IAEhE;;OAEG;IACH,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAMxD;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAUzD;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,EAAE;IAczC;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ/B;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAGzC"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ /**
3
+ * Event emitter for managing game events
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EventEmitter = void 0;
7
+ /**
8
+ * Simple event emitter for the game event system
9
+ * Used for story-level event handlers (daemons)
10
+ */
11
+ class EventEmitter {
12
+ handlers = new Map();
13
+ /**
14
+ * Register a handler for an event type
15
+ */
16
+ on(eventType, handler) {
17
+ const handlers = this.handlers.get(eventType) || [];
18
+ handlers.push(handler);
19
+ this.handlers.set(eventType, handlers);
20
+ }
21
+ /**
22
+ * Remove a handler for an event type
23
+ */
24
+ off(eventType, handler) {
25
+ const handlers = this.handlers.get(eventType);
26
+ if (handlers) {
27
+ const index = handlers.indexOf(handler);
28
+ if (index !== -1) {
29
+ handlers.splice(index, 1);
30
+ }
31
+ }
32
+ }
33
+ /**
34
+ * Emit an event to all registered handlers
35
+ * Returns any semantic events generated by handlers
36
+ */
37
+ emit(event) {
38
+ const results = [];
39
+ const handlers = this.handlers.get(event.type) || [];
40
+ for (const handler of handlers) {
41
+ const result = handler(event);
42
+ if (result) {
43
+ results.push(...result);
44
+ }
45
+ }
46
+ return results;
47
+ }
48
+ /**
49
+ * Clear all handlers for a specific event type
50
+ */
51
+ clear(eventType) {
52
+ if (eventType) {
53
+ this.handlers.delete(eventType);
54
+ }
55
+ else {
56
+ this.handlers.clear();
57
+ }
58
+ }
59
+ /**
60
+ * Get count of handlers for an event type
61
+ */
62
+ listenerCount(eventType) {
63
+ return this.handlers.get(eventType)?.length || 0;
64
+ }
65
+ }
66
+ exports.EventEmitter = EventEmitter;
67
+ //# sourceMappingURL=event-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../src/events/event-emitter.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAKH;;;GAGG;AACH,MAAa,YAAY;IACf,QAAQ,GAAsC,IAAI,GAAG,EAAE,CAAC;IAEhE;;OAEG;IACH,EAAE,CAAC,SAAiB,EAAE,OAA2B;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,SAAiB,EAAE,OAA2B;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,KAAiB;QACpB,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAErD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAkB;QACtB,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAAiB;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IACnD,CAAC;CACF;AA5DD,oCA4DC"}
@@ -0,0 +1,292 @@
1
+ /**
2
+ * Game Engine - Main runtime for Sharpee IF games
3
+ *
4
+ * Manages game state, turn execution, and coordinates all subsystems
5
+ */
6
+ import { WorldModel, IFEntity } from '@sharpee/world-model';
7
+ import { EventProcessor } from '@sharpee/event-processor';
8
+ import { Parser, IPerceptionService } from '@sharpee/stdlib';
9
+ import { LanguageProvider } from '@sharpee/if-domain';
10
+ import { ITextService } from '@sharpee/text-service';
11
+ import { ISemanticEvent, ISaveRestoreHooks, ISemanticEventSource } from '@sharpee/core';
12
+ import { ISchedulerService } from './scheduler';
13
+ import { INpcService } from '@sharpee/stdlib';
14
+ import { GameContext, TurnResult, EngineConfig, SequencedEvent } from './types';
15
+ import { Story } from './story';
16
+ import { NarrativeSettings } from './narrative';
17
+ import { ParsedCommandTransformer } from './command-executor';
18
+ /**
19
+ * Game engine events
20
+ */
21
+ export interface GameEngineEvents {
22
+ 'turn:start': (turn: number, input: string) => void;
23
+ 'turn:complete': (result: TurnResult) => void;
24
+ 'turn:failed': (error: Error, turn: number) => void;
25
+ 'event': (event: SequencedEvent) => void;
26
+ 'state:changed': (context: GameContext) => void;
27
+ 'game:over': (context: GameContext) => void;
28
+ 'text:output': (text: string, turn: number) => void;
29
+ 'text:channel': (channel: string, text: string, turn: number) => void;
30
+ }
31
+ type GameEngineEventName = keyof GameEngineEvents;
32
+ type GameEngineEventListener<K extends GameEngineEventName> = GameEngineEvents[K];
33
+ /**
34
+ * Main game engine
35
+ */
36
+ export declare class GameEngine {
37
+ private world;
38
+ private sessionStartTime?;
39
+ private sessionTurns;
40
+ private sessionMoves;
41
+ private context;
42
+ private config;
43
+ private commandExecutor;
44
+ private eventProcessor;
45
+ private platformEvents;
46
+ private actionRegistry;
47
+ private textService?;
48
+ private turnEvents;
49
+ private running;
50
+ private story?;
51
+ private languageProvider?;
52
+ private parser?;
53
+ private eventListeners;
54
+ private saveRestoreHooks?;
55
+ private eventSource;
56
+ private systemEventSource;
57
+ private pendingPlatformOps;
58
+ private perceptionService?;
59
+ private scheduler;
60
+ private npcService;
61
+ private narrativeSettings;
62
+ private vocabularyManager;
63
+ private saveRestoreService;
64
+ private turnEventProcessor;
65
+ private platformOpHandler?;
66
+ private hasEmittedInitialized;
67
+ constructor(options: {
68
+ world: WorldModel;
69
+ player: IFEntity;
70
+ parser: Parser;
71
+ language: LanguageProvider;
72
+ perceptionService?: IPerceptionService;
73
+ config?: EngineConfig;
74
+ });
75
+ /**
76
+ * Set the story for this engine
77
+ */
78
+ setStory(story: Story): void;
79
+ /**
80
+ * Get the current parser
81
+ */
82
+ getParser(): Parser | undefined;
83
+ /**
84
+ * Get the current language provider
85
+ */
86
+ getLanguageProvider(): LanguageProvider | undefined;
87
+ /**
88
+ * Start the game engine
89
+ */
90
+ start(): void;
91
+ /**
92
+ * Stop the game engine
93
+ */
94
+ stop(reason?: 'quit' | 'victory' | 'defeat' | 'abort', details?: any): void;
95
+ /**
96
+ * Execute a turn
97
+ */
98
+ executeTurn(input: string): Promise<TurnResult>;
99
+ /**
100
+ * Execute a meta-command (VERSION, SCORE, HELP, etc.)
101
+ *
102
+ * Meta-commands operate outside the turn cycle:
103
+ * - They don't increment turns
104
+ * - They don't trigger NPC ticks or scheduler
105
+ * - They don't create undo snapshots
106
+ * - They don't get stored in command history
107
+ * - Events are processed immediately through text service (not stored in turnEvents)
108
+ *
109
+ * @param input - Raw command string
110
+ * @param parsedCommand - Parsed command from parser
111
+ * @returns MetaCommandResult with events and success status
112
+ */
113
+ private executeMetaCommand;
114
+ /**
115
+ * Process meta-command events: text service → emit to clients
116
+ *
117
+ * - Does NOT store in turnEvents
118
+ * - Passes currentTurn for display context (turn/score shown to player)
119
+ * - Turn counter is NOT incremented
120
+ */
121
+ private processMetaEvents;
122
+ /**
123
+ * Process a single platform operation for meta-commands.
124
+ *
125
+ * This is similar to processPlatformOperations but handles one operation
126
+ * at a time and returns completion events for inclusion in the result.
127
+ */
128
+ private processMetaPlatformOperation;
129
+ /**
130
+ * Get current game context
131
+ */
132
+ getContext(): GameContext;
133
+ /**
134
+ * Get world model
135
+ */
136
+ getWorld(): WorldModel;
137
+ /**
138
+ * Get the current story
139
+ */
140
+ getStory(): Story | undefined;
141
+ /**
142
+ * Get the event source for save/restore
143
+ */
144
+ getEventSource(): ISemanticEventSource;
145
+ /**
146
+ * Get narrative settings (ADR-089)
147
+ *
148
+ * Returns the story's narrative perspective and related settings.
149
+ * Use this for text rendering that needs to know 1st/2nd/3rd person.
150
+ */
151
+ getNarrativeSettings(): NarrativeSettings;
152
+ /**
153
+ * Configure language provider with narrative settings (ADR-089)
154
+ *
155
+ * Sets up the language provider for perspective-aware message resolution.
156
+ * For 3rd person narratives, extracts player pronouns from ActorTrait.
157
+ */
158
+ private configureLanguageProviderNarrative;
159
+ /**
160
+ * Get scheduler service for daemons and fuses (ADR-071)
161
+ */
162
+ getScheduler(): ISchedulerService;
163
+ /**
164
+ * Get NPC service for NPC behavior management (ADR-070)
165
+ */
166
+ getNpcService(): INpcService;
167
+ /**
168
+ * Get event processor for handler registration (ADR-075)
169
+ */
170
+ getEventProcessor(): EventProcessor;
171
+ /**
172
+ * Get the text service
173
+ */
174
+ getTextService(): ITextService | undefined;
175
+ /**
176
+ * Set a custom text service
177
+ */
178
+ setTextService(service: ITextService): void;
179
+ /**
180
+ * Register save/restore hooks
181
+ */
182
+ registerSaveRestoreHooks(hooks: ISaveRestoreHooks): void;
183
+ /**
184
+ * Register a transformer for parsed commands.
185
+ * Transformers are called after parsing but before validation,
186
+ * allowing stories to modify commands (e.g., for debug tools).
187
+ *
188
+ * @param transformer - Function to transform parsed commands
189
+ */
190
+ registerParsedCommandTransformer(transformer: ParsedCommandTransformer): void;
191
+ /**
192
+ * Unregister a parsed command transformer.
193
+ *
194
+ * @param transformer - The transformer to remove
195
+ * @returns true if the transformer was found and removed
196
+ */
197
+ unregisterParsedCommandTransformer(transformer: ParsedCommandTransformer): boolean;
198
+ /**
199
+ * Save game state using registered hooks
200
+ */
201
+ save(): Promise<boolean>;
202
+ /**
203
+ * Restore game state using registered hooks
204
+ */
205
+ restore(): Promise<boolean>;
206
+ /**
207
+ * Create an undo snapshot of the current world state
208
+ */
209
+ private createUndoSnapshot;
210
+ /**
211
+ * Undo to previous turn
212
+ * @returns true if undo succeeded, false if nothing to undo
213
+ */
214
+ undo(): boolean;
215
+ /**
216
+ * Check if undo is available
217
+ */
218
+ canUndo(): boolean;
219
+ /**
220
+ * Get number of undo levels available
221
+ */
222
+ getUndoLevels(): number;
223
+ /**
224
+ * Create save data from current engine state
225
+ */
226
+ private createSaveData;
227
+ /**
228
+ * Load save data into engine
229
+ */
230
+ private loadSaveData;
231
+ /**
232
+ * Get turn history
233
+ */
234
+ getHistory(): TurnResult[];
235
+ /**
236
+ * Get recent events
237
+ */
238
+ getRecentEvents(count?: number): SequencedEvent[];
239
+ /**
240
+ * Update vocabulary for an entity
241
+ */
242
+ updateEntityVocabulary(entity: IFEntity, inScope: boolean): void;
243
+ /**
244
+ * Update vocabulary for all entities in scope
245
+ */
246
+ updateScopeVocabulary(): void;
247
+ /**
248
+ * Emit a platform event with turn metadata
249
+ */
250
+ emitPlatformEvent(event: Omit<ISemanticEvent, 'id' | 'timestamp'>): void;
251
+ /**
252
+ * Update context after a turn
253
+ */
254
+ private updateContext;
255
+ /**
256
+ * Update command history capability
257
+ */
258
+ private updateCommandHistory;
259
+ /**
260
+ * Process pending platform operations
261
+ */
262
+ private processPlatformOperations;
263
+ /**
264
+ * Emit a game lifecycle event.
265
+ * All game events now use ISemanticEvent with data in the `data` field.
266
+ * (IGameEvent with `payload` is deprecated - see ADR-097)
267
+ */
268
+ private emitGameEvent;
269
+ /**
270
+ * Emit an event to listeners
271
+ */
272
+ private emit;
273
+ /**
274
+ * Dispatch an event to entity handlers (entity.on)
275
+ * Entities can define handlers for specific event types
276
+ */
277
+ private dispatchEntityHandlers;
278
+ /**
279
+ * Check if game is over
280
+ */
281
+ private isGameOver;
282
+ /**
283
+ * Add event listener
284
+ */
285
+ on<K extends GameEngineEventName>(event: K, listener: GameEngineEventListener<K>): this;
286
+ /**
287
+ * Remove event listener
288
+ */
289
+ off<K extends GameEngineEventName>(event: K, listener: GameEngineEventListener<K>): this;
290
+ }
291
+ export {};
292
+ //# sourceMappingURL=game-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-engine.d.ts","sourceRoot":"","sources":["../src/game-engine.ts"],"names":[],"mappings":"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"}