@datamoc/mw_games 0.5.1 → 0.5.3

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 (99) hide show
  1. package/README.md +7 -4
  2. package/dist/actors/EntityTemplate.d.ts +42 -1
  3. package/dist/actors/EntityTemplate.d.ts.map +1 -1
  4. package/dist/actors/EntityTemplate.js +56 -4
  5. package/dist/actors/EntityTemplate.js.map +1 -1
  6. package/dist/actors/index.d.ts +2 -2
  7. package/dist/actors/index.d.ts.map +1 -1
  8. package/dist/actors/index.js +1 -1
  9. package/dist/actors/index.js.map +1 -1
  10. package/dist/core/Registry.d.ts +31 -0
  11. package/dist/core/Registry.d.ts.map +1 -0
  12. package/dist/core/Registry.js +46 -0
  13. package/dist/core/Registry.js.map +1 -0
  14. package/dist/core/SceneComponents.d.ts +67 -0
  15. package/dist/core/SceneComponents.d.ts.map +1 -0
  16. package/dist/core/SceneComponents.js +76 -0
  17. package/dist/core/SceneComponents.js.map +1 -0
  18. package/dist/core/index.d.ts +3 -0
  19. package/dist/core/index.d.ts.map +1 -1
  20. package/dist/core/index.js +2 -0
  21. package/dist/core/index.js.map +1 -1
  22. package/dist/i18n/EditSession.d.ts +101 -0
  23. package/dist/i18n/EditSession.d.ts.map +1 -0
  24. package/dist/i18n/EditSession.js +150 -0
  25. package/dist/i18n/EditSession.js.map +1 -0
  26. package/dist/i18n/Fluent.js +9 -1
  27. package/dist/i18n/Fluent.js.map +1 -1
  28. package/dist/i18n/FormatSpec.d.ts +74 -0
  29. package/dist/i18n/FormatSpec.d.ts.map +1 -0
  30. package/dist/i18n/FormatSpec.js +302 -0
  31. package/dist/i18n/FormatSpec.js.map +1 -0
  32. package/dist/i18n/SemanticMessage.d.ts +15 -2
  33. package/dist/i18n/SemanticMessage.d.ts.map +1 -1
  34. package/dist/i18n/SemanticMessage.js +16 -2
  35. package/dist/i18n/SemanticMessage.js.map +1 -1
  36. package/dist/i18n/Validate.d.ts +26 -0
  37. package/dist/i18n/Validate.d.ts.map +1 -1
  38. package/dist/i18n/Validate.js +33 -0
  39. package/dist/i18n/Validate.js.map +1 -1
  40. package/dist/i18n/index.d.ts +32 -2
  41. package/dist/i18n/index.d.ts.map +1 -1
  42. package/dist/i18n/index.js +76 -9
  43. package/dist/i18n/index.js.map +1 -1
  44. package/dist/mw_games.global.js +98 -91
  45. package/dist/rpg/Quest.d.ts +45 -0
  46. package/dist/rpg/Quest.d.ts.map +1 -1
  47. package/dist/rpg/Quest.js +76 -0
  48. package/dist/rpg/Quest.js.map +1 -1
  49. package/dist/rpg/index.d.ts +2 -2
  50. package/dist/rpg/index.d.ts.map +1 -1
  51. package/dist/rpg/index.js +1 -1
  52. package/dist/rpg/index.js.map +1 -1
  53. package/dist/two-d/render/AnimatedSprite.d.ts +4 -0
  54. package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -1
  55. package/dist/two-d/render/AnimatedSprite.js +4 -0
  56. package/dist/two-d/render/AnimatedSprite.js.map +1 -1
  57. package/dist/two-d/render/LayeredSprite.d.ts +8 -0
  58. package/dist/two-d/render/LayeredSprite.d.ts.map +1 -1
  59. package/dist/two-d/render/LayeredSprite.js +8 -0
  60. package/dist/two-d/render/LayeredSprite.js.map +1 -1
  61. package/dist/two-d/render/TileMap.d.ts +7 -0
  62. package/dist/two-d/render/TileMap.d.ts.map +1 -1
  63. package/dist/two-d/render/TileMap.js +7 -0
  64. package/dist/two-d/render/TileMap.js.map +1 -1
  65. package/dist/two-d/render/TintedSprite.d.ts +12 -0
  66. package/dist/two-d/render/TintedSprite.d.ts.map +1 -1
  67. package/dist/two-d/render/TintedSprite.js +12 -0
  68. package/dist/two-d/render/TintedSprite.js.map +1 -1
  69. package/dist/two-d/ui/Label.d.ts +14 -0
  70. package/dist/two-d/ui/Label.d.ts.map +1 -1
  71. package/dist/two-d/ui/Label.js +40 -0
  72. package/dist/two-d/ui/Label.js.map +1 -1
  73. package/dist/two-d/ui/MessageBox.d.ts +1 -1
  74. package/dist/two-d/ui/MessageBox.d.ts.map +1 -1
  75. package/dist/two-d/ui/MessageBox.js +8 -7
  76. package/dist/two-d/ui/MessageBox.js.map +1 -1
  77. package/dist/two-d/ui/NinePatch.d.ts +2 -0
  78. package/dist/two-d/ui/NinePatch.d.ts.map +1 -1
  79. package/dist/two-d/ui/NinePatch.js +2 -0
  80. package/dist/two-d/ui/NinePatch.js.map +1 -1
  81. package/dist/two-d/ui/RichLabel.d.ts +56 -0
  82. package/dist/two-d/ui/RichLabel.d.ts.map +1 -0
  83. package/dist/two-d/ui/RichLabel.js +135 -0
  84. package/dist/two-d/ui/RichLabel.js.map +1 -0
  85. package/dist/two-d/ui/index.d.ts +6 -0
  86. package/dist/two-d/ui/index.d.ts.map +1 -1
  87. package/dist/two-d/ui/index.js +3 -0
  88. package/dist/two-d/ui/index.js.map +1 -1
  89. package/dist/two-d/ui/markdown.d.ts +55 -0
  90. package/dist/two-d/ui/markdown.d.ts.map +1 -0
  91. package/dist/two-d/ui/markdown.js +145 -0
  92. package/dist/two-d/ui/markdown.js.map +1 -0
  93. package/dist/two-d/ui/reveal.d.ts +41 -0
  94. package/dist/two-d/ui/reveal.d.ts.map +1 -0
  95. package/dist/two-d/ui/reveal.js +22 -0
  96. package/dist/two-d/ui/reveal.js.map +1 -0
  97. package/dist/version.d.ts +1 -1
  98. package/dist/version.js +1 -1
  99. package/package.json +5 -1
