@sharpee/character 0.9.106 → 0.9.107

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 (137) hide show
  1. package/apply.d.ts +29 -7
  2. package/apply.d.ts.map +1 -1
  3. package/apply.js +15 -7
  4. package/apply.js.map +1 -1
  5. package/character-builder.d.ts +67 -4
  6. package/character-builder.d.ts.map +1 -1
  7. package/character-builder.js +116 -7
  8. package/character-builder.js.map +1 -1
  9. package/conversation/acl.d.ts +62 -0
  10. package/conversation/acl.d.ts.map +1 -0
  11. package/conversation/acl.js +117 -0
  12. package/conversation/acl.js.map +1 -0
  13. package/conversation/builder.d.ts +247 -0
  14. package/conversation/builder.d.ts.map +1 -0
  15. package/conversation/builder.js +324 -0
  16. package/conversation/builder.js.map +1 -0
  17. package/conversation/constraint-evaluator.d.ts +147 -0
  18. package/conversation/constraint-evaluator.d.ts.map +1 -0
  19. package/conversation/constraint-evaluator.js +247 -0
  20. package/conversation/constraint-evaluator.js.map +1 -0
  21. package/conversation/conversation-messages.d.ts +56 -0
  22. package/conversation/conversation-messages.d.ts.map +1 -0
  23. package/conversation/conversation-messages.js +69 -0
  24. package/conversation/conversation-messages.js.map +1 -0
  25. package/conversation/dialogue-extension.d.ts +87 -0
  26. package/conversation/dialogue-extension.d.ts.map +1 -0
  27. package/conversation/dialogue-extension.js +302 -0
  28. package/conversation/dialogue-extension.js.map +1 -0
  29. package/conversation/dialogue-types.d.ts +71 -0
  30. package/conversation/dialogue-types.d.ts.map +1 -0
  31. package/conversation/dialogue-types.js +13 -0
  32. package/conversation/dialogue-types.js.map +1 -0
  33. package/conversation/index.d.ts +19 -0
  34. package/conversation/index.d.ts.map +1 -0
  35. package/conversation/index.js +37 -0
  36. package/conversation/index.js.map +1 -0
  37. package/conversation/lifecycle.d.ts +212 -0
  38. package/conversation/lifecycle.d.ts.map +1 -0
  39. package/conversation/lifecycle.js +348 -0
  40. package/conversation/lifecycle.js.map +1 -0
  41. package/conversation/response-types.d.ts +98 -0
  42. package/conversation/response-types.d.ts.map +1 -0
  43. package/conversation/response-types.js +30 -0
  44. package/conversation/response-types.js.map +1 -0
  45. package/conversation/topic-registry.d.ts +130 -0
  46. package/conversation/topic-registry.d.ts.map +1 -0
  47. package/conversation/topic-registry.js +187 -0
  48. package/conversation/topic-registry.js.map +1 -0
  49. package/goals/builder.d.ts +135 -0
  50. package/goals/builder.d.ts.map +1 -0
  51. package/goals/builder.js +193 -0
  52. package/goals/builder.js.map +1 -0
  53. package/goals/goal-activation.d.ts +99 -0
  54. package/goals/goal-activation.d.ts.map +1 -0
  55. package/goals/goal-activation.js +212 -0
  56. package/goals/goal-activation.js.map +1 -0
  57. package/goals/goal-types.d.ts +138 -0
  58. package/goals/goal-types.d.ts.map +1 -0
  59. package/goals/goal-types.js +20 -0
  60. package/goals/goal-types.js.map +1 -0
  61. package/goals/index.d.ts +15 -0
  62. package/goals/index.d.ts.map +1 -0
  63. package/goals/index.js +24 -0
  64. package/goals/index.js.map +1 -0
  65. package/goals/pathfinding.d.ts +67 -0
  66. package/goals/pathfinding.d.ts.map +1 -0
  67. package/goals/pathfinding.js +134 -0
  68. package/goals/pathfinding.js.map +1 -0
  69. package/goals/step-evaluator.d.ts +52 -0
  70. package/goals/step-evaluator.d.ts.map +1 -0
  71. package/goals/step-evaluator.js +153 -0
  72. package/goals/step-evaluator.js.map +1 -0
  73. package/index.d.ts +6 -1
  74. package/index.d.ts.map +1 -1
  75. package/index.js +60 -1
  76. package/index.js.map +1 -1
  77. package/influence/builder.d.ts +136 -0
  78. package/influence/builder.d.ts.map +1 -0
  79. package/influence/builder.js +198 -0
  80. package/influence/builder.js.map +1 -0
  81. package/influence/index.d.ts +16 -0
  82. package/influence/index.d.ts.map +1 -0
  83. package/influence/index.js +25 -0
  84. package/influence/index.js.map +1 -0
  85. package/influence/influence-duration.d.ts +82 -0
  86. package/influence/influence-duration.d.ts.map +1 -0
  87. package/influence/influence-duration.js +148 -0
  88. package/influence/influence-duration.js.map +1 -0
  89. package/influence/influence-evaluator.d.ts +55 -0
  90. package/influence/influence-evaluator.d.ts.map +1 -0
  91. package/influence/influence-evaluator.js +183 -0
  92. package/influence/influence-evaluator.js.map +1 -0
  93. package/influence/influence-messages.d.ts +30 -0
  94. package/influence/influence-messages.d.ts.map +1 -0
  95. package/influence/influence-messages.js +40 -0
  96. package/influence/influence-messages.js.map +1 -0
  97. package/influence/influence-types.d.ts +123 -0
  98. package/influence/influence-types.d.ts.map +1 -0
  99. package/influence/influence-types.js +12 -0
  100. package/influence/influence-types.js.map +1 -0
  101. package/influence/pc-influence.d.ts +38 -0
  102. package/influence/pc-influence.d.ts.map +1 -0
  103. package/influence/pc-influence.js +56 -0
  104. package/influence/pc-influence.js.map +1 -0
  105. package/package.json +4 -3
  106. package/propagation/builder.d.ts +47 -0
  107. package/propagation/builder.d.ts.map +1 -0
  108. package/propagation/builder.js +46 -0
  109. package/propagation/builder.js.map +1 -0
  110. package/propagation/fact-transfer.d.ts +47 -0
  111. package/propagation/fact-transfer.d.ts.map +1 -0
  112. package/propagation/fact-transfer.js +76 -0
  113. package/propagation/fact-transfer.js.map +1 -0
  114. package/propagation/index.d.ts +16 -0
  115. package/propagation/index.d.ts.map +1 -0
  116. package/propagation/index.js +28 -0
  117. package/propagation/index.js.map +1 -0
  118. package/propagation/propagation-evaluator.d.ts +53 -0
  119. package/propagation/propagation-evaluator.d.ts.map +1 -0
  120. package/propagation/propagation-evaluator.js +231 -0
  121. package/propagation/propagation-evaluator.js.map +1 -0
  122. package/propagation/propagation-messages.d.ts +30 -0
  123. package/propagation/propagation-messages.d.ts.map +1 -0
  124. package/propagation/propagation-messages.js +37 -0
  125. package/propagation/propagation-messages.js.map +1 -0
  126. package/propagation/propagation-types.d.ts +100 -0
  127. package/propagation/propagation-types.d.ts.map +1 -0
  128. package/propagation/propagation-types.js +68 -0
  129. package/propagation/propagation-types.js.map +1 -0
  130. package/propagation/visibility.d.ts +46 -0
  131. package/propagation/visibility.d.ts.map +1 -0
  132. package/propagation/visibility.js +79 -0
  133. package/propagation/visibility.js.map +1 -0
  134. package/tick-phases.d.ts +93 -0
  135. package/tick-phases.d.ts.map +1 -0
  136. package/tick-phases.js +433 -0
  137. package/tick-phases.js.map +1 -0
