hoi4-agent-tools 2.8.3 → 2.8.4
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/CHANGELOG.md +5 -0
- package/dist/hoi4_agent_tools/gui/assets.js +24 -0
- package/dist/hoi4_agent_tools/gui/layout.js +11 -4
- package/dist/hoi4_agent_tools/gui/renderer.js +53 -11
- package/dist/hoi4_agent_tools/gui/source-graph.js +15 -0
- package/dist/hoi4_agent_tools/version.js +1 -1
- package/docs/gui.md +1 -1
- package/package.json +1 -1
- package/schemas/configuration.schema.json +1 -1
- package/schemas/continuous-focus-palette.schema.json +1 -1
- package/schemas/custom-weighted-pool.schema.json +1 -1
- package/schemas/event-feature-manifest.schema.json +1 -1
- package/schemas/focus-plan.schema.json +1 -1
- package/schemas/focus-planning-sidecar.schema.json +1 -1
- package/schemas/gui-animation-source.schema.json +1 -1
- package/schemas/gui-helper.schema.json +1 -1
- package/schemas/gui-scenario.schema.json +1 -1
- package/schemas/map-operation.schema.json +1 -1
- package/schemas/operation-result.schema.json +1 -1
- package/schemas/probability-analysis-result.schema.json +1 -1
- package/schemas/probability-compare-input.schema.json +1 -1
- package/schemas/probability-evaluate-input.schema.json +1 -1
- package/schemas/probability-inspect-input.schema.json +1 -1
- package/schemas/probability-render-input.schema.json +1 -1
- package/schemas/probability-scenario-set.schema.json +1 -1
- package/schemas/probability-sequence-input.schema.json +1 -1
- package/schemas/probability-simulate-input.schema.json +1 -1
- package/schemas/probability-sweep-input.schema.json +1 -1
- package/server.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
No unreleased changes.
|
|
6
6
|
|
|
7
|
+
## 2.8.4 - 2026-08-28
|
|
8
|
+
|
|
9
|
+
- Render each declared HOI4 font face with its own glyph atlas, native metrics, face colour, border colour, and inherited language-override styling.
|
|
10
|
+
- Keep native HOI4 bitmap or outline glyphs when localisation colour markup changes part of a line instead of replacing the line with the generic tool font.
|
|
11
|
+
|
|
7
12
|
## 2.8.3 - 2026-08-27
|
|
8
13
|
|
|
9
14
|
- Centered native button labels when HOI4 GUI source uses `text =` instead of `buttonText =`, matching the in-game horizontal and vertical alignment inside button frames.
|
|
@@ -180,6 +180,30 @@ export class GuiAssetCatalog {
|
|
|
180
180
|
definition.languages.length === 0))
|
|
181
181
|
this.fontDefinitions.set(key, definition);
|
|
182
182
|
}
|
|
183
|
+
const baseDefinitions = new Map();
|
|
184
|
+
for (const definition of graph.fonts) {
|
|
185
|
+
if (definition.override || definition.languages.length > 0)
|
|
186
|
+
continue;
|
|
187
|
+
const key = definition.name.toLocaleLowerCase('en-US');
|
|
188
|
+
if (!baseDefinitions.has(key))
|
|
189
|
+
baseDefinitions.set(key, definition);
|
|
190
|
+
}
|
|
191
|
+
for (const [key, definition] of this.fontDefinitions) {
|
|
192
|
+
if (!definition.override)
|
|
193
|
+
continue;
|
|
194
|
+
const base = baseDefinitions.get(key);
|
|
195
|
+
if (base === undefined)
|
|
196
|
+
continue;
|
|
197
|
+
this.fontDefinitions.set(key, {
|
|
198
|
+
...definition,
|
|
199
|
+
...(definition.colour === undefined && base.colour !== undefined
|
|
200
|
+
? { colour: base.colour }
|
|
201
|
+
: {}),
|
|
202
|
+
...(definition.borderColour === undefined && base.borderColour !== undefined
|
|
203
|
+
? { borderColour: base.borderColour }
|
|
204
|
+
: {}),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
183
207
|
}
|
|
184
208
|
resolveFile(assetPath, relativeTo) {
|
|
185
209
|
const normalized = normalizeAssetPath(assetPath);
|
|
@@ -446,7 +446,7 @@ function wrapText(catalog, fontName, text, colours, fontSize, maximumWidth, work
|
|
|
446
446
|
missingGlyphs: [...missingGlyphs].sort((a, b) => a - b),
|
|
447
447
|
};
|
|
448
448
|
}
|
|
449
|
-
function colourRunsForLine(catalog, fontName, line, colours, fontSize, work, inlineIcons = new Map()) {
|
|
449
|
+
function colourRunsForLine(catalog, fontName, line, colours, fontSize, work, inlineIcons = new Map(), defaultColour = defaultTextColour) {
|
|
450
450
|
if (!colours.some((colour) => colour !== undefined) || line.length === 0)
|
|
451
451
|
return [];
|
|
452
452
|
const runs = [];
|
|
@@ -459,11 +459,11 @@ function colourRunsForLine(catalog, fontName, line, colours, fontSize, work, inl
|
|
|
459
459
|
start += 1;
|
|
460
460
|
continue;
|
|
461
461
|
}
|
|
462
|
-
const colour = colours[start] ??
|
|
462
|
+
const colour = colours[start] ?? defaultColour;
|
|
463
463
|
let end = start + 1;
|
|
464
464
|
while (end < line.length &&
|
|
465
465
|
!inlineIcons.has(line[end] ?? '') &&
|
|
466
|
-
(colours[end] ??
|
|
466
|
+
(colours[end] ?? defaultColour) === colour)
|
|
467
467
|
end += 1;
|
|
468
468
|
const text = line.slice(start, end);
|
|
469
469
|
work.spendTextLayout('localisation colour-run measurement');
|
|
@@ -743,6 +743,7 @@ async function layoutElement(definition, parentRect, inheritedClip, parentScale,
|
|
|
743
743
|
displayText = visibleText.text;
|
|
744
744
|
context.work.admitText(displayText, `GUI text for ${definition.name}`);
|
|
745
745
|
const fontName = scalarString(property(definition.attributes, 'font', 'buttonFont'));
|
|
746
|
+
const fontDefinition = fontName === undefined ? undefined : catalog.fontDefinition(fontName);
|
|
746
747
|
const resolvedFontMetrics = catalog.resolvedFontMetrics(fontName);
|
|
747
748
|
const explicitFontSize = scalarNumber(property(definition.attributes, 'fontSize'), 16);
|
|
748
749
|
const fontSize = explicitFontSize ??
|
|
@@ -792,7 +793,7 @@ async function layoutElement(definition, parentRect, inheritedClip, parentScale,
|
|
|
792
793
|
inlineIcons.push(...shaped.icons);
|
|
793
794
|
}
|
|
794
795
|
const colourRuns = visibleText.hasColourMarkup
|
|
795
|
-
? wrapped.lines.map((line, index) => colourRunsForLine(catalog, fontName, line, wrapped.colourLines[index] ?? [], fontSize * scale, context.work, resolvedInlineIcons))
|
|
796
|
+
? wrapped.lines.map((line, index) => colourRunsForLine(catalog, fontName, line, wrapped.colourLines[index] ?? [], fontSize * scale, context.work, resolvedInlineIcons, fontDefinition?.colour ?? defaultTextColour))
|
|
796
797
|
: undefined;
|
|
797
798
|
const maximumLineWidth = wrapped.widths.reduce((maximum, value) => Math.max(maximum, value), 0);
|
|
798
799
|
if (width === 0)
|
|
@@ -812,6 +813,10 @@ async function layoutElement(definition, parentRect, inheritedClip, parentScale,
|
|
|
812
813
|
metricSource: wrapped.metricSource,
|
|
813
814
|
...alignment(definition.attributes, embeddedButtonText),
|
|
814
815
|
...(fontName === undefined ? {} : { fontName }),
|
|
816
|
+
...(fontDefinition?.colour === undefined ? {} : { colour: fontDefinition.colour }),
|
|
817
|
+
...(fontDefinition?.borderColour === undefined
|
|
818
|
+
? {}
|
|
819
|
+
: { borderColour: fontDefinition.borderColour }),
|
|
815
820
|
glyphLines,
|
|
816
821
|
overflowX: width > 0 && measuredWidth > width + 0.01,
|
|
817
822
|
overflowY: height > 0 && measuredHeight > height + 0.01,
|
|
@@ -824,6 +829,8 @@ async function layoutElement(definition, parentRect, inheritedClip, parentScale,
|
|
|
824
829
|
addFidelity(fidelity, 'approximated', 'font_metrics', `No supplied font metrics for ${fontName ?? '<default>'}.`, definition);
|
|
825
830
|
else
|
|
826
831
|
addFidelity(fidelity, 'modelled', 'font_metrics', `${wrapped.metricSource} metrics for ${fontName ?? '<default>'}.`, definition);
|
|
832
|
+
if (fontDefinition?.colour !== undefined || fontDefinition?.borderColour !== undefined)
|
|
833
|
+
addFidelity(fidelity, 'modelled', 'font_definition_style', `Font ${fontDefinition.name} uses its declared face and colour styling.`, definition);
|
|
827
834
|
const missingGlyphs = [
|
|
828
835
|
...new Set([...wrapped.missingGlyphs, ...glyphLines.flatMap((line) => line.missingGlyphs)]),
|
|
829
836
|
].slice(0, GUI_TEXT_MAX_MISSING_GLYPH_SAMPLES);
|
|
@@ -62,6 +62,31 @@ function sceneGlyphDefinitions(scene) {
|
|
|
62
62
|
.map(([key, glyph]) => `<image id="${bitmapDefinitionId(key)}" width="${finite(glyph.width)}" height="${finite(glyph.height)}" href="${glyph.dataUri}" preserveAspectRatio="none"/>`),
|
|
63
63
|
].join('');
|
|
64
64
|
}
|
|
65
|
+
function colourMatrix(colour) {
|
|
66
|
+
const match = /^#([0-9a-f]{6})([0-9a-f]{2})?$/iu.exec(colour);
|
|
67
|
+
if (match === null)
|
|
68
|
+
return '1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0';
|
|
69
|
+
const rgb = match[1];
|
|
70
|
+
const alpha = match[2] ?? 'ff';
|
|
71
|
+
const component = (offset) => Number.parseInt(rgb.slice(offset, offset + 2), 16) / 255;
|
|
72
|
+
return `${finite(component(0))} 0 0 0 0 0 ${finite(component(2))} 0 0 0 0 0 ${finite(component(4))} 0 0 0 0 0 ${finite(Number.parseInt(alpha, 16) / 255)} 0`;
|
|
73
|
+
}
|
|
74
|
+
function bitmapTintDefinition(id, colour) {
|
|
75
|
+
return `<filter id="${id}" color-interpolation-filters="sRGB"><feColorMatrix type="matrix" values="${colourMatrix(colour)}"/></filter>`;
|
|
76
|
+
}
|
|
77
|
+
function actualGlyphMarkup(glyphLine, originX, baseline, horizontalScale) {
|
|
78
|
+
if (glyphLine.source === 'fontkit-path')
|
|
79
|
+
return glyphLine.glyphs
|
|
80
|
+
.filter((glyph) => glyph.kind === 'outline')
|
|
81
|
+
.map((glyph) => `<use href="#${outlineDefinitionId(glyph.key)}" transform="translate(${finite(originX + glyph.x * horizontalScale)} ${finite(baseline + glyph.y)}) scale(${finite(glyph.scale * horizontalScale)} ${finite(-glyph.scale)})"/>`)
|
|
82
|
+
.join('');
|
|
83
|
+
if (glyphLine.source === 'bmfont-atlas')
|
|
84
|
+
return glyphLine.glyphs
|
|
85
|
+
.filter((glyph) => glyph.kind === 'bitmap')
|
|
86
|
+
.map((glyph) => `<use href="#${bitmapDefinitionId(glyph.key)}" transform="translate(${finite(originX + glyph.x * horizontalScale)} ${finite(baseline + glyph.y - glyphLine.baseline)}) scale(${finite(horizontalScale)} 1)"/>`)
|
|
87
|
+
.join('');
|
|
88
|
+
return '';
|
|
89
|
+
}
|
|
65
90
|
function renderText(element, toolText) {
|
|
66
91
|
const text = element.text;
|
|
67
92
|
if (text === undefined || text.lines.length === 0)
|
|
@@ -102,6 +127,25 @@ function renderText(element, toolText) {
|
|
|
102
127
|
})
|
|
103
128
|
.join('');
|
|
104
129
|
const colourRuns = text.colourRuns?.[index] ?? [];
|
|
130
|
+
if (colourRuns.length > 0 &&
|
|
131
|
+
glyphLine !== undefined &&
|
|
132
|
+
glyphLine.source !== 'deterministic-fallback') {
|
|
133
|
+
const definitions = [];
|
|
134
|
+
const renderedRuns = colourRuns.map((run, runIndex) => {
|
|
135
|
+
const key = `${element.id}:${index}:${runIndex}:${run.colour}`;
|
|
136
|
+
const clipId = `gui-font-run-clip-${sha256Bytes(key).slice(0, 20)}`;
|
|
137
|
+
const runX = originX + run.offsetX * horizontalScale;
|
|
138
|
+
definitions.push(`<clipPath id="${clipId}"><rect x="${finite(runX - 0.25)}" y="${finite(lineTop)}" width="${finite(run.width * horizontalScale + 0.5)}" height="${finite(text.lineHeight)}"/></clipPath>`);
|
|
139
|
+
const glyphs = actualGlyphMarkup(glyphLine, originX, baseline, horizontalScale);
|
|
140
|
+
if (glyphLine.source === 'bmfont-atlas') {
|
|
141
|
+
const filterId = `gui-font-tint-${sha256Bytes(key).slice(0, 20)}`;
|
|
142
|
+
definitions.push(bitmapTintDefinition(filterId, run.colour));
|
|
143
|
+
return `<g clip-path="url(#${clipId})" filter="url(#${filterId})" data-font-colour="${run.colour}">${glyphs}</g>`;
|
|
144
|
+
}
|
|
145
|
+
return `<g clip-path="url(#${clipId})" fill="${run.colour}" stroke="${text.borderColour ?? '#12151a'}" data-font-colour="${run.colour}">${glyphs}</g>`;
|
|
146
|
+
});
|
|
147
|
+
return `<g data-hoi4-colour-runs="true" data-font-sha256="${glyphLine.sourceHash}"><defs>${definitions.join('')}</defs>${renderedRuns.join('')}${inlineIconMarkup}</g>`;
|
|
148
|
+
}
|
|
105
149
|
if (colourRuns.length > 0) {
|
|
106
150
|
return `<g data-hoi4-colour-runs="true">${colourRuns
|
|
107
151
|
.map((run) => toolText.render(run.text, {
|
|
@@ -109,31 +153,29 @@ function renderText(element, toolText) {
|
|
|
109
153
|
y: baseline,
|
|
110
154
|
fontSize: text.fontSize,
|
|
111
155
|
fill: run.colour,
|
|
112
|
-
stroke: '#12151a',
|
|
156
|
+
stroke: text.borderColour ?? '#12151a',
|
|
113
157
|
strokeWidth: 0.6,
|
|
114
158
|
...(run.width > 0 ? { targetWidth: run.width * horizontalScale } : {}),
|
|
115
159
|
}))
|
|
116
160
|
.join('')}${inlineIconMarkup}</g>`;
|
|
117
161
|
}
|
|
118
162
|
if (glyphLine?.source === 'fontkit-path') {
|
|
119
|
-
return `<g data-font-sha256="${glyphLine.sourceHash}">${glyphLine
|
|
120
|
-
.filter((glyph) => glyph.kind === 'outline')
|
|
121
|
-
.map((glyph) => `<use href="#${outlineDefinitionId(glyph.key)}" transform="translate(${finite(originX + glyph.x * horizontalScale)} ${finite(baseline + glyph.y)}) scale(${finite(glyph.scale * horizontalScale)} ${finite(-glyph.scale)})"/>`)
|
|
122
|
-
.join('')}${inlineIconMarkup}</g>`;
|
|
163
|
+
return `<g data-font-sha256="${glyphLine.sourceHash}" fill="${text.colour ?? '#f5f2e8'}" stroke="${text.borderColour ?? '#12151a'}" data-font-colour="${text.colour ?? '#f5f2e8'}">${actualGlyphMarkup(glyphLine, originX, baseline, horizontalScale)}${inlineIconMarkup}</g>`;
|
|
123
164
|
}
|
|
124
165
|
if (glyphLine?.source === 'bmfont-atlas') {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
166
|
+
const glyphs = actualGlyphMarkup(glyphLine, originX, baseline, horizontalScale);
|
|
167
|
+
if (text.colour === undefined)
|
|
168
|
+
return `<g data-font-sha256="${glyphLine.sourceHash}">${glyphs}${inlineIconMarkup}</g>`;
|
|
169
|
+
const filterId = `gui-font-tint-${sha256Bytes(`${element.id}:${index}:${text.colour}`).slice(0, 20)}`;
|
|
170
|
+
return `<g data-font-sha256="${glyphLine.sourceHash}" data-font-colour="${text.colour}"><defs>${bitmapTintDefinition(filterId, text.colour)}</defs><g filter="url(#${filterId})">${glyphs}</g>${inlineIconMarkup}</g>`;
|
|
129
171
|
}
|
|
130
172
|
const visibleLine = line.replace(/[\uE000-\uF8FF]/gu, ' ');
|
|
131
173
|
return `<g>${toolText.render(visibleLine, {
|
|
132
174
|
x: originX,
|
|
133
175
|
y: baseline,
|
|
134
176
|
fontSize: text.fontSize,
|
|
135
|
-
fill: '#f5f2e8',
|
|
136
|
-
stroke: '#12151a',
|
|
177
|
+
fill: text.colour ?? '#f5f2e8',
|
|
178
|
+
stroke: text.borderColour ?? '#12151a',
|
|
137
179
|
strokeWidth: 0.6,
|
|
138
180
|
...(width > 0 ? { targetWidth: width } : {}),
|
|
139
181
|
})}${inlineIconMarkup}</g>`;
|
|
@@ -188,6 +188,15 @@ function boolScalar(block, ...keys) {
|
|
|
188
188
|
return false;
|
|
189
189
|
return undefined;
|
|
190
190
|
}
|
|
191
|
+
function paradoxColour(value) {
|
|
192
|
+
if (value === undefined)
|
|
193
|
+
return undefined;
|
|
194
|
+
const match = /^0x([0-9a-f]{8})$/iu.exec(value.trim());
|
|
195
|
+
if (match === null)
|
|
196
|
+
return undefined;
|
|
197
|
+
const argb = match[1];
|
|
198
|
+
return `#${argb.slice(2)}${argb.slice(0, 2)}`.toLowerCase();
|
|
199
|
+
}
|
|
191
200
|
function sizeFrom(block) {
|
|
192
201
|
const size = childBlocks(block, 'size')[0];
|
|
193
202
|
if (size === undefined)
|
|
@@ -425,6 +434,8 @@ function indexSpritesAndFonts(document, file, fileNodeId, nodes, edges, sprites,
|
|
|
425
434
|
const languages = childBlocks(child, 'languages').flatMap((languageBlock) => languageBlock.entries
|
|
426
435
|
.filter((entry) => entry.type === 'scalar')
|
|
427
436
|
.map((entry) => entry.value));
|
|
437
|
+
const colour = paradoxColour(firstScalarInsensitive(child, 'color', 'colour'));
|
|
438
|
+
const borderColour = paradoxColour(firstScalarInsensitive(child, 'border_color', 'borderColor', 'border_colour'));
|
|
428
439
|
const id = deterministicId('gui_font', { path: file.displayPath, name });
|
|
429
440
|
const font = {
|
|
430
441
|
id,
|
|
@@ -435,6 +446,8 @@ function indexSpritesAndFonts(document, file, fileNodeId, nodes, edges, sprites,
|
|
|
435
446
|
override: assignment.key.value === 'bitmapfont_override',
|
|
436
447
|
languages,
|
|
437
448
|
assetPaths,
|
|
449
|
+
...(colour === undefined ? {} : { colour }),
|
|
450
|
+
...(borderColour === undefined ? {} : { borderColour }),
|
|
438
451
|
rawSource: raw(document, assignment),
|
|
439
452
|
};
|
|
440
453
|
addDomainEntry(fonts, font, 'font');
|
|
@@ -449,6 +462,8 @@ function indexSpritesAndFonts(document, file, fileNodeId, nodes, edges, sprites,
|
|
|
449
462
|
override: font.override,
|
|
450
463
|
languages,
|
|
451
464
|
assetPaths,
|
|
465
|
+
...(colour === undefined ? {} : { colour }),
|
|
466
|
+
...(borderColour === undefined ? {} : { borderColour }),
|
|
452
467
|
},
|
|
453
468
|
});
|
|
454
469
|
addEdge(edges, 'contains', fileNodeId, id, true, {}, font.location);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LATEST_PROTOCOL_VERSION } from '@modelcontextprotocol/sdk/types.js';
|
|
2
2
|
export const PACKAGE_NAME = 'hoi4-agent-tools';
|
|
3
|
-
export const PACKAGE_VERSION = '2.8.
|
|
3
|
+
export const PACKAGE_VERSION = '2.8.4';
|
|
4
4
|
export const MCP_PROTOCOL_VERSION = LATEST_PROTOCOL_VERSION;
|
|
5
5
|
export const CONFIG_VERSION = 1;
|
|
6
6
|
export const TRANSACTION_VERSION = 1;
|
package/docs/gui.md
CHANGED
|
@@ -33,7 +33,7 @@ Inspection checks missing assets and localisation, invalid sizes, overlap, clipp
|
|
|
33
33
|
|
|
34
34
|
The renderer resolves sprites and fonts through the complete mod, dependency, and installed-game load order. Mod windows therefore render ordinary vanilla sprites, tiled vanilla panels, progress bars, masked shields, button frames, and localisation icons such as `£command_power` without copying game assets into the mod. Case differences in GFX and font identifiers do not prevent a valid asset from resolving.
|
|
35
35
|
|
|
36
|
-
Bitmap text uses the language-appropriate HOI4 font definition and its real glyph atlas. The default language uses the base font rather than an unrelated language override, and the renderer recognizes installed-game atlases whose filename omits a page suffix declared by the matching `.fnt` file.
|
|
36
|
+
Bitmap text uses the language-appropriate HOI4 font definition and its real glyph atlas. Header, serif, compact, typewriter, black, inverted, and other declared faces keep their own glyph shapes, native metrics, face colour, border colour, and language override. HOI4 localisation colour runs such as `§Y` and `§R` recolour those same native glyphs instead of switching to the tool font. The default language uses the base font rather than an unrelated language override, and the renderer recognizes installed-game atlases whose filename omits a page suffix declared by the matching `.fnt` file.
|
|
37
37
|
|
|
38
38
|
Layout follows Clausewitz orientation and element-origin anchors, including `CENTER_LEFT`, `CENTER_RIGHT`, `CENTER_UP`, `CENTER_DOWN`, `origo`, `centerposition`, inherited container coordinate origins, local scale, and both `%` and `%%` relative dimensions. Text boxes use native font metrics together with `maxWidth`, `maxHeight`, alignment, wrapping, and `fixedsize` clipping. Cornered tile sprites use fixed nine-slice borders and optional center tiling; progress bars composite their filled and background textures; masked shields composite their background and mask textures.
|
|
39
39
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hoi4-agent-tools",
|
|
3
3
|
"mcpName": "io.github.klimPaskov/hoi4-agent-tools",
|
|
4
|
-
"version": "2.8.
|
|
4
|
+
"version": "2.8.4",
|
|
5
5
|
"description": "Analyze HOI4 events, tech trees, AI weights, and MTTH; build focus trees, GUIs, and maps.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/configuration.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/continuous-focus-palette.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/custom-weighted-pool.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/event-feature-manifest.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/focus-plan.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/focus-planning-sidecar.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/gui-animation-source.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/gui-helper.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/gui-scenario.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/map-operation.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"oneOf": [
|
|
5
5
|
{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/operation-result.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/probability-analysis-result.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/probability-compare-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/probability-evaluate-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/probability-inspect-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/probability-render-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/probability-scenario-set.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/probability-sequence-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/probability-simulate-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.
|
|
2
|
+
"$id": "https://github.com/klimPaskov/hoi4-agent-tools/blob/v2.8.4/schemas/probability-sweep-input.schema.json",
|
|
3
3
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"properties": {
|
package/server.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "io.github.klimPaskov/hoi4-agent-tools",
|
|
4
4
|
"title": "HOI4 Agent Tools",
|
|
5
5
|
"description": "Analyze HOI4 events, tech trees, AI weights, and MTTH; build focus trees, GUIs, and maps.",
|
|
6
|
-
"version": "2.8.
|
|
6
|
+
"version": "2.8.4",
|
|
7
7
|
"repository": {
|
|
8
8
|
"url": "https://github.com/klimPaskov/hoi4-agent-tools",
|
|
9
9
|
"source": "github"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
{
|
|
14
14
|
"registryType": "npm",
|
|
15
15
|
"identifier": "hoi4-agent-tools",
|
|
16
|
-
"version": "2.8.
|
|
16
|
+
"version": "2.8.4",
|
|
17
17
|
"transport": {
|
|
18
18
|
"type": "stdio"
|
|
19
19
|
}
|