@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.
- package/apply.d.ts +29 -7
- package/apply.d.ts.map +1 -1
- package/apply.js +15 -7
- package/apply.js.map +1 -1
- package/character-builder.d.ts +67 -4
- package/character-builder.d.ts.map +1 -1
- package/character-builder.js +116 -7
- package/character-builder.js.map +1 -1
- package/conversation/acl.d.ts +62 -0
- package/conversation/acl.d.ts.map +1 -0
- package/conversation/acl.js +117 -0
- package/conversation/acl.js.map +1 -0
- package/conversation/builder.d.ts +247 -0
- package/conversation/builder.d.ts.map +1 -0
- package/conversation/builder.js +324 -0
- package/conversation/builder.js.map +1 -0
- package/conversation/constraint-evaluator.d.ts +147 -0
- package/conversation/constraint-evaluator.d.ts.map +1 -0
- package/conversation/constraint-evaluator.js +247 -0
- package/conversation/constraint-evaluator.js.map +1 -0
- package/conversation/conversation-messages.d.ts +56 -0
- package/conversation/conversation-messages.d.ts.map +1 -0
- package/conversation/conversation-messages.js +69 -0
- package/conversation/conversation-messages.js.map +1 -0
- package/conversation/dialogue-extension.d.ts +87 -0
- package/conversation/dialogue-extension.d.ts.map +1 -0
- package/conversation/dialogue-extension.js +302 -0
- package/conversation/dialogue-extension.js.map +1 -0
- package/conversation/dialogue-types.d.ts +71 -0
- package/conversation/dialogue-types.d.ts.map +1 -0
- package/conversation/dialogue-types.js +13 -0
- package/conversation/dialogue-types.js.map +1 -0
- package/conversation/index.d.ts +19 -0
- package/conversation/index.d.ts.map +1 -0
- package/conversation/index.js +37 -0
- package/conversation/index.js.map +1 -0
- package/conversation/lifecycle.d.ts +212 -0
- package/conversation/lifecycle.d.ts.map +1 -0
- package/conversation/lifecycle.js +348 -0
- package/conversation/lifecycle.js.map +1 -0
- package/conversation/response-types.d.ts +98 -0
- package/conversation/response-types.d.ts.map +1 -0
- package/conversation/response-types.js +30 -0
- package/conversation/response-types.js.map +1 -0
- package/conversation/topic-registry.d.ts +130 -0
- package/conversation/topic-registry.d.ts.map +1 -0
- package/conversation/topic-registry.js +187 -0
- package/conversation/topic-registry.js.map +1 -0
- package/goals/builder.d.ts +135 -0
- package/goals/builder.d.ts.map +1 -0
- package/goals/builder.js +193 -0
- package/goals/builder.js.map +1 -0
- package/goals/goal-activation.d.ts +99 -0
- package/goals/goal-activation.d.ts.map +1 -0
- package/goals/goal-activation.js +212 -0
- package/goals/goal-activation.js.map +1 -0
- package/goals/goal-types.d.ts +138 -0
- package/goals/goal-types.d.ts.map +1 -0
- package/goals/goal-types.js +20 -0
- package/goals/goal-types.js.map +1 -0
- package/goals/index.d.ts +15 -0
- package/goals/index.d.ts.map +1 -0
- package/goals/index.js +24 -0
- package/goals/index.js.map +1 -0
- package/goals/pathfinding.d.ts +67 -0
- package/goals/pathfinding.d.ts.map +1 -0
- package/goals/pathfinding.js +134 -0
- package/goals/pathfinding.js.map +1 -0
- package/goals/step-evaluator.d.ts +52 -0
- package/goals/step-evaluator.d.ts.map +1 -0
- package/goals/step-evaluator.js +153 -0
- package/goals/step-evaluator.js.map +1 -0
- package/index.d.ts +6 -1
- package/index.d.ts.map +1 -1
- package/index.js +60 -1
- package/index.js.map +1 -1
- package/influence/builder.d.ts +136 -0
- package/influence/builder.d.ts.map +1 -0
- package/influence/builder.js +198 -0
- package/influence/builder.js.map +1 -0
- package/influence/index.d.ts +16 -0
- package/influence/index.d.ts.map +1 -0
- package/influence/index.js +25 -0
- package/influence/index.js.map +1 -0
- package/influence/influence-duration.d.ts +82 -0
- package/influence/influence-duration.d.ts.map +1 -0
- package/influence/influence-duration.js +148 -0
- package/influence/influence-duration.js.map +1 -0
- package/influence/influence-evaluator.d.ts +55 -0
- package/influence/influence-evaluator.d.ts.map +1 -0
- package/influence/influence-evaluator.js +183 -0
- package/influence/influence-evaluator.js.map +1 -0
- package/influence/influence-messages.d.ts +30 -0
- package/influence/influence-messages.d.ts.map +1 -0
- package/influence/influence-messages.js +40 -0
- package/influence/influence-messages.js.map +1 -0
- package/influence/influence-types.d.ts +123 -0
- package/influence/influence-types.d.ts.map +1 -0
- package/influence/influence-types.js +12 -0
- package/influence/influence-types.js.map +1 -0
- package/influence/pc-influence.d.ts +38 -0
- package/influence/pc-influence.d.ts.map +1 -0
- package/influence/pc-influence.js +56 -0
- package/influence/pc-influence.js.map +1 -0
- package/package.json +4 -3
- package/propagation/builder.d.ts +47 -0
- package/propagation/builder.d.ts.map +1 -0
- package/propagation/builder.js +46 -0
- package/propagation/builder.js.map +1 -0
- package/propagation/fact-transfer.d.ts +47 -0
- package/propagation/fact-transfer.d.ts.map +1 -0
- package/propagation/fact-transfer.js +76 -0
- package/propagation/fact-transfer.js.map +1 -0
- package/propagation/index.d.ts +16 -0
- package/propagation/index.d.ts.map +1 -0
- package/propagation/index.js +28 -0
- package/propagation/index.js.map +1 -0
- package/propagation/propagation-evaluator.d.ts +53 -0
- package/propagation/propagation-evaluator.d.ts.map +1 -0
- package/propagation/propagation-evaluator.js +231 -0
- package/propagation/propagation-evaluator.js.map +1 -0
- package/propagation/propagation-messages.d.ts +30 -0
- package/propagation/propagation-messages.d.ts.map +1 -0
- package/propagation/propagation-messages.js +37 -0
- package/propagation/propagation-messages.js.map +1 -0
- package/propagation/propagation-types.d.ts +100 -0
- package/propagation/propagation-types.d.ts.map +1 -0
- package/propagation/propagation-types.js +68 -0
- package/propagation/propagation-types.js.map +1 -0
- package/propagation/visibility.d.ts +46 -0
- package/propagation/visibility.d.ts.map +1 -0
- package/propagation/visibility.js +79 -0
- package/propagation/visibility.js.map +1 -0
- package/tick-phases.d.ts +93 -0
- package/tick-phases.d.ts.map +1 -0
- package/tick-phases.js +433 -0
- 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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"}
|