package/README.md CHANGED
@@ -11,7 +11,7 @@ of their own; improvements to `mwg`'s own files are shared back.
11
11
  **[Live examples and API docs](https://datamoc.github.io/mwg/)**: every example below,
12
12
  playable in the browser with no download, plus the generated API reference.
13
13
 
14
- > **Status: early release (v0.4.3).** Every module in the shared floor below, plus optional
14
+ > **Status: early release (v0.5.3).** Every module in the shared floor below, plus optional
15
15
  > 3D, mobile (Capacitor) and desktop (WebView2) packaging, is built and tested - see
16
16
  > [ROADMAP.md](ROADMAP.md) for the full, numbered history.
17
17
  >
@@ -119,7 +119,9 @@ them rather than pretending otherwise:
119
119
  | cross-origin images | an `<img>` from a sibling file taints a WebGL texture in Chrome | assets travel as `data:` URIs inside those scripts |
120
120
 
121
121
  The practical effect: resources are **compiled at build time**, so at runtime every lookup
122
- is synchronous. Game code never awaits an asset.
122
+ is synchronous. Game code never awaits an asset. The developer-side scripts behind this
123
+ and the other workflows (translation editing, benchmarks, packaging) are listed in
124
+ [tools.md](tools.md).
123
125
 
124
126
  ## Capability spec
125
127
 
@@ -144,15 +146,16 @@ only some do.
144
146
  | | camera with follow, pan, shake and zoom | `mwg/two-d/render` |
145
147
  | | particle effects | `mwg/two-d/render` |
146
148
  | | screen transitions: fade, flash, tint | `mwg/two-d/render` |
147
- | **ui** | windows, lists, tooltips | `mwg/two-d/ui` |
149
+ | **ui** | windows, lists, tooltips, markdown labels | `mwg/two-d/ui` |
148
150
  | | text and fonts, including non-latin fallback | PixiJS |
149
151
  | | pointer, keyboard and gamepad input with rebinding | `mwg/core` |
150
152
  | **text** | message tables per language, compiled at build time | `mwg/i18n` |
151
- | | plurals, gendered forms and interpolation | `mwg/i18n` |
153
+ | | plurals, gendered forms, interpolation, and Python f-string-style format specs | `mwg/i18n` |
152
154
  | | Fluent-style FTL catalogs with locale-aware fallback and variants | `mwg/i18n` |
153
155
  | | left-to-right, right-to-left and vertical writing | `mwg/i18n` |
154
156
  | | interface mirrored for right-to-left languages | `mwg/two-d/ui` |
155
157
  | | a missing translation falls back rather than showing a key | `mwg/i18n` |
158
+ | | per-message sound cues as an `audio` channel, edited in a split-screen CLI | `mwg/i18n` + `tools/i18n-edit` |
156
159
  | **audio** | sound effects with pooling, music with crossfade | `mwg/audio` |
157
160
 
158
161
  ### World
@@ -1,4 +1,4 @@
1
- import { StatBlock } from './StatBlock.ts';
1
+ import { StatBlock, type Stats } from './StatBlock.ts';
2
2
  import { Progression, type GrowthCurve } from './Progression.ts';
3
3
  import { type AffixDef } from './Affix.ts';
4
4
  import type { InventoryItem } from './Inventory.ts';
@@ -71,6 +71,17 @@ export interface BuiltEntity {
71
71
  maxHp: number;
72
72
  }>;
73
73
  }
