warhammer-oracle 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/README.md +147 -0
- package/dist/data/keywords.d.ts +3 -0
- package/dist/data/keywords.d.ts.map +1 -0
- package/dist/data/keywords.js +193 -0
- package/dist/data/keywords.js.map +1 -0
- package/dist/data/kill-team-operatives.d.ts +3 -0
- package/dist/data/kill-team-operatives.d.ts.map +1 -0
- package/dist/data/kill-team-operatives.js +24956 -0
- package/dist/data/kill-team-operatives.js.map +1 -0
- package/dist/data/kill-team-rules.d.ts +5 -0
- package/dist/data/kill-team-rules.d.ts.map +1 -0
- package/dist/data/kill-team-rules.js +94 -0
- package/dist/data/kill-team-rules.js.map +1 -0
- package/dist/data/phases.d.ts +3 -0
- package/dist/data/phases.d.ts.map +1 -0
- package/dist/data/phases.js +232 -0
- package/dist/data/phases.js.map +1 -0
- package/dist/data/rules.d.ts +5 -0
- package/dist/data/rules.d.ts.map +1 -0
- package/dist/data/rules.js +138 -0
- package/dist/data/rules.js.map +1 -0
- package/dist/data/units.d.ts +3 -0
- package/dist/data/units.d.ts.map +1 -0
- package/dist/data/units.js +222240 -0
- package/dist/data/units.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/search.d.ts +2 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +14 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/xml-parser.d.ts +28 -0
- package/dist/lib/xml-parser.d.ts.map +1 -0
- package/dist/lib/xml-parser.js +411 -0
- package/dist/lib/xml-parser.js.map +1 -0
- package/dist/lib/xml-parser.test.d.ts +2 -0
- package/dist/lib/xml-parser.test.d.ts.map +1 -0
- package/dist/lib/xml-parser.test.js +202 -0
- package/dist/lib/xml-parser.test.js.map +1 -0
- package/dist/register-tools.d.ts +3 -0
- package/dist/register-tools.d.ts.map +1 -0
- package/dist/register-tools.js +15 -0
- package/dist/register-tools.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +11 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/compare-units.d.ts +3 -0
- package/dist/tools/compare-units.d.ts.map +1 -0
- package/dist/tools/compare-units.js +191 -0
- package/dist/tools/compare-units.js.map +1 -0
- package/dist/tools/game-flow.d.ts +3 -0
- package/dist/tools/game-flow.d.ts.map +1 -0
- package/dist/tools/game-flow.js +119 -0
- package/dist/tools/game-flow.js.map +1 -0
- package/dist/tools/lookup-keyword.d.ts +3 -0
- package/dist/tools/lookup-keyword.d.ts.map +1 -0
- package/dist/tools/lookup-keyword.js +84 -0
- package/dist/tools/lookup-keyword.js.map +1 -0
- package/dist/tools/lookup-phase.d.ts +3 -0
- package/dist/tools/lookup-phase.d.ts.map +1 -0
- package/dist/tools/lookup-phase.js +74 -0
- package/dist/tools/lookup-phase.js.map +1 -0
- package/dist/tools/lookup-unit.d.ts +3 -0
- package/dist/tools/lookup-unit.d.ts.map +1 -0
- package/dist/tools/lookup-unit.js +175 -0
- package/dist/tools/lookup-unit.js.map +1 -0
- package/dist/tools/search-units.d.ts +3 -0
- package/dist/tools/search-units.d.ts.map +1 -0
- package/dist/tools/search-units.js +108 -0
- package/dist/tools/search-units.js.map +1 -0
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +39 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { createServer } from "./server.js";
|
|
4
|
+
console.error("Warhammer Oracle v0.1.0 — Warhammer rules & stats MCP server");
|
|
5
|
+
const server = createServer();
|
|
6
|
+
const transport = new StdioServerTransport();
|
|
7
|
+
await server.connect(transport);
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;AAE9E,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/lib/search.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAClB,CAAC,EAAE,CAeL"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function fuzzySearch(items, query, fields) {
|
|
2
|
+
if (!query.trim())
|
|
3
|
+
return [...items];
|
|
4
|
+
const lower = query.toLowerCase();
|
|
5
|
+
return items.filter((item) => fields.some((field) => {
|
|
6
|
+
const value = item[field];
|
|
7
|
+
if (typeof value === "string")
|
|
8
|
+
return value.toLowerCase().includes(lower);
|
|
9
|
+
if (Array.isArray(value))
|
|
10
|
+
return value.some((v) => typeof v === "string" && v.toLowerCase().includes(lower));
|
|
11
|
+
return false;
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/lib/search.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CACzB,KAAU,EACV,KAAa,EACb,MAAmB;IAEnB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ;YAC3B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACtB,OAAO,KAAK,CAAC,IAAI,CACf,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAChE,CAAC;QACJ,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { XMLParser } from "fast-xml-parser";
|
|
2
|
+
import type { Unit, KillTeamOperative } from "../types.js";
|
|
3
|
+
declare const parser: XMLParser;
|
|
4
|
+
declare function ensureArray<T>(val: T | T[] | undefined | null): T[];
|
|
5
|
+
declare function extractFaction(catalogueName: string): string;
|
|
6
|
+
/** Collect all profiles from direct profiles, sub-entries, and entry groups */
|
|
7
|
+
declare function collectAllProfiles(entry: any): any[];
|
|
8
|
+
export { parser as xmlParser, ensureArray };
|
|
9
|
+
/**
|
|
10
|
+
* Parse a single raw XML entry node (from sharedSelectionEntries or selectionEntries)
|
|
11
|
+
* into a Unit object. Used by fetch-data.ts for cross-catalogue entryLink resolution.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseEntryNode(entry: any, faction: string, allProfiles?: any[]): Unit | null;
|
|
14
|
+
export { extractFaction, collectAllProfiles };
|
|
15
|
+
export type GameSystemResult = {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
rules: {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
}[];
|
|
23
|
+
};
|
|
24
|
+
export declare function parseGameSystem(xml: string): GameSystemResult;
|
|
25
|
+
export declare function parseKillTeamGameSystem(xml: string): GameSystemResult;
|
|
26
|
+
export declare function parseKillTeamCatalogue(xml: string): KillTeamOperative[];
|
|
27
|
+
export declare function parseCatalogue(xml: string): Unit[];
|
|
28
|
+
//# sourceMappingURL=xml-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../src/lib/xml-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EACV,IAAI,EAKJ,iBAAiB,EAGlB,MAAM,aAAa,CAAC;AA6BrB,QAAA,MAAM,MAAM,WAQV,CAAC;AAIH,iBAAS,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,CAAC,EAAE,CAG5D;AAsBD,iBAAS,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAQrD;AAqED,+EAA+E;AAC/E,iBAAS,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,CAuB7C;AAqBD,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,WAAW,EAAE,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,GAAG,EACV,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,GAAG,EAAE,GAClB,IAAI,GAAG,IAAI,CAmBb;AAED,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;AAI9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5D,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAoB7D;AA8ED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAErE;AAgFD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAqCvE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,CAmClD"}
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { XMLParser } from "fast-xml-parser";
|
|
2
|
+
// === Profile type IDs from BattleScribe 40k 10th Edition ===
|
|
3
|
+
const UNIT_PROFILE_TYPE_ID = "c547-1836-d8a-ff4f";
|
|
4
|
+
const RANGED_WEAPON_TYPE_ID = "f77d-b953-8fa4-b762";
|
|
5
|
+
const MELEE_WEAPON_TYPE_ID = "8a40-4aaa-c780-9046";
|
|
6
|
+
const ABILITY_TYPE_ID = "9cc3-6d83-4dd3-9b64";
|
|
7
|
+
const POINTS_COST_TYPE_ID = "51b2-306e-1021-d207";
|
|
8
|
+
// === Profile type IDs from BattleScribe Kill Team (2024) ===
|
|
9
|
+
const KT_OPERATIVE_PROFILE_TYPE_ID = "5156-3fb9-39ce-7bdb";
|
|
10
|
+
const KT_WEAPON_TYPE_ID = "f25f-4b13-b724-d5a8";
|
|
11
|
+
const KT_ABILITY_TYPE_ID = "f887-5881-0e6d-755c";
|
|
12
|
+
const KT_UNIQUE_ACTION_TYPE_ID = "0ef1-ffa2-bd78-c722";
|
|
13
|
+
const KT_POINTS_COST_TYPE_ID = "c61a-51a3-370d-bf55";
|
|
14
|
+
// Tags that may appear as single element or array
|
|
15
|
+
const ARRAY_TAGS = [
|
|
16
|
+
"selectionEntry",
|
|
17
|
+
"selectionEntryGroup",
|
|
18
|
+
"profile",
|
|
19
|
+
"characteristic",
|
|
20
|
+
"cost",
|
|
21
|
+
"categoryLink",
|
|
22
|
+
"rule",
|
|
23
|
+
"entryLink",
|
|
24
|
+
"catalogueLink",
|
|
25
|
+
];
|
|
26
|
+
const parser = new XMLParser({
|
|
27
|
+
ignoreAttributes: false,
|
|
28
|
+
attributeNamePrefix: "@_",
|
|
29
|
+
textNodeName: "#text",
|
|
30
|
+
isArray: (_name, jpath) => {
|
|
31
|
+
const tag = String(jpath).split(".").pop() ?? "";
|
|
32
|
+
return ARRAY_TAGS.includes(tag);
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
// === Helpers ===
|
|
36
|
+
function ensureArray(val) {
|
|
37
|
+
if (val == null)
|
|
38
|
+
return [];
|
|
39
|
+
return Array.isArray(val) ? val : [val];
|
|
40
|
+
}
|
|
41
|
+
function getCharacteristic(characteristics, name) {
|
|
42
|
+
const char = characteristics.find((c) => c["@_name"] === name);
|
|
43
|
+
if (!char)
|
|
44
|
+
return "";
|
|
45
|
+
const text = char["#text"];
|
|
46
|
+
return text != null ? String(text) : "";
|
|
47
|
+
}
|
|
48
|
+
function parseWeaponKeywords(raw) {
|
|
49
|
+
if (!raw || raw.trim() === "")
|
|
50
|
+
return [];
|
|
51
|
+
return raw
|
|
52
|
+
.split(",")
|
|
53
|
+
.map((k) => k.trim())
|
|
54
|
+
.filter((k) => k.length > 0);
|
|
55
|
+
}
|
|
56
|
+
function extractFaction(catalogueName) {
|
|
57
|
+
// "Imperium - Space Marines" → "Space Marines"
|
|
58
|
+
// "Xenos - Leagues of Votann" → "Leagues of Votann"
|
|
59
|
+
const dashIndex = catalogueName.indexOf(" - ");
|
|
60
|
+
if (dashIndex >= 0) {
|
|
61
|
+
return catalogueName.substring(dashIndex + 3);
|
|
62
|
+
}
|
|
63
|
+
return catalogueName;
|
|
64
|
+
}
|
|
65
|
+
// === Profile extractors ===
|
|
66
|
+
function extractUnitProfiles(profiles) {
|
|
67
|
+
return profiles
|
|
68
|
+
.filter((p) => p["@_typeId"] === UNIT_PROFILE_TYPE_ID)
|
|
69
|
+
.map((p) => {
|
|
70
|
+
const chars = ensureArray(p.characteristics?.characteristic);
|
|
71
|
+
return {
|
|
72
|
+
name: p["@_name"],
|
|
73
|
+
movement: getCharacteristic(chars, "M"),
|
|
74
|
+
toughness: getCharacteristic(chars, "T"),
|
|
75
|
+
save: getCharacteristic(chars, "SV"),
|
|
76
|
+
wounds: getCharacteristic(chars, "W"),
|
|
77
|
+
leadership: getCharacteristic(chars, "LD"),
|
|
78
|
+
objectiveControl: getCharacteristic(chars, "OC"),
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function extractRangedWeapons(profiles) {
|
|
83
|
+
return profiles
|
|
84
|
+
.filter((p) => p["@_typeId"] === RANGED_WEAPON_TYPE_ID)
|
|
85
|
+
.map((p) => {
|
|
86
|
+
const chars = ensureArray(p.characteristics?.characteristic);
|
|
87
|
+
return {
|
|
88
|
+
name: p["@_name"],
|
|
89
|
+
range: getCharacteristic(chars, "Range"),
|
|
90
|
+
attacks: getCharacteristic(chars, "A"),
|
|
91
|
+
ballisticSkill: getCharacteristic(chars, "BS"),
|
|
92
|
+
strength: getCharacteristic(chars, "S"),
|
|
93
|
+
armourPenetration: getCharacteristic(chars, "AP"),
|
|
94
|
+
damage: getCharacteristic(chars, "D"),
|
|
95
|
+
keywords: parseWeaponKeywords(getCharacteristic(chars, "Keywords")),
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function extractMeleeWeapons(profiles) {
|
|
100
|
+
return profiles
|
|
101
|
+
.filter((p) => p["@_typeId"] === MELEE_WEAPON_TYPE_ID)
|
|
102
|
+
.map((p) => {
|
|
103
|
+
const chars = ensureArray(p.characteristics?.characteristic);
|
|
104
|
+
return {
|
|
105
|
+
name: p["@_name"],
|
|
106
|
+
range: getCharacteristic(chars, "Range"),
|
|
107
|
+
attacks: getCharacteristic(chars, "A"),
|
|
108
|
+
weaponSkill: getCharacteristic(chars, "WS"),
|
|
109
|
+
strength: getCharacteristic(chars, "S"),
|
|
110
|
+
armourPenetration: getCharacteristic(chars, "AP"),
|
|
111
|
+
damage: getCharacteristic(chars, "D"),
|
|
112
|
+
keywords: parseWeaponKeywords(getCharacteristic(chars, "Keywords")),
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
function extractAbilities(profiles) {
|
|
117
|
+
return profiles
|
|
118
|
+
.filter((p) => p["@_typeId"] === ABILITY_TYPE_ID)
|
|
119
|
+
.map((p) => {
|
|
120
|
+
const chars = ensureArray(p.characteristics?.characteristic);
|
|
121
|
+
return {
|
|
122
|
+
name: p["@_name"],
|
|
123
|
+
description: getCharacteristic(chars, "Description"),
|
|
124
|
+
};
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/** Collect all profiles from direct profiles, sub-entries, and entry groups */
|
|
128
|
+
function collectAllProfiles(entry) {
|
|
129
|
+
const directProfiles = ensureArray(entry.profiles?.profile);
|
|
130
|
+
// Profiles from selectionEntries (sub-entries)
|
|
131
|
+
const subEntries = ensureArray(entry.selectionEntries?.selectionEntry);
|
|
132
|
+
const subProfiles = subEntries.flatMap((sub) => ensureArray(sub.profiles?.profile));
|
|
133
|
+
// Profiles from selectionEntryGroups
|
|
134
|
+
const groups = ensureArray(entry.selectionEntryGroups?.selectionEntryGroup);
|
|
135
|
+
const groupProfiles = groups.flatMap((group) => {
|
|
136
|
+
const groupEntries = ensureArray(group.selectionEntries?.selectionEntry);
|
|
137
|
+
return groupEntries.flatMap((ge) => ensureArray(ge.profiles?.profile));
|
|
138
|
+
});
|
|
139
|
+
return [...directProfiles, ...subProfiles, ...groupProfiles];
|
|
140
|
+
}
|
|
141
|
+
function extractPoints(entry) {
|
|
142
|
+
const costs = ensureArray(entry.costs?.cost);
|
|
143
|
+
const ptsCost = costs.find((c) => c["@_typeId"] === POINTS_COST_TYPE_ID);
|
|
144
|
+
if (!ptsCost)
|
|
145
|
+
return null;
|
|
146
|
+
return Number(ptsCost["@_value"]);
|
|
147
|
+
}
|
|
148
|
+
function extractKeywords(entry) {
|
|
149
|
+
const links = ensureArray(entry.categoryLinks?.categoryLink);
|
|
150
|
+
return links
|
|
151
|
+
.filter((cl) => cl["@_hidden"] !== "true")
|
|
152
|
+
.map((cl) => cl["@_name"])
|
|
153
|
+
.filter((name) => !name.startsWith("Faction:"));
|
|
154
|
+
}
|
|
155
|
+
// === Exported helpers for fetch-data.ts cross-catalogue resolution ===
|
|
156
|
+
export { parser as xmlParser, ensureArray };
|
|
157
|
+
/**
|
|
158
|
+
* Parse a single raw XML entry node (from sharedSelectionEntries or selectionEntries)
|
|
159
|
+
* into a Unit object. Used by fetch-data.ts for cross-catalogue entryLink resolution.
|
|
160
|
+
*/
|
|
161
|
+
export function parseEntryNode(entry, faction, allProfiles) {
|
|
162
|
+
const type = entry["@_type"];
|
|
163
|
+
const hidden = entry["@_hidden"] === "true";
|
|
164
|
+
if (hidden || (type !== "unit" && type !== "model"))
|
|
165
|
+
return null;
|
|
166
|
+
const profiles = allProfiles ?? collectAllProfiles(entry);
|
|
167
|
+
return {
|
|
168
|
+
id: entry["@_id"],
|
|
169
|
+
name: entry["@_name"],
|
|
170
|
+
faction,
|
|
171
|
+
keywords: extractKeywords(entry),
|
|
172
|
+
profiles: extractUnitProfiles(profiles),
|
|
173
|
+
rangedWeapons: extractRangedWeapons(profiles),
|
|
174
|
+
meleeWeapons: extractMeleeWeapons(profiles),
|
|
175
|
+
abilities: extractAbilities(profiles),
|
|
176
|
+
points: extractPoints(entry),
|
|
177
|
+
gameSystem: "wh40k-10e",
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
export { extractFaction, collectAllProfiles };
|
|
181
|
+
export function parseGameSystem(xml) {
|
|
182
|
+
const parsed = parser.parse(xml);
|
|
183
|
+
const gs = parsed.gameSystem;
|
|
184
|
+
// Rules may be in <rules> and/or <sharedRules>
|
|
185
|
+
const directRules = ensureArray(gs.rules?.rule);
|
|
186
|
+
const sharedRules = ensureArray(gs.sharedRules?.rule);
|
|
187
|
+
const allRuleNodes = [...directRules, ...sharedRules];
|
|
188
|
+
const rules = allRuleNodes.map((r) => ({
|
|
189
|
+
id: r["@_id"],
|
|
190
|
+
name: r["@_name"],
|
|
191
|
+
description: r.description ?? "",
|
|
192
|
+
}));
|
|
193
|
+
return {
|
|
194
|
+
id: gs["@_id"],
|
|
195
|
+
name: gs["@_name"],
|
|
196
|
+
rules,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// === Kill Team profile extractors ===
|
|
200
|
+
function extractKTOperativeProfile(profiles) {
|
|
201
|
+
const p = profiles.find((p) => p["@_typeId"] === KT_OPERATIVE_PROFILE_TYPE_ID);
|
|
202
|
+
if (!p)
|
|
203
|
+
return null;
|
|
204
|
+
const chars = ensureArray(p.characteristics?.characteristic);
|
|
205
|
+
return {
|
|
206
|
+
name: p["@_name"],
|
|
207
|
+
apl: getCharacteristic(chars, "APL"),
|
|
208
|
+
movement: getCharacteristic(chars, "Move"),
|
|
209
|
+
save: getCharacteristic(chars, "Save"),
|
|
210
|
+
wounds: getCharacteristic(chars, "Wounds"),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function extractKTWeapons(profiles) {
|
|
214
|
+
return profiles
|
|
215
|
+
.filter((p) => p["@_typeId"] === KT_WEAPON_TYPE_ID)
|
|
216
|
+
.map((p) => {
|
|
217
|
+
const chars = ensureArray(p.characteristics?.characteristic);
|
|
218
|
+
const rawName = p["@_name"] ?? "";
|
|
219
|
+
let type = "melee";
|
|
220
|
+
let name = rawName;
|
|
221
|
+
if (rawName.startsWith("\u2316")) {
|
|
222
|
+
// ⌖ = ranged
|
|
223
|
+
type = "ranged";
|
|
224
|
+
name = rawName.replace(/^\u2316\s*/, "");
|
|
225
|
+
}
|
|
226
|
+
else if (rawName.startsWith("\u2694")) {
|
|
227
|
+
// ⚔ = melee
|
|
228
|
+
type = "melee";
|
|
229
|
+
name = rawName.replace(/^\u2694\s*/, "");
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
name,
|
|
233
|
+
attacks: getCharacteristic(chars, "ATK"),
|
|
234
|
+
hit: getCharacteristic(chars, "HIT"),
|
|
235
|
+
damage: getCharacteristic(chars, "DMG"),
|
|
236
|
+
weaponRules: getCharacteristic(chars, "WR"),
|
|
237
|
+
type,
|
|
238
|
+
};
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
function extractKTAbilities(profiles) {
|
|
242
|
+
return profiles
|
|
243
|
+
.filter((p) => p["@_typeId"] === KT_ABILITY_TYPE_ID)
|
|
244
|
+
.map((p) => {
|
|
245
|
+
const chars = ensureArray(p.characteristics?.characteristic);
|
|
246
|
+
return {
|
|
247
|
+
name: p["@_name"],
|
|
248
|
+
description: getCharacteristic(chars, "Ability"),
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
function extractKTUniqueActions(profiles) {
|
|
253
|
+
return profiles
|
|
254
|
+
.filter((p) => p["@_typeId"] === KT_UNIQUE_ACTION_TYPE_ID)
|
|
255
|
+
.map((p) => {
|
|
256
|
+
const chars = ensureArray(p.characteristics?.characteristic);
|
|
257
|
+
// Unique actions may have a "Description" or "Ability" characteristic
|
|
258
|
+
const desc = getCharacteristic(chars, "Description") || getCharacteristic(chars, "Ability");
|
|
259
|
+
return {
|
|
260
|
+
name: p["@_name"],
|
|
261
|
+
description: desc,
|
|
262
|
+
};
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
function extractKTFaction(catalogueName) {
|
|
266
|
+
// "2024 - Faction Name" → "Faction Name"
|
|
267
|
+
const match = catalogueName.match(/^2024\s*-\s*(.+)$/);
|
|
268
|
+
if (match)
|
|
269
|
+
return match[1];
|
|
270
|
+
return extractFaction(catalogueName);
|
|
271
|
+
}
|
|
272
|
+
export function parseKillTeamGameSystem(xml) {
|
|
273
|
+
return parseGameSystem(xml);
|
|
274
|
+
}
|
|
275
|
+
/** Build an index of shared selection entries by id for entryLink resolution */
|
|
276
|
+
function buildSharedEntryIndex(cat) {
|
|
277
|
+
const index = new Map();
|
|
278
|
+
const sharedEntries = ensureArray(cat.sharedSelectionEntries?.selectionEntry);
|
|
279
|
+
for (const entry of sharedEntries) {
|
|
280
|
+
if (entry["@_id"]) {
|
|
281
|
+
index.set(entry["@_id"], entry);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Also index entries from sharedSelectionEntryGroups
|
|
285
|
+
const sharedGroups = ensureArray(cat.sharedSelectionEntryGroups?.selectionEntryGroup);
|
|
286
|
+
for (const group of sharedGroups) {
|
|
287
|
+
if (group["@_id"]) {
|
|
288
|
+
index.set(group["@_id"], group);
|
|
289
|
+
}
|
|
290
|
+
const groupEntries = ensureArray(group.selectionEntries?.selectionEntry);
|
|
291
|
+
for (const entry of groupEntries) {
|
|
292
|
+
if (entry["@_id"]) {
|
|
293
|
+
index.set(entry["@_id"], entry);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return index;
|
|
298
|
+
}
|
|
299
|
+
/** Collect profiles from an entry, resolving entryLinks to shared entries */
|
|
300
|
+
function collectAllProfilesWithLinks(entry, sharedIndex) {
|
|
301
|
+
const profiles = collectAllProfiles(entry);
|
|
302
|
+
// Resolve entryLinks on the entry itself
|
|
303
|
+
const entryLinks = ensureArray(entry.entryLinks?.entryLink);
|
|
304
|
+
for (const link of entryLinks) {
|
|
305
|
+
const targetId = link["@_targetId"];
|
|
306
|
+
if (targetId) {
|
|
307
|
+
const target = sharedIndex.get(targetId);
|
|
308
|
+
if (target) {
|
|
309
|
+
profiles.push(...ensureArray(target.profiles?.profile));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Resolve entryLinks inside selectionEntryGroups
|
|
314
|
+
const groups = ensureArray(entry.selectionEntryGroups?.selectionEntryGroup);
|
|
315
|
+
for (const group of groups) {
|
|
316
|
+
const groupLinks = ensureArray(group.entryLinks?.entryLink);
|
|
317
|
+
for (const link of groupLinks) {
|
|
318
|
+
const targetId = link["@_targetId"];
|
|
319
|
+
if (targetId) {
|
|
320
|
+
const target = sharedIndex.get(targetId);
|
|
321
|
+
if (target) {
|
|
322
|
+
profiles.push(...ensureArray(target.profiles?.profile));
|
|
323
|
+
// Also check sub-entries of the resolved target
|
|
324
|
+
const targetSubEntries = ensureArray(target.selectionEntries?.selectionEntry);
|
|
325
|
+
for (const sub of targetSubEntries) {
|
|
326
|
+
profiles.push(...ensureArray(sub.profiles?.profile));
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// Also resolve entryLinks inside sub-selectionEntries of groups
|
|
332
|
+
const groupEntries = ensureArray(group.selectionEntries?.selectionEntry);
|
|
333
|
+
for (const ge of groupEntries) {
|
|
334
|
+
const geLinks = ensureArray(ge.entryLinks?.entryLink);
|
|
335
|
+
for (const link of geLinks) {
|
|
336
|
+
const targetId = link["@_targetId"];
|
|
337
|
+
if (targetId) {
|
|
338
|
+
const target = sharedIndex.get(targetId);
|
|
339
|
+
if (target) {
|
|
340
|
+
profiles.push(...ensureArray(target.profiles?.profile));
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return profiles;
|
|
347
|
+
}
|
|
348
|
+
export function parseKillTeamCatalogue(xml) {
|
|
349
|
+
const parsed = parser.parse(xml);
|
|
350
|
+
const cat = parsed.catalogue;
|
|
351
|
+
const faction = extractKTFaction(cat["@_name"]);
|
|
352
|
+
const sharedIndex = buildSharedEntryIndex(cat);
|
|
353
|
+
const directEntries = ensureArray(cat.selectionEntries?.selectionEntry);
|
|
354
|
+
const sharedEntries = ensureArray(cat.sharedSelectionEntries?.selectionEntry);
|
|
355
|
+
const entries = [...directEntries, ...sharedEntries];
|
|
356
|
+
const operatives = [];
|
|
357
|
+
for (const entry of entries) {
|
|
358
|
+
const type = entry["@_type"];
|
|
359
|
+
const hidden = entry["@_hidden"] === "true";
|
|
360
|
+
if (hidden || (type !== "unit" && type !== "model"))
|
|
361
|
+
continue;
|
|
362
|
+
const allProfiles = collectAllProfilesWithLinks(entry, sharedIndex);
|
|
363
|
+
const profile = extractKTOperativeProfile(allProfiles);
|
|
364
|
+
if (!profile)
|
|
365
|
+
continue;
|
|
366
|
+
operatives.push({
|
|
367
|
+
id: entry["@_id"],
|
|
368
|
+
name: entry["@_name"],
|
|
369
|
+
faction,
|
|
370
|
+
keywords: extractKeywords(entry),
|
|
371
|
+
profile,
|
|
372
|
+
weapons: extractKTWeapons(allProfiles),
|
|
373
|
+
abilities: extractKTAbilities(allProfiles),
|
|
374
|
+
uniqueActions: extractKTUniqueActions(allProfiles),
|
|
375
|
+
gameSystem: "wh40k-killteam",
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
return operatives;
|
|
379
|
+
}
|
|
380
|
+
export function parseCatalogue(xml) {
|
|
381
|
+
const parsed = parser.parse(xml);
|
|
382
|
+
const cat = parsed.catalogue;
|
|
383
|
+
const faction = extractFaction(cat["@_name"]);
|
|
384
|
+
// Units may be in <selectionEntries> and/or <sharedSelectionEntries>
|
|
385
|
+
const directEntries = ensureArray(cat.selectionEntries?.selectionEntry);
|
|
386
|
+
const sharedEntries = ensureArray(cat.sharedSelectionEntries?.selectionEntry);
|
|
387
|
+
const entries = [...directEntries, ...sharedEntries];
|
|
388
|
+
return entries
|
|
389
|
+
.filter((entry) => {
|
|
390
|
+
// Only unit or model type entries, not hidden
|
|
391
|
+
const type = entry["@_type"];
|
|
392
|
+
const hidden = entry["@_hidden"] === "true";
|
|
393
|
+
return !hidden && (type === "unit" || type === "model");
|
|
394
|
+
})
|
|
395
|
+
.map((entry) => {
|
|
396
|
+
const allProfiles = collectAllProfiles(entry);
|
|
397
|
+
return {
|
|
398
|
+
id: entry["@_id"],
|
|
399
|
+
name: entry["@_name"],
|
|
400
|
+
faction,
|
|
401
|
+
keywords: extractKeywords(entry),
|
|
402
|
+
profiles: extractUnitProfiles(allProfiles),
|
|
403
|
+
rangedWeapons: extractRangedWeapons(allProfiles),
|
|
404
|
+
meleeWeapons: extractMeleeWeapons(allProfiles),
|
|
405
|
+
abilities: extractAbilities(allProfiles),
|
|
406
|
+
points: extractPoints(entry),
|
|
407
|
+
gameSystem: "wh40k-10e",
|
|
408
|
+
};
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=xml-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-parser.js","sourceRoot":"","sources":["../../src/lib/xml-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-parser.test.d.ts","sourceRoot":"","sources":["../../src/lib/xml-parser.test.ts"],"names":[],"mappings":""}
|