@mythxengine/mcp-server 0.1.0
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/LICENSE +21 -0
- package/dist/__tests__/assemble.test.d.ts +2 -0
- package/dist/__tests__/assemble.test.d.ts.map +1 -0
- package/dist/__tests__/assemble.test.js +81 -0
- package/dist/__tests__/assemble.test.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/index.d.ts +9 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +202 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +41 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +91 -0
- package/dist/server.js.map +1 -0
- package/dist/state/manager.d.ts +88 -0
- package/dist/state/manager.d.ts.map +1 -0
- package/dist/state/manager.js +308 -0
- package/dist/state/manager.js.map +1 -0
- package/dist/state/rules.d.ts +30 -0
- package/dist/state/rules.d.ts.map +1 -0
- package/dist/state/rules.js +61 -0
- package/dist/state/rules.js.map +1 -0
- package/dist/state/worldpacks.d.ts +43 -0
- package/dist/state/worldpacks.d.ts.map +1 -0
- package/dist/state/worldpacks.js +125 -0
- package/dist/state/worldpacks.js.map +1 -0
- package/dist/tools/augmentation/augment.d.ts +15 -0
- package/dist/tools/augmentation/augment.d.ts.map +1 -0
- package/dist/tools/augmentation/augment.js +512 -0
- package/dist/tools/augmentation/augment.js.map +1 -0
- package/dist/tools/augmentation/index.d.ts +6 -0
- package/dist/tools/augmentation/index.d.ts.map +1 -0
- package/dist/tools/augmentation/index.js +7 -0
- package/dist/tools/augmentation/index.js.map +1 -0
- package/dist/tools/characters.d.ts +26 -0
- package/dist/tools/characters.d.ts.map +1 -0
- package/dist/tools/characters.js +362 -0
- package/dist/tools/characters.js.map +1 -0
- package/dist/tools/clocks.d.ts +33 -0
- package/dist/tools/clocks.d.ts.map +1 -0
- package/dist/tools/clocks.js +438 -0
- package/dist/tools/clocks.js.map +1 -0
- package/dist/tools/combat.d.ts +38 -0
- package/dist/tools/combat.d.ts.map +1 -0
- package/dist/tools/combat.js +574 -0
- package/dist/tools/combat.js.map +1 -0
- package/dist/tools/dice.d.ts +9 -0
- package/dist/tools/dice.d.ts.map +1 -0
- package/dist/tools/dice.js +287 -0
- package/dist/tools/dice.js.map +1 -0
- package/dist/tools/encounters.d.ts +21 -0
- package/dist/tools/encounters.d.ts.map +1 -0
- package/dist/tools/encounters.js +521 -0
- package/dist/tools/encounters.js.map +1 -0
- package/dist/tools/engagement.d.ts +25 -0
- package/dist/tools/engagement.d.ts.map +1 -0
- package/dist/tools/engagement.js +491 -0
- package/dist/tools/engagement.js.map +1 -0
- package/dist/tools/expansion/archetype.d.ts +12 -0
- package/dist/tools/expansion/archetype.d.ts.map +1 -0
- package/dist/tools/expansion/archetype.js +157 -0
- package/dist/tools/expansion/archetype.js.map +1 -0
- package/dist/tools/expansion/index.d.ts +12 -0
- package/dist/tools/expansion/index.d.ts.map +1 -0
- package/dist/tools/expansion/index.js +21 -0
- package/dist/tools/expansion/index.js.map +1 -0
- package/dist/tools/expansion/location.d.ts +12 -0
- package/dist/tools/expansion/location.d.ts.map +1 -0
- package/dist/tools/expansion/location.js +149 -0
- package/dist/tools/expansion/location.js.map +1 -0
- package/dist/tools/expansion/monster.d.ts +12 -0
- package/dist/tools/expansion/monster.d.ts.map +1 -0
- package/dist/tools/expansion/monster.js +157 -0
- package/dist/tools/expansion/monster.js.map +1 -0
- package/dist/tools/expansion/npc.d.ts +12 -0
- package/dist/tools/expansion/npc.d.ts.map +1 -0
- package/dist/tools/expansion/npc.js +153 -0
- package/dist/tools/expansion/npc.js.map +1 -0
- package/dist/tools/generation/archetypes.d.ts +12 -0
- package/dist/tools/generation/archetypes.d.ts.map +1 -0
- package/dist/tools/generation/archetypes.js +129 -0
- package/dist/tools/generation/archetypes.js.map +1 -0
- package/dist/tools/generation/arcs.d.ts +13 -0
- package/dist/tools/generation/arcs.d.ts.map +1 -0
- package/dist/tools/generation/arcs.js +186 -0
- package/dist/tools/generation/arcs.js.map +1 -0
- package/dist/tools/generation/encounters.d.ts +12 -0
- package/dist/tools/generation/encounters.d.ts.map +1 -0
- package/dist/tools/generation/encounters.js +169 -0
- package/dist/tools/generation/encounters.js.map +1 -0
- package/dist/tools/generation/index.d.ts +19 -0
- package/dist/tools/generation/index.d.ts.map +1 -0
- package/dist/tools/generation/index.js +42 -0
- package/dist/tools/generation/index.js.map +1 -0
- package/dist/tools/generation/items.d.ts +12 -0
- package/dist/tools/generation/items.d.ts.map +1 -0
- package/dist/tools/generation/items.js +149 -0
- package/dist/tools/generation/items.js.map +1 -0
- package/dist/tools/generation/locations.d.ts +12 -0
- package/dist/tools/generation/locations.d.ts.map +1 -0
- package/dist/tools/generation/locations.js +131 -0
- package/dist/tools/generation/locations.js.map +1 -0
- package/dist/tools/generation/monsters.d.ts +12 -0
- package/dist/tools/generation/monsters.d.ts.map +1 -0
- package/dist/tools/generation/monsters.js +154 -0
- package/dist/tools/generation/monsters.js.map +1 -0
- package/dist/tools/generation/narrative.d.ts +12 -0
- package/dist/tools/generation/narrative.d.ts.map +1 -0
- package/dist/tools/generation/narrative.js +129 -0
- package/dist/tools/generation/narrative.js.map +1 -0
- package/dist/tools/generation/npcs.d.ts +12 -0
- package/dist/tools/generation/npcs.d.ts.map +1 -0
- package/dist/tools/generation/npcs.js +136 -0
- package/dist/tools/generation/npcs.js.map +1 -0
- package/dist/tools/generation/resume.d.ts +12 -0
- package/dist/tools/generation/resume.d.ts.map +1 -0
- package/dist/tools/generation/resume.js +288 -0
- package/dist/tools/generation/resume.js.map +1 -0
- package/dist/tools/generation/rules-prompt.d.ts +23 -0
- package/dist/tools/generation/rules-prompt.d.ts.map +1 -0
- package/dist/tools/generation/rules-prompt.js +209 -0
- package/dist/tools/generation/rules-prompt.js.map +1 -0
- package/dist/tools/generation/seed.d.ts +12 -0
- package/dist/tools/generation/seed.d.ts.map +1 -0
- package/dist/tools/generation/seed.js +171 -0
- package/dist/tools/generation/seed.js.map +1 -0
- package/dist/tools/generation/situations.d.ts +13 -0
- package/dist/tools/generation/situations.d.ts.map +1 -0
- package/dist/tools/generation/situations.js +247 -0
- package/dist/tools/generation/situations.js.map +1 -0
- package/dist/tools/gm-guidance.d.ts +13 -0
- package/dist/tools/gm-guidance.d.ts.map +1 -0
- package/dist/tools/gm-guidance.js +395 -0
- package/dist/tools/gm-guidance.js.map +1 -0
- package/dist/tools/index.d.ts +33 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +80 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/investigation.d.ts +41 -0
- package/dist/tools/investigation.d.ts.map +1 -0
- package/dist/tools/investigation.js +586 -0
- package/dist/tools/investigation.js.map +1 -0
- package/dist/tools/leads.d.ts +29 -0
- package/dist/tools/leads.d.ts.map +1 -0
- package/dist/tools/leads.js +460 -0
- package/dist/tools/leads.js.map +1 -0
- package/dist/tools/players.d.ts +30 -0
- package/dist/tools/players.d.ts.map +1 -0
- package/dist/tools/players.js +448 -0
- package/dist/tools/players.js.map +1 -0
- package/dist/tools/portable-clues.d.ts +29 -0
- package/dist/tools/portable-clues.d.ts.map +1 -0
- package/dist/tools/portable-clues.js +490 -0
- package/dist/tools/portable-clues.js.map +1 -0
- package/dist/tools/relationships.d.ts +29 -0
- package/dist/tools/relationships.d.ts.map +1 -0
- package/dist/tools/relationships.js +471 -0
- package/dist/tools/relationships.js.map +1 -0
- package/dist/tools/scene-framing.d.ts +21 -0
- package/dist/tools/scene-framing.d.ts.map +1 -0
- package/dist/tools/scene-framing.js +380 -0
- package/dist/tools/scene-framing.js.map +1 -0
- package/dist/tools/sessions.d.ts +30 -0
- package/dist/tools/sessions.d.ts.map +1 -0
- package/dist/tools/sessions.js +253 -0
- package/dist/tools/sessions.js.map +1 -0
- package/dist/tools/time.d.ts +26 -0
- package/dist/tools/time.d.ts.map +1 -0
- package/dist/tools/time.js +438 -0
- package/dist/tools/time.js.map +1 -0
- package/dist/tools/turns.d.ts +38 -0
- package/dist/tools/turns.d.ts.map +1 -0
- package/dist/tools/turns.js +560 -0
- package/dist/tools/turns.js.map +1 -0
- package/dist/tools/worldpack/assemble.d.ts +20 -0
- package/dist/tools/worldpack/assemble.d.ts.map +1 -0
- package/dist/tools/worldpack/assemble.js +237 -0
- package/dist/tools/worldpack/assemble.js.map +1 -0
- package/dist/tools/worldpack/docs-generator.d.ts +18 -0
- package/dist/tools/worldpack/docs-generator.d.ts.map +1 -0
- package/dist/tools/worldpack/docs-generator.js +264 -0
- package/dist/tools/worldpack/docs-generator.js.map +1 -0
- package/dist/tools/worldpack/export.d.ts +12 -0
- package/dist/tools/worldpack/export.d.ts.map +1 -0
- package/dist/tools/worldpack/export.js +209 -0
- package/dist/tools/worldpack/export.js.map +1 -0
- package/dist/tools/worldpack/index.d.ts +15 -0
- package/dist/tools/worldpack/index.d.ts.map +1 -0
- package/dist/tools/worldpack/index.js +30 -0
- package/dist/tools/worldpack/index.js.map +1 -0
- package/dist/tools/worldpack/lookup.d.ts +19 -0
- package/dist/tools/worldpack/lookup.d.ts.map +1 -0
- package/dist/tools/worldpack/lookup.js +320 -0
- package/dist/tools/worldpack/lookup.js.map +1 -0
- package/dist/tools/worldpack/manage.d.ts +20 -0
- package/dist/tools/worldpack/manage.d.ts.map +1 -0
- package/dist/tools/worldpack/manage.js +101 -0
- package/dist/tools/worldpack/manage.js.map +1 -0
- package/dist/tools/worldpack/save-result.d.ts +12 -0
- package/dist/tools/worldpack/save-result.d.ts.map +1 -0
- package/dist/tools/worldpack/save-result.js +222 -0
- package/dist/tools/worldpack/save-result.js.map +1 -0
- package/dist/tools/worldpack/summary.d.ts +13 -0
- package/dist/tools/worldpack/summary.d.ts.map +1 -0
- package/dist/tools/worldpack/summary.js +180 -0
- package/dist/tools/worldpack/summary.js.map +1 -0
- package/dist/tools/worldpack/validate.d.ts +12 -0
- package/dist/tools/worldpack/validate.d.ts.map +1 -0
- package/dist/tools/worldpack/validate.js +388 -0
- package/dist/tools/worldpack/validate.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encounter Builder Tools
|
|
3
|
+
*
|
|
4
|
+
* On-demand encounter generation and management.
|
|
5
|
+
* Supports the Alexandrian principle: "Build toolkits you can deploy flexibly."
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { sessionManager } from "../state/manager.js";
|
|
9
|
+
// Difficulty levels
|
|
10
|
+
const DIFFICULTIES = ["easy", "medium", "hard", "deadly"];
|
|
11
|
+
// Encounter types
|
|
12
|
+
const ENCOUNTER_TYPES = ["combat", "social", "puzzle", "environmental"];
|
|
13
|
+
// Input schemas
|
|
14
|
+
const GenerateEncounterInput = z.object({
|
|
15
|
+
sessionId: z.string(),
|
|
16
|
+
difficulty: z.enum(DIFFICULTIES).describe("How challenging the encounter should be"),
|
|
17
|
+
type: z.enum(ENCOUNTER_TYPES).default("combat").describe("Type of encounter"),
|
|
18
|
+
locationId: z.string().optional().describe("Use location-appropriate content"),
|
|
19
|
+
theme: z.string().optional().describe("Theme like 'ambush', 'negotiation', 'chase'"),
|
|
20
|
+
includeMonsterIds: z.array(z.string()).optional().describe("Force specific monsters"),
|
|
21
|
+
excludeMonsterIds: z.array(z.string()).optional().describe("Exclude these monsters"),
|
|
22
|
+
});
|
|
23
|
+
const ScaleEncounterInput = z.object({
|
|
24
|
+
sessionId: z.string(),
|
|
25
|
+
encounterId: z.string(),
|
|
26
|
+
targetDifficulty: z.enum(DIFFICULTIES),
|
|
27
|
+
method: z.enum(["add_monsters", "remove_monsters", "adjust_hp", "add_minions"]).default("add_monsters"),
|
|
28
|
+
});
|
|
29
|
+
const GetEncounterSuggestionsInput = z.object({
|
|
30
|
+
sessionId: z.string(),
|
|
31
|
+
locationId: z.string().optional(),
|
|
32
|
+
situationId: z.string().optional(),
|
|
33
|
+
mood: z.string().optional(),
|
|
34
|
+
limit: z.number().min(1).max(10).default(5),
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* Get monsters from session
|
|
38
|
+
*/
|
|
39
|
+
function getMonsters(session) {
|
|
40
|
+
if (!session.generation?.generatedContent?.monsters) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
return session.generation.generatedContent.monsters;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get locations from session
|
|
47
|
+
*/
|
|
48
|
+
function getLocations(session) {
|
|
49
|
+
if (!session.generation?.generatedContent?.locations) {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
return session.generation.generatedContent.locations;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get encounters from session
|
|
56
|
+
*/
|
|
57
|
+
function getEncounters(session) {
|
|
58
|
+
if (!session.generation?.generatedContent?.encounters) {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
return session.generation.generatedContent.encounters;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Calculate threat value for a monster
|
|
65
|
+
*/
|
|
66
|
+
function getThreatValue(monster) {
|
|
67
|
+
const tierValues = { minion: 1, standard: 2, elite: 4, boss: 8 };
|
|
68
|
+
return tierValues[monster.threatTier] || 2;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Calculate party strength
|
|
72
|
+
*/
|
|
73
|
+
function getPartyStrength(session) {
|
|
74
|
+
const characters = Object.values(session.characters);
|
|
75
|
+
if (characters.length === 0)
|
|
76
|
+
return 4; // Default party of 4
|
|
77
|
+
return characters.length;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get target threat total for difficulty
|
|
81
|
+
*/
|
|
82
|
+
function getTargetThreat(difficulty, partySize) {
|
|
83
|
+
const base = partySize * 2;
|
|
84
|
+
switch (difficulty) {
|
|
85
|
+
case "easy": return { min: base * 0.5, max: base * 0.75 };
|
|
86
|
+
case "medium": return { min: base * 0.75, max: base * 1.25 };
|
|
87
|
+
case "hard": return { min: base * 1.25, max: base * 2 };
|
|
88
|
+
case "deadly": return { min: base * 2, max: base * 3 };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Select monsters to meet threat target
|
|
93
|
+
*/
|
|
94
|
+
function selectMonsters(available, target, include = [], exclude = []) {
|
|
95
|
+
const selected = [];
|
|
96
|
+
let currentThreat = 0;
|
|
97
|
+
// Filter available monsters
|
|
98
|
+
let pool = available.filter(m => !exclude.includes(m.id));
|
|
99
|
+
// First, add any required monsters
|
|
100
|
+
for (const monsterId of include) {
|
|
101
|
+
const monster = pool.find(m => m.id === monsterId);
|
|
102
|
+
if (monster) {
|
|
103
|
+
selected.push({ monster, count: 1 });
|
|
104
|
+
currentThreat += getThreatValue(monster);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Sort remaining by threat tier for variety
|
|
108
|
+
pool = pool.filter(m => !include.includes(m.id));
|
|
109
|
+
pool.sort((a, b) => getThreatValue(a) - getThreatValue(b));
|
|
110
|
+
// Fill to target
|
|
111
|
+
while (currentThreat < target.min && pool.length > 0) {
|
|
112
|
+
// Pick a monster that fits
|
|
113
|
+
const remaining = target.max - currentThreat;
|
|
114
|
+
// Try to find something that fits well
|
|
115
|
+
let picked;
|
|
116
|
+
for (const monster of pool) {
|
|
117
|
+
if (getThreatValue(monster) <= remaining + 1) {
|
|
118
|
+
picked = monster;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// If nothing fits, take the smallest
|
|
123
|
+
if (!picked) {
|
|
124
|
+
picked = pool[0];
|
|
125
|
+
}
|
|
126
|
+
// Add to selection
|
|
127
|
+
const existing = selected.find(s => s.monster.id === picked.id);
|
|
128
|
+
if (existing) {
|
|
129
|
+
existing.count++;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
selected.push({ monster: picked, count: 1 });
|
|
133
|
+
}
|
|
134
|
+
currentThreat += getThreatValue(picked);
|
|
135
|
+
// Don't add too many of one type
|
|
136
|
+
if (existing && existing.count >= 4) {
|
|
137
|
+
pool = pool.filter(m => m.id !== picked.id);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return selected;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* generate_encounter tool
|
|
144
|
+
*/
|
|
145
|
+
export const generateEncounterTool = {
|
|
146
|
+
name: "generate_encounter",
|
|
147
|
+
description: "Create an encounter matching the specified parameters. Uses available monsters from the world pack.",
|
|
148
|
+
inputSchema: {
|
|
149
|
+
type: "object",
|
|
150
|
+
properties: {
|
|
151
|
+
sessionId: { type: "string", description: "Session ID" },
|
|
152
|
+
difficulty: {
|
|
153
|
+
type: "string",
|
|
154
|
+
enum: DIFFICULTIES,
|
|
155
|
+
description: "How challenging: easy, medium, hard, deadly",
|
|
156
|
+
},
|
|
157
|
+
type: {
|
|
158
|
+
type: "string",
|
|
159
|
+
enum: ENCOUNTER_TYPES,
|
|
160
|
+
description: "Encounter type",
|
|
161
|
+
},
|
|
162
|
+
locationId: { type: "string", description: "Location ID for context" },
|
|
163
|
+
theme: { type: "string", description: "Theme like 'ambush', 'negotiation'" },
|
|
164
|
+
includeMonsterIds: {
|
|
165
|
+
type: "array",
|
|
166
|
+
items: { type: "string" },
|
|
167
|
+
description: "Force specific monsters",
|
|
168
|
+
},
|
|
169
|
+
excludeMonsterIds: {
|
|
170
|
+
type: "array",
|
|
171
|
+
items: { type: "string" },
|
|
172
|
+
description: "Exclude these monsters",
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
required: ["sessionId", "difficulty"],
|
|
176
|
+
},
|
|
177
|
+
handler: async (args) => {
|
|
178
|
+
const input = GenerateEncounterInput.parse(args);
|
|
179
|
+
const session = await sessionManager.get(input.sessionId);
|
|
180
|
+
if (!session) {
|
|
181
|
+
throw new Error(`Session not found: ${input.sessionId}`);
|
|
182
|
+
}
|
|
183
|
+
const monsters = getMonsters(session);
|
|
184
|
+
const locations = getLocations(session);
|
|
185
|
+
if (monsters.length === 0 && input.type === "combat") {
|
|
186
|
+
return {
|
|
187
|
+
error: "No monsters available. Generate monsters first with generate_monsters.",
|
|
188
|
+
suggestion: "Create a world pack with monsters before generating combat encounters.",
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
// Get location context if provided
|
|
192
|
+
let location;
|
|
193
|
+
if (input.locationId) {
|
|
194
|
+
location = locations.find(l => l.id === input.locationId);
|
|
195
|
+
}
|
|
196
|
+
const partySize = getPartyStrength(session);
|
|
197
|
+
const target = getTargetThreat(input.difficulty, partySize);
|
|
198
|
+
// Generate based on type
|
|
199
|
+
if (input.type === "combat") {
|
|
200
|
+
// Filter monsters by theme if provided
|
|
201
|
+
let availableMonsters = monsters;
|
|
202
|
+
if (input.theme) {
|
|
203
|
+
const themeLower = input.theme.toLowerCase();
|
|
204
|
+
const themeMonsters = monsters.filter(m => m.tags?.some(t => t.toLowerCase().includes(themeLower)) ||
|
|
205
|
+
m.name.toLowerCase().includes(themeLower) ||
|
|
206
|
+
m.description.toLowerCase().includes(themeLower));
|
|
207
|
+
if (themeMonsters.length > 0) {
|
|
208
|
+
availableMonsters = themeMonsters;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Select monsters
|
|
212
|
+
const selected = selectMonsters(availableMonsters, target, input.includeMonsterIds || [], input.excludeMonsterIds || []);
|
|
213
|
+
if (selected.length === 0) {
|
|
214
|
+
return {
|
|
215
|
+
error: "Could not select appropriate monsters for this encounter.",
|
|
216
|
+
suggestion: "Try different parameters or add more monsters to the world.",
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// Calculate actual threat
|
|
220
|
+
const totalThreat = selected.reduce((sum, s) => sum + getThreatValue(s.monster) * s.count, 0);
|
|
221
|
+
// Generate encounter details
|
|
222
|
+
const encounterName = input.theme
|
|
223
|
+
? `${input.theme.charAt(0).toUpperCase() + input.theme.slice(1)} Encounter`
|
|
224
|
+
: `${input.difficulty.charAt(0).toUpperCase() + input.difficulty.slice(1)} Combat`;
|
|
225
|
+
// Build setup based on theme
|
|
226
|
+
let setup = "The enemies become aware of the party's presence.";
|
|
227
|
+
let tactics = "Fight until reduced to half HP, then consider retreat.";
|
|
228
|
+
if (input.theme) {
|
|
229
|
+
const themeLower = input.theme.toLowerCase();
|
|
230
|
+
if (themeLower.includes("ambush")) {
|
|
231
|
+
setup = "The enemies lie in wait, hidden. They strike when the party is vulnerable.";
|
|
232
|
+
tactics = "Focus fire on isolated targets. Use terrain for cover.";
|
|
233
|
+
}
|
|
234
|
+
else if (themeLower.includes("chase")) {
|
|
235
|
+
setup = "The enemies are fleeing (or pursuing). This is a running battle.";
|
|
236
|
+
tactics = "Split up to confuse pursuers. Use obstacles to slow the other side.";
|
|
237
|
+
}
|
|
238
|
+
else if (themeLower.includes("defense")) {
|
|
239
|
+
setup = "The enemies are defending a position. They have prepared.";
|
|
240
|
+
tactics = "Hold ground. Use chokepoints and ranged attacks.";
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Use monster tactics if available
|
|
244
|
+
const primaryMonster = selected.reduce((best, curr) => getThreatValue(curr.monster) > getThreatValue(best.monster) ? curr : best).monster;
|
|
245
|
+
if (primaryMonster.tactics) {
|
|
246
|
+
tactics = primaryMonster.tactics;
|
|
247
|
+
}
|
|
248
|
+
const encounter = {
|
|
249
|
+
id: `encounter:generated-${Date.now()}`,
|
|
250
|
+
name: encounterName,
|
|
251
|
+
type: "combat",
|
|
252
|
+
difficulty: input.difficulty,
|
|
253
|
+
threatTotal: totalThreat,
|
|
254
|
+
partySize,
|
|
255
|
+
monsters: selected.map(s => ({
|
|
256
|
+
id: s.monster.id,
|
|
257
|
+
name: s.monster.name,
|
|
258
|
+
count: s.count,
|
|
259
|
+
threatTier: s.monster.threatTier,
|
|
260
|
+
hp: s.monster.hp,
|
|
261
|
+
})),
|
|
262
|
+
setup,
|
|
263
|
+
tactics,
|
|
264
|
+
environment: location?.atmosphere || "Standard terrain with some cover available.",
|
|
265
|
+
outcomes: {
|
|
266
|
+
victory: {
|
|
267
|
+
description: "The enemies are defeated.",
|
|
268
|
+
loot: "Search the fallen for valuables.",
|
|
269
|
+
},
|
|
270
|
+
defeat: {
|
|
271
|
+
description: "The party is overwhelmed.",
|
|
272
|
+
consequences: ["Captured", "Robbed and left for dead", "Forced to flee"],
|
|
273
|
+
},
|
|
274
|
+
escape: {
|
|
275
|
+
how: "Disengage and flee the area.",
|
|
276
|
+
consequences: ["Enemies may pursue", "Lost opportunity"],
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
locationId: input.locationId,
|
|
280
|
+
theme: input.theme,
|
|
281
|
+
};
|
|
282
|
+
return {
|
|
283
|
+
message: `Generated ${input.difficulty} combat encounter`,
|
|
284
|
+
encounter,
|
|
285
|
+
notes: {
|
|
286
|
+
balanceCheck: totalThreat >= target.min && totalThreat <= target.max
|
|
287
|
+
? "Within target range"
|
|
288
|
+
: totalThreat > target.max
|
|
289
|
+
? "Slightly overtuned - consider removing a monster"
|
|
290
|
+
: "Slightly undertuned - consider adding minions",
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
// Non-combat encounter
|
|
296
|
+
const encounter = {
|
|
297
|
+
id: `encounter:generated-${Date.now()}`,
|
|
298
|
+
name: `${input.type.charAt(0).toUpperCase() + input.type.slice(1)} Challenge`,
|
|
299
|
+
type: input.type,
|
|
300
|
+
difficulty: input.difficulty,
|
|
301
|
+
description: input.type === "social"
|
|
302
|
+
? "A social situation requiring negotiation, persuasion, or deception."
|
|
303
|
+
: input.type === "puzzle"
|
|
304
|
+
? "A puzzle or riddle that must be solved to proceed."
|
|
305
|
+
: "An environmental hazard or obstacle to overcome.",
|
|
306
|
+
setup: `Present the ${input.type} challenge with clear stakes.`,
|
|
307
|
+
resolution: {
|
|
308
|
+
success: "The challenge is overcome. Progress is made.",
|
|
309
|
+
failure: "The challenge defeats them. New complications arise.",
|
|
310
|
+
partial: "Partial success with complications or costs.",
|
|
311
|
+
},
|
|
312
|
+
difficultyGuidance: {
|
|
313
|
+
easy: "DC 8 - Most attempts should succeed",
|
|
314
|
+
medium: "DC 12 - Fair challenge, competent characters succeed often",
|
|
315
|
+
hard: "DC 16 - Difficult, requires skill or luck",
|
|
316
|
+
deadly: "DC 20 - Near impossible without special preparation",
|
|
317
|
+
}[input.difficulty],
|
|
318
|
+
locationId: input.locationId,
|
|
319
|
+
theme: input.theme,
|
|
320
|
+
};
|
|
321
|
+
return {
|
|
322
|
+
message: `Generated ${input.difficulty} ${input.type} encounter`,
|
|
323
|
+
encounter,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
/**
|
|
329
|
+
* scale_encounter tool
|
|
330
|
+
*/
|
|
331
|
+
export const scaleEncounterTool = {
|
|
332
|
+
name: "scale_encounter",
|
|
333
|
+
description: "Adjust the difficulty of an existing encounter.",
|
|
334
|
+
inputSchema: {
|
|
335
|
+
type: "object",
|
|
336
|
+
properties: {
|
|
337
|
+
sessionId: { type: "string", description: "Session ID" },
|
|
338
|
+
encounterId: { type: "string", description: "Encounter ID to scale" },
|
|
339
|
+
targetDifficulty: {
|
|
340
|
+
type: "string",
|
|
341
|
+
enum: DIFFICULTIES,
|
|
342
|
+
description: "New target difficulty",
|
|
343
|
+
},
|
|
344
|
+
method: {
|
|
345
|
+
type: "string",
|
|
346
|
+
enum: ["add_monsters", "remove_monsters", "adjust_hp", "add_minions"],
|
|
347
|
+
description: "How to adjust difficulty",
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
required: ["sessionId", "encounterId", "targetDifficulty"],
|
|
351
|
+
},
|
|
352
|
+
handler: async (args) => {
|
|
353
|
+
const input = ScaleEncounterInput.parse(args);
|
|
354
|
+
const session = await sessionManager.get(input.sessionId);
|
|
355
|
+
if (!session) {
|
|
356
|
+
throw new Error(`Session not found: ${input.sessionId}`);
|
|
357
|
+
}
|
|
358
|
+
const encounters = getEncounters(session);
|
|
359
|
+
const monsters = getMonsters(session);
|
|
360
|
+
const encounter = encounters.find(e => e.id === input.encounterId);
|
|
361
|
+
if (!encounter) {
|
|
362
|
+
return {
|
|
363
|
+
error: `Encounter not found: ${input.encounterId}`,
|
|
364
|
+
suggestion: "Use get_encounter_suggestions to find available encounters.",
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
const partySize = getPartyStrength(session);
|
|
368
|
+
const target = getTargetThreat(input.targetDifficulty, partySize);
|
|
369
|
+
// Calculate current threat
|
|
370
|
+
let currentThreat = 0;
|
|
371
|
+
const currentMonsters = [];
|
|
372
|
+
if (encounter.monsters) {
|
|
373
|
+
for (const m of encounter.monsters) {
|
|
374
|
+
const monster = monsters.find(mon => mon.id === m.monsterId);
|
|
375
|
+
if (monster) {
|
|
376
|
+
const threat = getThreatValue(monster) * m.count;
|
|
377
|
+
currentThreat += threat;
|
|
378
|
+
currentMonsters.push({
|
|
379
|
+
id: monster.id,
|
|
380
|
+
name: monster.name,
|
|
381
|
+
count: m.count,
|
|
382
|
+
threat,
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// Determine adjustment
|
|
388
|
+
const adjustments = [];
|
|
389
|
+
const targetMid = (target.min + target.max) / 2;
|
|
390
|
+
if (input.method === "add_monsters" && currentThreat < targetMid) {
|
|
391
|
+
const needed = Math.ceil((targetMid - currentThreat) / 2);
|
|
392
|
+
adjustments.push(`Add ${needed} standard monster(s) or equivalent`);
|
|
393
|
+
}
|
|
394
|
+
else if (input.method === "remove_monsters" && currentThreat > targetMid) {
|
|
395
|
+
const toRemove = Math.ceil((currentThreat - targetMid) / 2);
|
|
396
|
+
adjustments.push(`Remove ${toRemove} threat worth of monsters`);
|
|
397
|
+
}
|
|
398
|
+
else if (input.method === "adjust_hp") {
|
|
399
|
+
const ratio = targetMid / currentThreat;
|
|
400
|
+
const percentage = Math.round((ratio - 1) * 100);
|
|
401
|
+
if (percentage > 0) {
|
|
402
|
+
adjustments.push(`Increase monster HP by ${percentage}%`);
|
|
403
|
+
}
|
|
404
|
+
else if (percentage < 0) {
|
|
405
|
+
adjustments.push(`Decrease monster HP by ${Math.abs(percentage)}%`);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
else if (input.method === "add_minions") {
|
|
409
|
+
const needed = Math.ceil((targetMid - currentThreat));
|
|
410
|
+
adjustments.push(`Add ${needed} minion-tier creature(s)`);
|
|
411
|
+
}
|
|
412
|
+
if (adjustments.length === 0) {
|
|
413
|
+
adjustments.push("Encounter is already at target difficulty");
|
|
414
|
+
}
|
|
415
|
+
return {
|
|
416
|
+
encounter: {
|
|
417
|
+
id: encounter.id,
|
|
418
|
+
name: encounter.name,
|
|
419
|
+
currentDifficulty: encounter.difficulty,
|
|
420
|
+
targetDifficulty: input.targetDifficulty,
|
|
421
|
+
},
|
|
422
|
+
analysis: {
|
|
423
|
+
currentThreat,
|
|
424
|
+
targetRange: target,
|
|
425
|
+
currentMonsters,
|
|
426
|
+
},
|
|
427
|
+
adjustments,
|
|
428
|
+
method: input.method,
|
|
429
|
+
};
|
|
430
|
+
},
|
|
431
|
+
};
|
|
432
|
+
/**
|
|
433
|
+
* get_encounter_suggestions tool
|
|
434
|
+
*/
|
|
435
|
+
export const getEncounterSuggestionsTool = {
|
|
436
|
+
name: "get_encounter_suggestions",
|
|
437
|
+
description: "List encounters that fit the current context.",
|
|
438
|
+
inputSchema: {
|
|
439
|
+
type: "object",
|
|
440
|
+
properties: {
|
|
441
|
+
sessionId: { type: "string", description: "Session ID" },
|
|
442
|
+
locationId: { type: "string", description: "Filter by location" },
|
|
443
|
+
situationId: { type: "string", description: "Filter by situation" },
|
|
444
|
+
mood: { type: "string", description: "Desired mood" },
|
|
445
|
+
limit: { type: "number", minimum: 1, maximum: 10, description: "Max results" },
|
|
446
|
+
},
|
|
447
|
+
required: ["sessionId"],
|
|
448
|
+
},
|
|
449
|
+
handler: async (args) => {
|
|
450
|
+
const input = GetEncounterSuggestionsInput.parse(args);
|
|
451
|
+
const session = await sessionManager.get(input.sessionId);
|
|
452
|
+
if (!session) {
|
|
453
|
+
throw new Error(`Session not found: ${input.sessionId}`);
|
|
454
|
+
}
|
|
455
|
+
const encounters = getEncounters(session);
|
|
456
|
+
const locations = getLocations(session);
|
|
457
|
+
const monsters = getMonsters(session);
|
|
458
|
+
if (encounters.length === 0) {
|
|
459
|
+
return {
|
|
460
|
+
message: "No pre-defined encounters available.",
|
|
461
|
+
suggestions: [],
|
|
462
|
+
tip: "Use generate_encounter to create encounters on-demand.",
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
// Filter encounters
|
|
466
|
+
let filtered = encounters;
|
|
467
|
+
// Filter by location
|
|
468
|
+
if (input.locationId) {
|
|
469
|
+
const location = locations.find(l => l.id === input.locationId);
|
|
470
|
+
if (location && location.encounters) {
|
|
471
|
+
filtered = filtered.filter(e => location.encounters.includes(e.id));
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// Filter by mood/type match (simple text matching)
|
|
475
|
+
if (input.mood) {
|
|
476
|
+
const moodLower = input.mood.toLowerCase();
|
|
477
|
+
const moodMatches = filtered.filter(e => e.description?.toLowerCase().includes(moodLower) ||
|
|
478
|
+
e.name?.toLowerCase().includes(moodLower));
|
|
479
|
+
if (moodMatches.length > 0) {
|
|
480
|
+
filtered = moodMatches;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
// Limit results
|
|
484
|
+
const limited = filtered.slice(0, input.limit);
|
|
485
|
+
// Enrich with monster names
|
|
486
|
+
const suggestions = limited.map(e => {
|
|
487
|
+
const monsterNames = [];
|
|
488
|
+
if (e.monsters) {
|
|
489
|
+
for (const m of e.monsters) {
|
|
490
|
+
const monster = monsters.find(mon => mon.id === m.monsterId);
|
|
491
|
+
if (monster) {
|
|
492
|
+
monsterNames.push(`${m.count}x ${monster.name}`);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return {
|
|
497
|
+
id: e.id,
|
|
498
|
+
name: e.name,
|
|
499
|
+
type: e.type,
|
|
500
|
+
difficulty: e.difficulty,
|
|
501
|
+
description: e.description,
|
|
502
|
+
monsters: monsterNames.length > 0 ? monsterNames : undefined,
|
|
503
|
+
};
|
|
504
|
+
});
|
|
505
|
+
return {
|
|
506
|
+
message: `Found ${suggestions.length} encounter(s)`,
|
|
507
|
+
suggestions,
|
|
508
|
+
filters: {
|
|
509
|
+
locationId: input.locationId,
|
|
510
|
+
situationId: input.situationId,
|
|
511
|
+
mood: input.mood,
|
|
512
|
+
},
|
|
513
|
+
};
|
|
514
|
+
},
|
|
515
|
+
};
|
|
516
|
+
export const encounterTools = [
|
|
517
|
+
generateEncounterTool,
|
|
518
|
+
scaleEncounterTool,
|
|
519
|
+
getEncounterSuggestionsTool,
|
|
520
|
+
];
|
|
521
|
+
//# sourceMappingURL=encounters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encounters.js","sourceRoot":"","sources":["../../src/tools/encounters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engagement Hook Generator
|
|
3
|
+
*
|
|
4
|
+
* Tools for "treasure, personal, mystery" engagement encodings.
|
|
5
|
+
* Based on Alexandrian: "Make lore stick via treasure, mystery, personal ties."
|
|
6
|
+
*/
|
|
7
|
+
import type { MCPToolEntry } from "@mythxengine/types";
|
|
8
|
+
/**
|
|
9
|
+
* personalize_content tool
|
|
10
|
+
*/
|
|
11
|
+
export declare const personalizeContentTool: MCPToolEntry;
|
|
12
|
+
/**
|
|
13
|
+
* treasurify_information tool
|
|
14
|
+
*/
|
|
15
|
+
export declare const treasurifyInformationTool: MCPToolEntry;
|
|
16
|
+
/**
|
|
17
|
+
* mystify_content tool
|
|
18
|
+
*/
|
|
19
|
+
export declare const mystifyContentTool: MCPToolEntry;
|
|
20
|
+
/**
|
|
21
|
+
* generate_engagement_hooks tool
|
|
22
|
+
*/
|
|
23
|
+
export declare const generateEngagementHooksTool: MCPToolEntry;
|
|
24
|
+
export declare const engagementTools: MCPToolEntry[];
|
|
25
|
+
//# sourceMappingURL=engagement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engagement.d.ts","sourceRoot":"","sources":["../../src/tools/engagement.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA+FvD;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,YAkHpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,YA4GvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,YAqHhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,YAgLzC,CAAC;AAEF,eAAO,MAAM,eAAe,gBAK3B,CAAC"}
|