74
+ /** what a `BuiltEntity` actually needs saved - everything else is the row/catalog, definitions supplied fresh on load */
75
+ export interface EntitySaveState {
76
+ stats: {
77
+ base: Stats;
78
+ };
79
+ progression?: {
80
+ level: number;
81
+ experience: number;
82
+ };
83
+ item?: InventoryItem;
84
+ }
74
85
  /**
75
86
  * @example
76
87
  * ```ts
@@ -83,4 +94,34 @@ export interface BuiltEntity {
83
94
  export declare function buildEntity(row: EntityTemplateRow, catalog?: EntityTemplateCatalog, onLowHp?: (entity: BuiltEntity) => void): BuiltEntity;
84
95
  /** `buildEntity` over every row - the usual shape once a whole file's worth loads at once */
85
96
  export declare function buildEntities(rows: readonly EntityTemplateRow[], catalog?: EntityTemplateCatalog, onLowHp?: (entity: BuiltEntity) => void): BuiltEntity[];
97
+ /**
98
+ * A `BuiltEntity`'s mutable state, in the same "definitions supplied fresh on load" shape
99
+ * `StatBlock.toJSON`/`Progression.toJSON` already draw: base stat values, level and
100
+ * experience, and the carried item, never the row or catalog that produced them.
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * import { buildEntity, toEntitySaveState, fromEntitySaveState, type EntityTemplateCatalog } from '@datamoc/mw_games/actors';
105
+ *
106
+ * const catalog: EntityTemplateCatalog = {
107
+ * growthCurves: { steep: { maxLevel: 20, experienceFor: (level) => level * level * 10 } },
108
+ * };
109
+ *
110
+ * const row = { id: 'fireling', growth: 'steep', attack: 10 };
111
+ * const fireling = buildEntity(row, catalog);
112
+ * fireling.stats.setBase('attack', 12);
113
+ * fireling.progression?.addExperience(500);
114
+ *
115
+ * const saved = toEntitySaveState(fireling); // JSON.stringify this into a save slot
116
+ * const restored = fromEntitySaveState(row, catalog, saved);
117
+ * restored.stats.get('attack'); // 12, not the row's original 10
118
+ * ```
119
+ */
120
+ export declare function toEntitySaveState(entity: BuiltEntity): EntitySaveState;
121
+ /**
122
+ * Rebuilds a `BuiltEntity` the same way `buildEntity` does - same row, same catalog, so the
123
+ * reactions and item lookups stay validated the same way - then overlays the saved base
124
+ * stats, level/experience, and carried item on top of the fresh one.
125
+ */
126
+ export declare function fromEntitySaveState(row: EntityTemplateRow, catalog: EntityTemplateCatalog, data: EntitySaveState, onLowHp?: (entity: BuiltEntity) => void): BuiltEntity;
86
127
  //# sourceMappingURL=EntityTemplate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityTemplate.d.ts","sourceRoot":"","sources":["../../src/actors/EntityTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAc,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,qEAAqE;IACrE,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,uFAAuF;AACvF,MAAM,WAAW,qBAAqB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEnC,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,aAAa,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAID;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,iBAAiB,EAAE,OAAO,GAAE,qBAA0B,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,WAAW,CAkC7I;AAED,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,EAAE,OAAO,GAAE,qBAA0B,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,WAAW,EAAE,CAE7J"}