package/tick-phases.js ADDED
@@ -0,0 +1,433 @@
1
+ "use strict";
2
+ /**
3
+ * NPC tick phase implementations (ADR-144, 145, 146)
4
+ *
5
+ * Factory functions that create tick phase handlers for propagation,
6
+ * goal pursuit, and influence evaluation. Register these with
7
+ * NpcService.registerTickPhase() during story initialization.
8
+ *
9
+ * Public interface: createPropagationPhase, createGoalPhase,
10
+ * createInfluencePhase, CharacterPhaseConfig.
11
+ * Owner context: @sharpee/character
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.CharacterPhaseRegistry = void 0;
15
+ exports.createPropagationPhase = createPropagationPhase;
16
+ exports.createGoalPhase = createGoalPhase;
17
+ exports.createInfluencePhase = createInfluencePhase;
18
+ const world_model_1 = require("../world-model/index.js");
19
+ const propagation_1 = require("./propagation");
20
+ const goals_1 = require("./goals");
21
+ const influence_1 = require("./influence");
22
+ /** Manages per-NPC configs and shared state for tick phases. */
23
+ class CharacterPhaseRegistry {
24
+ configs = new Map();
25
+ goalManagers = new Map();
26
+ influenceTracker = new influence_1.InfluenceTracker();
27
+ alreadyToldRecord = new propagation_1.AlreadyToldRecord();
28
+ /**
29
+ * Register character configuration for an NPC.
30
+ *
31
+ * @param entityId - NPC entity ID
32
+ * @param config - Configuration from AppliedCharacter
33
+ */
34
+ register(entityId, config) {
35
+ this.configs.set(entityId, config);
36
+ if (config.goalDefs && config.goalDefs.length > 0) {
37
+ const manager = new goals_1.GoalManager();
38
+ manager.registerGoals(config.goalDefs);
39
+ this.goalManagers.set(entityId, manager);
40
+ }
41
+ }
42
+ /** Get config for an NPC. */
43
+ getConfig(entityId) {
44
+ return this.configs.get(entityId);
45
+ }
46
+ /** Get goal manager for an NPC. */
47
+ getGoalManager(entityId) {
48
+ return this.goalManagers.get(entityId);
49
+ }
50
+ /** Check if any NPCs have been registered. */
51
+ get hasConfigs() {
52
+ return this.configs.size > 0;
53
+ }
54
+ /**
55
+ * Export serializable state for save/restore.
56
+ * Configs are authored (re-registered on load), so only mutable state is saved.
57
+ */
58
+ toJSON() {
59
+ const goalStates = {};
60
+ for (const [id, manager] of this.goalManagers) {
61
+ goalStates[id] = manager.toJSON();
62
+ }
63
+ return {
64
+ goalStates,
65
+ influenceEffects: this.influenceTracker.toJSON(),
66
+ alreadyTold: this.alreadyToldRecord.toJSON(),
67
+ };
68
+ }
69
+ /**
70
+ * Restore mutable state from saved data.
71
+ * Call after re-registering all NPC configs.
72
+ */
73
+ restoreState(saved) {
74
+ // Restore goal manager states
75
+ if (saved.goalStates) {
76
+ for (const [id, states] of Object.entries(saved.goalStates)) {
77
+ const manager = this.goalManagers.get(id);
78
+ if (manager) {
79
+ manager.restoreState(states);
80
+ }
81
+ }
82
+ }
83
+ // Restore influence tracker
84
+ if (saved.influenceEffects) {
85
+ const restored = influence_1.InfluenceTracker.fromJSON(saved.influenceEffects);
86
+ // Copy effects into the existing tracker
87
+ for (const effect of restored.toJSON()) {
88
+ this.influenceTracker.track(effect.influenceName, effect.influencerId, effect.targetId, effect.effect, {
89
+ duration: effect.duration,
90
+ turn: effect.appliedAtTurn,
91
+ lingeringTurns: effect.expiresAtTurn != null ? effect.expiresAtTurn - effect.appliedAtTurn : undefined,
92
+ clearCondition: effect.clearCondition,
93
+ });
94
+ }
95
+ }
96
+ // Restore already-told record
97
+ if (saved.alreadyTold) {
98
+ propagation_1.AlreadyToldRecord.fromJSON(saved.alreadyTold);
99
+ // The alreadyToldRecord is readonly, so we need to record each entry
100
+ for (const [speakerId, listeners] of Object.entries(saved.alreadyTold)) {
101
+ for (const [listenerId, topics] of Object.entries(listeners)) {
102
+ for (const topic of topics) {
103
+ this.alreadyToldRecord.record(speakerId, listenerId, topic);
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
110
+ exports.CharacterPhaseRegistry = CharacterPhaseRegistry;
111
+ // ---------------------------------------------------------------------------
112
+ // Event helper
113
+ // ---------------------------------------------------------------------------
114
+ function createEvent(type, data, npcId) {
115
+ return {
116
+ id: `${type}_${Date.now()}_${crypto.randomUUID().slice(0, 9)}`,
117
+ type,
118
+ timestamp: Date.now(),
119
+ entities: npcId ? { actor: npcId } : {},
120
+ data,
121
+ };
122
+ }
123
+ // ---------------------------------------------------------------------------
124
+ // Propagation phase (ADR-144)
125
+ // ---------------------------------------------------------------------------
126
+ /**
127
+ * Create a propagation tick phase handler.
128
+ *
129
+ * @param registry - The character phase registry
130
+ * @returns Tick phase handler function
131
+ */
132
+ function createPropagationPhase(registry) {
133
+ return (npcs, ctx) => {
134
+ const events = [];
135
+ const { world, turn, playerLocation } = ctx;
136
+ // Group NPCs by room
137
+ const roomNpcs = new Map();
138
+ for (const npc of npcs) {
139
+ const loc = world.getLocation(npc.id);
140
+ if (!loc)
141
+ continue;
142
+ const config = registry.getConfig(npc.id);
143
+ if (!config?.propagationProfile)
144
+ continue;
145
+ if (!npc.has(world_model_1.TraitType.CHARACTER_MODEL))
146
+ continue;
147
+ const list = roomNpcs.get(loc) ?? [];
148
+ list.push(npc);
149
+ roomNpcs.set(loc, list);
150
+ }
151
+ for (const [roomId, roomNpcList] of roomNpcs) {
152
+ if (roomNpcList.length < 2)
153
+ continue;
154
+ handleRoomPropagation(roomId, roomNpcList, registry, world, turn, playerLocation, events);
155
+ }
156
+ return events;
157
+ };
158
+ }
159
+ /**
160
+ * Evaluate propagation for all speaker/listener pairs in a single room.
161
+ *
162
+ * @param roomId - The room entity ID
163
+ * @param roomNpcList - NPCs co-located in this room
164
+ * @param registry - Character phase registry for configs and records
165
+ * @param world - World model for entity lookups
166
+ * @param turn - Current turn number
167
+ * @param playerLocation - Player's current room ID
168
+ * @param events - Accumulator for witnessed events
169
+ */
170
+ function handleRoomPropagation(roomId, roomNpcList, registry, world, turn, playerLocation, events) {
171
+ for (const speaker of roomNpcList) {
172
+ const config = registry.getConfig(speaker.id);
173
+ const trait = speaker.get(world_model_1.TraitType.CHARACTER_MODEL);
174
+ if (!trait || !config.propagationProfile)
175
+ continue;
176
+ const listeners = roomNpcList
177
+ .filter(n => n.id !== speaker.id)
178
+ .map(n => ({
179
+ id: n.id,
180
+ trait: n.get(world_model_1.TraitType.CHARACTER_MODEL),
181
+ profile: registry.getConfig(n.id)?.propagationProfile,
182
+ }));
183
+ const propContext = {
184
+ speaker: { id: speaker.id, trait, profile: config.propagationProfile },
185
+ listeners,
186
+ alreadyTold: registry.alreadyToldRecord,
187
+ playerPresent: roomId === playerLocation,
188
+ turn,
189
+ };
190
+ const transfers = (0, propagation_1.evaluatePropagation)(propContext);
191
+ for (const transfer of transfers) {
192
+ recordTransfer(transfer, speaker, roomId, registry, world, turn, playerLocation, events);
193
+ }
194
+ }
195
+ }
196
+ /**
197
+ * Apply a single propagation transfer and emit a witnessed event if visible.
198
+ *
199
+ * @param transfer - The propagation transfer to apply
200
+ * @param speaker - The speaking NPC entity
201
+ * @param roomId - The room where propagation occurs
202
+ * @param registry - Character phase registry for configs and records
203
+ * @param world - World model for entity lookups
204
+ * @param turn - Current turn number
205
+ * @param playerLocation - Player's current room ID
206
+ * @param events - Accumulator for witnessed events
207
+ */
208
+ function recordTransfer(transfer, speaker, roomId, registry, world, turn, playerLocation, events) {
209
+ const listenerEntity = world.getEntity(transfer.listenerId);
210
+ if (!listenerEntity)
211
+ return;
212
+ const listenerTrait = listenerEntity.get(world_model_1.TraitType.CHARACTER_MODEL);
213
+ if (!listenerTrait)
214
+ return;
215
+ const listenerConfig = registry.getConfig(transfer.listenerId);
216
+ const receivesAs = listenerConfig?.propagationProfile?.receives ?? 'as fact';
217
+ const result = (0, propagation_1.transferFact)(transfer, listenerTrait, registry.alreadyToldRecord, turn, receivesAs);
218
+ if (roomId === playerLocation && !result.alreadyKnew) {
219
+ const visibility = (0, propagation_1.getVisibilityResult)(transfer, 'present');
220
+ if (visibility.messageId) {
221
+ events.push(createEvent('character.propagation.witnessed', {
222
+ speakerId: speaker.id,
223
+ listenerId: transfer.listenerId,
224
+ topic: transfer.topic,
225
+ messageId: visibility.messageId,
226
+ speakerName: speaker.name,
227
+ listenerName: listenerEntity.name,
228
+ }, speaker.id));
229
+ }
230
+ }
231
+ }
232
+ // ---------------------------------------------------------------------------
233
+ // Goal pursuit phase (ADR-145)
234
+ // ---------------------------------------------------------------------------
235
+ /**
236
+ * Create a goal pursuit tick phase handler.
237
+ *
238
+ * @param registry - The character phase registry
239
+ * @returns Tick phase handler function
240
+ */
241
+ function createGoalPhase(registry) {
242
+ return (npcs, ctx) => {
243
+ const events = [];
244
+ const { world, playerLocation } = ctx;
245
+ for (const npc of npcs) {
246
+ executeNpcGoals(npc, registry, world, playerLocation, events);
247
+ }
248
+ return events;
249
+ };
250
+ }
251
+ /**
252
+ * Evaluate and execute the top active goal for a single NPC.
253
+ *
254
+ * @param npc - The NPC entity to evaluate
255
+ * @param registry - Character phase registry for configs and goal managers
256
+ * @param world - World model for location lookups and room graph
257
+ * @param playerLocation - Player's current room ID
258
+ * @param events - Accumulator for witnessed events
259
+ */
260
+ function executeNpcGoals(npc, registry, world, playerLocation, events) {
261
+ const manager = registry.getGoalManager(npc.id);
262
+ if (!manager)
263
+ return;
264
+ const trait = npc.get(world_model_1.TraitType.CHARACTER_MODEL);
265
+ if (!trait)
266
+ return;
267
+ manager.evaluate(trait);
268
+ const activeGoals = manager.getActiveGoals();
269
+ const activeGoal = activeGoals.find(g => !g.paused && !g.interrupted);
270
+ if (!activeGoal)
271
+ return;
272
+ const config = registry.getConfig(npc.id);
273
+ const npcLocation = world.getLocation(npc.id) || '';
274
+ const movement = config?.movementProfile ?? { knows: 'all', access: 'all' };
275
+ const stepContext = {
276
+ npcId: npc.id,
277
+ currentRoom: npcLocation,
278
+ trait,
279
+ movement,
280
+ roomGraph: buildRoomGraph(world),
281
+ playerPresent: npcLocation === playerLocation,
282
+ isInRoom: (entityId, roomId) => world.getLocation(entityId) === roomId,
283
+ getEntityRoom: (entityId) => world.getLocation(entityId) || undefined,
284
+ };
285
+ const stepResult = (0, goals_1.evaluateGoalStep)(activeGoal, stepContext);
286
+ if ((stepResult.status === 'completed' || stepResult.status === 'in-progress') &&
287
+ stepResult.witnessed &&
288
+ npcLocation === playerLocation) {
289
+ events.push(createEvent('character.goal.step', {
290
+ npcId: npc.id,
291
+ goalId: activeGoal.def.id,
292
+ step: activeGoal.currentStep,
293
+ messageId: stepResult.witnessed,
294
+ npcName: npc.name,
295
+ }, npc.id));
296
+ }
297
+ if (stepResult.status === 'completed') {
298
+ manager.advanceStep(activeGoal.def.id);
299
+ }
300
+ }
301
+ // ---------------------------------------------------------------------------
302
+ // Influence phase (ADR-146)
303
+ // ---------------------------------------------------------------------------
304
+ /**
305
+ * Create an influence evaluation tick phase handler.
306
+ *
307
+ * @param registry - The character phase registry
308
+ * @returns Tick phase handler function
309
+ */
310
+ function createInfluencePhase(registry) {
311
+ return (npcs, ctx) => {
312
+ const events = [];
313
+ const { world, turn, playerLocation, playerId } = ctx;
314
+ // Group entities by room
315
+ const roomEntities = new Map();
316
+ for (const npc of npcs) {
317
+ const loc = world.getLocation(npc.id);
318
+ if (!loc)
319
+ continue;
320
+ const config = registry.getConfig(npc.id);
321
+ const trait = npc.get(world_model_1.TraitType.CHARACTER_MODEL);
322
+ roomEntities.set(loc, [
323
+ ...(roomEntities.get(loc) ?? []),
324
+ {
325
+ id: npc.id,
326
+ influences: config?.influenceDefs ?? [],
327
+ resistances: config?.resistanceDefs ?? [],
328
+ evaluatePredicate: (pred) => trait ? trait.evaluate(pred) : false,
329
+ },
330
+ ]);
331
+ }
332
+ // Add player as potential target in their room
333
+ const playerList = roomEntities.get(playerLocation) ?? [];
334
+ playerList.push({
335
+ id: playerId,
336
+ influences: [],
337
+ resistances: [],
338
+ evaluatePredicate: () => false,
339
+ });
340
+ roomEntities.set(playerLocation, playerList);
341
+ // Evaluate passive influences per room
342
+ for (const [roomId, entities] of roomEntities) {
343
+ const results = (0, influence_1.evaluatePassiveInfluences)(entities);
344
+ handleInfluenceResults(results, roomId, registry, world, turn, playerLocation, events);
345
+ }
346
+ // Expire effects
347
+ const expired = registry.influenceTracker.expireTurn(turn, (targetId, pred) => {
348
+ const entity = world.getEntity(targetId);
349
+ if (!entity)
350
+ return false;
351
+ const trait = entity.get(world_model_1.TraitType.CHARACTER_MODEL);
352
+ return trait ? trait.evaluate(pred) : false;
353
+ });
354
+ for (const effect of expired) {
355
+ const target = world.getEntity(effect.targetId);
356
+ const targetLoc = target ? world.getLocation(target.id) : undefined;
357
+ if (targetLoc === playerLocation) {
358
+ events.push(createEvent('character.influence.expired', {
359
+ influenceName: effect.influenceName,
360
+ targetId: effect.targetId,
361
+ targetName: target?.name ?? effect.targetId,
362
+ }));
363
+ }
364
+ }
365
+ return events;
366
+ };
367
+ }
368
+ /**
369
+ * Process influence evaluation results: track applied effects and emit events.
370
+ *
371
+ * @param results - Influence evaluation results for one room
372
+ * @param roomId - The room where influences were evaluated
373
+ * @param registry - Character phase registry for configs and tracker
374
+ * @param world - World model for entity lookups
375
+ * @param turn - Current turn number
376
+ * @param playerLocation - Player's current room ID
377
+ * @param events - Accumulator for witnessed events
378
+ */
379
+ function handleInfluenceResults(results, roomId, registry, world, turn, playerLocation, events) {
380
+ for (const result of results) {
381
+ if (result.status === 'applied') {
382
+ const influencerConfig = registry.getConfig(result.influencerId);
383
+ const influenceDef = influencerConfig?.influenceDefs?.find(d => d.name === result.influenceName);
384
+ registry.influenceTracker.track(result.influenceName, result.influencerId, result.targetId, result.effect, {
385
+ duration: influenceDef?.duration ?? 'while present',
386
+ turn,
387
+ lingeringTurns: influenceDef?.lingeringTurns,
388
+ clearCondition: influenceDef?.lingeringClearCondition,
389
+ });
390
+ if (roomId === playerLocation && result.witnessed) {
391
+ const influencer = world.getEntity(result.influencerId);
392
+ const target = world.getEntity(result.targetId);
393
+ events.push(createEvent('character.influence.applied', {
394
+ influencerId: result.influencerId, targetId: result.targetId,
395
+ influenceName: result.influenceName, messageId: result.witnessed,
396
+ influencerName: influencer?.name ?? result.influencerId,
397
+ targetName: target?.name ?? result.targetId,
398
+ }, result.influencerId));
399
+ }
400
+ }
401
+ else if (result.status === 'resisted' && result.resisted && roomId === playerLocation) {
402
+ const influencer = world.getEntity(result.influencerId);
403
+ const target = world.getEntity(result.targetId);
404
+ events.push(createEvent('character.influence.resisted', {
405
+ influencerId: result.influencerId, targetId: result.targetId,
406
+ influenceName: result.influenceName, messageId: result.resisted,
407
+ influencerName: influencer?.name ?? result.influencerId,
408
+ targetName: target?.name ?? result.targetId,
409
+ }, result.influencerId));
410
+ }
411
+ }
412
+ }
413
+ // ---------------------------------------------------------------------------
414
+ // Helpers
415
+ // ---------------------------------------------------------------------------
416
+ /** Build a SimpleRoomGraph from the world model. */
417
+ function buildRoomGraph(world) {
418
+ const graph = new goals_1.SimpleRoomGraph();
419
+ const allEntities = world.getAllEntities();
420
+ for (const entity of allEntities) {
421
+ const roomTrait = entity.get(world_model_1.RoomTrait);
422
+ if (!roomTrait?.exits)
423
+ continue;
424
+ for (const [direction, exitInfo] of Object.entries(roomTrait.exits)) {
425
+ const exit = exitInfo;
426
+ if (exit.destination) {
427
+ graph.addConnection(entity.id, exit.destination, direction);
428
+ }
429
+ }
430
+ }
431
+ return graph;
432
+ }
433
+ //# sourceMappingURL=tick-phases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick-phases.js","sourceRoot":"","sources":["../../../../../../repos/sharpee/packages/character/src/tick-phases.ts"],"names":[],"mappings":"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"}