@datamoc/mw_games 0.6.0 → 0.7.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.
Files changed (54) hide show
  1. package/README.md +51 -1
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/mw_games.global.js +24 -21
  7. package/dist/mwl/actors.d.ts +16 -0
  8. package/dist/mwl/actors.d.ts.map +1 -0
  9. package/dist/mwl/actors.js +25 -0
  10. package/dist/mwl/actors.js.map +1 -0
  11. package/dist/mwl/catalog.d.ts +13 -0
  12. package/dist/mwl/catalog.d.ts.map +1 -0
  13. package/dist/mwl/catalog.js +52 -0
  14. package/dist/mwl/catalog.js.map +1 -0
  15. package/dist/mwl/compiler.d.ts +45 -0
  16. package/dist/mwl/compiler.d.ts.map +1 -0
  17. package/dist/mwl/compiler.js +69 -0
  18. package/dist/mwl/compiler.js.map +1 -0
  19. package/dist/mwl/content.d.ts +54 -0
  20. package/dist/mwl/content.d.ts.map +1 -0
  21. package/dist/mwl/content.js +97 -0
  22. package/dist/mwl/content.js.map +1 -0
  23. package/dist/mwl/expression.d.ts +21 -0
  24. package/dist/mwl/expression.d.ts.map +1 -0
  25. package/dist/mwl/expression.js +100 -0
  26. package/dist/mwl/expression.js.map +1 -0
  27. package/dist/mwl/grammar.d.ts +39 -0
  28. package/dist/mwl/grammar.d.ts.map +1 -0
  29. package/dist/mwl/grammar.js +204 -0
  30. package/dist/mwl/grammar.js.map +1 -0
  31. package/dist/mwl/hooks.d.ts +81 -0
  32. package/dist/mwl/hooks.d.ts.map +1 -0
  33. package/dist/mwl/hooks.js +78 -0
  34. package/dist/mwl/hooks.js.map +1 -0
  35. package/dist/mwl/index.d.ts +21 -0
  36. package/dist/mwl/index.d.ts.map +1 -0
  37. package/dist/mwl/index.js +11 -0
  38. package/dist/mwl/index.js.map +1 -0
  39. package/dist/mwl/persistence.d.ts +15 -0
  40. package/dist/mwl/persistence.d.ts.map +1 -0
  41. package/dist/mwl/persistence.js +33 -0
  42. package/dist/mwl/persistence.js.map +1 -0
  43. package/dist/mwl/runtime.d.ts +169 -0
  44. package/dist/mwl/runtime.d.ts.map +1 -0
  45. package/dist/mwl/runtime.js +519 -0
  46. package/dist/mwl/runtime.js.map +1 -0
  47. package/dist/mwl/schema.d.ts +20 -0
  48. package/dist/mwl/schema.d.ts.map +1 -0
  49. package/dist/mwl/schema.js +351 -0
  50. package/dist/mwl/schema.js.map +1 -0
  51. package/dist/version.d.ts +1 -1
  52. package/dist/version.js +1 -1
  53. package/package.json +7 -1
  54. package/tools/mwl.mjs +153 -0
