@ai-rpg-engine/modules 2.0.1 → 2.0.3

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/dist/index.d.ts CHANGED
@@ -30,4 +30,8 @@ export { createSimulationInspector, inspectEntity, inspectAllEntities, inspectFa
30
30
  export type { EntityInspection, FactionInspection, ZoneInspection, DistrictInspection, SimulationSnapshot, } from './simulation-inspector.js';
31
31
  export { deriveStance, getReputationConsequence, evolveTitle, buildPlayerDescriptor, } from './social-consequence.js';
32
32
  export type { Stance, ReputationConsequence, TitleEvolution, } from './social-consequence.js';
33
+ export { spawnPlayerRumor, spawnReputationRumor, propagateRumor, shouldMutate, mutateRumorClaim, deriveRumorValence, getRumorsKnownToFaction, getRumorsInDistrict, formatRumorForDirector, } from './player-rumor.js';
34
+ export type { PlayerRumor, RumorValence, RumorMutation, MilestoneHint, } from './player-rumor.js';
35
+ export { evaluatePressures, tickPressures, getPressuresForFaction, getVisiblePressures, formatPressureForDirector, formatPressureForNarrator, formatPressureForDialogue, } from './pressure-system.js';
36
+ export type { PressureKind, PressureVisibility, WorldPressure, PressureInputs, PressureSpawnResult, } from './pressure-system.js';
33
37
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -16,4 +16,6 @@ export { createBeliefProvenance, traceEntityBelief, traceFactionBelief, traceSub
16
16
  export { createObserverPresentation, presentForObserver, presentForAllObservers, getDivergences, getEventDivergences, } from './observer-presentation.js';
17
17
  export { createSimulationInspector, inspectEntity, inspectAllEntities, inspectFaction, inspectAllFactions, inspectZone, inspectAllZones, inspectDistrict, inspectAllDistricts, createSnapshot, formatEntityInspection, formatFactionInspection, formatDistrictInspection, } from './simulation-inspector.js';
18
18
  export { deriveStance, getReputationConsequence, evolveTitle, buildPlayerDescriptor, } from './social-consequence.js';
19
+ export { spawnPlayerRumor, spawnReputationRumor, propagateRumor, shouldMutate, mutateRumorClaim, deriveRumorValence, getRumorsKnownToFaction, getRumorsInDistrict, formatRumorForDirector, } from './player-rumor.js';
20
+ export { evaluatePressures, tickPressures, getPressuresForFaction, getVisiblePressures, formatPressureForDirector, formatPressureForNarrator, formatPressureForDialogue, } from './pressure-system.js';
19
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACrG,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAEzI,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,SAAS,EACT,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAY7B,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,YAAY,GACb,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,UAAU,EACV,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,wBAAwB,EACxB,UAAU,EACV,cAAc,GACf,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,kBAAkB,EAClB,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAQpC,OAAO,EACL,yBAAyB,EACzB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAQnC,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,WAAW,EACX,qBAAqB,GACtB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { CharacterProfile } from '@ai-rpg-engine/character-profile';
2
+ export type RumorValence = 'heroic' | 'fearsome' | 'tragic' | 'mysterious';
3
+ export type PlayerRumor = {
4
+ id: string;
5
+ /** Structured claim: "defeated the Bone Collector" */
6
+ claim: string;
7
+ /** From buildPlayerDescriptor — how NPCs describe the player */
8
+ subjectDescriptor: string;
9
+ /** Event type that spawned it */
10
+ sourceEvent: string;
11
+ /** Milestone label if applicable */
12
+ sourceMilestone?: string;
13
+ /** Faction that witnessed/originated */
14
+ originFactionId?: string;
15
+ /** District where it happened */
16
+ originDistrictId?: string;
17
+ /** 0-1, decays with hops */
18
+ confidence: number;
19
+ /** 0-1, increases with mutations */
20
+ distortion: number;
21
+ /** How many times the claim has been mutated */
22
+ mutationCount: number;
23
+ /** Emotional charge */
24
+ valence: RumorValence;
25
+ /** FactionIds that have received this rumor */
26
+ spreadTo: string[];
27
+ /** Engine tick when spawned */
28
+ originTick: number;
29
+ };
30
+ export type RumorMutation = {
31
+ type: 'exaggerate' | 'invert' | 'conflate';
32
+ field: 'claim' | 'valence';
33
+ before: string;
34
+ after: string;
35
+ };
36
+ export type MilestoneHint = {
37
+ label: string;
38
+ description: string;
39
+ tags: string[];
40
+ };
41
+ /** Derive emotional charge from milestone tags. */
42
+ export declare function deriveRumorValence(tags: string[]): RumorValence;
43
+ /** Spawn a player rumor from a milestone event. */
44
+ export declare function spawnPlayerRumor(milestone: MilestoneHint, profile: CharacterProfile, originFactionId?: string, originDistrictId?: string, tick?: number): PlayerRumor;
45
+ /** Spawn a player rumor from a reputation change event. */
46
+ export declare function spawnReputationRumor(factionId: string, delta: number, factionName: string, profile: CharacterProfile, districtId?: string, tick?: number): PlayerRumor;
47
+ /**
48
+ * Propagate a rumor to a new faction.
49
+ * Returns a new rumor with the target added to spreadTo, confidence decayed,
50
+ * and possible mutation applied.
51
+ */
52
+ export declare function propagateRumor(rumor: PlayerRumor, targetFactionId: string, distortionRate?: number): PlayerRumor;
53
+ /** Determine if a rumor should mutate during propagation. */
54
+ export declare function shouldMutate(rumor: PlayerRumor): boolean;
55
+ /**
56
+ * Apply a structured mutation to a rumor's claim.
57
+ * Returns the mutated rumor and a record of what changed.
58
+ */
59
+ export declare function mutateRumorClaim(rumor: PlayerRumor): {
60
+ rumor: PlayerRumor;
61
+ mutation: RumorMutation;
62
+ };
63
+ /** Get all rumors known to a specific faction (originated or spread to). */
64
+ export declare function getRumorsKnownToFaction(rumors: PlayerRumor[], factionId: string): PlayerRumor[];
65
+ /** Get all rumors that originated in a specific district. */
66
+ export declare function getRumorsInDistrict(rumors: PlayerRumor[], districtId: string): PlayerRumor[];
67
+ /** Format a single rumor for the director /rumors view. */
68
+ export declare function formatRumorForDirector(rumor: PlayerRumor): string;
69
+ //# sourceMappingURL=player-rumor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-rumor.d.ts","sourceRoot":"","sources":["../src/player-rumor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAIzE,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,OAAO,EAAE,YAAY,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC3C,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AA8BF,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAO/D;AAgBD,mDAAmD;AACnD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,gBAAgB,EACzB,eAAe,CAAC,EAAE,MAAM,EACxB,gBAAgB,CAAC,EAAE,MAAM,EACzB,IAAI,GAAE,MAAU,GACf,WAAW,CAgBb;AAED,2DAA2D;AAC3D,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,gBAAgB,EACzB,UAAU,CAAC,EAAE,MAAM,EACnB,IAAI,GAAE,MAAU,GACf,WAAW,CAoBb;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,eAAe,EAAE,MAAM,EACvB,cAAc,GAAE,MAA6B,GAC5C,WAAW,CAkBb;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAOxD;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,CA8BpG;AAcD,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CAI/F;AAED,6DAA6D;AAC7D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE,CAE5F;AAID,2DAA2D;AAC3D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAgBjE"}
@@ -0,0 +1,186 @@
1
+ // player-rumor — structured player legend propagation
2
+ // Pure functions + types for rumor lifecycle. No module registration.
3
+ // Rumors are structured claims, not prose. Claude renders them into dialogue.
4
+ import { buildPlayerDescriptor } from './social-consequence.js';
5
+ // --- Constants ---
6
+ const CONFIDENCE_DECAY = 0.85;
7
+ const BASE_DISTORTION_RATE = 0.08;
8
+ const MUTATION_THRESHOLD = 0.10;
9
+ const CLAIM_EXAGGERATIONS = {
10
+ 'defeated': 'slaughtered',
11
+ 'entered': 'conquered',
12
+ 'discovered': 'claimed',
13
+ 'slew': 'annihilated',
14
+ 'killed': 'massacred',
15
+ };
16
+ const VALENCE_INVERSIONS = {
17
+ heroic: 'fearsome',
18
+ fearsome: 'heroic',
19
+ tragic: 'mysterious',
20
+ mysterious: 'tragic',
21
+ };
22
+ let rumorCounter = 0;
23
+ function nextRumorId() {
24
+ return `pr-${++rumorCounter}`;
25
+ }
26
+ // --- Valence Derivation ---
27
+ /** Derive emotional charge from milestone tags. */
28
+ export function deriveRumorValence(tags) {
29
+ const has = (t) => tags.includes(t);
30
+ if (has('combat') && has('boss-kill'))
31
+ return 'fearsome';
32
+ if (has('exploration') && has('landmark'))
33
+ return 'mysterious';
34
+ if (has('combat'))
35
+ return 'heroic';
36
+ if (has('exploration') && has('boss-lair'))
37
+ return 'fearsome';
38
+ return 'mysterious';
39
+ }
40
+ // --- Spawning ---
41
+ /** Build a subject descriptor from a profile. */
42
+ function descriptorFromProfile(profile) {
43
+ const injuryNames = profile.injuries.map((i) => i.name);
44
+ return buildPlayerDescriptor(profile.build.name, profile.build.archetypeId, profile.progression.level, injuryNames, profile.custom.title);
45
+ }
46
+ /** Spawn a player rumor from a milestone event. */
47
+ export function spawnPlayerRumor(milestone, profile, originFactionId, originDistrictId, tick = 0) {
48
+ return {
49
+ id: nextRumorId(),
50
+ claim: milestone.label,
51
+ subjectDescriptor: descriptorFromProfile(profile),
52
+ sourceEvent: 'milestone',
53
+ sourceMilestone: milestone.label,
54
+ originFactionId,
55
+ originDistrictId,
56
+ confidence: 1.0,
57
+ distortion: 0,
58
+ mutationCount: 0,
59
+ valence: deriveRumorValence(milestone.tags),
60
+ spreadTo: originFactionId ? [originFactionId] : [],
61
+ originTick: tick,
62
+ };
63
+ }
64
+ /** Spawn a player rumor from a reputation change event. */
65
+ export function spawnReputationRumor(factionId, delta, factionName, profile, districtId, tick = 0) {
66
+ const claim = delta < 0
67
+ ? `angered the ${factionName}`
68
+ : `honored by the ${factionName}`;
69
+ const valence = delta < 0 ? 'fearsome' : 'heroic';
70
+ return {
71
+ id: nextRumorId(),
72
+ claim,
73
+ subjectDescriptor: descriptorFromProfile(profile),
74
+ sourceEvent: 'reputation',
75
+ originFactionId: factionId,
76
+ originDistrictId: districtId,
77
+ confidence: 0.9,
78
+ distortion: 0,
79
+ mutationCount: 0,
80
+ valence,
81
+ spreadTo: [factionId],
82
+ originTick: tick,
83
+ };
84
+ }
85
+ // --- Propagation ---
86
+ /**
87
+ * Propagate a rumor to a new faction.
88
+ * Returns a new rumor with the target added to spreadTo, confidence decayed,
89
+ * and possible mutation applied.
90
+ */
91
+ export function propagateRumor(rumor, targetFactionId, distortionRate = BASE_DISTORTION_RATE) {
92
+ const newConfidence = rumor.confidence * CONFIDENCE_DECAY;
93
+ const newDistortion = Math.min(1, rumor.distortion + distortionRate);
94
+ let propagated = {
95
+ ...rumor,
96
+ confidence: newConfidence,
97
+ distortion: newDistortion,
98
+ spreadTo: [...rumor.spreadTo, targetFactionId],
99
+ };
100
+ // Mutation chance based on distortion level
101
+ if (shouldMutate(propagated)) {
102
+ const result = mutateRumorClaim(propagated);
103
+ propagated = result.rumor;
104
+ }
105
+ return propagated;
106
+ }
107
+ /** Determine if a rumor should mutate during propagation. */
108
+ export function shouldMutate(rumor) {
109
+ // Higher distortion = higher mutation chance
110
+ // Base 10% + distortion bonus
111
+ const chance = MUTATION_THRESHOLD + rumor.distortion * 0.15;
112
+ // Deterministic based on mutation count + confidence for reproducibility
113
+ const seed = (rumor.mutationCount * 7 + Math.round(rumor.confidence * 100)) % 100;
114
+ return seed < chance * 100;
115
+ }
116
+ // --- Mutation ---
117
+ /**
118
+ * Apply a structured mutation to a rumor's claim.
119
+ * Returns the mutated rumor and a record of what changed.
120
+ */
121
+ export function mutateRumorClaim(rumor) {
122
+ // Alternate between mutation types based on mutation count
123
+ const mutationType = rumor.mutationCount % 3;
124
+ if (mutationType === 0) {
125
+ // Exaggerate: replace a verb in the claim
126
+ const exaggerated = exaggerateClaim(rumor.claim);
127
+ if (exaggerated !== rumor.claim) {
128
+ return {
129
+ rumor: { ...rumor, claim: exaggerated, mutationCount: rumor.mutationCount + 1 },
130
+ mutation: { type: 'exaggerate', field: 'claim', before: rumor.claim, after: exaggerated },
131
+ };
132
+ }
133
+ }
134
+ if (mutationType === 1) {
135
+ // Invert valence
136
+ const newValence = VALENCE_INVERSIONS[rumor.valence];
137
+ return {
138
+ rumor: { ...rumor, valence: newValence, mutationCount: rumor.mutationCount + 1 },
139
+ mutation: { type: 'invert', field: 'valence', before: rumor.valence, after: newValence },
140
+ };
141
+ }
142
+ // Conflate: modify the descriptor
143
+ const newDescriptor = `${rumor.subjectDescriptor}, whose deeds grow stranger in the telling`;
144
+ return {
145
+ rumor: { ...rumor, subjectDescriptor: newDescriptor, mutationCount: rumor.mutationCount + 1 },
146
+ mutation: { type: 'conflate', field: 'claim', before: rumor.subjectDescriptor, after: newDescriptor },
147
+ };
148
+ }
149
+ function exaggerateClaim(claim) {
150
+ const lower = claim.toLowerCase();
151
+ for (const [original, exaggerated] of Object.entries(CLAIM_EXAGGERATIONS)) {
152
+ if (lower.includes(original)) {
153
+ return claim.replace(new RegExp(original, 'i'), exaggerated);
154
+ }
155
+ }
156
+ return claim;
157
+ }
158
+ // --- Queries ---
159
+ /** Get all rumors known to a specific faction (originated or spread to). */
160
+ export function getRumorsKnownToFaction(rumors, factionId) {
161
+ return rumors.filter((r) => r.originFactionId === factionId || r.spreadTo.includes(factionId));
162
+ }
163
+ /** Get all rumors that originated in a specific district. */
164
+ export function getRumorsInDistrict(rumors, districtId) {
165
+ return rumors.filter((r) => r.originDistrictId === districtId);
166
+ }
167
+ // --- Director Display ---
168
+ /** Format a single rumor for the director /rumors view. */
169
+ export function formatRumorForDirector(rumor) {
170
+ const conf = Math.round(rumor.confidence * 100);
171
+ const dist = Math.round(rumor.distortion * 100);
172
+ const spread = rumor.spreadTo.length > 0 ? rumor.spreadTo.join(' → ') : 'none';
173
+ const parts = [
174
+ ` "${rumor.claim}"`,
175
+ ` Subject: ${rumor.subjectDescriptor}`,
176
+ ` Valence: ${rumor.valence} | Confidence: ${conf}% | Distortion: ${dist}%`,
177
+ ` Origin: ${rumor.originFactionId ?? '?'} / ${rumor.originDistrictId ?? '?'} (tick ${rumor.originTick})`,
178
+ ` Spread: ${spread}`,
179
+ ` Mutations: ${rumor.mutationCount}`,
180
+ ];
181
+ if (rumor.sourceMilestone) {
182
+ parts.splice(2, 0, ` Source: milestone "${rumor.sourceMilestone}"`);
183
+ }
184
+ return parts.join('\n');
185
+ }
186
+ //# sourceMappingURL=player-rumor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-rumor.js","sourceRoot":"","sources":["../src/player-rumor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { PlayerRumor } from './player-rumor.js';
2
+ export type PressureKind = 'bounty-issued' | 'faction-summons' | 'merchant-blacklist' | 'revenge-attempt' | 'investigation-opened' | 'heresy-whisper' | 'chapel-sanction' | 'case-opened' | 'witness-vanished' | 'mutiny-brewing' | 'navy-bounty' | 'infection-suspicion' | 'camp-panic' | 'corp-manhunt' | 'ice-escalation';
3
+ export type PressureVisibility = 'hidden' | 'rumored' | 'known' | 'public';
4
+ export type WorldPressure = {
5
+ id: string;
6
+ kind: PressureKind;
7
+ /** Faction that generated this pressure */
8
+ sourceFactionId: string;
9
+ /** Structured claim about what this pressure represents */
10
+ description: string;
11
+ /** What triggered it — rumor id, milestone label, or event type */
12
+ triggeredBy: string;
13
+ /** 0-1, higher = more imminent */
14
+ urgency: number;
15
+ /** How widely known this pressure is */
16
+ visibility: PressureVisibility;
17
+ /** Turns remaining before expiry (null = permanent until resolved) */
18
+ turnsRemaining: number | null;
19
+ /** Possible outcomes if the player engages or ignores */
20
+ potentialOutcomes: string[];
21
+ /** Genre/thematic tags */
22
+ tags: string[];
23
+ /** Engine tick when created */
24
+ createdAtTick: number;
25
+ };
26
+ export type PressureInputs = {
27
+ playerRumors: PlayerRumor[];
28
+ reputation: Array<{
29
+ factionId: string;
30
+ value: number;
31
+ }>;
32
+ milestones: Array<{
33
+ label: string;
34
+ tags: string[];
35
+ }>;
36
+ factionStates: Record<string, {
37
+ alertLevel: number;
38
+ cohesion: number;
39
+ }>;
40
+ districtMetrics?: Record<string, {
41
+ alertPressure: number;
42
+ rumorDensity: number;
43
+ stability: number;
44
+ }>;
45
+ playerLevel: number;
46
+ totalTurns: number;
47
+ activePressures: WorldPressure[];
48
+ /** From PackMetadata.genres[0], e.g. 'fantasy', 'cyberpunk' */
49
+ genre: string;
50
+ /** Current engine tick for timestamps */
51
+ currentTick: number;
52
+ };
53
+ export type PressureSpawnResult = {
54
+ pressure: WorldPressure;
55
+ /** One-line reason for director mode */
56
+ reason: string;
57
+ };
58
+ /**
59
+ * Tick all active pressures: decrement timers, remove expired,
60
+ * escalate visibility over time. Returns new array (immutable).
61
+ */
62
+ export declare function tickPressures(pressures: WorldPressure[], currentTick: number): WorldPressure[];
63
+ /**
64
+ * Evaluate simulation state for new pressure. Returns at most ONE new pressure.
65
+ * Returns null most turns — scarcity by design.
66
+ */
67
+ export declare function evaluatePressures(inputs: PressureInputs): PressureSpawnResult | null;
68
+ /** Get pressures originating from a specific faction. */
69
+ export declare function getPressuresForFaction(pressures: WorldPressure[], factionId: string): WorldPressure[];
70
+ /** Get pressures the player would be aware of (not hidden). */
71
+ export declare function getVisiblePressures(pressures: WorldPressure[]): WorldPressure[];
72
+ /** Format a single pressure for the director /pressures view. */
73
+ export declare function formatPressureForDirector(pressure: WorldPressure): string;
74
+ /** Compact summary for narrator prompt injection (~15 tokens). */
75
+ export declare function formatPressureForNarrator(pressure: WorldPressure): string;
76
+ /** NPC-facing description for dialogue context. */
77
+ export declare function formatPressureForDialogue(pressure: WorldPressure): string;
78
+ //# sourceMappingURL=pressure-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pressure-system.d.ts","sourceRoot":"","sources":["../src/pressure-system.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,MAAM,MAAM,YAAY,GAEpB,eAAe,GACf,iBAAiB,GACjB,oBAAoB,GACpB,iBAAiB,GACjB,sBAAsB,GAEtB,gBAAgB,GAChB,iBAAiB,GAEjB,aAAa,GACb,kBAAkB,GAElB,gBAAgB,GAChB,aAAa,GAEb,qBAAqB,GACrB,YAAY,GAEZ,cAAc,GACd,gBAAgB,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,sEAAsE;IACtE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,UAAU,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,UAAU,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACrD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrG,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,aAAa,CAAC;IACxB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAeF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,EAAE,CA0B9F;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,mBAAmB,GAAG,IAAI,CAmBpF;AAkhBD,yDAAyD;AACzD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE,CAErG;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAE/E;AAID,iEAAiE;AACjE,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAYzE;AAED,kEAAkE;AAClE,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAGzE;AAED,mDAAmD;AACnD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAGzE"}
@@ -0,0 +1,577 @@
1
+ // pressure-system — emergent world pressure generation
2
+ // Pure functions + types for pressure lifecycle. No module registration.
3
+ // Pressures are structured objects, not prose. Claude renders them into narration.
4
+ // Most turns produce nothing — scarcity makes pressures meaningful.
5
+ // --- Constants ---
6
+ const MAX_ACTIVE_PRESSURES = 3;
7
+ const MIN_TURNS_BETWEEN_SPAWNS = 3;
8
+ const VISIBILITY_ESCALATION_TICKS = 3;
9
+ let pressureCounter = 0;
10
+ function nextPressureId() {
11
+ return `wp-${++pressureCounter}`;
12
+ }
13
+ // --- Lifecycle ---
14
+ /**
15
+ * Tick all active pressures: decrement timers, remove expired,
16
+ * escalate visibility over time. Returns new array (immutable).
17
+ */
18
+ export function tickPressures(pressures, currentTick) {
19
+ const result = [];
20
+ for (const p of pressures) {
21
+ // Expire if turnsRemaining hit 0
22
+ if (p.turnsRemaining !== null && p.turnsRemaining <= 0)
23
+ continue;
24
+ const updated = { ...p };
25
+ // Decrement timer
26
+ if (updated.turnsRemaining !== null) {
27
+ updated.turnsRemaining = updated.turnsRemaining - 1;
28
+ }
29
+ // Escalate visibility over time
30
+ const age = currentTick - updated.createdAtTick;
31
+ if (updated.visibility === 'hidden' && age >= VISIBILITY_ESCALATION_TICKS) {
32
+ updated.visibility = 'rumored';
33
+ }
34
+ else if (updated.visibility === 'rumored' && age >= VISIBILITY_ESCALATION_TICKS * 2) {
35
+ updated.visibility = 'known';
36
+ }
37
+ result.push(updated);
38
+ }
39
+ return result;
40
+ }
41
+ // --- Evaluation ---
42
+ /**
43
+ * Evaluate simulation state for new pressure. Returns at most ONE new pressure.
44
+ * Returns null most turns — scarcity by design.
45
+ */
46
+ export function evaluatePressures(inputs) {
47
+ // Scarcity guard: max active
48
+ if (inputs.activePressures.length >= MAX_ACTIVE_PRESSURES)
49
+ return null;
50
+ // Scarcity guard: min turns between spawns
51
+ if (inputs.activePressures.length > 0) {
52
+ const mostRecent = Math.max(...inputs.activePressures.map((p) => p.createdAtTick));
53
+ if (inputs.currentTick - mostRecent < MIN_TURNS_BETWEEN_SPAWNS)
54
+ return null;
55
+ }
56
+ // Existing kinds — no duplicates
57
+ const activeKinds = new Set(inputs.activePressures.map((p) => p.kind));
58
+ // Try universal rules first
59
+ const universal = evaluateUniversalRules(inputs, activeKinds);
60
+ if (universal)
61
+ return universal;
62
+ // Try genre-specific rules
63
+ return evaluateGenreRules(inputs, activeKinds);
64
+ }
65
+ // --- Universal Rules ---
66
+ function evaluateUniversalRules(inputs, activeKinds) {
67
+ const { reputation, factionStates, playerRumors, currentTick } = inputs;
68
+ for (const rep of reputation) {
69
+ const factionState = factionStates[rep.factionId];
70
+ if (!factionState)
71
+ continue;
72
+ // Bounty: deep hostility + high alert
73
+ if (!activeKinds.has('bounty-issued') &&
74
+ rep.value <= -50 &&
75
+ factionState.alertLevel >= 60) {
76
+ return {
77
+ pressure: makePressure({
78
+ kind: 'bounty-issued',
79
+ sourceFactionId: rep.factionId,
80
+ description: `${rep.factionId} has placed a bounty on the player`,
81
+ triggeredBy: `reputation:${rep.value}`,
82
+ urgency: 0.7,
83
+ visibility: 'rumored',
84
+ turnsRemaining: 12,
85
+ potentialOutcomes: [
86
+ 'Hunters sent after the player',
87
+ 'Safe passage denied in faction territory',
88
+ 'Bounty can be cleared by major service to the faction',
89
+ ],
90
+ tags: ['hostile', 'universal'],
91
+ currentTick,
92
+ }),
93
+ reason: `Faction ${rep.factionId} reputation ${rep.value} with alert ${factionState.alertLevel}`,
94
+ };
95
+ }
96
+ // Investigation: moderate hostility + moderate alert
97
+ if (!activeKinds.has('investigation-opened') &&
98
+ rep.value <= -30 &&
99
+ factionState.alertLevel >= 40) {
100
+ return {
101
+ pressure: makePressure({
102
+ kind: 'investigation-opened',
103
+ sourceFactionId: rep.factionId,
104
+ description: `${rep.factionId} has opened an investigation into the player's activities`,
105
+ triggeredBy: `reputation:${rep.value}`,
106
+ urgency: 0.4,
107
+ visibility: 'hidden',
108
+ turnsRemaining: 8,
109
+ potentialOutcomes: [
110
+ 'NPCs withhold information during investigation',
111
+ 'Investigation may escalate to bounty if ignored',
112
+ 'Player can cooperate to clear suspicion',
113
+ ],
114
+ tags: ['probe', 'universal'],
115
+ currentTick,
116
+ }),
117
+ reason: `Faction ${rep.factionId} reputation ${rep.value} with alert ${factionState.alertLevel}`,
118
+ };
119
+ }
120
+ // Faction summons: high rep with one faction, their rival hates the player
121
+ if (!activeKinds.has('faction-summons') &&
122
+ rep.value >= 50) {
123
+ const hasRival = reputation.some((other) => other.factionId !== rep.factionId && other.value <= -20);
124
+ if (hasRival) {
125
+ return {
126
+ pressure: makePressure({
127
+ kind: 'faction-summons',
128
+ sourceFactionId: rep.factionId,
129
+ description: `${rep.factionId} summons the player to discuss a matter of importance`,
130
+ triggeredBy: `reputation:${rep.value}`,
131
+ urgency: 0.5,
132
+ visibility: 'known',
133
+ turnsRemaining: 10,
134
+ potentialOutcomes: [
135
+ 'Faction offers a mission against their rival',
136
+ 'Refusing the summons may strain the relationship',
137
+ 'Accepting deepens alliance and rival hostility',
138
+ ],
139
+ tags: ['diplomatic', 'universal'],
140
+ currentTick,
141
+ }),
142
+ reason: `Faction ${rep.factionId} rep ${rep.value} while rival faction hostile`,
143
+ };
144
+ }
145
+ }
146
+ // Merchant blacklist: hostility with merchant-tagged factions
147
+ // (We check tags via faction id containing 'merchant', 'trade', 'guild', 'market')
148
+ if (!activeKinds.has('merchant-blacklist') &&
149
+ rep.value <= -40 &&
150
+ isMerchantFaction(rep.factionId)) {
151
+ return {
152
+ pressure: makePressure({
153
+ kind: 'merchant-blacklist',
154
+ sourceFactionId: rep.factionId,
155
+ description: `${rep.factionId} has blacklisted the player from trade`,
156
+ triggeredBy: `reputation:${rep.value}`,
157
+ urgency: 0.5,
158
+ visibility: 'known',
159
+ turnsRemaining: 15,
160
+ potentialOutcomes: [
161
+ 'Trade access revoked at faction shops',
162
+ 'Prices inflated at neutral merchants who heard',
163
+ 'Blacklist lifted after reputation repair',
164
+ ],
165
+ tags: ['economic', 'universal'],
166
+ currentTick,
167
+ }),
168
+ reason: `Merchant faction ${rep.factionId} reputation ${rep.value}`,
169
+ };
170
+ }
171
+ }
172
+ // Revenge: fearsome rumors spread widely
173
+ if (!activeKinds.has('revenge-attempt')) {
174
+ const fearsomeWideRumors = playerRumors.filter((r) => r.valence === 'fearsome' && r.spreadTo.length >= 3 && r.confidence > 0.3);
175
+ if (fearsomeWideRumors.length > 0) {
176
+ const trigger = fearsomeWideRumors[0];
177
+ const originFaction = trigger.originFactionId ?? reputation[0]?.factionId ?? 'unknown';
178
+ return {
179
+ pressure: makePressure({
180
+ kind: 'revenge-attempt',
181
+ sourceFactionId: originFaction,
182
+ description: `allies of those the player wronged are seeking revenge`,
183
+ triggeredBy: `rumor:${trigger.id}`,
184
+ urgency: 0.6,
185
+ visibility: 'hidden',
186
+ turnsRemaining: 8,
187
+ potentialOutcomes: [
188
+ 'Ambush attempt in the current district',
189
+ 'NPCs may betray the player to avengers',
190
+ 'Avengers can be confronted or evaded',
191
+ ],
192
+ tags: ['hostile', 'universal'],
193
+ currentTick,
194
+ }),
195
+ reason: `Fearsome rumor "${trigger.claim}" spread to ${trigger.spreadTo.length} factions`,
196
+ };
197
+ }
198
+ }
199
+ return null;
200
+ }
201
+ // --- Genre Rules ---
202
+ function evaluateGenreRules(inputs, activeKinds) {
203
+ const { genre } = inputs;
204
+ switch (genre) {
205
+ case 'fantasy':
206
+ return evaluateFantasyRules(inputs, activeKinds);
207
+ case 'mystery':
208
+ return evaluateMysteryRules(inputs, activeKinds);
209
+ case 'pirate':
210
+ return evaluatePirateRules(inputs, activeKinds);
211
+ case 'horror':
212
+ case 'post-apocalyptic':
213
+ return evaluateHorrorRules(inputs, activeKinds);
214
+ case 'cyberpunk':
215
+ return evaluateCyberpunkRules(inputs, activeKinds);
216
+ default:
217
+ return null;
218
+ }
219
+ }
220
+ function evaluateFantasyRules(inputs, activeKinds) {
221
+ const { reputation, factionStates, currentTick, milestones } = inputs;
222
+ // Heresy whisper: religious faction + negative rep + religious milestones
223
+ if (!activeKinds.has('heresy-whisper')) {
224
+ const chapelFaction = findFactionByHint(reputation, ['chapel', 'church', 'temple', 'clergy', 'faith']);
225
+ if (chapelFaction && chapelFaction.value < -20) {
226
+ const hasReligiousMilestone = milestones.some((m) => m.tags.some((t) => ['faith', 'chapel', 'heresy', 'divine', 'sacrilege'].includes(t)));
227
+ if (hasReligiousMilestone || (factionStates[chapelFaction.factionId]?.alertLevel ?? 0) >= 40) {
228
+ return {
229
+ pressure: makePressure({
230
+ kind: 'heresy-whisper',
231
+ sourceFactionId: chapelFaction.factionId,
232
+ description: `the ${chapelFaction.factionId} whispers of heresy against the player`,
233
+ triggeredBy: `reputation:${chapelFaction.value}`,
234
+ urgency: 0.4,
235
+ visibility: 'rumored',
236
+ turnsRemaining: 10,
237
+ potentialOutcomes: [
238
+ 'Religious NPCs become suspicious and uncooperative',
239
+ 'May escalate to formal chapel sanction if unaddressed',
240
+ 'Can be defused through piety or atonement',
241
+ ],
242
+ tags: ['religious', 'fantasy'],
243
+ currentTick,
244
+ }),
245
+ reason: `Chapel faction ${chapelFaction.factionId} rep ${chapelFaction.value}`,
246
+ };
247
+ }
248
+ }
249
+ }
250
+ // Chapel sanction: heresy-whisper expired (not currently active but was recently)
251
+ if (!activeKinds.has('chapel-sanction') && !activeKinds.has('heresy-whisper')) {
252
+ const chapelFaction = findFactionByHint(reputation, ['chapel', 'church', 'temple', 'clergy', 'faith']);
253
+ if (chapelFaction && chapelFaction.value < -40) {
254
+ return {
255
+ pressure: makePressure({
256
+ kind: 'chapel-sanction',
257
+ sourceFactionId: chapelFaction.factionId,
258
+ description: `the ${chapelFaction.factionId} has formally sanctioned the player`,
259
+ triggeredBy: `reputation:${chapelFaction.value}`,
260
+ urgency: 0.7,
261
+ visibility: 'public',
262
+ turnsRemaining: 20,
263
+ potentialOutcomes: [
264
+ 'Healing and blessing services denied',
265
+ 'Faithful NPCs refuse all aid',
266
+ 'Sanction can be lifted through a major act of devotion',
267
+ ],
268
+ tags: ['religious', 'fantasy', 'escalation'],
269
+ currentTick,
270
+ }),
271
+ reason: `Chapel faction ${chapelFaction.factionId} rep ${chapelFaction.value}, heresy unresolved`,
272
+ };
273
+ }
274
+ }
275
+ return null;
276
+ }
277
+ function evaluateMysteryRules(inputs, activeKinds) {
278
+ const { reputation, factionStates, milestones, currentTick } = inputs;
279
+ // Case opened: law faction alert + investigation milestones
280
+ if (!activeKinds.has('case-opened')) {
281
+ const lawFaction = findFactionByHint(reputation, ['police', 'law', 'detective', 'constable', 'precinct']);
282
+ if (lawFaction) {
283
+ const alert = factionStates[lawFaction.factionId]?.alertLevel ?? 0;
284
+ const hasInvestigationMilestone = milestones.some((m) => m.tags.some((t) => ['investigation', 'crime', 'evidence', 'witness'].includes(t)));
285
+ if (alert >= 50 || hasInvestigationMilestone) {
286
+ return {
287
+ pressure: makePressure({
288
+ kind: 'case-opened',
289
+ sourceFactionId: lawFaction.factionId,
290
+ description: `${lawFaction.factionId} has opened a case involving the player`,
291
+ triggeredBy: hasInvestigationMilestone ? 'milestone:investigation' : `alert:${alert}`,
292
+ urgency: 0.5,
293
+ visibility: 'hidden',
294
+ turnsRemaining: 10,
295
+ potentialOutcomes: [
296
+ 'Investigators shadow the player',
297
+ 'Evidence may implicate or exonerate',
298
+ 'Player can cooperate, obstruct, or flee',
299
+ ],
300
+ tags: ['investigation', 'mystery'],
301
+ currentTick,
302
+ }),
303
+ reason: `Law faction alert ${alert}, investigation milestones present`,
304
+ };
305
+ }
306
+ }
307
+ }
308
+ // Witness vanished: active investigation + high suspicion environment
309
+ if (!activeKinds.has('witness-vanished') && activeKinds.has('case-opened')) {
310
+ const lawFaction = findFactionByHint(reputation, ['police', 'law', 'detective', 'constable', 'precinct']);
311
+ if (lawFaction) {
312
+ const alert = factionStates[lawFaction.factionId]?.alertLevel ?? 0;
313
+ if (alert >= 70) {
314
+ return {
315
+ pressure: makePressure({
316
+ kind: 'witness-vanished',
317
+ sourceFactionId: lawFaction.factionId,
318
+ description: `a key witness in the investigation has disappeared`,
319
+ triggeredBy: 'case-opened:escalation',
320
+ urgency: 0.7,
321
+ visibility: 'rumored',
322
+ turnsRemaining: 6,
323
+ potentialOutcomes: [
324
+ 'Suspicion falls on the player',
325
+ 'Finding the witness may clear the player',
326
+ 'The witness may have been silenced by a third party',
327
+ ],
328
+ tags: ['investigation', 'mystery', 'escalation'],
329
+ currentTick,
330
+ }),
331
+ reason: `Active case with law faction alert ${alert}`,
332
+ };
333
+ }
334
+ }
335
+ }
336
+ return null;
337
+ }
338
+ function evaluatePirateRules(inputs, activeKinds) {
339
+ const { reputation, factionStates, playerRumors, currentTick } = inputs;
340
+ // Mutiny brewing: crew faction low cohesion
341
+ if (!activeKinds.has('mutiny-brewing')) {
342
+ const crewFaction = findFactionByHint(reputation, ['crew', 'pirate', 'sailor', 'buccaneer']);
343
+ if (crewFaction) {
344
+ const cohesion = factionStates[crewFaction.factionId]?.cohesion ?? 1;
345
+ if (cohesion < 0.4) {
346
+ return {
347
+ pressure: makePressure({
348
+ kind: 'mutiny-brewing',
349
+ sourceFactionId: crewFaction.factionId,
350
+ description: `discontent festers among the ${crewFaction.factionId}`,
351
+ triggeredBy: `cohesion:${cohesion}`,
352
+ urgency: 0.6,
353
+ visibility: 'rumored',
354
+ turnsRemaining: 8,
355
+ potentialOutcomes: [
356
+ 'Crew members may refuse orders',
357
+ 'A ringleader emerges to challenge the player',
358
+ 'Sharing plunder or winning a battle may restore loyalty',
359
+ ],
360
+ tags: ['social', 'pirate'],
361
+ currentTick,
362
+ }),
363
+ reason: `Crew faction ${crewFaction.factionId} cohesion ${cohesion}`,
364
+ };
365
+ }
366
+ }
367
+ }
368
+ // Navy bounty: fearsome rumors spread widely
369
+ if (!activeKinds.has('navy-bounty')) {
370
+ const fearsomeRumors = playerRumors.filter((r) => r.valence === 'fearsome' && r.spreadTo.length >= 2 && r.confidence > 0.4);
371
+ if (fearsomeRumors.length > 0) {
372
+ const navyFaction = findFactionByHint(reputation, ['navy', 'admiralty', 'crown', 'port-authority']);
373
+ const factionId = navyFaction?.factionId ?? 'navy';
374
+ return {
375
+ pressure: makePressure({
376
+ kind: 'navy-bounty',
377
+ sourceFactionId: factionId,
378
+ description: `naval forces have posted a bounty for the player's capture`,
379
+ triggeredBy: `rumor:${fearsomeRumors[0].id}`,
380
+ urgency: 0.7,
381
+ visibility: 'known',
382
+ turnsRemaining: 15,
383
+ potentialOutcomes: [
384
+ 'Naval patrols hunt the player at sea',
385
+ 'Port access may be restricted',
386
+ 'Privateers may seek the bounty reward',
387
+ ],
388
+ tags: ['hostile', 'pirate', 'naval'],
389
+ currentTick,
390
+ }),
391
+ reason: `Fearsome rumors spread to ${fearsomeRumors[0].spreadTo.length} factions`,
392
+ };
393
+ }
394
+ }
395
+ return null;
396
+ }
397
+ function evaluateHorrorRules(inputs, activeKinds) {
398
+ const { reputation, factionStates, playerRumors, currentTick, milestones } = inputs;
399
+ // Infection suspicion: community on high alert + injury-related milestones
400
+ if (!activeKinds.has('infection-suspicion')) {
401
+ const communityFaction = findFactionByHint(reputation, ['camp', 'settlement', 'survivors', 'community', 'haven']);
402
+ if (communityFaction) {
403
+ const alert = factionStates[communityFaction.factionId]?.alertLevel ?? 0;
404
+ const hasInjury = milestones.some((m) => m.tags.some((t) => ['injury', 'wound', 'infection', 'bite', 'exposure'].includes(t)));
405
+ if (alert >= 60 && hasInjury) {
406
+ return {
407
+ pressure: makePressure({
408
+ kind: 'infection-suspicion',
409
+ sourceFactionId: communityFaction.factionId,
410
+ description: `the ${communityFaction.factionId} suspects the player may be infected`,
411
+ triggeredBy: 'injury+alert',
412
+ urgency: 0.6,
413
+ visibility: 'rumored',
414
+ turnsRemaining: 6,
415
+ potentialOutcomes: [
416
+ 'NPCs demand the player submit to examination',
417
+ 'Access to safe zones restricted',
418
+ 'Player may be quarantined or expelled',
419
+ ],
420
+ tags: ['social', 'horror', 'medical'],
421
+ currentTick,
422
+ }),
423
+ reason: `Community alert ${alert} with injury milestones`,
424
+ };
425
+ }
426
+ }
427
+ }
428
+ // Camp panic: multiple fearsome rumors in circulation
429
+ if (!activeKinds.has('camp-panic')) {
430
+ const fearsomeRumors = playerRumors.filter((r) => r.valence === 'fearsome' && r.confidence > 0.3);
431
+ if (fearsomeRumors.length >= 2) {
432
+ const communityFaction = findFactionByHint(reputation, ['camp', 'settlement', 'survivors', 'community', 'haven']);
433
+ const factionId = communityFaction?.factionId ?? reputation[0]?.factionId ?? 'community';
434
+ return {
435
+ pressure: makePressure({
436
+ kind: 'camp-panic',
437
+ sourceFactionId: factionId,
438
+ description: `fear spreads through the settlement — the player's reputation precedes them`,
439
+ triggeredBy: `rumors:fearsome:${fearsomeRumors.length}`,
440
+ urgency: 0.5,
441
+ visibility: 'known',
442
+ turnsRemaining: 8,
443
+ potentialOutcomes: [
444
+ 'NPCs hoard resources and refuse to share',
445
+ 'Some NPCs flee the settlement entirely',
446
+ 'A leader may demand the player leave',
447
+ ],
448
+ tags: ['social', 'horror', 'panic'],
449
+ currentTick,
450
+ }),
451
+ reason: `${fearsomeRumors.length} fearsome rumors in circulation`,
452
+ };
453
+ }
454
+ }
455
+ return null;
456
+ }
457
+ function evaluateCyberpunkRules(inputs, activeKinds) {
458
+ const { reputation, factionStates, currentTick } = inputs;
459
+ // Corp manhunt: corporate faction hostile + high alert
460
+ if (!activeKinds.has('corp-manhunt')) {
461
+ const corpFaction = findFactionByHint(reputation, ['corp', 'corporation', 'corporate', 'zaibatsu', 'syndicate']);
462
+ if (corpFaction && corpFaction.value <= -40) {
463
+ const alert = factionStates[corpFaction.factionId]?.alertLevel ?? 0;
464
+ if (alert >= 50) {
465
+ return {
466
+ pressure: makePressure({
467
+ kind: 'corp-manhunt',
468
+ sourceFactionId: corpFaction.factionId,
469
+ description: `${corpFaction.factionId} security division has authorized a manhunt`,
470
+ triggeredBy: `reputation:${corpFaction.value}`,
471
+ urgency: 0.8,
472
+ visibility: 'rumored',
473
+ turnsRemaining: 10,
474
+ potentialOutcomes: [
475
+ 'Corporate operatives deployed to player location',
476
+ 'Surveillance systems track player movement',
477
+ 'A fixer may offer to broker a truce — for a price',
478
+ ],
479
+ tags: ['hostile', 'cyberpunk', 'corporate'],
480
+ currentTick,
481
+ }),
482
+ reason: `Corp faction ${corpFaction.factionId} rep ${corpFaction.value} alert ${alert}`,
483
+ };
484
+ }
485
+ }
486
+ }
487
+ // ICE escalation: investigation expired or failed + digital presence
488
+ if (!activeKinds.has('ice-escalation') && !activeKinds.has('investigation-opened')) {
489
+ const corpFaction = findFactionByHint(reputation, ['corp', 'corporation', 'corporate', 'zaibatsu', 'syndicate', 'net']);
490
+ if (corpFaction && corpFaction.value <= -30) {
491
+ const alert = factionStates[corpFaction.factionId]?.alertLevel ?? 0;
492
+ if (alert >= 60) {
493
+ return {
494
+ pressure: makePressure({
495
+ kind: 'ice-escalation',
496
+ sourceFactionId: corpFaction.factionId,
497
+ description: `${corpFaction.factionId} has upgraded its ICE against the player`,
498
+ triggeredBy: `alert:${alert}`,
499
+ urgency: 0.5,
500
+ visibility: 'hidden',
501
+ turnsRemaining: 12,
502
+ potentialOutcomes: [
503
+ 'Digital zones become more dangerous',
504
+ 'Hacking attempts face increased resistance',
505
+ 'A netrunner contact may offer countermeasures',
506
+ ],
507
+ tags: ['digital', 'cyberpunk', 'escalation'],
508
+ currentTick,
509
+ }),
510
+ reason: `Corp faction ${corpFaction.factionId} alert ${alert} after investigation`,
511
+ };
512
+ }
513
+ }
514
+ }
515
+ return null;
516
+ }
517
+ // --- Queries ---
518
+ /** Get pressures originating from a specific faction. */
519
+ export function getPressuresForFaction(pressures, factionId) {
520
+ return pressures.filter((p) => p.sourceFactionId === factionId);
521
+ }
522
+ /** Get pressures the player would be aware of (not hidden). */
523
+ export function getVisiblePressures(pressures) {
524
+ return pressures.filter((p) => p.visibility !== 'hidden');
525
+ }
526
+ // --- Formatting ---
527
+ /** Format a single pressure for the director /pressures view. */
528
+ export function formatPressureForDirector(pressure) {
529
+ const urgencyPct = Math.round(pressure.urgency * 100);
530
+ const turns = pressure.turnsRemaining !== null ? `${pressure.turnsRemaining} turns` : 'permanent';
531
+ const parts = [
532
+ ` [${pressure.kind}] ${pressure.description}`,
533
+ ` Source: ${pressure.sourceFactionId} | Urgency: ${urgencyPct}% | Visibility: ${pressure.visibility}`,
534
+ ` Expires: ${turns} | Triggered by: ${pressure.triggeredBy}`,
535
+ ` Tags: ${pressure.tags.join(', ')}`,
536
+ ` Outcomes:`,
537
+ ...pressure.potentialOutcomes.map((o) => ` - ${o}`),
538
+ ];
539
+ return parts.join('\n');
540
+ }
541
+ /** Compact summary for narrator prompt injection (~15 tokens). */
542
+ export function formatPressureForNarrator(pressure) {
543
+ const urgency = pressure.urgency >= 0.7 ? 'urgent' : pressure.urgency >= 0.4 ? 'growing' : 'distant';
544
+ return `${pressure.kind}: ${pressure.description} (${urgency})`;
545
+ }
546
+ /** NPC-facing description for dialogue context. */
547
+ export function formatPressureForDialogue(pressure) {
548
+ const urgency = pressure.urgency >= 0.7 ? 'imminent' : pressure.urgency >= 0.4 ? 'developing' : 'emerging';
549
+ return `${pressure.kind} (${urgency}): ${pressure.description}`;
550
+ }
551
+ // --- Helpers ---
552
+ function makePressure(opts) {
553
+ return {
554
+ id: nextPressureId(),
555
+ kind: opts.kind,
556
+ sourceFactionId: opts.sourceFactionId,
557
+ description: opts.description,
558
+ triggeredBy: opts.triggeredBy,
559
+ urgency: opts.urgency,
560
+ visibility: opts.visibility,
561
+ turnsRemaining: opts.turnsRemaining,
562
+ potentialOutcomes: opts.potentialOutcomes,
563
+ tags: opts.tags,
564
+ createdAtTick: opts.currentTick,
565
+ };
566
+ }
567
+ function isMerchantFaction(factionId) {
568
+ const lower = factionId.toLowerCase();
569
+ return ['merchant', 'trade', 'guild', 'market', 'bazaar', 'shop', 'vendor'].some((hint) => lower.includes(hint));
570
+ }
571
+ function findFactionByHint(reputation, hints) {
572
+ return reputation.find((r) => {
573
+ const lower = r.factionId.toLowerCase();
574
+ return hints.some((h) => lower.includes(h));
575
+ });
576
+ }
577
+ //# sourceMappingURL=pressure-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pressure-system.js","sourceRoot":"","sources":["../src/pressure-system.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-rpg-engine/modules",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "description": "AI RPG Engine built-in modules: combat, dialogue, inventory, traversal, status",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",