1
+ {"version":3,"file":"EntityTemplate.d.ts","sourceRoot":"","sources":["../../src/actors/EntityTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,qEAAqE;IACrE,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,uFAAuF;AACvF,MAAM,WAAW,qBAAqB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEnC,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,aAAa,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAED,yHAAyH;AACzH,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE,CAAC;IACvB,WAAW,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,IAAI,CAAC,EAAE,aAAa,CAAC;CACrB;AAID;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,iBAAiB,EAAE,OAAO,GAAE,qBAA0B,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,WAAW,CAgC7I;AAED,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,EAAE,OAAO,GAAE,qBAA0B,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,WAAW,EAAE,CAE7J;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,CAKtE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE,eAAe,EACrB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GACrC,WAAW,CAab"}
@@ -16,10 +16,7 @@ export function buildEntity(row, catalog = {}, onLowHp) {
16
16
  const stats = new StatBlock({ base: statsFrom(row) });
17
17
  let progression;
18
18
  if (row.growth !== undefined) {
19
- const curve = catalog.growthCurves?.[row.growth];
20
- if (!curve)
21
- throw new Error(`entity template "${row.id}": unknown growth curve "${row.growth}"`);
22
- progression = new Progression(curve, { level: row.level ?? 1 });
19
+ progression = new Progression(growthCurveFor(row, catalog), { level: row.level ?? 1 });
23
20
  }
24
21
  let item;
25
22
  if (row.startingItem !== undefined) {
@@ -51,6 +48,61 @@ export function buildEntity(row, catalog = {}, onLowHp) {
51
48
  export function buildEntities(rows, catalog = {}, onLowHp) {
52
49
  return rows.map((row) => buildEntity(row, catalog, onLowHp));
53
50
  }
51
+ /**
52
+ * A `BuiltEntity`'s mutable state, in the same "definitions supplied fresh on load" shape
53
+ * `StatBlock.toJSON`/`Progression.toJSON` already draw: base stat values, level and
54
+ * experience, and the carried item, never the row or catalog that produced them.
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * import { buildEntity, toEntitySaveState, fromEntitySaveState, type EntityTemplateCatalog } from '@datamoc/mw_games/actors';
59
+ *
60
+ * const catalog: EntityTemplateCatalog = {
61
+ * growthCurves: { steep: { maxLevel: 20, experienceFor: (level) => level * level * 10 } },
62
+ * };
63
+ *
64
+ * const row = { id: 'fireling', growth: 'steep', attack: 10 };
65
+ * const fireling = buildEntity(row, catalog);
66
+ * fireling.stats.setBase('attack', 12);
67
+ * fireling.progression?.addExperience(500);
68
+ *
69
+ * const saved = toEntitySaveState(fireling); // JSON.stringify this into a save slot
70
+ * const restored = fromEntitySaveState(row, catalog, saved);
71
+ * restored.stats.get('attack'); // 12, not the row's original 10
72
+ * ```
73
+ */
74
+ export function toEntitySaveState(entity) {
75
+ const state = { stats: entity.stats.toJSON() };
76
+ if (entity.progression)
77
+ state.progression = entity.progression.toJSON();
78
+ if (entity.item)
79
+ state.item = entity.item;
80
+ return state;
81
+ }
82
+ /**
83
+ * Rebuilds a `BuiltEntity` the same way `buildEntity` does - same row, same catalog, so the
84
+ * reactions and item lookups stay validated the same way - then overlays the saved base
85
+ * stats, level/experience, and carried item on top of the fresh one.
86
+ */
87
+ export function fromEntitySaveState(row, catalog, data, onLowHp) {
88
+ const entity = buildEntity(row, catalog, onLowHp);
89
+ entity.stats = StatBlock.fromJSON({ base: statsFrom(row) }, data.stats);
90
+ if (data.progression !== undefined) {
91
+ if (!entity.progression) {
92
+ throw new Error(`entity template "${row.id}": save data has progression but the row names no growth curve`);
93
+ }
94
+ entity.progression = Progression.fromJSON(growthCurveFor(row, catalog), data.progression);
95
+ }
96
+ if (data.item !== undefined)
97
+ entity.item = data.item;
98
+ return entity;
99
+ }
100
+ function growthCurveFor(row, catalog) {
101
+ const curve = catalog.growthCurves?.[row.growth ?? ''];
102
+ if (!curve)
103
+ throw new Error(`entity template "${row.id}": unknown growth curve "${row.growth}"`);
104
+ return curve;
105
+ }
54
106
  function statsFrom(row) {
55
107
  const stats = {};
56
108
  for (const [key, value] of Object.entries(row)) {
@@ -1 +1 @@
1
- {"version":3,"file":"EntityTemplate.js","sourceRoot":"","sources":["../../src/actors/EntityTemplate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EntityTemplate.js","sourceRoot":"","sources":["../../src/actors/EntityTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAc,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAoB,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAgFrD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;AAE3G;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,GAAsB,EAAE,OAAO,GAA0B,EAAE,EAAE,OAAuC;IAC/H,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEtD,IAAI,WAAoC,CAAC;IACzC,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,WAAW,GAAG,IAAI,WAAW,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,IAA+B,CAAC;IACpC,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,EAAE,6BAA6B,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;QAC1G,IAAI,GAAG,OAAO,EAAE,CAAC;QACjB,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,EAAE,qBAAqB,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC;YACjG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;SAAM,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,EAAE,uDAAuD,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,aAAa,EAAiC,CAAC;IACrE,MAAM,MAAM,GAAgB,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAEhF,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,EAAE,sEAAsE,CAAC,CAAC;QAChI,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC;QACpC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1G,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,aAAa,CAAC,IAAkC,EAAE,OAAO,GAA0B,EAAE,EAAE,OAAuC;IAC7I,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACpD,MAAM,KAAK,GAAoB,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;IAChE,IAAI,MAAM,CAAC,WAAW;QAAE,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;IACxE,IAAI,MAAM,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1C,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAClC,GAAsB,EACtB,OAA8B,EAC9B,IAAqB,EACrB,OAAuC;IAEvC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAExE,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,EAAE,gEAAgE,CAAC,CAAC;QAC7G,CAAC;QACD,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,GAAsB,EAAE,OAA8B;IAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,EAAE,4BAA4B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACjG,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,GAAsB;IACxC,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACrC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,EAAE,YAAY,GAAG,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC;QACnI,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC"}
@@ -41,6 +41,6 @@ export { AuraField } from './Aura.ts';
41
41
  export type { AuraDef, AuraParticipant } from './Aura.ts';
42
42
  export { SupportLedger } from './Support.ts';
43
43
  export type { SupportLevel, SupportChange, SupportSave } from './Support.ts';
44
- export { buildEntity, buildEntities } from './EntityTemplate.ts';
45
- export type { EntityTemplateRow, EntityTemplateCatalog, BuiltEntity } from './EntityTemplate.ts';
44
+ export { buildEntity, buildEntities, toEntitySaveState, fromEntitySaveState } from './EntityTemplate.ts';
45
+ export type { EntityTemplateRow, EntityTemplateCatalog, BuiltEntity, EntitySaveState } from './EntityTemplate.ts';
46
46
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actors/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actors/index.ts"],"names":[],"mappings":"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"}
@@ -20,5 +20,5 @@ export { Barrier } from './Barrier.js';
20
20
  export { assignTraits } from './Traits.js';
21
21
  export { AuraField } from './Aura.js';
22
22
  export { SupportLedger } from './Support.js';
23
- export { buildEntity, buildEntities } from './EntityTemplate.js';
23
+ export { buildEntity, buildEntities, toEntitySaveState, fromEntitySaveState } from './EntityTemplate.js';
24
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * A named lookup of values, registered once and read back by name - the shape underneath a
3
+ * catalog of factories, handlers, or scene sections, so a game can grow that catalog by
4
+ * registering another entry instead of adding another branch to a hand-written `if`/`switch`.
5
+ *
6
+ * Deliberately does not discover or import anything on its own: a game still writes the
7
+ * import and the `register` call for each entry itself, the same explicit-import style
8
+ * `core`/`two-d` already use throughout - this only replaces the dispatch step after that,
9
+ * not the wiring step before it.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { Registry } from '@datamoc/mw_games/core';
14
+ *
15
+ * const commands = new Registry<(args: string[]) => void>();
16
+ * commands.register('heal', (args) => console.log('healing', args[0]));
17
+ *
18
+ * commands.get('heal')(['fireling']); // "healing fireling"
19
+ * commands.get('missing'); // throws: no registration named "missing"
20
+ * ```
21
+ */
22
+ export declare class Registry<T> {
23
+ private items;
24
+ /** throws if `name` is already registered - a duplicate is always an authoring error */
25
+ register(name: string, value: T): void;
26
+ get(name: string): T;
27
+ has(name: string): boolean;
28
+ /** every registered name, in registration order */
29
+ list(): string[];
30
+ }
31
+ //# sourceMappingURL=Registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Registry.d.ts","sourceRoot":"","sources":["../../src/core/Registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,KAAK,CAAwB;IAErC,wFAAwF;IACxF,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAGrC;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAInB;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzB;IAED,mDAAmD;IACnD,IAAI,IAAI,MAAM,EAAE,CAEf;CACD"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * A named lookup of values, registered once and read back by name - the shape underneath a
3
+ * catalog of factories, handlers, or scene sections, so a game can grow that catalog by
4
+ * registering another entry instead of adding another branch to a hand-written `if`/`switch`.
5
+ *
6
+ * Deliberately does not discover or import anything on its own: a game still writes the
7
+ * import and the `register` call for each entry itself, the same explicit-import style
8
+ * `core`/`two-d` already use throughout - this only replaces the dispatch step after that,
9
+ * not the wiring step before it.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { Registry } from '@datamoc/mw_games/core';
14
+ *
15
+ * const commands = new Registry<(args: string[]) => void>();
16
+ * commands.register('heal', (args) => console.log('healing', args[0]));
17
+ *
18
+ * commands.get('heal')(['fireling']); // "healing fireling"
19
+ * commands.get('missing'); // throws: no registration named "missing"
20
+ * ```
21
+ */
22
+ export class Registry {
23
+ constructor() {
24
+ this.items = new Map();
25
+ }
26
+ /** throws if `name` is already registered - a duplicate is always an authoring error */
27
+ register(name, value) {
28
+ if (this.items.has(name))
29
+ throw new Error(`"${name}" is already registered`);
30
+ this.items.set(name, value);
31
+ }
32
+ get(name) {
33
+ const value = this.items.get(name);
34
+ if (value === undefined)
35
+ throw new Error(`no registration named "${name}"`);
36
+ return value;
37
+ }
38
+ has(name) {
39
+ return this.items.has(name);
40
+ }
41
+ /** every registered name, in registration order */
42
+ list() {
43
+ return [...this.items.keys()];
44
+ }
45
+ }
46
+ //# sourceMappingURL=Registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Registry.js","sourceRoot":"","sources":["../../src/core/Registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,QAAQ;IAArB;QACS,UAAK,GAAG,IAAI,GAAG,EAAa,CAAC;IAsBtC,CAAC;IApBA,wFAAwF;IACxF,QAAQ,CAAC,IAAY,EAAE,KAAQ;QAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,yBAAyB,CAAC,CAAC;QAC7E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,IAAY;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,GAAG,CAAC,CAAC;QAC5E,OAAO,KAAK,CAAC;IACd,CAAC;IAED,GAAG,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,mDAAmD;IACnD,IAAI;QACH,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC;CACD"}
@@ -0,0 +1,67 @@
1
+ import type { Scene } from './Scene.ts';
2
+ /**
3
+ * One self-contained section of a scene - map logic, encounter logic, UI wiring - with its
4
+ * own slice of `core.Scene`'s lifecycle, registered by name into a `SceneComponentHost`
5
+ * instead of folded into one growing scene class.
6
+ *
7
+ * Every hook is optional and receives the owning scene, so a component reads whatever the
8
+ * scene exposes (a `two-d.Scene2D`'s `stage`, a game's own fields) without the host needing
9
+ * to know what a scene actually is beyond `core.Scene`'s lifecycle shape.
10
+ */
11
+ export interface SceneComponent<TScene extends Scene = Scene> {
12
+ readonly name: string;
13
+ create?(scene: TScene): void;
14
+ update?(scene: TScene, dt: number): void;
15
+ resize?(scene: TScene, width: number, height: number): void;
16
+ onSuspend?(scene: TScene): void;
17
+ onResume?(scene: TScene, result: unknown): void;
18
+ destroy?(scene: TScene): void;
19
+ }
20
+ /**
21
+ * Composes a scene out of named `SceneComponent`s instead of one class accreting every
22
+ * responsibility a scene ends up needing - a factory assembling named sections (map,
23
+ * encounters, UI) at scene-creation time, each a separate module with its own lifecycle.
24
+ *
25
+ * A composition helper, not a base class: a scene owns one `SceneComponentHost` and forwards
26
+ * `core.Scene`'s lifecycle methods to it, the same few lines regardless of whether that scene
27
+ * extends `core.Scene` directly or `two-d.Scene2D` - inheritance would have to pick one of
28
+ * those to sit above, composition does not.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { Scene, SceneComponentHost, type SceneComponent } from '@datamoc/mw_games/core';
33
+ *
34
+ * class MapSection implements SceneComponent<DungeonScene> {
35
+ * readonly name = 'map';
36
+ * create(scene: DungeonScene): void { console.log('map ready for', scene.floor); }
37
+ * update(_scene: DungeonScene, dt: number): void { }
38
+ * }
39
+ *
40
+ * class DungeonScene extends Scene {
41
+ * floor = 1;
42
+ * private components = new SceneComponentHost<DungeonScene>();
43
+ *
44
+ * create(): void {
45
+ * this.components.add(new MapSection(), this);
46
+ * }
47
+ * override update(dt: number): void { this.components.update(this, dt); }
48
+ * protected override teardown(): void { this.components.destroy(this); }
49
+ * }
50
+ * ```
51
+ */
52
+ export declare class SceneComponentHost<TScene extends Scene = Scene> {
53
+ private order;
54
+ private registry;
55
+ /** registers `component` and immediately runs its `create`, if it has one */
56
+ add(component: SceneComponent<TScene>, scene: TScene): void;
57
+ has(name: string): boolean;
58
+ /** the component registered under `name`; throws if none was */
59
+ get<T extends SceneComponent<TScene> = SceneComponent<TScene>>(name: string): T;
60
+ update(scene: TScene, dt: number): void;
61
+ resize(scene: TScene, width: number, height: number): void;
62
+ onSuspend(scene: TScene): void;
63
+ onResume(scene: TScene, result: unknown): void;
64
+ /** destroys every component in reverse registration order, then forgets them all */
65
+ destroy(scene: TScene): void;
66
+ }
67
+ //# sourceMappingURL=SceneComponents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneComponents.d.ts","sourceRoot":"","sources":["../../src/core/SceneComponents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGxC;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc,CAAC,MAAM,SAAS,KAAK,GAAG,KAAK;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5D,SAAS,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,kBAAkB,CAAC,MAAM,SAAS,KAAK,GAAG,KAAK;IAC3D,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,QAAQ,CAA0C;IAE1D,6EAA6E;IAC7E,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI1D;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzB;IAED,gEAAgE;IAChE,GAAG,CAAC,CAAC,SAAS,cAAc,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAE9E;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAEzD;IAED,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE7B;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAE7C;IAED,oFAAoF;IACpF,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI3B;CACD"}
@@ -0,0 +1,76 @@
1
+ import { Registry } from './Registry.js';
2
+ /**
3
+ * Composes a scene out of named `SceneComponent`s instead of one class accreting every
4
+ * responsibility a scene ends up needing - a factory assembling named sections (map,
5
+ * encounters, UI) at scene-creation time, each a separate module with its own lifecycle.
6
+ *
7
+ * A composition helper, not a base class: a scene owns one `SceneComponentHost` and forwards
8
+ * `core.Scene`'s lifecycle methods to it, the same few lines regardless of whether that scene
9
+ * extends `core.Scene` directly or `two-d.Scene2D` - inheritance would have to pick one of
10
+ * those to sit above, composition does not.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { Scene, SceneComponentHost, type SceneComponent } from '@datamoc/mw_games/core';
15
+ *
16
+ * class MapSection implements SceneComponent<DungeonScene> {
17
+ * readonly name = 'map';
18
+ * create(scene: DungeonScene): void { console.log('map ready for', scene.floor); }
19
+ * update(_scene: DungeonScene, dt: number): void { }
20
+ * }
21
+ *
22
+ * class DungeonScene extends Scene {
23
+ * floor = 1;
24
+ * private components = new SceneComponentHost<DungeonScene>();
25
+ *
26
+ * create(): void {
27
+ * this.components.add(new MapSection(), this);
28
+ * }
29
+ * override update(dt: number): void { this.components.update(this, dt); }
30
+ * protected override teardown(): void { this.components.destroy(this); }
31
+ * }
32
+ * ```
33
+ */
34
+ export class SceneComponentHost {
35
+ constructor() {
36
+ this.order = [];
37
+ this.registry = new Registry();
38
+ }
39
+ /** registers `component` and immediately runs its `create`, if it has one */
40
+ add(component, scene) {
41
+ this.registry.register(component.name, component);
42
+ this.order.push(component);
43
+ component.create?.(scene);
44
+ }
45
+ has(name) {
46
+ return this.registry.has(name);
47
+ }
48
+ /** the component registered under `name`; throws if none was */
49
+ get(name) {
50
+ return this.registry.get(name);
51
+ }
52
+ update(scene, dt) {
53
+ for (const c of this.order)
54
+ c.update?.(scene, dt);
55
+ }
56
+ resize(scene, width, height) {
57
+ for (const c of this.order)
58
+ c.resize?.(scene, width, height);
59
+ }
60
+ onSuspend(scene) {
61
+ for (const c of this.order)
62
+ c.onSuspend?.(scene);
63
+ }
64
+ onResume(scene, result) {
65
+ for (const c of this.order)
66
+ c.onResume?.(scene, result);
67
+ }
68
+ /** destroys every component in reverse registration order, then forgets them all */
69
+ destroy(scene) {
70
+ for (let i = this.order.length - 1; i >= 0; i--)
71
+ this.order[i].destroy?.(scene);
72
+ this.order = [];
73
+ this.registry = new Registry();
74
+ }
75
+ }
76
+ //# sourceMappingURL=SceneComponents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneComponents.js","sourceRoot":"","sources":["../../src/core/SceneComponents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAqBzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,OAAO,kBAAkB;IAA/B;QACS,UAAK,GAA6B,EAAE,CAAC;QACrC,aAAQ,GAAG,IAAI,QAAQ,EAA0B,CAAC;IAwC3D,CAAC;IAtCA,6EAA6E;IAC7E,GAAG,CAAC,SAAiC,EAAE,KAAa;QACnD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,gEAAgE;IAChE,GAAG,CAA4D,IAAY;QAC1E,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAM,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,EAAU;QAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,KAAa,EAAE,MAAc;QAClD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,SAAS,CAAC,KAAa;QACtB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,QAAQ,CAAC,KAAa,EAAE,MAAe;QACtC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAED,oFAAoF;IACpF,OAAO,CAAC,KAAa;QACpB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QAChF,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAA0B,CAAC;IACxD,CAAC;CACD"}
@@ -1,6 +1,9 @@
1
1
  export { Scene } from './Scene.ts';
2
2
  export type { SceneClass } from './Scene.ts';
3
3
  export { SceneStack } from './SceneStack.ts';
4
+ export { Registry } from './Registry.ts';
5
+ export { SceneComponentHost } from './SceneComponents.ts';
6
+ export type { SceneComponent } from './SceneComponents.ts';
4
7
  export { Logger } from './Log.ts';
5
8
  export type { LogLevel, LogEntry, LoggerOptions } from './Log.ts';
6
9
  export { Signal } from './Signal.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  export { Scene } from './Scene.js';
2
2
  export { SceneStack } from './SceneStack.js';
3
+ export { Registry } from './Registry.js';
4
+ export { SceneComponentHost } from './SceneComponents.js';
3
5
  export { Logger } from './Log.js';
4
6
  export { Signal } from './Signal.js';
5
7
  export { HookRegistry } from './Hooks.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEzG,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEzG,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,101 @@
1
+ import type { Catalog } from './index.ts';
2
+ /**
3
+ * The testable core behind `tools/i18n-edit.mjs`: a base (reference-language) catalog and
4
+ * the target catalog being translated, plus the pure operations a split-screen translation
5
+ * editor needs. Nothing here touches the filesystem or the terminal - the tool owns file
6
+ * IO and rendering, this module owns the catalog arithmetic, so both are verifiable with
7
+ * plain unit tests.
8
+ *
9
+ * Audio cues are ordinary catalog entries under this scheme (`<key>.audio` holding a
10
+ * sound path, read by the semantic formatter's `audio` channel), not a parallel map - so
11
+ * associating a sound with a string is just setting one more key, and the translatable
12
+ * key list simply skips `*.audio` entries rather than asking a translator to translate a
13
+ * file path.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import {
18
+ * AUDIO_SUFFIX, copyFromBase, createEditSession, cueKeyFor, deleteTargetKey,
19
+ * isAudioKey, sessionCompleteness, sessionKeys, sessionRow, sessionRows,
20
+ * setTargetSound, setTargetText, swapSession,
21
+ * } from '@datamoc/mw_games/i18n';
22
+ *
23
+ * let session = createEditSession(
24
+ * { locale: 'en', direction: 'ltr', messages: { greeting: 'Hello!', 'hit.audio': 'sounds/hit.wav' } },
25
+ * { locale: 'fr', direction: 'ltr', messages: {} },
26
+ * );
27
+ *
28
+ * sessionKeys(session); // ['greeting'] - 'hit.audio' is a cue, not translated
29
+ * isAudioKey(`hit${AUDIO_SUFFIX}`); // true
30
+ * sessionRow(session, 'greeting').status; // 'missing'
31
+ * sessionRows(session, { missingOnly: true }).length; // 1
32
+ * sessionCompleteness(session); // 0
33
+ *
34
+ * session = setTargetText(session, 'greeting', 'Bonjour !');
35
+ * session = copyFromBase(session, 'greeting');
36
+ * session = setTargetSound(session, 'hit', 'sons/coup.wav');
37
+ * cueKeyFor(session, 'greeting'); // 'greeting.audio'
38
+ * session = deleteTargetKey(session, 'greeting');
39
+ * session = swapSession(session);
40
+ * ```
41
+ */
42
+ /** one translatable key as the editor shows it: reference text left, target text right */
43
+ export interface EditRow {
44
+ key: string;
45
+ baseText: string;
46
+ /** '' when the target has no entry for this key yet */
47
+ targetText: string;
48
+ status: 'ok' | 'missing' | 'extra';
49
+ /** effective cue: the target's own `<key>.audio`, else the base's, else the family's (see below) */
50
+ sound?: string;
51
+ /** the full audio key `sound` above came from, when any */
52
+ soundKey?: string;
53
+ /** true when `sound` above was inherited from the base catalog */
54
+ soundInherited: boolean;
55
+ }
56
+ export interface EditSession {
57
+ base: Catalog;
58
+ target: Catalog;
59
+ }
60
+ export interface RowFilter {
61
+ /** only keys missing from the target */
62
+ missingOnly?: boolean;
63
+ /** case-insensitive substring matched against key and both texts */
64
+ query?: string;
65
+ }
66
+ export declare function createEditSession(base: Catalog, target: Catalog): EditSession;
67
+ /** the suffix marking a sound-cue entry rather than translatable text */
68
+ export declare const AUDIO_SUFFIX = ".audio";
69
+ export declare function isAudioKey(key: string): boolean;
70
+ /** every translatable key across both catalogs, sorted; `*.audio` cues are not translated */
71
+ export declare function sessionKeys(session: EditSession): string[];
72
+ export declare function sessionRow(session: EditSession, key: string): EditRow;
73
+ /**
74
+ * Which audio key `setTargetSound` writes for `key`: the key's own `<key>.audio` when one
75
+ * already exists on either side, else the family's (`<type>.audio` for a channel key),
76
+ * else the key's own. One cue per family rather than one per channel.
77
+ */
78
+ export declare function cueKeyFor(session: EditSession, key: string): string;
79
+ export declare function sessionRows(session: EditSession, filter?: RowFilter): EditRow[];
80
+ /**
81
+ * Sets the target's text for `key`, preserving a plural structure when the new text parses
82
+ * as a plain JSON object over an existing plural entry - otherwise the entry becomes the
83
+ * string as typed. A select message (from an FTL source) edited here downgrades to a
84
+ * plain string; the tool warns about that on save rather than this function refusing it.
85
+ */
86
+ export declare function setTargetText(session: EditSession, key: string, text: string): EditSession;
87
+ /** fills a missing target entry with the base language's own value, plural structure included */
88
+ export declare function copyFromBase(session: EditSession, key: string): EditSession;
89
+ export declare function deleteTargetKey(session: EditSession, key: string): EditSession;
90
+ /**
91
+ * Associates a sound cue with `key` by setting the target's audio entry (`cueKeyFor`
92
+ * picks the family's `<type>.audio` for a channel key with no cue of its own). An empty
93
+ * path clears the cue (removing the entry rather than storing an empty string, which
94
+ * `validateMessageAudio` would flag).
95
+ */
96
+ export declare function setTargetSound(session: EditSession, key: string, path: string): EditSession;
97
+ /** fraction of the base catalog's translatable keys the target also has; cue keys excluded */
98
+ export declare function sessionCompleteness(session: EditSession): number;
99
+ /** swaps which catalog is the reference and which is edited, for main-language-to-main-language work */
100
+ export declare function swapSession(session: EditSession): EditSession;
101
+ //# sourceMappingURL=EditSession.d.ts.map