@thijshakkenberg/valkyrie-mom-mcp 1.0.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/.claude-plugin/plugin.json +17 -0
- package/.mcp.json +9 -0
- package/CLAUDE.md +73 -0
- package/LICENSE +21 -0
- package/README.md +164 -0
- package/agents/scenario-designer.md +114 -0
- package/dist/catalogs/catalog-store.d.ts +20 -0
- package/dist/catalogs/catalog-store.d.ts.map +1 -0
- package/dist/catalogs/catalog-store.js +78 -0
- package/dist/catalogs/catalog-store.js.map +1 -0
- package/dist/catalogs/catalog-types.d.ts +10 -0
- package/dist/catalogs/catalog-types.d.ts.map +1 -0
- package/dist/catalogs/catalog-types.js +2 -0
- package/dist/catalogs/catalog-types.js.map +1 -0
- package/dist/catalogs/data/all-catalogs.d.ts +9 -0
- package/dist/catalogs/data/all-catalogs.d.ts.map +1 -0
- package/dist/catalogs/data/all-catalogs.js +8383 -0
- package/dist/catalogs/data/all-catalogs.js.map +1 -0
- package/dist/catalogs/data/tile-geometry.d.ts +12 -0
- package/dist/catalogs/data/tile-geometry.d.ts.map +1 -0
- package/dist/catalogs/data/tile-geometry.js +183 -0
- package/dist/catalogs/data/tile-geometry.js.map +1 -0
- package/dist/catalogs/extract-catalogs.d.ts +12 -0
- package/dist/catalogs/extract-catalogs.d.ts.map +1 -0
- package/dist/catalogs/extract-catalogs.js +128 -0
- package/dist/catalogs/extract-catalogs.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/io/ini-parser.d.ts +6 -0
- package/dist/io/ini-parser.d.ts.map +1 -0
- package/dist/io/ini-parser.js +42 -0
- package/dist/io/ini-parser.js.map +1 -0
- package/dist/io/ini-writer.d.ts +2 -0
- package/dist/io/ini-writer.d.ts.map +1 -0
- package/dist/io/ini-writer.js +36 -0
- package/dist/io/ini-writer.js.map +1 -0
- package/dist/io/localization-io.d.ts +21 -0
- package/dist/io/localization-io.d.ts.map +1 -0
- package/dist/io/localization-io.js +51 -0
- package/dist/io/localization-io.js.map +1 -0
- package/dist/io/package-builder.d.ts +2 -0
- package/dist/io/package-builder.d.ts.map +1 -0
- package/dist/io/package-builder.js +22 -0
- package/dist/io/package-builder.js.map +1 -0
- package/dist/model/component-types.d.ts +61 -0
- package/dist/model/component-types.d.ts.map +1 -0
- package/dist/model/component-types.js +71 -0
- package/dist/model/component-types.js.map +1 -0
- package/dist/model/localization-store.d.ts +15 -0
- package/dist/model/localization-store.d.ts.map +1 -0
- package/dist/model/localization-store.js +42 -0
- package/dist/model/localization-store.js.map +1 -0
- package/dist/model/scenario-model.d.ts +27 -0
- package/dist/model/scenario-model.d.ts.map +1 -0
- package/dist/model/scenario-model.js +151 -0
- package/dist/model/scenario-model.js.map +1 -0
- package/dist/resources/format-docs.d.ts +6 -0
- package/dist/resources/format-docs.d.ts.map +1 -0
- package/dist/resources/format-docs.js +261 -0
- package/dist/resources/format-docs.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +206 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/lifecycle.d.ts +37 -0
- package/dist/tools/lifecycle.d.ts.map +1 -0
- package/dist/tools/lifecycle.js +146 -0
- package/dist/tools/lifecycle.js.map +1 -0
- package/dist/tools/map.d.ts +14 -0
- package/dist/tools/map.d.ts.map +1 -0
- package/dist/tools/map.js +98 -0
- package/dist/tools/map.js.map +1 -0
- package/dist/tools/reference.d.ts +4 -0
- package/dist/tools/reference.d.ts.map +1 -0
- package/dist/tools/reference.js +6 -0
- package/dist/tools/reference.js.map +1 -0
- package/dist/tools/shared.d.ts +10 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +22 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/upsert.d.ts +15 -0
- package/dist/tools/upsert.d.ts.map +1 -0
- package/dist/tools/upsert.js +91 -0
- package/dist/tools/upsert.js.map +1 -0
- package/dist/validation/rules/catalog-references.d.ts +14 -0
- package/dist/validation/rules/catalog-references.d.ts.map +1 -0
- package/dist/validation/rules/catalog-references.js +90 -0
- package/dist/validation/rules/catalog-references.js.map +1 -0
- package/dist/validation/rules/cross-references.d.ts +9 -0
- package/dist/validation/rules/cross-references.d.ts.map +1 -0
- package/dist/validation/rules/cross-references.js +37 -0
- package/dist/validation/rules/cross-references.js.map +1 -0
- package/dist/validation/rules/event-chain-utils.d.ts +8 -0
- package/dist/validation/rules/event-chain-utils.d.ts.map +1 -0
- package/dist/validation/rules/event-chain-utils.js +30 -0
- package/dist/validation/rules/event-chain-utils.js.map +1 -0
- package/dist/validation/rules/event-flow.d.ts +14 -0
- package/dist/validation/rules/event-flow.d.ts.map +1 -0
- package/dist/validation/rules/event-flow.js +83 -0
- package/dist/validation/rules/event-flow.js.map +1 -0
- package/dist/validation/rules/event-graph.d.ts +10 -0
- package/dist/validation/rules/event-graph.d.ts.map +1 -0
- package/dist/validation/rules/event-graph.js +51 -0
- package/dist/validation/rules/event-graph.js.map +1 -0
- package/dist/validation/rules/explore-token-pattern.d.ts +10 -0
- package/dist/validation/rules/explore-token-pattern.d.ts.map +1 -0
- package/dist/validation/rules/explore-token-pattern.js +70 -0
- package/dist/validation/rules/explore-token-pattern.js.map +1 -0
- package/dist/validation/rules/format-rules.d.ts +10 -0
- package/dist/validation/rules/format-rules.d.ts.map +1 -0
- package/dist/validation/rules/format-rules.js +61 -0
- package/dist/validation/rules/format-rules.js.map +1 -0
- package/dist/validation/rules/investigator-token-pattern.d.ts +9 -0
- package/dist/validation/rules/investigator-token-pattern.d.ts.map +1 -0
- package/dist/validation/rules/investigator-token-pattern.js +39 -0
- package/dist/validation/rules/investigator-token-pattern.js.map +1 -0
- package/dist/validation/rules/localization-completeness.d.ts +11 -0
- package/dist/validation/rules/localization-completeness.d.ts.map +1 -0
- package/dist/validation/rules/localization-completeness.js +83 -0
- package/dist/validation/rules/localization-completeness.js.map +1 -0
- package/dist/validation/rules/mythos-structure.d.ts +10 -0
- package/dist/validation/rules/mythos-structure.d.ts.map +1 -0
- package/dist/validation/rules/mythos-structure.js +57 -0
- package/dist/validation/rules/mythos-structure.js.map +1 -0
- package/dist/validation/rules/required-fields.d.ts +9 -0
- package/dist/validation/rules/required-fields.d.ts.map +1 -0
- package/dist/validation/rules/required-fields.js +38 -0
- package/dist/validation/rules/required-fields.js.map +1 -0
- package/dist/validation/rules/tile-connectivity.d.ts +9 -0
- package/dist/validation/rules/tile-connectivity.d.ts.map +1 -0
- package/dist/validation/rules/tile-connectivity.js +125 -0
- package/dist/validation/rules/tile-connectivity.js.map +1 -0
- package/dist/validation/validator.d.ts +7 -0
- package/dist/validation/validator.d.ts.map +1 -0
- package/dist/validation/validator.js +35 -0
- package/dist/validation/validator.js.map +1 -0
- package/package.json +59 -0
- package/skills/custom-monsters/SKILL.md +228 -0
- package/skills/event-patterns/SKILL.md +268 -0
- package/skills/items-and-distribution/SKILL.md +193 -0
- package/skills/scenario/SKILL.md +105 -0
- package/skills/tile-placement/SKILL.md +163 -0
- package/skills/ui-and-puzzles/SKILL.md +347 -0
- package/skills/variables-and-mythos/SKILL.md +285 -0
- package/src/catalogs/catalog-store.ts +94 -0
- package/src/catalogs/catalog-types.ts +10 -0
- package/src/catalogs/data/all-catalogs.ts +8391 -0
- package/src/catalogs/data/tile-geometry.ts +188 -0
- package/src/catalogs/extract-catalogs.ts +172 -0
- package/src/index.ts +14 -0
- package/src/io/ini-parser.ts +52 -0
- package/src/io/ini-writer.ts +51 -0
- package/src/io/localization-io.ts +62 -0
- package/src/io/package-builder.ts +26 -0
- package/src/model/component-types.ts +124 -0
- package/src/model/localization-store.ts +52 -0
- package/src/model/scenario-model.ts +177 -0
- package/src/resources/format-docs.ts +264 -0
- package/src/server.ts +336 -0
- package/src/tools/lifecycle.ts +183 -0
- package/src/tools/map.ts +125 -0
- package/src/tools/reference.ts +7 -0
- package/src/tools/shared.ts +34 -0
- package/src/tools/upsert.ts +133 -0
- package/src/validation/rules/catalog-references.ts +95 -0
- package/src/validation/rules/cross-references.ts +42 -0
- package/src/validation/rules/event-chain-utils.ts +31 -0
- package/src/validation/rules/event-flow.ts +93 -0
- package/src/validation/rules/event-graph.ts +62 -0
- package/src/validation/rules/explore-token-pattern.ts +77 -0
- package/src/validation/rules/format-rules.ts +69 -0
- package/src/validation/rules/investigator-token-pattern.ts +47 -0
- package/src/validation/rules/localization-completeness.ts +93 -0
- package/src/validation/rules/mythos-structure.ts +64 -0
- package/src/validation/rules/required-fields.ts +43 -0
- package/src/validation/rules/tile-connectivity.ts +148 -0
- package/src/validation/validator.ts +38 -0
- package/tsconfig.json +20 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { validateScenario } from './validation/validator.js';
|
|
5
|
+
import { createScenario, loadScenario, getScenarioState, saveScenario, buildScenario, listScenarios, getEditorDir, } from './tools/lifecycle.js';
|
|
6
|
+
import { upsertEvent, upsertTile, upsertToken, upsertSpawn, upsertItem, upsertPuzzle, upsertUI, } from './tools/upsert.js';
|
|
7
|
+
import { deleteComponent, setLocalization } from './tools/shared.js';
|
|
8
|
+
import { getMapAscii, suggestTileLayout, placeTileRelative } from './tools/map.js';
|
|
9
|
+
import { searchGameContent } from './tools/reference.js';
|
|
10
|
+
import { EVENT_FORMAT_DOC, LOCALIZATION_FORMAT_DOC, COMPONENT_FORMAT_DOC, PATTERN_REFERENCE_DOC, } from './resources/format-docs.js';
|
|
11
|
+
/** Singleton scenario model for the current session */
|
|
12
|
+
let currentModel = null;
|
|
13
|
+
function getModel() {
|
|
14
|
+
if (!currentModel)
|
|
15
|
+
throw new Error('No scenario loaded. Use create_scenario or load_scenario first.');
|
|
16
|
+
return currentModel;
|
|
17
|
+
}
|
|
18
|
+
function formatUpsertResult(r) {
|
|
19
|
+
if (!r.success) {
|
|
20
|
+
return `Failed: ${r.errors.map(e => e.message).join('; ')}`;
|
|
21
|
+
}
|
|
22
|
+
const parts = ['Success'];
|
|
23
|
+
if (r.warnings.length > 0) {
|
|
24
|
+
parts.push(`Warnings: ${r.warnings.map(w => w.message).join('; ')}`);
|
|
25
|
+
}
|
|
26
|
+
return parts.join('. ');
|
|
27
|
+
}
|
|
28
|
+
/** Upsert tool definitions driven by data */
|
|
29
|
+
const UPSERT_TOOLS = [
|
|
30
|
+
{ name: 'upsert_event', desc: 'Create or update an event component. IMPORTANT: buttons must be >= highest populated eventN index (1-6) or Valkyrie will silently drop the excess event references on re-save', prefix: 'Event', fn: upsertEvent },
|
|
31
|
+
{ name: 'upsert_tile', desc: 'Create or update a tile component', prefix: 'Tile', fn: upsertTile },
|
|
32
|
+
{ name: 'upsert_token', desc: 'Create or update a token component', prefix: 'Token', fn: upsertToken },
|
|
33
|
+
{ name: 'upsert_spawn', desc: 'Create or update a spawn component', prefix: 'Spawn', fn: upsertSpawn },
|
|
34
|
+
{ name: 'upsert_item', desc: 'Create or update a quest item component', prefix: 'QItem', fn: upsertItem },
|
|
35
|
+
{ name: 'upsert_puzzle', desc: 'Create or update a puzzle component', prefix: 'Puzzle', fn: upsertPuzzle },
|
|
36
|
+
{ name: 'upsert_ui', desc: 'Create or update a UI component', prefix: 'UI', fn: upsertUI },
|
|
37
|
+
];
|
|
38
|
+
export function createServer() {
|
|
39
|
+
const server = new McpServer({
|
|
40
|
+
name: 'valkyrie-mom',
|
|
41
|
+
version: '0.1.0',
|
|
42
|
+
});
|
|
43
|
+
// ── Lifecycle Tools ──
|
|
44
|
+
server.tool('list_scenarios', 'List all MoM scenarios in the Valkyrie editor directory', { dir: z.string().optional().describe('Custom editor directory (defaults to platform Valkyrie editor path)') }, async ({ dir }) => {
|
|
45
|
+
const editorDir = dir ?? getEditorDir();
|
|
46
|
+
const scenarios = listScenarios(editorDir);
|
|
47
|
+
if (scenarios.length === 0) {
|
|
48
|
+
return { content: [{ type: 'text', text: `No scenarios found in ${editorDir}` }] };
|
|
49
|
+
}
|
|
50
|
+
const lines = scenarios.map(s => `- ${s.questName} (${s.name}) → ${s.dir}`);
|
|
51
|
+
return { content: [{ type: 'text', text: `Found ${scenarios.length} scenario(s) in ${editorDir}:\n${lines.join('\n')}` }] };
|
|
52
|
+
});
|
|
53
|
+
server.tool('create_scenario', 'Create a new MoM scenario with default scaffold. Defaults to the Valkyrie editor directory.', { name: z.string().describe('Scenario name'), dir: z.string().optional().describe('Custom output directory (defaults to Valkyrie editor dir)') }, async ({ name, dir }) => {
|
|
54
|
+
const targetDir = dir ?? path.join(getEditorDir(), name);
|
|
55
|
+
const result = await createScenario(name, { dir: targetDir });
|
|
56
|
+
currentModel = result.model;
|
|
57
|
+
return { content: [{ type: 'text', text: `Scenario "${name}" created at ${result.dir}` }] };
|
|
58
|
+
});
|
|
59
|
+
server.tool('load_scenario', 'Load an existing scenario from a directory', { dir: z.string().describe('Path to scenario directory') }, async ({ dir }) => {
|
|
60
|
+
currentModel = await loadScenario(dir);
|
|
61
|
+
const state = getScenarioState(currentModel);
|
|
62
|
+
return {
|
|
63
|
+
content: [{
|
|
64
|
+
type: 'text',
|
|
65
|
+
text: `Loaded scenario: ${state.totalComponents} components, ${state.localizationKeys} localization keys\n${JSON.stringify(state.componentCounts, null, 2)}`,
|
|
66
|
+
}],
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
server.tool('get_scenario_state', 'Get current scenario state summary', {}, async () => {
|
|
70
|
+
const state = getScenarioState(getModel());
|
|
71
|
+
return { content: [{ type: 'text', text: JSON.stringify(state, null, 2) }] };
|
|
72
|
+
});
|
|
73
|
+
server.tool('validate_scenario', 'Run all validation rules on the current scenario', {}, async () => {
|
|
74
|
+
const results = validateScenario(getModel());
|
|
75
|
+
const errors = results.filter(r => r.severity === 'error');
|
|
76
|
+
const warnings = results.filter(r => r.severity === 'warning');
|
|
77
|
+
return {
|
|
78
|
+
content: [{
|
|
79
|
+
type: 'text',
|
|
80
|
+
text: `Validation: ${errors.length} errors, ${warnings.length} warnings\n${results.map(r => `[${r.severity}] ${r.rule}: ${r.message}`).join('\n')}`,
|
|
81
|
+
}],
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
server.tool('build_scenario', 'Save and build .valkyrie package', { outputPath: z.string().describe('Output .valkyrie file path') }, async ({ outputPath }) => {
|
|
85
|
+
const model = getModel();
|
|
86
|
+
await saveScenario(model);
|
|
87
|
+
await buildScenario(model, outputPath);
|
|
88
|
+
return { content: [{ type: 'text', text: `Built package: ${outputPath}` }] };
|
|
89
|
+
});
|
|
90
|
+
// ── Component Upsert Tools (data-driven) ──
|
|
91
|
+
const dataSchema = z.record(z.string()).describe('Component field key-value pairs');
|
|
92
|
+
for (const tool of UPSERT_TOOLS) {
|
|
93
|
+
server.tool(tool.name, tool.desc, { name: z.string().describe(`${tool.name.replace('upsert_', '').replace(/^\w/, c => c.toUpperCase())} name (must start with "${tool.prefix}")`), data: dataSchema }, async ({ name, data }) => {
|
|
94
|
+
const r = tool.fn(getModel(), name, data);
|
|
95
|
+
return { content: [{ type: 'text', text: formatUpsertResult(r) }] };
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// ── Shared Tools ──
|
|
99
|
+
server.tool('delete_component', 'Delete a component and cascade-clean references', { name: z.string().describe('Component name to delete') }, async ({ name }) => {
|
|
100
|
+
const r = deleteComponent(getModel(), name);
|
|
101
|
+
return {
|
|
102
|
+
content: [{
|
|
103
|
+
type: 'text',
|
|
104
|
+
text: r.deleted
|
|
105
|
+
? `Deleted "${name}". Cleaned references in: ${r.cascaded.length > 0 ? r.cascaded.join(', ') : 'none'}`
|
|
106
|
+
: `Component "${name}" not found`,
|
|
107
|
+
}],
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
server.tool('set_localization', 'Set localization key-value pairs', { entries: z.record(z.string()).describe('Key-value pairs to set') }, async ({ entries }) => {
|
|
111
|
+
const r = setLocalization(getModel(), entries);
|
|
112
|
+
return {
|
|
113
|
+
content: [{
|
|
114
|
+
type: 'text',
|
|
115
|
+
text: `Set ${r.set} keys${r.errors.length > 0 ? `. Errors: ${r.errors.join('; ')}` : ''}`,
|
|
116
|
+
}],
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
// ── Map Tools ──
|
|
120
|
+
server.tool('get_map_ascii', 'Render tile/token layout as ASCII art for spatial reasoning', {}, async () => {
|
|
121
|
+
return { content: [{ type: 'text', text: getMapAscii(getModel()) }] };
|
|
122
|
+
});
|
|
123
|
+
server.tool('suggest_tile_layout', 'Suggest tile coordinates for a layout style', {
|
|
124
|
+
count: z.number().describe('Number of tiles'),
|
|
125
|
+
style: z.enum(['linear', 'l_shape', 'hub_spoke']).describe('Layout style'),
|
|
126
|
+
}, async ({ count, style }) => {
|
|
127
|
+
const positions = suggestTileLayout(count, style);
|
|
128
|
+
return { content: [{ type: 'text', text: JSON.stringify(positions, null, 2) }] };
|
|
129
|
+
});
|
|
130
|
+
server.tool('place_tile_relative', 'Compute position for a tile relative to an existing tile', {
|
|
131
|
+
existingTile: z.string().describe('Name of existing tile'),
|
|
132
|
+
direction: z.enum(['north', 'south', 'east', 'west']).describe('Direction'),
|
|
133
|
+
tileSize: z.number().optional().describe('Tile spacing (default 7)'),
|
|
134
|
+
}, async ({ existingTile, direction, tileSize }) => {
|
|
135
|
+
const pos = placeTileRelative(getModel(), existingTile, direction, tileSize);
|
|
136
|
+
return { content: [{ type: 'text', text: JSON.stringify(pos) }] };
|
|
137
|
+
});
|
|
138
|
+
// ── Reference Tools ──
|
|
139
|
+
server.tool('search_game_content', 'Search game content catalogs (monsters, tiles, audio, etc.)', { query: z.string().describe('Search query'), type: z.string().optional().describe('Filter by type') }, async ({ query, type }) => {
|
|
140
|
+
const results = searchGameContent(query, type);
|
|
141
|
+
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
|
|
142
|
+
});
|
|
143
|
+
// ── Resources ──
|
|
144
|
+
server.resource('valkyrie-format-events', 'valkyrie://format/events', async () => ({
|
|
145
|
+
contents: [{ uri: 'valkyrie://format/events', text: EVENT_FORMAT_DOC, mimeType: 'text/markdown' }],
|
|
146
|
+
}));
|
|
147
|
+
server.resource('valkyrie-format-localization', 'valkyrie://format/localization', async () => ({
|
|
148
|
+
contents: [{ uri: 'valkyrie://format/localization', text: LOCALIZATION_FORMAT_DOC, mimeType: 'text/markdown' }],
|
|
149
|
+
}));
|
|
150
|
+
server.resource('valkyrie-format-components', 'valkyrie://format/components', async () => ({
|
|
151
|
+
contents: [{ uri: 'valkyrie://format/components', text: COMPONENT_FORMAT_DOC, mimeType: 'text/markdown' }],
|
|
152
|
+
}));
|
|
153
|
+
server.resource('valkyrie-format-patterns', 'valkyrie://format/patterns', async () => ({
|
|
154
|
+
contents: [{ uri: 'valkyrie://format/patterns', text: PATTERN_REFERENCE_DOC, mimeType: 'text/markdown' }],
|
|
155
|
+
}));
|
|
156
|
+
server.resource('valkyrie-scenario-current', 'valkyrie://scenario/current', async () => {
|
|
157
|
+
if (!currentModel) {
|
|
158
|
+
return { contents: [{ uri: 'valkyrie://scenario/current', text: 'No scenario loaded.', mimeType: 'text/plain' }] };
|
|
159
|
+
}
|
|
160
|
+
const state = getScenarioState(currentModel);
|
|
161
|
+
return {
|
|
162
|
+
contents: [{ uri: 'valkyrie://scenario/current', text: JSON.stringify(state, null, 2), mimeType: 'application/json' }],
|
|
163
|
+
};
|
|
164
|
+
});
|
|
165
|
+
// ── Prompts ──
|
|
166
|
+
server.prompt('create-scenario', 'Guided workflow for creating a new MoM scenario', {}, async () => ({
|
|
167
|
+
messages: [{
|
|
168
|
+
role: 'user',
|
|
169
|
+
content: {
|
|
170
|
+
type: 'text',
|
|
171
|
+
text: `Guide me through creating a new Mansions of Madness scenario for Valkyrie. Follow these steps:
|
|
172
|
+
|
|
173
|
+
1. **Concept**: Ask me for a scenario concept (theme, setting, difficulty)
|
|
174
|
+
2. **Map Layout**: Help me design the tile layout (suggest tiles from the catalog)
|
|
175
|
+
3. **Events**: Create the event chain (start → exploration → encounters → finale)
|
|
176
|
+
4. **Tokens**: Place search, explore, and interact tokens
|
|
177
|
+
5. **Monsters**: Set up spawns and monster encounters
|
|
178
|
+
6. **Items**: Configure starting and discoverable items
|
|
179
|
+
7. **Narrative**: Write localization text for all events, tokens, and UI elements
|
|
180
|
+
8. **Validation**: Run validation and fix any issues
|
|
181
|
+
9. **Build**: Package into .valkyrie file
|
|
182
|
+
|
|
183
|
+
Use the valkyrie-mom MCP tools for each step. Start by asking for my scenario concept.`,
|
|
184
|
+
},
|
|
185
|
+
}],
|
|
186
|
+
}));
|
|
187
|
+
server.prompt('review-scenario', 'Analyze an existing scenario for balance and completeness', {}, async () => ({
|
|
188
|
+
messages: [{
|
|
189
|
+
role: 'user',
|
|
190
|
+
content: {
|
|
191
|
+
type: 'text',
|
|
192
|
+
text: `Review the currently loaded Mansions of Madness scenario. Analyze:
|
|
193
|
+
|
|
194
|
+
1. **Structure**: Event graph flow, reachability, dead ends
|
|
195
|
+
2. **Balance**: Monster count vs items, difficulty curve
|
|
196
|
+
3. **Completeness**: Missing localization, orphaned components
|
|
197
|
+
4. **Map**: Tile layout coherence, token placement
|
|
198
|
+
5. **Narrative**: Text quality, consistency, spelling
|
|
199
|
+
|
|
200
|
+
Use validate_scenario first, then get_scenario_state and get_map_ascii for analysis.`,
|
|
201
|
+
},
|
|
202
|
+
}],
|
|
203
|
+
}));
|
|
204
|
+
return server;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ScenarioModel } from '../model/scenario-model.js';
|
|
2
|
+
/**
|
|
3
|
+
* Get the Valkyrie editor directory for MoM scenarios.
|
|
4
|
+
*
|
|
5
|
+
* Platform paths (mirrors Game.DefaultAppData() + "/MoM/Editor" in Valkyrie C#):
|
|
6
|
+
* macOS/Linux: ~/.config/Valkyrie/MoM/Editor
|
|
7
|
+
* Windows: %APPDATA%/Valkyrie/MoM/Editor
|
|
8
|
+
*/
|
|
9
|
+
export declare function getEditorDir(): string;
|
|
10
|
+
export interface ScenarioSummary {
|
|
11
|
+
name: string;
|
|
12
|
+
dir: string;
|
|
13
|
+
questName: string;
|
|
14
|
+
}
|
|
15
|
+
/** List all scenarios in the Valkyrie editor directory */
|
|
16
|
+
export declare function listScenarios(editorDir?: string): ScenarioSummary[];
|
|
17
|
+
export interface ScenarioState {
|
|
18
|
+
totalComponents: number;
|
|
19
|
+
componentCounts: Record<string, number>;
|
|
20
|
+
localizationKeys: number;
|
|
21
|
+
}
|
|
22
|
+
/** Creates new scenario directory with quest.ini + empty data files */
|
|
23
|
+
export declare function createScenario(name: string, options?: {
|
|
24
|
+
dir?: string;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
model: ScenarioModel;
|
|
27
|
+
dir: string;
|
|
28
|
+
}>;
|
|
29
|
+
/** Loads existing scenario from directory */
|
|
30
|
+
export declare function loadScenario(dir: string): Promise<ScenarioModel>;
|
|
31
|
+
/** Returns current scenario state summary */
|
|
32
|
+
export declare function getScenarioState(model: ScenarioModel): ScenarioState;
|
|
33
|
+
/** Saves model to disk */
|
|
34
|
+
export declare function saveScenario(model: ScenarioModel): Promise<void>;
|
|
35
|
+
/** Builds .valkyrie package */
|
|
36
|
+
export declare function buildScenario(model: ScenarioModel, outputPath: string): Promise<void>;
|
|
37
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/tools/lifecycle.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAQ3D;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,MAAM,CASrC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE,CA2BnE;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,uEAAuE;AACvE,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BhD;AAED,6CAA6C;AAC7C,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAsBtE;AAED,6CAA6C;AAC7C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CAcpE;AAED,0BAA0B;AAC1B,wBAAsB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BtE;AAED,+BAA+B;AAC/B,wBAAsB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3F"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import { ScenarioModel } from '../model/scenario-model.js';
|
|
5
|
+
import { DEFAULT_QUEST_CONFIG, getTypePrefix, serializeQuestConfig } from '../model/component-types.js';
|
|
6
|
+
import { writeIni } from '../io/ini-writer.js';
|
|
7
|
+
import { buildPackage } from '../io/package-builder.js';
|
|
8
|
+
import { parseLocalization } from '../io/localization-io.js';
|
|
9
|
+
const DATA_FILES = ['events.ini', 'tiles.ini', 'tokens.ini', 'spawns.ini', 'items.ini', 'ui.ini', 'other.ini'];
|
|
10
|
+
/**
|
|
11
|
+
* Get the Valkyrie editor directory for MoM scenarios.
|
|
12
|
+
*
|
|
13
|
+
* Platform paths (mirrors Game.DefaultAppData() + "/MoM/Editor" in Valkyrie C#):
|
|
14
|
+
* macOS/Linux: ~/.config/Valkyrie/MoM/Editor
|
|
15
|
+
* Windows: %APPDATA%/Valkyrie/MoM/Editor
|
|
16
|
+
*/
|
|
17
|
+
export function getEditorDir() {
|
|
18
|
+
const platform = os.platform();
|
|
19
|
+
let appData;
|
|
20
|
+
if (platform === 'win32') {
|
|
21
|
+
appData = process.env.APPDATA ?? path.join(os.homedir(), 'AppData', 'Roaming');
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
appData = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), '.config');
|
|
25
|
+
}
|
|
26
|
+
return path.join(appData, 'Valkyrie', 'MoM', 'Editor');
|
|
27
|
+
}
|
|
28
|
+
/** List all scenarios in the Valkyrie editor directory */
|
|
29
|
+
export function listScenarios(editorDir) {
|
|
30
|
+
const dir = editorDir ?? getEditorDir();
|
|
31
|
+
if (!fs.existsSync(dir))
|
|
32
|
+
return [];
|
|
33
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
34
|
+
const results = [];
|
|
35
|
+
for (const entry of entries) {
|
|
36
|
+
if (!entry.isDirectory())
|
|
37
|
+
continue;
|
|
38
|
+
const scenarioDir = path.join(dir, entry.name);
|
|
39
|
+
const questPath = path.join(scenarioDir, 'quest.ini');
|
|
40
|
+
if (!fs.existsSync(questPath))
|
|
41
|
+
continue;
|
|
42
|
+
// Try to read quest name from localization
|
|
43
|
+
let questName = entry.name;
|
|
44
|
+
const locPath = path.join(scenarioDir, 'Localization.English.txt');
|
|
45
|
+
if (fs.existsSync(locPath)) {
|
|
46
|
+
try {
|
|
47
|
+
const parsed = parseLocalization(fs.readFileSync(locPath, 'utf-8'));
|
|
48
|
+
questName = parsed.entries.get('quest.name') ?? entry.name;
|
|
49
|
+
}
|
|
50
|
+
catch { /* use folder name */ }
|
|
51
|
+
}
|
|
52
|
+
results.push({ name: entry.name, dir: scenarioDir, questName });
|
|
53
|
+
}
|
|
54
|
+
return results;
|
|
55
|
+
}
|
|
56
|
+
/** Creates new scenario directory with quest.ini + empty data files */
|
|
57
|
+
export async function createScenario(name, options) {
|
|
58
|
+
const dir = options?.dir ?? name;
|
|
59
|
+
if (!fs.existsSync(dir)) {
|
|
60
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
61
|
+
}
|
|
62
|
+
const model = new ScenarioModel(undefined, dir);
|
|
63
|
+
// Write quest.ini
|
|
64
|
+
const questSections = {
|
|
65
|
+
Quest: serializeQuestConfig(DEFAULT_QUEST_CONFIG),
|
|
66
|
+
};
|
|
67
|
+
const bareKeySections = {
|
|
68
|
+
QuestText: ['Localization.English.txt'],
|
|
69
|
+
QuestData: [...DATA_FILES],
|
|
70
|
+
};
|
|
71
|
+
fs.writeFileSync(path.join(dir, 'quest.ini'), writeIni(questSections, bareKeySections));
|
|
72
|
+
// Write empty data files
|
|
73
|
+
for (const f of DATA_FILES) {
|
|
74
|
+
fs.writeFileSync(path.join(dir, f), writeIni({}));
|
|
75
|
+
}
|
|
76
|
+
// Write empty localization file
|
|
77
|
+
fs.writeFileSync(path.join(dir, 'Localization.English.txt'), '.,English\n');
|
|
78
|
+
return { model, dir };
|
|
79
|
+
}
|
|
80
|
+
/** Loads existing scenario from directory */
|
|
81
|
+
export async function loadScenario(dir) {
|
|
82
|
+
const questIni = fs.readFileSync(path.join(dir, 'quest.ini'), 'utf-8');
|
|
83
|
+
const dataFiles = {};
|
|
84
|
+
for (const f of DATA_FILES) {
|
|
85
|
+
const filePath = path.join(dir, f);
|
|
86
|
+
if (fs.existsSync(filePath)) {
|
|
87
|
+
dataFiles[f] = fs.readFileSync(filePath, 'utf-8');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Find English localization file
|
|
91
|
+
let locContent;
|
|
92
|
+
const locPath = path.join(dir, 'Localization.English.txt');
|
|
93
|
+
if (fs.existsSync(locPath)) {
|
|
94
|
+
locContent = fs.readFileSync(locPath, 'utf-8');
|
|
95
|
+
}
|
|
96
|
+
const model = ScenarioModel.loadFromData(questIni, dataFiles, locContent);
|
|
97
|
+
model.scenarioDir = dir;
|
|
98
|
+
return model;
|
|
99
|
+
}
|
|
100
|
+
/** Returns current scenario state summary */
|
|
101
|
+
export function getScenarioState(model) {
|
|
102
|
+
const all = model.getAll();
|
|
103
|
+
const counts = {};
|
|
104
|
+
for (const comp of all) {
|
|
105
|
+
const prefix = getTypePrefix(comp.name);
|
|
106
|
+
counts[prefix] = (counts[prefix] ?? 0) + 1;
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
totalComponents: all.length,
|
|
110
|
+
componentCounts: counts,
|
|
111
|
+
localizationKeys: model.localization.size,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** Saves model to disk */
|
|
115
|
+
export async function saveScenario(model) {
|
|
116
|
+
const dir = model.scenarioDir;
|
|
117
|
+
if (!dir)
|
|
118
|
+
throw new Error('Model has no scenarioDir set');
|
|
119
|
+
// Serialize components by file
|
|
120
|
+
const iniData = model.serializeToIniData();
|
|
121
|
+
// Write each data file
|
|
122
|
+
for (const f of DATA_FILES) {
|
|
123
|
+
const sections = iniData[f] ?? {};
|
|
124
|
+
fs.writeFileSync(path.join(dir, f), writeIni(sections));
|
|
125
|
+
}
|
|
126
|
+
// Write quest.ini
|
|
127
|
+
const questSections = {
|
|
128
|
+
Quest: serializeQuestConfig(model.questConfig),
|
|
129
|
+
};
|
|
130
|
+
const bareKeySections = {
|
|
131
|
+
QuestText: ['Localization.English.txt'],
|
|
132
|
+
QuestData: [...DATA_FILES],
|
|
133
|
+
};
|
|
134
|
+
fs.writeFileSync(path.join(dir, 'quest.ini'), writeIni(questSections, bareKeySections));
|
|
135
|
+
// Write localization
|
|
136
|
+
const locContent = model.localization.toCSV();
|
|
137
|
+
fs.writeFileSync(path.join(dir, 'Localization.English.txt'), locContent);
|
|
138
|
+
}
|
|
139
|
+
/** Builds .valkyrie package */
|
|
140
|
+
export async function buildScenario(model, outputPath) {
|
|
141
|
+
const dir = model.scenarioDir;
|
|
142
|
+
if (!dir)
|
|
143
|
+
throw new Error('Model has no scenarioDir set');
|
|
144
|
+
await buildPackage(dir, outputPath);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/tools/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ScenarioModel } from '../model/scenario-model.js';
|
|
2
|
+
/** Generate an ASCII map of tile positions */
|
|
3
|
+
export declare function getMapAscii(model: ScenarioModel): string;
|
|
4
|
+
/** Suggest coordinates for a tile layout */
|
|
5
|
+
export declare function suggestTileLayout(count: number, style: 'linear' | 'l_shape' | 'hub_spoke'): Array<{
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
}>;
|
|
9
|
+
/** Compute position for a tile placed relative to an existing tile */
|
|
10
|
+
export declare function placeTileRelative(model: ScenarioModel, existingTile: string, direction: 'north' | 'south' | 'east' | 'west', tileSize?: number): {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/tools/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAI3D,8CAA8C;AAC9C,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CA4CxD;AAED,4CAA4C;AAC5C,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GACxC,KAAK,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0CjC;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAC9C,QAAQ,GAAE,MAA0B,GACnC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAmB1B"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
const DEFAULT_TILE_SIZE = 7;
|
|
2
|
+
/** Generate an ASCII map of tile positions */
|
|
3
|
+
export function getMapAscii(model) {
|
|
4
|
+
const tiles = model.getByType('Tile');
|
|
5
|
+
if (tiles.length === 0) {
|
|
6
|
+
return 'No tiles placed yet.';
|
|
7
|
+
}
|
|
8
|
+
// Collect tile positions
|
|
9
|
+
const tilePositions = tiles.map(t => ({
|
|
10
|
+
name: t.name.replace(/^Tile/, ''),
|
|
11
|
+
x: parseFloat(t.data.xposition ?? '0'),
|
|
12
|
+
y: parseFloat(t.data.yposition ?? '0'),
|
|
13
|
+
}));
|
|
14
|
+
// Find bounds
|
|
15
|
+
const minX = Math.min(...tilePositions.map(t => t.x));
|
|
16
|
+
const maxX = Math.max(...tilePositions.map(t => t.x));
|
|
17
|
+
const minY = Math.min(...tilePositions.map(t => t.y));
|
|
18
|
+
const maxY = Math.max(...tilePositions.map(t => t.y));
|
|
19
|
+
// Normalize to grid positions (each tile takes ~7 units)
|
|
20
|
+
const cellWidth = 14;
|
|
21
|
+
const cols = Math.round((maxX - minX) / DEFAULT_TILE_SIZE) + 1;
|
|
22
|
+
const rows = Math.round((maxY - minY) / DEFAULT_TILE_SIZE) + 1;
|
|
23
|
+
// Create grid
|
|
24
|
+
const grid = Array.from({ length: rows }, () => Array.from({ length: cols }, () => '.'.padStart(cellWidth, ' ')));
|
|
25
|
+
for (const t of tilePositions) {
|
|
26
|
+
const col = Math.round((t.x - minX) / DEFAULT_TILE_SIZE);
|
|
27
|
+
const row = rows - 1 - Math.round((t.y - minY) / DEFAULT_TILE_SIZE); // invert Y
|
|
28
|
+
const label = t.name.length > cellWidth - 2
|
|
29
|
+
? t.name.substring(0, cellWidth - 2)
|
|
30
|
+
: t.name;
|
|
31
|
+
grid[row][col] = `[${label}]`.padStart(cellWidth, ' ');
|
|
32
|
+
}
|
|
33
|
+
const lines = [];
|
|
34
|
+
for (const row of grid) {
|
|
35
|
+
lines.push(row.join(''));
|
|
36
|
+
}
|
|
37
|
+
return lines.join('\n');
|
|
38
|
+
}
|
|
39
|
+
/** Suggest coordinates for a tile layout */
|
|
40
|
+
export function suggestTileLayout(count, style) {
|
|
41
|
+
const positions = [];
|
|
42
|
+
const s = DEFAULT_TILE_SIZE;
|
|
43
|
+
switch (style) {
|
|
44
|
+
case 'linear':
|
|
45
|
+
for (let i = 0; i < count; i++) {
|
|
46
|
+
positions.push({ x: i * s, y: 0 });
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
case 'l_shape': {
|
|
50
|
+
// Half go horizontal, rest go vertical from the corner
|
|
51
|
+
const horizontal = Math.ceil(count / 2);
|
|
52
|
+
for (let i = 0; i < horizontal; i++) {
|
|
53
|
+
positions.push({ x: i * s, y: 0 });
|
|
54
|
+
}
|
|
55
|
+
for (let i = 0; i < count - horizontal; i++) {
|
|
56
|
+
positions.push({ x: (horizontal - 1) * s, y: (i + 1) * s });
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case 'hub_spoke': {
|
|
61
|
+
// Center tile + spokes in cardinal directions
|
|
62
|
+
positions.push({ x: 0, y: 0 });
|
|
63
|
+
const directions = [
|
|
64
|
+
{ x: 0, y: s }, // north
|
|
65
|
+
{ x: s, y: 0 }, // east
|
|
66
|
+
{ x: 0, y: -s }, // south
|
|
67
|
+
{ x: -s, y: 0 }, // west
|
|
68
|
+
];
|
|
69
|
+
for (let i = 1; i < count; i++) {
|
|
70
|
+
const dir = directions[(i - 1) % 4];
|
|
71
|
+
const ring = Math.ceil(i / 4);
|
|
72
|
+
positions.push({ x: dir.x * ring, y: dir.y * ring });
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return positions;
|
|
78
|
+
}
|
|
79
|
+
/** Compute position for a tile placed relative to an existing tile */
|
|
80
|
+
export function placeTileRelative(model, existingTile, direction, tileSize = DEFAULT_TILE_SIZE) {
|
|
81
|
+
const tile = model.get(existingTile);
|
|
82
|
+
if (!tile) {
|
|
83
|
+
throw new Error(`Tile "${existingTile}" not found`);
|
|
84
|
+
}
|
|
85
|
+
const x = parseFloat(tile.data.xposition ?? '0');
|
|
86
|
+
const y = parseFloat(tile.data.yposition ?? '0');
|
|
87
|
+
switch (direction) {
|
|
88
|
+
case 'north':
|
|
89
|
+
return { x, y: y + tileSize };
|
|
90
|
+
case 'south':
|
|
91
|
+
return { x, y: y - tileSize };
|
|
92
|
+
case 'east':
|
|
93
|
+
return { x: x + tileSize, y };
|
|
94
|
+
case 'west':
|
|
95
|
+
return { x: x - tileSize, y };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/tools/map.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,8CAA8C;AAC9C,MAAM,UAAU,WAAW,CAAC,KAAoB;IAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED,yBAAyB;IACzB,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACjC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;QACtC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;KACvC,CAAC,CAAC,CAAC;IAEJ,cAAc;IACd,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,yDAAyD;IACzD,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAE/D,cAAc;IACd,MAAM,IAAI,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CACzD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CACjE,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,WAAW;QAChF,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,CAAC;YACzC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACX,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,KAAyC;IAEzC,MAAM,SAAS,GAAoC,EAAE,CAAC;IACtD,MAAM,CAAC,GAAG,iBAAiB,CAAC;IAE5B,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ;YACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACrC,CAAC;YACD,MAAM;QAER,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,uDAAuD;YACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACrC,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,8CAA8C;YAC9C,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,UAAU,GAAG;gBACjB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAI,QAAQ;gBAC1B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAI,OAAO;gBACzB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAG,QAAQ;gBAC1B,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAG,OAAO;aAC1B,CAAC;YACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9B,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,iBAAiB,CAC/B,KAAoB,EACpB,YAAoB,EACpB,SAA8C,EAC9C,WAAmB,iBAAiB;IAEpC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,SAAS,YAAY,aAAa,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;IAEjD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC;QAChC,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC;QAChC,KAAK,MAAM;YACT,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;QAChC,KAAK,MAAM;YACT,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC;IAClC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../src/tools/reference.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,8BAA8B,CAAC;AAE9E,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAE9E"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { getSharedCatalog } from '../catalogs/catalog-store.js';
|
|
2
|
+
/** Search game content catalogs (monsters, tiles, items, etc.) */
|
|
3
|
+
export function searchGameContent(query, type) {
|
|
4
|
+
return getSharedCatalog().search(query, type);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference.js","sourceRoot":"","sources":["../../src/tools/reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGhE,kEAAkE;AAClE,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,IAAa;IAC5D,OAAO,gBAAgB,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAA+B,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ScenarioModel } from '../model/scenario-model.js';
|
|
2
|
+
export declare function deleteComponent(model: ScenarioModel, name: string): {
|
|
3
|
+
deleted: boolean;
|
|
4
|
+
cascaded: string[];
|
|
5
|
+
};
|
|
6
|
+
export declare function setLocalization(model: ScenarioModel, entries: Record<string, string>): {
|
|
7
|
+
set: number;
|
|
8
|
+
errors: string[];
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,wBAAgB,eAAe,CAC7B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,GACX;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAQ1C;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAenC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function deleteComponent(model, name) {
|
|
2
|
+
const exists = model.get(name) !== undefined;
|
|
3
|
+
if (!exists) {
|
|
4
|
+
return { deleted: false, cascaded: [] };
|
|
5
|
+
}
|
|
6
|
+
const cascaded = model.delete(name);
|
|
7
|
+
return { deleted: true, cascaded };
|
|
8
|
+
}
|
|
9
|
+
export function setLocalization(model, entries) {
|
|
10
|
+
let set = 0;
|
|
11
|
+
const errors = [];
|
|
12
|
+
for (const [key, value] of Object.entries(entries)) {
|
|
13
|
+
if (!key || key.trim() === '') {
|
|
14
|
+
errors.push('Cannot set localization with empty key');
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
model.localization.set(key, value);
|
|
18
|
+
set++;
|
|
19
|
+
}
|
|
20
|
+
return { set, errors };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAC7B,KAAoB,EACpB,IAAY;IAEZ,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAoB,EACpB,OAA+B;IAE/B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACtD,SAAS;QACX,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,GAAG,EAAE,CAAC;IACR,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ScenarioModel } from '../model/scenario-model.js';
|
|
2
|
+
import type { ValidationResult } from '../model/component-types.js';
|
|
3
|
+
export interface UpsertResult {
|
|
4
|
+
success: boolean;
|
|
5
|
+
warnings: ValidationResult[];
|
|
6
|
+
errors: ValidationResult[];
|
|
7
|
+
}
|
|
8
|
+
export declare function upsertEvent(model: ScenarioModel, name: string, data: Record<string, string>): UpsertResult;
|
|
9
|
+
export declare function upsertTile(model: ScenarioModel, name: string, data: Record<string, string>): UpsertResult;
|
|
10
|
+
export declare function upsertToken(model: ScenarioModel, name: string, data: Record<string, string>): UpsertResult;
|
|
11
|
+
export declare function upsertSpawn(model: ScenarioModel, name: string, data: Record<string, string>): UpsertResult;
|
|
12
|
+
export declare function upsertItem(model: ScenarioModel, name: string, data: Record<string, string>): UpsertResult;
|
|
13
|
+
export declare function upsertPuzzle(model: ScenarioModel, name: string, data: Record<string, string>): UpsertResult;
|
|
14
|
+
export declare function upsertUI(model: ScenarioModel, name: string, data: Record<string, string>): UpsertResult;
|
|
15
|
+
//# sourceMappingURL=upsert.d.ts.map
|