@@ -0,0 +1,16 @@
1
+ import type { EquipmentSlots } from '../actors/Equipment.ts';
2
+ import type { InventoryItem, ItemDefinition } from '../actors/Inventory.ts';
3
+ import type { Modifier } from '../actors/StatBlock.ts';
4
+ import type { MwlEffectDefinition, MwlItemDefinition } from './content.ts';
5
+ import { type MwlExpressionContext } from './expression.ts';
6
+ export interface MwlActorItem extends ItemDefinition {
7
+ readonly id: string;
8
+ readonly slot?: string;
9
+ readonly modifiers?: Modifier[];
10
+ }
11
+ /** Converts MWL's data shape into the actor layer without importing game rules. */
12
+ export declare function itemDefinition(item: MwlItemDefinition, context?: MwlExpressionContext): MwlActorItem;
13
+ export declare function inventoryItem(item: MwlActorItem, quantity?: number): InventoryItem;
14
+ export declare function effectToModifier(effect: MwlEffectDefinition, context?: MwlExpressionContext): Modifier;
15
+ export type MwlEquipment<Slot extends string> = EquipmentSlots<Slot, MwlActorItem>;
16
+ //# sourceMappingURL=actors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actors.d.ts","sourceRoot":"","sources":["../../src/mwl/actors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEhF,MAAM,WAAW,YAAa,SAAQ,cAAc;IACnD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CAChC;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,GAAE,oBAAyB,GAAG,YAAY,CAQxG;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,SAAI,GAAG,aAAa,CAE7E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,GAAE,oBAAyB,GAAG,QAAQ,CAQ1G;AAED,MAAM,MAAM,YAAY,CAAC,IAAI,SAAS,MAAM,IAAI,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { evaluateExpression } from './expression.js';
2
+ /** Converts MWL's data shape into the actor layer without importing game rules. */
3
+ export function itemDefinition(item, context = {}) {
4
+ return {
5
+ id: item.id,
6
+ stackable: item.stackable,
7
+ weight: item.weight,
8
+ slot: item.slot,
9
+ modifiers: item.effects.map((effect) => effectToModifier(effect, context)),
10
+ };
11
+ }
12
+ export function inventoryItem(item, quantity = 1) {
13
+ return { id: item.id, quantity, stackable: item.stackable, weight: item.weight };
14
+ }
15
+ export function effectToModifier(effect, context = {}) {
16
+ const operation = effect.operation;
17
+ if (operation !== 'add' && operation !== 'sub' && operation !== 'multiply' && operation !== 'divide' && operation !== 'set')
18
+ throw new Error(`MWL effect operation "${operation ?? ''}" is not a StatBlock modifier`);
19
+ const raw = effect.value;
20
+ if (raw === undefined)
21
+ throw new Error('MWL effect has no value');
22
+ const value = evaluateExpression(raw, context);
23
+ return { stat: effect.applyTo, op: operation === 'sub' ? 'add' : operation === 'divide' ? 'multiply' : operation, value: operation === 'sub' ? -value : operation === 'divide' ? 1 / value : value };
24
+ }
25
+ //# sourceMappingURL=actors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actors.js","sourceRoot":"","sources":["../../src/mwl/actors.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAA6B,MAAM,iBAAiB,CAAC;AAQhF,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,IAAuB,EAAE,OAAO,GAAyB,EAAE;IACzF,OAAO;QACN,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC1E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAkB,EAAE,QAAQ,GAAG,CAAC;IAC7D,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAA2B,EAAE,OAAO,GAAyB,EAAE;IAC/F,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,KAAK;QAC1H,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,IAAI,EAAE,+BAA+B,CAAC,CAAC;IAC1F,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,IAAI,GAAG,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AACtM,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { MwlCompiledGame } from './compiler.ts';
2
+ import type { MwlDiagnostic, MwlNode } from './grammar.ts';
3
+ export interface MwlValidationOptions {
4
+ /** Slots are game-defined. Supplying them enables unknown-slot diagnostics. */
5
+ readonly slots?: readonly string[];
6
+ /** Hook ids exported by the game's adapter. */
7
+ readonly hooks?: readonly string[];
8
+ }
9
+ /** Semantic checks shared by all games. Domain rules remain in the game adapter. */
10
+ export declare function validateCatalog(game: MwlCompiledGame, options?: MwlValidationOptions): MwlDiagnostic[];
11
+ /** Convenience for adapters that keep parsed nodes rather than compiled games. */
12
+ export declare function validateCatalogNodes(nodes: readonly MwlNode[], options?: MwlValidationOptions): MwlDiagnostic[];
13
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/mwl/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,eAAe,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAe,OAAO,EAAE,MAAM,cAAc,CAAC;AAGxE,MAAM,WAAW,oBAAoB;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,GAAE,oBAAyB,GAAG,aAAa,EAAE,CA+B1G;AAYD,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,GAAE,oBAAyB,GAAG,aAAa,EAAE,CAGnH"}
@@ -0,0 +1,52 @@
1
+ import { collectHookReferences, parseHookReference } from './hooks.js';
2
+ /** Semantic checks shared by all games. Domain rules remain in the game adapter. */
3
+ export function validateCatalog(game, options = {}) {
4
+ const diagnostics = [];
5
+ const ids = new Map();
6
+ const nodes = flatten(game.roots);
7
+ for (const node of nodes) {
8
+ const id = node.attributes.id;
9
+ if (id) {
10
+ const key = `${node.tag}:${id}`;
11
+ const previous = ids.get(key);
12
+ if (previous)
13
+ diagnostics.push(diagnostic('MWL_DUPLICATE_ID', `duplicate ${node.tag} id "${id}"`, node.location ?? previous.location));
14
+ else
15
+ ids.set(key, node);
16
+ }
17
+ if (node.tag === 'item' && options.slots && node.attributes.slot && !options.slots.includes(node.attributes.slot))
18
+ diagnostics.push(diagnostic('MWL_UNKNOWN_SLOT', `unknown equipment slot "${node.attributes.slot}"`, node.location));
19
+ if (node.tag === 'effect') {
20
+ const operations = ['add', 'sub', 'multiply', 'divide', 'set', 'increase', 'increase_total', 'increase_damage'].filter((key) => node.attributes[key] !== undefined);
21
+ if (!node.attributes.apply_to || operations.length !== 1)
22
+ diagnostics.push(diagnostic('MWL_INCOMPLETE_EFFECT', 'an effect needs apply_to and exactly one operation', node.location));
23
+ }
24
+ }
25
+ const references = collectHookReferences(game);
26
+ const knownHooks = new Set(options.hooks ?? []);
27
+ for (const node of nodes) {
28
+ const raw = node.attributes.hook ?? (node.tag === 'hook' ? node.attributes.name : undefined);
29
+ if (raw !== undefined && !parseHookReference(raw))
30
+ diagnostics.push(diagnostic('MWL_INVALID_HOOK', `invalid hook reference "${raw}"`, node.location));
31
+ }
32
+ if (options.hooks)
33
+ for (const reference of references)
34
+ if (!knownHooks.has(`${reference.type}:${reference.name}`))
35
+ diagnostics.push(diagnostic('MWL_UNKNOWN_HOOK', `hook ${reference.type}:${reference.name} is not declared by the game`, reference.location));
36
+ return diagnostics;
37
+ }
38
+ function flatten(roots) {
39
+ const result = [];
40
+ const visit = (node) => { result.push(node); node.children.forEach(visit); };
41
+ roots.forEach(visit);
42
+ return result;
43
+ }
44
+ function diagnostic(code, message, location) {
45
+ return { code, message, location: location ?? { file: '<mwl>', line: 1, column: 1 } };
46
+ }
47
+ /** Convenience for adapters that keep parsed nodes rather than compiled games. */
48
+ export function validateCatalogNodes(nodes, options = {}) {
49
+ const fake = { schema: '0.1', roots: nodes, assets: [], messages: [] };
50
+ return validateCatalog(fake, options);
51
+ }
52
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/mwl/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { type MwlLocation, type MwlNode, type MwlPreprocessOptions } from './grammar.ts';
2
+ import { type MwlTagSchema } from './schema.ts';
3
+ export interface MwlCompiledNode {
4
+ readonly tag: string;
5
+ readonly attributes: Readonly<Record<string, string>>;
6
+ readonly children: readonly MwlCompiledNode[];
7
+ /** source location, kept so the runtime and tools can report where a node came from */
8
+ readonly location?: MwlLocation;
9
+ /** attribute names that carried the gettext marker, when the node came from text */
10
+ readonly gettext?: readonly string[];
11
+ }
12
+ export interface MwlCompiledGame {
13
+ readonly schema: string;
14
+ readonly roots: readonly MwlCompiledNode[];
15
+ readonly assets: readonly string[];
16
+ readonly messages: readonly string[];
17
+ }
18
+ export interface MwlCompileOptions extends MwlPreprocessOptions {
19
+ readonly schemas?: Readonly<Record<string, MwlTagSchema>>;
20
+ }
21
+ export declare function compile(source: string, options?: MwlCompileOptions): MwlCompiledGame;
22
+ /**
23
+ * Compile an already-parsed MWL node tree. A game that builds its nodes from
24
+ * another format (the Wesnoth port converts its own parsed nodes this way) can
25
+ * validate and compile through the same schema without going back to text.
26
+ */
27
+ export declare function compileNodes(nodes: readonly MwlNode[], options?: MwlCompileOptions): MwlCompiledGame;
28
+ export interface MwlCatalogOptions {
29
+ /** BCP-47 tag for the extracted catalog; the message ids are the source text */
30
+ readonly locale?: string;
31
+ readonly direction?: 'ltr' | 'rtl';
32
+ }
33
+ export interface MwlCatalog {
34
+ readonly locale: string;
35
+ readonly direction: 'ltr' | 'rtl';
36
+ readonly messages: Record<string, string>;
37
+ }
38
+ /**
39
+ * Extract a translation catalog compatible with `mwg/i18n` from a compiled
40
+ * game. MWL keeps the source text as the message id, so the base-language
41
+ * catalog maps each id to itself and translators fill in the other locales.
42
+ */
43
+ export declare function extractCatalog(game: MwlCompiledGame, options?: MwlCatalogOptions): MwlCatalog;
44
+ export declare function emitModule(game: MwlCompiledGame, variable?: string): string;
45
+ //# sourceMappingURL=compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/mwl/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC5G,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,oFAAoF;IACpF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC9D,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;CAC1D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,eAAe,CAGxF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,GAAE,iBAAsB,GAAG,eAAe,CAqCxG;AAOD,MAAM,WAAW,iBAAiB;IACjC,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,GAAE,iBAAsB,GAAG,UAAU,CAIjG;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,SAAa,GAAG,MAAM,CAE/E"}
@@ -0,0 +1,69 @@
1
+ import { parse, preprocess } from './grammar.js';
2
+ import { validate } from './schema.js';
3
+ export function compile(source, options = {}) {
4
+ const expanded = preprocess(source, options);
5
+ return compileNodes(parse(expanded, options.file), options);
6
+ }
7
+ /**
8
+ * Compile an already-parsed MWL node tree. A game that builds its nodes from
9
+ * another format (the Wesnoth port converts its own parsed nodes this way) can
10
+ * validate and compile through the same schema without going back to text.
11
+ */
12
+ export function compileNodes(nodes, options = {}) {
13
+ const diagnostics = validate(nodes, options.schemas);
14
+ if (diagnostics.length) {
15
+ const first = diagnostics[0];
16
+ throw new Error(`${first.location.file}:${first.location.line}:${first.location.column}: ${first.message}`);
17
+ }
18
+ const assets = new Set();
19
+ const messages = new Set();
20
+ const convert = (node) => {
21
+ for (const [key, value] of Object.entries(node.attributes)) {
22
+ if (isAssetAttribute(key)) {
23
+ for (const asset of value.split(',').map((part) => part.trim()).filter(Boolean))
24
+ assets.add(asset.split('~', 1)[0].trim());
25
+ }
26
+ }
27
+ // Text-parsed nodes carry the exact set of gettext-marked attributes, so
28
+ // extraction is precise. Programmatically built nodes have no marker
29
+ // information, so fall back to the conventional display attributes.
30
+ const messageKeys = node.gettext ?? ['name', 'text', 'title'];
31
+ for (const key of messageKeys) {
32
+ const value = node.attributes[key];
33
+ if (value !== undefined)
34
+ messages.add(value);
35
+ }
36
+ const compiled = {
37
+ tag: node.tag,
38
+ attributes: { ...node.attributes },
39
+ children: node.children.map(convert),
40
+ location: node.location,
41
+ };
42
+ return node.gettext ? { ...compiled, gettext: [...node.gettext] } : compiled;
43
+ };
44
+ return {
45
+ schema: nodes.find((node) => node.tag === 'game')?.attributes.schema ?? '0.1',
46
+ roots: nodes.map(convert),
47
+ assets: [...assets].sort(),
48
+ messages: [...messages].sort(),
49
+ };
50
+ }
51
+ /** Common WML asset attributes, including the sound/image aliases used by CFG macros. */
52
+ function isAssetAttribute(name) {
53
+ return name === 'file' || name === 'image' || name === 'image_icon' || name === 'icon' || name === 'profile' || name === 'sound' || name.endsWith('_sound') || name.endsWith('_image');
54
+ }
55
+ /**
56
+ * Extract a translation catalog compatible with `mwg/i18n` from a compiled
57
+ * game. MWL keeps the source text as the message id, so the base-language
58
+ * catalog maps each id to itself and translators fill in the other locales.
59
+ */
60
+ export function extractCatalog(game, options = {}) {
61
+ const messages = {};
62
+ for (const id of game.messages)
63
+ messages[id] = id;
64
+ return { locale: options.locale ?? 'en', direction: options.direction ?? 'ltr', messages };
65
+ }
66
+ export function emitModule(game, variable = 'gameData') {
67
+ return `export const ${variable} = ${JSON.stringify(game, null, '\t')} as const;\n`;
68
+ }
69
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/mwl/compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { MwlCompiledGame } from './compiler.ts';
2
+ export interface MwlEffectDefinition {
3
+ readonly applyTo: string;
4
+ readonly operation?: string;
5
+ readonly value?: string;
6
+ readonly range?: string;
7
+ }
8
+ export interface MwlItemDefinition {
9
+ readonly id: string;
10
+ readonly name: string;
11
+ readonly slot?: string;
12
+ readonly stackable?: boolean;
13
+ readonly weight?: number;
14
+ readonly effects: readonly MwlEffectDefinition[];
15
+ }
16
+ export interface MwlMonsterDefinition {
17
+ readonly id: string;
18
+ readonly name?: string;
19
+ readonly hp: number;
20
+ readonly accuracy?: number;
21
+ readonly evasion?: number;
22
+ readonly damage?: readonly [number, number];
23
+ readonly armor?: readonly [number, number];
24
+ readonly experience?: number;
25
+ readonly maxLevel?: number;
26
+ readonly image?: string;
27
+ }
28
+ export interface MwlStatusDefinition {
29
+ readonly id: string;
30
+ readonly name?: string;
31
+ readonly duration?: number;
32
+ readonly tick?: string;
33
+ readonly modifiers?: string;
34
+ }
35
+ export interface MwlLootDefinition {
36
+ readonly item: string;
37
+ readonly chance?: number;
38
+ readonly quantity?: number;
39
+ readonly weight?: number;
40
+ }
41
+ export interface MwlTurnClockDefinition {
42
+ readonly id: string;
43
+ readonly tick?: number;
44
+ readonly hunger?: number;
45
+ }
46
+ export interface MwlContentCatalog {
47
+ readonly items: readonly MwlItemDefinition[];
48
+ readonly monsters: readonly MwlMonsterDefinition[];
49
+ readonly statuses: readonly MwlStatusDefinition[];
50
+ readonly loot: readonly MwlLootDefinition[];
51
+ readonly turnClocks: readonly MwlTurnClockDefinition[];
52
+ }
53
+ export declare function contentCatalog(game: MwlCompiledGame): MwlContentCatalog;
54
+ //# sourceMappingURL=content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/mwl/content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,eAAe,CAAC;AAEtE,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACjD;AACD,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AACD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACvD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,iBAAiB,CAgDvE"}
@@ -0,0 +1,97 @@
1
+ export function contentCatalog(game) {
2
+ const nodes = flatten(game.roots);
3
+ return {
4
+ items: nodes
5
+ .filter((node) => node.tag === 'item')
6
+ .map((node) => ({
7
+ id: required(node, 'id'),
8
+ name: required(node, 'name'),
9
+ slot: node.attributes.slot,
10
+ stackable: bool(node, 'stackable'),
11
+ weight: num(node, 'weight'),
12
+ effects: node.children.filter((child) => child.tag === 'effect').map(effect),
13
+ })),
14
+ monsters: nodes
15
+ .filter((node) => node.tag === 'monster')
16
+ .map((node) => ({
17
+ id: required(node, 'id'),
18
+ name: node.attributes.name,
19
+ hp: integer(node, 'hp', 1),
20
+ accuracy: num(node, 'accuracy'),
21
+ evasion: num(node, 'evasion'),
22
+ damage: pair(node, 'damage_min', 'damage_max'),
23
+ armor: pair(node, 'armor_min', 'armor_max'),
24
+ experience: integer(node, 'experience'),
25
+ maxLevel: integer(node, 'max_level'),
26
+ image: node.attributes.image,
27
+ })),
28
+ statuses: nodes
29
+ .filter((node) => node.tag === 'status')
30
+ .map((node) => ({
31
+ id: required(node, 'id'),
32
+ name: node.attributes.name,
33
+ duration: integer(node, 'duration'),
34
+ tick: node.attributes.tick,
35
+ modifiers: node.attributes.modifiers,
36
+ })),
37
+ loot: nodes
38
+ .filter((node) => node.tag === 'loot')
39
+ .map((node) => ({
40
+ item: required(node, 'item'),
41
+ chance: num(node, 'chance'),
42
+ quantity: integer(node, 'quantity'),
43
+ weight: num(node, 'weight'),
44
+ })),
45
+ turnClocks: nodes
46
+ .filter((node) => node.tag === 'turn_clock')
47
+ .map((node) => ({ id: required(node, 'id'), tick: num(node, 'tick'), hunger: num(node, 'hunger') })),
48
+ };
49
+ }
50
+ function effect(node) {
51
+ const operation = ['add', 'sub', 'multiply', 'divide', 'set', 'increase', 'increase_total', 'increase_damage'].find((key) => node.attributes[key] !== undefined);
52
+ return {
53
+ applyTo: required(node, 'apply_to'),
54
+ operation,
55
+ value: operation ? node.attributes[operation] : undefined,
56
+ range: node.attributes.range,
57
+ };
58
+ }
59
+ function flatten(roots) {
60
+ const out = [];
61
+ const visit = (node) => {
62
+ out.push(node);
63
+ node.children.forEach(visit);
64
+ };
65
+ roots.forEach(visit);
66
+ return out;
67
+ }
68
+ function required(node, name) {
69
+ const value = node.attributes[name];
70
+ if (!value)
71
+ throw new Error(`MWL ${node.tag} is missing ${name}`);
72
+ return value;
73
+ }
74
+ function num(node, name) {
75
+ const value = node.attributes[name];
76
+ if (value === undefined)
77
+ return undefined;
78
+ const result = Number(value);
79
+ return Number.isFinite(result) ? result : undefined;
80
+ }
81
+ function integer(node, name, fallback) {
82
+ const value = node.attributes[name];
83
+ if (value === undefined)
84
+ return fallback;
85
+ const result = Number.parseInt(value, 10);
86
+ return Number.isFinite(result) ? result : fallback;
87
+ }
88
+ function pair(node, min, max) {
89
+ const a = num(node, min);
90
+ const b = num(node, max);
91
+ return a === undefined || b === undefined ? undefined : [a, b];
92
+ }
93
+ function bool(node, name) {
94
+ const value = node.attributes[name];
95
+ return value === undefined ? undefined : value === 'true' || value === 'yes';
96
+ }
97
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/mwl/content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /** Small, game-neutral numeric expressions used by MWL effects.
2
+ *
3
+ * MWG only evaluates arithmetic. A game supplies the variables, so names such as
4
+ * `level` or `missing_hp_fraction` remain game vocabulary rather than MWG rules.
5
+ */
6
+ export type MwlExpression = {
7
+ readonly kind: 'number';
8
+ readonly value: number;
9
+ } | {
10
+ readonly kind: 'variable';
11
+ readonly name: string;
12
+ } | {
13
+ readonly kind: 'binary';
14
+ readonly op: '+' | '-' | '*' | '/' | '^';
15
+ readonly left: MwlExpression;
16
+ readonly right: MwlExpression;
17
+ };
18
+ export type MwlExpressionContext = Readonly<Record<string, number>>;
19
+ export declare function parseExpression(source: string): MwlExpression;
20
+ export declare function evaluateExpression(expression: MwlExpression | string, context: MwlExpressionContext): number;
21
+ //# sourceMappingURL=expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../src/mwl/expression.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;CAAE,CAAC;AAEtI,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAM7D;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,aAAa,GAAG,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAkB5G"}
@@ -0,0 +1,100 @@
1
+ export function parseExpression(source) {
2
+ const parser = new Parser(source);
3
+ const result = parser.expression();
4
+ parser.skip();
5
+ if (!parser.atEnd())
6
+ throw new Error(`invalid MWL expression near "${parser.rest()}"`);
7
+ return result;
8
+ }
9
+ export function evaluateExpression(expression, context) {
10
+ const node = typeof expression === 'string' ? parseExpression(expression) : expression;
11
+ if (node.kind === 'number')
12
+ return node.value;
13
+ if (node.kind === 'variable') {
14
+ const value = context[node.name];
15
+ if (value === undefined || !Number.isFinite(value))
16
+ throw new Error(`missing MWL expression variable "${node.name}"`);
17
+ return value;
18
+ }
19
+ const left = evaluateExpression(node.left, context);
20
+ const right = evaluateExpression(node.right, context);
21
+ if (node.op === '+')
22
+ return left + right;
23
+ if (node.op === '-')
24
+ return left - right;
25
+ if (node.op === '*')
26
+ return left * right;
27
+ if (node.op === '/') {
28
+ if (right === 0)
29
+ throw new Error('division by zero in MWL expression');
30
+ return left / right;
31
+ }
32
+ return left ** right;
33
+ }
34
+ class Parser {
35
+ constructor(source) {
36
+ this.index = 0;
37
+ this.source = source;
38
+ }
39
+ expression() { return this.additive(); }
40
+ additive() {
41
+ let left = this.multiplicative();
42
+ while (true) {
43
+ this.skip();
44
+ const op = this.peek('+') ? '+' : this.peek('-') ? '-' : null;
45
+ if (!op)
46
+ return left;
47
+ this.index++;
48
+ left = { kind: 'binary', op, left, right: this.multiplicative() };
49
+ }
50
+ }
51
+ multiplicative() {
52
+ let left = this.power();
53
+ while (true) {
54
+ this.skip();
55
+ const op = this.peek('*') ? '*' : this.peek('/') ? '/' : null;
56
+ if (!op)
57
+ return left;
58
+ this.index++;
59
+ left = { kind: 'binary', op, left, right: this.power() };
60
+ }
61
+ }
62
+ power() {
63
+ let left = this.primary();
64
+ this.skip();
65
+ if (this.peek('^')) {
66
+ this.index++;
67
+ left = { kind: 'binary', op: '^', left, right: this.power() };
68
+ }
69
+ return left;
70
+ }
71
+ primary() {
72
+ this.skip();
73
+ if (this.peek('(')) {
74
+ this.index++;
75
+ const value = this.expression();
76
+ this.skip();
77
+ if (!this.peek(')'))
78
+ throw new Error('missing closing parenthesis in MWL expression');
79
+ this.index++;
80
+ return value;
81
+ }
82
+ const number = /^(?:\d+(?:\.\d*)?|\.\d+)/.exec(this.rest());
83
+ if (number) {
84
+ this.index += number[0].length;
85
+ return { kind: 'number', value: Number(number[0]) };
86
+ }
87
+ const name = /^[A-Za-z_][A-Za-z0-9_.-]*/.exec(this.rest());
88
+ if (name) {
89
+ this.index += name[0].length;
90
+ return { kind: 'variable', name: name[0] };
91
+ }
92
+ throw new Error(`expected number, variable, or parenthesis near "${this.rest()}"`);
93
+ }
94
+ peek(value) { return this.source[this.index] === value; }
95
+ skip() { while (/\s/.test(this.source[this.index] ?? ''))
96
+ this.index++; }
97
+ atEnd() { return this.index >= this.source.length; }
98
+ rest() { return this.source.slice(this.index); }
99
+ }
100
+ //# sourceMappingURL=expression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.js","sourceRoot":"","sources":["../../src/mwl/expression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export interface MwlLocation {
2
+ readonly file: string;
3
+ readonly line: number;
4
+ readonly column: number;
5
+ }
6
+ export interface MwlNode {
7
+ readonly tag: string;
8
+ readonly attributes: Readonly<Record<string, string>>;
9
+ readonly children: readonly MwlNode[];
10
+ readonly location: MwlLocation;
11
+ /**
12
+ * Names of the attributes that carried the gettext marker `_ "..."`.
13
+ * Present (possibly empty) on nodes parsed from text, so the compiler can
14
+ * extract exactly the author-marked display strings; absent on nodes built
15
+ * programmatically by a converter.
16
+ */
17
+ readonly gettext?: readonly string[];
18
+ }
19
+ export interface MwlDiagnostic {
20
+ readonly code: string;
21
+ readonly message: string;
22
+ readonly location: MwlLocation;
23
+ readonly lineText?: string;
24
+ }
25
+ export declare class MwlSyntaxError extends Error {
26
+ readonly diagnostic: MwlDiagnostic;
27
+ constructor(diagnostic: MwlDiagnostic);
28
+ }
29
+ export interface MwlPreprocessOptions {
30
+ readonly file?: string;
31
+ readonly defines?: readonly string[];
32
+ readonly includes?: Readonly<Record<string, string>>;
33
+ }
34
+ export declare function preprocess(source: string, options?: MwlPreprocessOptions): string;
35
+ export declare function parse(source: string, file?: string): MwlNode[];
36
+ export declare function parseValue(raw: string, location: MwlLocation, lineText?: string): string;
37
+ /** True when a raw attribute value carries the gettext marker `_ "..."`. */
38
+ export declare function isGettext(raw: string): boolean;
39
+ //# sourceMappingURL=grammar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar.d.ts","sourceRoot":"","sources":["../../src/mwl/grammar.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,cAAe,SAAQ,KAAK;IACxC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IAEnC,YAAY,UAAU,EAAE,aAAa,EAMpC;CACD;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD;AAUD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,MAAM,CA0ErF;AAkBD,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAU,GAAG,OAAO,EAAE,CAsD/D;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,SAAM,GAAG,MAAM,CAarF;AAED,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C"}