@datamoc/mw_games 0.4.0 → 0.4.2

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 (665) hide show
  1. package/README.md +2 -2
  2. package/dist/actors/Advancement.d.ts +17 -0
  3. package/dist/actors/Advancement.d.ts.map +1 -1
  4. package/dist/actors/Advancement.js +17 -0
  5. package/dist/actors/Advancement.js.map +1 -1
  6. package/dist/actors/Affix.d.ts +20 -0
  7. package/dist/actors/Affix.d.ts.map +1 -1
  8. package/dist/actors/Affix.js.map +1 -1
  9. package/dist/actors/Appearances.d.ts +12 -0
  10. package/dist/actors/Appearances.d.ts.map +1 -1
  11. package/dist/actors/Appearances.js +12 -0
  12. package/dist/actors/Appearances.js.map +1 -1
  13. package/dist/actors/Aura.d.ts +16 -0
  14. package/dist/actors/Aura.d.ts.map +1 -1
  15. package/dist/actors/Aura.js +16 -0
  16. package/dist/actors/Aura.js.map +1 -1
  17. package/dist/actors/Barrier.d.ts +13 -0
  18. package/dist/actors/Barrier.d.ts.map +1 -1
  19. package/dist/actors/Barrier.js.map +1 -1
  20. package/dist/actors/Charges.d.ts +13 -0
  21. package/dist/actors/Charges.d.ts.map +1 -1
  22. package/dist/actors/Charges.js.map +1 -1
  23. package/dist/actors/Equipment.d.ts +18 -0
  24. package/dist/actors/Equipment.d.ts.map +1 -1
  25. package/dist/actors/Equipment.js +18 -0
  26. package/dist/actors/Equipment.js.map +1 -1
  27. package/dist/actors/Inventory.d.ts +12 -0
  28. package/dist/actors/Inventory.d.ts.map +1 -1
  29. package/dist/actors/Inventory.js +12 -0
  30. package/dist/actors/Inventory.js.map +1 -1
  31. package/dist/actors/ItemState.d.ts +13 -0
  32. package/dist/actors/ItemState.d.ts.map +1 -1
  33. package/dist/actors/ItemState.js +13 -0
  34. package/dist/actors/ItemState.js.map +1 -1
  35. package/dist/actors/ItemStatusEffect.d.ts +13 -0
  36. package/dist/actors/ItemStatusEffect.d.ts.map +1 -1
  37. package/dist/actors/ItemStatusEffect.js +13 -0
  38. package/dist/actors/ItemStatusEffect.js.map +1 -1
  39. package/dist/actors/Loot.d.ts +15 -1
  40. package/dist/actors/Loot.d.ts.map +1 -1
  41. package/dist/actors/Loot.js +15 -1
  42. package/dist/actors/Loot.js.map +1 -1
  43. package/dist/actors/Progression.d.ts +14 -1
  44. package/dist/actors/Progression.d.ts.map +1 -1
  45. package/dist/actors/Progression.js +14 -1
  46. package/dist/actors/Progression.js.map +1 -1
  47. package/dist/actors/Resource.d.ts +14 -0
  48. package/dist/actors/Resource.d.ts.map +1 -1
  49. package/dist/actors/Resource.js.map +1 -1
  50. package/dist/actors/Scaling.d.ts +8 -0
  51. package/dist/actors/Scaling.d.ts.map +1 -1
  52. package/dist/actors/Scaling.js.map +1 -1
  53. package/dist/actors/Shop.d.ts +15 -0
  54. package/dist/actors/Shop.d.ts.map +1 -1
  55. package/dist/actors/Shop.js.map +1 -1
  56. package/dist/actors/SkillPoints.d.ts +13 -0
  57. package/dist/actors/SkillPoints.d.ts.map +1 -1
  58. package/dist/actors/SkillPoints.js +13 -0
  59. package/dist/actors/SkillPoints.js.map +1 -1
  60. package/dist/actors/StatusEffect.d.ts +18 -0
  61. package/dist/actors/StatusEffect.d.ts.map +1 -1
  62. package/dist/actors/StatusEffect.js +18 -0
  63. package/dist/actors/StatusEffect.js.map +1 -1
  64. package/dist/actors/Support.d.ts +11 -0
  65. package/dist/actors/Support.d.ts.map +1 -1
  66. package/dist/actors/Support.js +11 -0
  67. package/dist/actors/Support.js.map +1 -1
  68. package/dist/actors/Traits.d.ts +14 -0
  69. package/dist/actors/Traits.d.ts.map +1 -1
  70. package/dist/actors/Traits.js +14 -0
  71. package/dist/actors/Traits.js.map +1 -1
  72. package/dist/actors/craft.d.ts +16 -0
  73. package/dist/actors/craft.d.ts.map +1 -1
  74. package/dist/actors/craft.js +16 -0
  75. package/dist/actors/craft.js.map +1 -1
  76. package/dist/actors/skillCheck.d.ts +8 -0
  77. package/dist/actors/skillCheck.d.ts.map +1 -1
  78. package/dist/actors/skillCheck.js +8 -0
  79. package/dist/actors/skillCheck.js.map +1 -1
  80. package/dist/assets/ByteProgress.d.ts +10 -0
  81. package/dist/assets/ByteProgress.d.ts.map +1 -1
  82. package/dist/assets/ByteProgress.js +10 -0
  83. package/dist/assets/ByteProgress.js.map +1 -1
  84. package/dist/assets/Streaming.d.ts +10 -0
  85. package/dist/assets/Streaming.d.ts.map +1 -1
  86. package/dist/assets/Streaming.js +10 -0
  87. package/dist/assets/Streaming.js.map +1 -1
  88. package/dist/assets/binary.d.ts +52 -0
  89. package/dist/assets/binary.d.ts.map +1 -0
  90. package/dist/assets/binary.js +57 -0
  91. package/dist/assets/binary.js.map +1 -0
  92. package/dist/assets/index.d.ts +10 -5
  93. package/dist/assets/index.d.ts.map +1 -1
  94. package/dist/assets/index.js +9 -5
  95. package/dist/assets/index.js.map +1 -1
  96. package/dist/assets/loader.d.ts +11 -0
  97. package/dist/assets/loader.d.ts.map +1 -1
  98. package/dist/assets/loader.js +11 -0
  99. package/dist/assets/loader.js.map +1 -1
  100. package/dist/assets/paths.d.ts +10 -0
  101. package/dist/assets/paths.d.ts.map +1 -1
  102. package/dist/assets/paths.js +10 -0
  103. package/dist/assets/paths.js.map +1 -1
  104. package/dist/audio/Captions.d.ts +13 -1
  105. package/dist/audio/Captions.d.ts.map +1 -1
  106. package/dist/audio/Captions.js +13 -1
  107. package/dist/audio/Captions.js.map +1 -1
  108. package/dist/audio/Midi.d.ts +19 -1
  109. package/dist/audio/Midi.d.ts.map +1 -1
  110. package/dist/audio/Midi.js +19 -1
  111. package/dist/audio/Midi.js.map +1 -1
  112. package/dist/audio/Music.d.ts +11 -0
  113. package/dist/audio/Music.d.ts.map +1 -1
  114. package/dist/audio/Music.js +11 -0
  115. package/dist/audio/Music.js.map +1 -1
  116. package/dist/audio/Orchestrator.d.ts +14 -0
  117. package/dist/audio/Orchestrator.d.ts.map +1 -1
  118. package/dist/audio/Orchestrator.js +14 -0
  119. package/dist/audio/Orchestrator.js.map +1 -1
  120. package/dist/audio/Playable.d.ts +11 -1
  121. package/dist/audio/Playable.d.ts.map +1 -1
  122. package/dist/audio/Playable.js +11 -1
  123. package/dist/audio/Playable.js.map +1 -1
  124. package/dist/audio/Sound.d.ts +8 -0
  125. package/dist/audio/Sound.d.ts.map +1 -1
  126. package/dist/audio/Sound.js +8 -0
  127. package/dist/audio/Sound.js.map +1 -1
  128. package/dist/audio/Synth.d.ts +15 -0
  129. package/dist/audio/Synth.d.ts.map +1 -1
  130. package/dist/audio/Synth.js +15 -0
  131. package/dist/audio/Synth.js.map +1 -1
  132. package/dist/battle/BattleAI.d.ts +18 -2
  133. package/dist/battle/BattleAI.d.ts.map +1 -1
  134. package/dist/battle/BattleAI.js +18 -2
  135. package/dist/battle/BattleAI.js.map +1 -1
  136. package/dist/battle/Evolution.d.ts +12 -0
  137. package/dist/battle/Evolution.d.ts.map +1 -1
  138. package/dist/battle/Evolution.js +12 -0
  139. package/dist/battle/Evolution.js.map +1 -1
  140. package/dist/battle/Field.d.ts +11 -0
  141. package/dist/battle/Field.d.ts.map +1 -1
  142. package/dist/battle/Field.js.map +1 -1
  143. package/dist/battle/Hooks.d.ts +16 -0
  144. package/dist/battle/Hooks.d.ts.map +1 -1
  145. package/dist/battle/Hooks.js +16 -0
  146. package/dist/battle/Hooks.js.map +1 -1
  147. package/dist/battle/Move.d.ts +13 -0
  148. package/dist/battle/Move.d.ts.map +1 -1
  149. package/dist/battle/Move.js +13 -0
  150. package/dist/battle/Move.js.map +1 -1
  151. package/dist/battle/Party.d.ts +11 -0
  152. package/dist/battle/Party.d.ts.map +1 -1
  153. package/dist/battle/Party.js +11 -0
  154. package/dist/battle/Party.js.map +1 -1
  155. package/dist/battle/Species.d.ts +10 -0
  156. package/dist/battle/Species.d.ts.map +1 -1
  157. package/dist/battle/Species.js +10 -0
  158. package/dist/battle/Species.js.map +1 -1
  159. package/dist/battle/StatStages.d.ts +14 -0
  160. package/dist/battle/StatStages.d.ts.map +1 -1
  161. package/dist/battle/StatStages.js.map +1 -1
  162. package/dist/battle/TypeMatrix.d.ts +11 -0
  163. package/dist/battle/TypeMatrix.d.ts.map +1 -1
  164. package/dist/battle/TypeMatrix.js +11 -0
  165. package/dist/battle/TypeMatrix.js.map +1 -1
  166. package/dist/board/Army.d.ts +75 -0
  167. package/dist/board/Army.d.ts.map +1 -1
  168. package/dist/board/Army.js +75 -0
  169. package/dist/board/Army.js.map +1 -1
  170. package/dist/board/Classics.d.ts +297 -1
  171. package/dist/board/Classics.d.ts.map +1 -1
  172. package/dist/board/Classics.js +297 -1
  173. package/dist/board/Classics.js.map +1 -1
  174. package/dist/board/Engine.d.ts +23 -0
  175. package/dist/board/Engine.d.ts.map +1 -1
  176. package/dist/board/Engine.js +23 -0
  177. package/dist/board/Engine.js.map +1 -1
  178. package/dist/board/FogOfWar.d.ts +20 -0
  179. package/dist/board/FogOfWar.d.ts.map +1 -1
  180. package/dist/board/FogOfWar.js +20 -0
  181. package/dist/board/FogOfWar.js.map +1 -1
  182. package/dist/board/Tactics.d.ts +158 -1
  183. package/dist/board/Tactics.d.ts.map +1 -1
  184. package/dist/board/Tactics.js +125 -1
  185. package/dist/board/Tactics.js.map +1 -1
  186. package/dist/board/chess.d.ts +87 -3
  187. package/dist/board/chess.d.ts.map +1 -1
  188. package/dist/board/chess.js +96 -4
  189. package/dist/board/chess.js.map +1 -1
  190. package/dist/core/Achievements.d.ts +15 -0
  191. package/dist/core/Achievements.d.ts.map +1 -1
  192. package/dist/core/Achievements.js +15 -0
  193. package/dist/core/Achievements.js.map +1 -1
  194. package/dist/core/Collection.d.ts +12 -0
  195. package/dist/core/Collection.d.ts.map +1 -1
  196. package/dist/core/Collection.js +12 -0
  197. package/dist/core/Collection.js.map +1 -1
  198. package/dist/core/Entity.d.ts +42 -0
  199. package/dist/core/Entity.d.ts.map +1 -0
  200. package/dist/core/Entity.js +47 -0
  201. package/dist/core/Entity.js.map +1 -0
  202. package/dist/core/Feedback.d.ts +11 -1
  203. package/dist/core/Feedback.d.ts.map +1 -1
  204. package/dist/core/Feedback.js +11 -1
  205. package/dist/core/Feedback.js.map +1 -1
  206. package/dist/core/Hex.d.ts +14 -0
  207. package/dist/core/Hex.d.ts.map +1 -1
  208. package/dist/core/Hex.js +14 -0
  209. package/dist/core/Hex.js.map +1 -1
  210. package/dist/core/Hooks.d.ts +14 -0
  211. package/dist/core/Hooks.d.ts.map +1 -1
  212. package/dist/core/Hooks.js.map +1 -1
  213. package/dist/core/Input.d.ts +12 -0
  214. package/dist/core/Input.d.ts.map +1 -1
  215. package/dist/core/Input.js.map +1 -1
  216. package/dist/core/Loading.d.ts +17 -0
  217. package/dist/core/Loading.d.ts.map +1 -1
  218. package/dist/core/Loading.js +17 -0
  219. package/dist/core/Loading.js.map +1 -1
  220. package/dist/core/Log.d.ts +9 -0
  221. package/dist/core/Log.d.ts.map +1 -1
  222. package/dist/core/Log.js +9 -0
  223. package/dist/core/Log.js.map +1 -1
  224. package/dist/core/Multiplayer.d.ts +12 -0
  225. package/dist/core/Multiplayer.d.ts.map +1 -1
  226. package/dist/core/Multiplayer.js +12 -0
  227. package/dist/core/Multiplayer.js.map +1 -1
  228. package/dist/core/News.d.ts +12 -0
  229. package/dist/core/News.d.ts.map +1 -1
  230. package/dist/core/News.js.map +1 -1
  231. package/dist/core/PlayerInput.d.ts +14 -0
  232. package/dist/core/PlayerInput.d.ts.map +1 -1
  233. package/dist/core/PlayerInput.js +14 -0
  234. package/dist/core/PlayerInput.js.map +1 -1
  235. package/dist/core/Presentation.d.ts +56 -0
  236. package/dist/core/Presentation.d.ts.map +1 -0
  237. package/dist/core/Presentation.js +78 -0
  238. package/dist/core/Presentation.js.map +1 -0
  239. package/dist/core/Random.d.ts +24 -0
  240. package/dist/core/Random.d.ts.map +1 -1
  241. package/dist/core/Random.js +24 -0
  242. package/dist/core/Random.js.map +1 -1
  243. package/dist/core/Replay.d.ts +31 -0
  244. package/dist/core/Replay.d.ts.map +1 -1
  245. package/dist/core/Replay.js +31 -0
  246. package/dist/core/Replay.js.map +1 -1
  247. package/dist/core/RunHistory.d.ts +12 -0
  248. package/dist/core/RunHistory.d.ts.map +1 -1
  249. package/dist/core/RunHistory.js.map +1 -1
  250. package/dist/core/Sanitize.d.ts +18 -0
  251. package/dist/core/Sanitize.d.ts.map +1 -1
  252. package/dist/core/Sanitize.js +18 -0
  253. package/dist/core/Sanitize.js.map +1 -1
  254. package/dist/core/Save.d.ts.map +1 -1
  255. package/dist/core/Save.js +13 -0
  256. package/dist/core/Save.js.map +1 -1
  257. package/dist/core/SaveSync.d.ts +14 -0
  258. package/dist/core/SaveSync.d.ts.map +1 -1
  259. package/dist/core/SaveSync.js.map +1 -1
  260. package/dist/core/Scene.d.ts +13 -0
  261. package/dist/core/Scene.d.ts.map +1 -1
  262. package/dist/core/Scene.js +13 -0
  263. package/dist/core/Scene.js.map +1 -1
  264. package/dist/core/SceneStack.d.ts +20 -0
  265. package/dist/core/SceneStack.d.ts.map +1 -1
  266. package/dist/core/SceneStack.js +20 -0
  267. package/dist/core/SceneStack.js.map +1 -1
  268. package/dist/core/Scramble.d.ts +8 -0
  269. package/dist/core/Scramble.d.ts.map +1 -1
  270. package/dist/core/Scramble.js +8 -0
  271. package/dist/core/Scramble.js.map +1 -1
  272. package/dist/core/Session.d.ts +10 -0
  273. package/dist/core/Session.d.ts.map +1 -1
  274. package/dist/core/Session.js.map +1 -1
  275. package/dist/core/Signal.d.ts +11 -0
  276. package/dist/core/Signal.d.ts.map +1 -1
  277. package/dist/core/Signal.js.map +1 -1
  278. package/dist/core/Spawner.d.ts +17 -0
  279. package/dist/core/Spawner.d.ts.map +1 -1
  280. package/dist/core/Spawner.js +17 -0
  281. package/dist/core/Spawner.js.map +1 -1
  282. package/dist/core/Stats.d.ts +14 -0
  283. package/dist/core/Stats.d.ts.map +1 -1
  284. package/dist/core/Stats.js +14 -0
  285. package/dist/core/Stats.js.map +1 -1
  286. package/dist/core/Telemetry.d.ts +11 -0
  287. package/dist/core/Telemetry.d.ts.map +1 -1
  288. package/dist/core/Telemetry.js +11 -0
  289. package/dist/core/Telemetry.js.map +1 -1
  290. package/dist/core/Tween.d.ts +16 -1
  291. package/dist/core/Tween.d.ts.map +1 -1
  292. package/dist/core/Tween.js +16 -1
  293. package/dist/core/Tween.js.map +1 -1
  294. package/dist/core/UndoHistory.d.ts +15 -0
  295. package/dist/core/UndoHistory.d.ts.map +1 -1
  296. package/dist/core/UndoHistory.js.map +1 -1
  297. package/dist/core/index.d.ts +4 -0
  298. package/dist/core/index.d.ts.map +1 -1
  299. package/dist/core/index.js +2 -0
  300. package/dist/core/index.js.map +1 -1
  301. package/dist/i18n/Content.d.ts +151 -0
  302. package/dist/i18n/Content.d.ts.map +1 -0
  303. package/dist/i18n/Content.js +219 -0
  304. package/dist/i18n/Content.js.map +1 -0
  305. package/dist/i18n/Format.d.ts +25 -0
  306. package/dist/i18n/Format.d.ts.map +1 -0
  307. package/dist/i18n/Format.js +32 -0
  308. package/dist/i18n/Format.js.map +1 -0
  309. package/dist/i18n/SemanticMessage.d.ts +71 -0
  310. package/dist/i18n/SemanticMessage.d.ts.map +1 -0
  311. package/dist/i18n/SemanticMessage.js +40 -0
  312. package/dist/i18n/SemanticMessage.js.map +1 -0
  313. package/dist/i18n/Validate.d.ts +56 -0
  314. package/dist/i18n/Validate.d.ts.map +1 -0
  315. package/dist/i18n/Validate.js +65 -0
  316. package/dist/i18n/Validate.js.map +1 -0
  317. package/dist/i18n/index.d.ts +74 -3
  318. package/dist/i18n/index.d.ts.map +1 -1
  319. package/dist/i18n/index.js +136 -7
  320. package/dist/i18n/index.js.map +1 -1
  321. package/dist/mw_games.global.js +153 -88
  322. package/dist/roguelike/Blob.d.ts +11 -0
  323. package/dist/roguelike/Blob.d.ts.map +1 -1
  324. package/dist/roguelike/Blob.js +11 -0
  325. package/dist/roguelike/Blob.js.map +1 -1
  326. package/dist/roguelike/Boss.d.ts +12 -0
  327. package/dist/roguelike/Boss.d.ts.map +1 -1
  328. package/dist/roguelike/Boss.js +12 -0
  329. package/dist/roguelike/Boss.js.map +1 -1
  330. package/dist/roguelike/Combat.d.ts +13 -0
  331. package/dist/roguelike/Combat.d.ts.map +1 -1
  332. package/dist/roguelike/Combat.js +13 -0
  333. package/dist/roguelike/Combat.js.map +1 -1
  334. package/dist/roguelike/ContentRoll.d.ts +10 -0
  335. package/dist/roguelike/ContentRoll.d.ts.map +1 -1
  336. package/dist/roguelike/ContentRoll.js +10 -0
  337. package/dist/roguelike/ContentRoll.js.map +1 -1
  338. package/dist/roguelike/Doors.d.ts +13 -0
  339. package/dist/roguelike/Doors.d.ts.map +1 -1
  340. package/dist/roguelike/Doors.js +13 -0
  341. package/dist/roguelike/Doors.js.map +1 -1
  342. package/dist/roguelike/DungeonParity.d.ts +15 -0
  343. package/dist/roguelike/DungeonParity.d.ts.map +1 -1
  344. package/dist/roguelike/DungeonParity.js +15 -0
  345. package/dist/roguelike/DungeonParity.js.map +1 -1
  346. package/dist/roguelike/Elevation.d.ts +15 -0
  347. package/dist/roguelike/Elevation.d.ts.map +1 -1
  348. package/dist/roguelike/Elevation.js +15 -0
  349. package/dist/roguelike/Elevation.js.map +1 -1
  350. package/dist/roguelike/Features.d.ts +17 -0
  351. package/dist/roguelike/Features.d.ts.map +1 -1
  352. package/dist/roguelike/Features.js +17 -0
  353. package/dist/roguelike/Features.js.map +1 -1
  354. package/dist/roguelike/FieldOfView.d.ts +13 -0
  355. package/dist/roguelike/FieldOfView.d.ts.map +1 -1
  356. package/dist/roguelike/FieldOfView.js +13 -0
  357. package/dist/roguelike/FieldOfView.js.map +1 -1
  358. package/dist/roguelike/Level.d.ts +26 -1
  359. package/dist/roguelike/Level.d.ts.map +1 -1
  360. package/dist/roguelike/Level.js +26 -1
  361. package/dist/roguelike/Level.js.map +1 -1
  362. package/dist/roguelike/MonsterAI.d.ts +14 -0
  363. package/dist/roguelike/MonsterAI.d.ts.map +1 -1
  364. package/dist/roguelike/MonsterAI.js +14 -0
  365. package/dist/roguelike/MonsterAI.js.map +1 -1
  366. package/dist/roguelike/MultiStageAbility.d.ts +16 -0
  367. package/dist/roguelike/MultiStageAbility.d.ts.map +1 -1
  368. package/dist/roguelike/MultiStageAbility.js +16 -0
  369. package/dist/roguelike/MultiStageAbility.js.map +1 -1
  370. package/dist/roguelike/Pathfinder.d.ts +23 -2
  371. package/dist/roguelike/Pathfinder.d.ts.map +1 -1
  372. package/dist/roguelike/Pathfinder.js +23 -2
  373. package/dist/roguelike/Pathfinder.js.map +1 -1
  374. package/dist/roguelike/Placement.d.ts +62 -0
  375. package/dist/roguelike/Placement.d.ts.map +1 -0
  376. package/dist/roguelike/Placement.js +79 -0
  377. package/dist/roguelike/Placement.js.map +1 -0
  378. package/dist/roguelike/RoomBuilders.d.ts +18 -1
  379. package/dist/roguelike/RoomBuilders.d.ts.map +1 -1
  380. package/dist/roguelike/RoomBuilders.js +18 -1
  381. package/dist/roguelike/RoomBuilders.js.map +1 -1
  382. package/dist/roguelike/Scheduler.d.ts +48 -1
  383. package/dist/roguelike/Scheduler.d.ts.map +1 -1
  384. package/dist/roguelike/Scheduler.js +58 -1
  385. package/dist/roguelike/Scheduler.js.map +1 -1
  386. package/dist/roguelike/Secrets.d.ts +13 -0
  387. package/dist/roguelike/Secrets.d.ts.map +1 -1
  388. package/dist/roguelike/Secrets.js +13 -0
  389. package/dist/roguelike/Secrets.js.map +1 -1
  390. package/dist/roguelike/Stealth.d.ts +13 -0
  391. package/dist/roguelike/Stealth.d.ts.map +1 -1
  392. package/dist/roguelike/Stealth.js +13 -0
  393. package/dist/roguelike/Stealth.js.map +1 -1
  394. package/dist/roguelike/Targeting.d.ts +45 -1
  395. package/dist/roguelike/Targeting.d.ts.map +1 -1
  396. package/dist/roguelike/Targeting.js +33 -1
  397. package/dist/roguelike/Targeting.js.map +1 -1
  398. package/dist/roguelike/TriggerTracker.d.ts +10 -0
  399. package/dist/roguelike/TriggerTracker.d.ts.map +1 -1
  400. package/dist/roguelike/TriggerTracker.js +10 -0
  401. package/dist/roguelike/TriggerTracker.js.map +1 -1
  402. package/dist/roguelike/generate.d.ts +41 -1
  403. package/dist/roguelike/generate.d.ts.map +1 -1
  404. package/dist/roguelike/generate.js +41 -1
  405. package/dist/roguelike/generate.js.map +1 -1
  406. package/dist/roguelike/index.d.ts +3 -1
  407. package/dist/roguelike/index.d.ts.map +1 -1
  408. package/dist/roguelike/index.js +1 -0
  409. package/dist/roguelike/index.js.map +1 -1
  410. package/dist/rpg/Collision.d.ts +19 -0
  411. package/dist/rpg/Collision.d.ts.map +1 -1
  412. package/dist/rpg/Collision.js +19 -0
  413. package/dist/rpg/Collision.js.map +1 -1
  414. package/dist/rpg/Event.d.ts +17 -0
  415. package/dist/rpg/Event.d.ts.map +1 -1
  416. package/dist/rpg/Event.js +17 -0
  417. package/dist/rpg/Event.js.map +1 -1
  418. package/dist/rpg/EventRunner.d.ts +14 -0
  419. package/dist/rpg/EventRunner.d.ts.map +1 -1
  420. package/dist/rpg/EventRunner.js +14 -0
  421. package/dist/rpg/EventRunner.js.map +1 -1
  422. package/dist/rpg/FreeMover.d.ts +14 -0
  423. package/dist/rpg/FreeMover.d.ts.map +1 -1
  424. package/dist/rpg/FreeMover.js +14 -0
  425. package/dist/rpg/FreeMover.js.map +1 -1
  426. package/dist/rpg/GameState.d.ts +14 -0
  427. package/dist/rpg/GameState.d.ts.map +1 -1
  428. package/dist/rpg/GameState.js +14 -0
  429. package/dist/rpg/GameState.js.map +1 -1
  430. package/dist/rpg/GridMover.d.ts +14 -0
  431. package/dist/rpg/GridMover.d.ts.map +1 -1
  432. package/dist/rpg/GridMover.js +14 -0
  433. package/dist/rpg/GridMover.js.map +1 -1
  434. package/dist/rpg/Marshal.d.ts +16 -0
  435. package/dist/rpg/Marshal.d.ts.map +1 -1
  436. package/dist/rpg/Marshal.js +16 -0
  437. package/dist/rpg/Marshal.js.map +1 -1
  438. package/dist/rpg/Quest.d.ts +15 -0
  439. package/dist/rpg/Quest.d.ts.map +1 -1
  440. package/dist/rpg/Quest.js +15 -0
  441. package/dist/rpg/Quest.js.map +1 -1
  442. package/dist/rpg/automap.d.ts +15 -0
  443. package/dist/rpg/automap.d.ts.map +1 -1
  444. package/dist/rpg/automap.js +15 -0
  445. package/dist/rpg/automap.js.map +1 -1
  446. package/dist/simulation/Runtime.d.ts +98 -0
  447. package/dist/simulation/Runtime.d.ts.map +1 -0
  448. package/dist/simulation/Runtime.js +91 -0
  449. package/dist/simulation/Runtime.js.map +1 -0
  450. package/dist/simulation/Scenario.d.ts +15 -0
  451. package/dist/simulation/Scenario.d.ts.map +1 -1
  452. package/dist/simulation/Scenario.js +15 -0
  453. package/dist/simulation/Scenario.js.map +1 -1
  454. package/dist/simulation/Turns.d.ts +11 -0
  455. package/dist/simulation/Turns.d.ts.map +1 -1
  456. package/dist/simulation/Turns.js +11 -0
  457. package/dist/simulation/Turns.js.map +1 -1
  458. package/dist/simulation/index.d.ts +10 -0
  459. package/dist/simulation/index.d.ts.map +1 -1
  460. package/dist/simulation/index.js +8 -0
  461. package/dist/simulation/index.js.map +1 -1
  462. package/dist/three-d/Models.d.ts +38 -1
  463. package/dist/three-d/Models.d.ts.map +1 -1
  464. package/dist/three-d/Models.js +66 -3
  465. package/dist/three-d/Models.js.map +1 -1
  466. package/dist/two-d/Game.d.ts +8 -11
  467. package/dist/two-d/Game.d.ts.map +1 -1
  468. package/dist/two-d/Game.js.map +1 -1
  469. package/dist/two-d/Scene2D.d.ts +2 -2
  470. package/dist/two-d/Scene2D.d.ts.map +1 -1
  471. package/dist/two-d/Scene2D.js.map +1 -1
  472. package/dist/two-d/pixi-interop.d.ts +13 -0
  473. package/dist/two-d/pixi-interop.d.ts.map +1 -0
  474. package/dist/two-d/pixi-interop.js +12 -0
  475. package/dist/two-d/pixi-interop.js.map +1 -0
  476. package/dist/two-d/render/ActorAnimator.d.ts +32 -0
  477. package/dist/two-d/render/ActorAnimator.d.ts.map +1 -1
  478. package/dist/two-d/render/ActorAnimator.js +21 -0
  479. package/dist/two-d/render/ActorAnimator.js.map +1 -1
  480. package/dist/two-d/render/AnimatedSprite.d.ts +28 -8
  481. package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -1
  482. package/dist/two-d/render/AnimatedSprite.js +24 -4
  483. package/dist/two-d/render/AnimatedSprite.js.map +1 -1
  484. package/dist/two-d/render/Autotile.d.ts +33 -1
  485. package/dist/two-d/render/Autotile.d.ts.map +1 -1
  486. package/dist/two-d/render/Autotile.js +33 -1
  487. package/dist/two-d/render/Autotile.js.map +1 -1
  488. package/dist/two-d/render/Camera.d.ts +53 -1
  489. package/dist/two-d/render/Camera.d.ts.map +1 -1
  490. package/dist/two-d/render/Camera.js +36 -1
  491. package/dist/two-d/render/Camera.js.map +1 -1
  492. package/dist/two-d/render/Capabilities.d.ts +33 -0
  493. package/dist/two-d/render/Capabilities.d.ts.map +1 -1
  494. package/dist/two-d/render/Capabilities.js +33 -0
  495. package/dist/two-d/render/Capabilities.js.map +1 -1
  496. package/dist/two-d/render/ColorBlindness.d.ts +23 -0
  497. package/dist/two-d/render/ColorBlindness.d.ts.map +1 -1
  498. package/dist/two-d/render/ColorBlindness.js +23 -4
  499. package/dist/two-d/render/ColorBlindness.js.map +1 -1
  500. package/dist/two-d/render/ColorTransformBatcher.d.ts +75 -4
  501. package/dist/two-d/render/ColorTransformBatcher.d.ts.map +1 -1
  502. package/dist/two-d/render/ColorTransformBatcher.js +65 -4
  503. package/dist/two-d/render/ColorTransformBatcher.js.map +1 -1
  504. package/dist/two-d/render/LayeredSprite.d.ts +22 -3
  505. package/dist/two-d/render/LayeredSprite.d.ts.map +1 -1
  506. package/dist/two-d/render/LayeredSprite.js +19 -0
  507. package/dist/two-d/render/LayeredSprite.js.map +1 -1
  508. package/dist/two-d/render/Minimap.d.ts +25 -1
  509. package/dist/two-d/render/Minimap.d.ts.map +1 -1
  510. package/dist/two-d/render/Minimap.js +25 -1
  511. package/dist/two-d/render/Minimap.js.map +1 -1
  512. package/dist/two-d/render/Particles.d.ts +26 -2
  513. package/dist/two-d/render/Particles.d.ts.map +1 -1
  514. package/dist/two-d/render/Particles.js +23 -0
  515. package/dist/two-d/render/Particles.js.map +1 -1
  516. package/dist/two-d/render/Projectile.d.ts +14 -0
  517. package/dist/two-d/render/Projectile.d.ts.map +1 -1
  518. package/dist/two-d/render/Projectile.js +14 -0
  519. package/dist/two-d/render/Projectile.js.map +1 -1
  520. package/dist/two-d/render/ScreenEffects.d.ts +15 -0
  521. package/dist/two-d/render/ScreenEffects.d.ts.map +1 -1
  522. package/dist/two-d/render/ScreenEffects.js +15 -0
  523. package/dist/two-d/render/ScreenEffects.js.map +1 -1
  524. package/dist/two-d/render/Shape2D.d.ts +97 -0
  525. package/dist/two-d/render/Shape2D.d.ts.map +1 -0
  526. package/dist/two-d/render/Shape2D.js +97 -0
  527. package/dist/two-d/render/Shape2D.js.map +1 -0
  528. package/dist/two-d/render/SpriteSheet.d.ts +9 -6
  529. package/dist/two-d/render/SpriteSheet.d.ts.map +1 -1
  530. package/dist/two-d/render/SpriteSheet.js +7 -0
  531. package/dist/two-d/render/SpriteSheet.js.map +1 -1
  532. package/dist/two-d/render/StatusVisuals.d.ts +22 -0
  533. package/dist/two-d/render/StatusVisuals.d.ts.map +1 -1
  534. package/dist/two-d/render/StatusVisuals.js +22 -0
  535. package/dist/two-d/render/StatusVisuals.js.map +1 -1
  536. package/dist/two-d/render/TileMap.d.ts +65 -3
  537. package/dist/two-d/render/TileMap.d.ts.map +1 -1
  538. package/dist/two-d/render/TileMap.js +65 -3
  539. package/dist/two-d/render/TileMap.js.map +1 -1
  540. package/dist/two-d/render/TiledMap.d.ts +9 -3
  541. package/dist/two-d/render/TiledMap.d.ts.map +1 -1
  542. package/dist/two-d/render/TiledMap.js +9 -3
  543. package/dist/two-d/render/TiledMap.js.map +1 -1
  544. package/dist/two-d/render/TintedSprite.d.ts +12 -4
  545. package/dist/two-d/render/TintedSprite.d.ts.map +1 -1
  546. package/dist/two-d/render/TintedSprite.js +14 -3
  547. package/dist/two-d/render/TintedSprite.js.map +1 -1
  548. package/dist/two-d/render/Types2D.d.ts +39 -0
  549. package/dist/two-d/render/Types2D.d.ts.map +1 -0
  550. package/dist/two-d/render/Types2D.js +18 -0
  551. package/dist/two-d/render/Types2D.js.map +1 -0
  552. package/dist/two-d/render/Viewport.d.ts +22 -0
  553. package/dist/two-d/render/Viewport.d.ts.map +1 -1
  554. package/dist/two-d/render/Viewport.js +22 -0
  555. package/dist/two-d/render/Viewport.js.map +1 -1
  556. package/dist/two-d/render/index.d.ts +3 -0
  557. package/dist/two-d/render/index.d.ts.map +1 -1
  558. package/dist/two-d/render/index.js +2 -0
  559. package/dist/two-d/render/index.js.map +1 -1
  560. package/dist/two-d/stage/DialogueStage.d.ts +16 -0
  561. package/dist/two-d/stage/DialogueStage.d.ts.map +1 -1
  562. package/dist/two-d/stage/DialogueStage.js +16 -0
  563. package/dist/two-d/stage/DialogueStage.js.map +1 -1
  564. package/dist/two-d/stage/script.d.ts +20 -0
  565. package/dist/two-d/stage/script.d.ts.map +1 -1
  566. package/dist/two-d/stage/script.js +20 -0
  567. package/dist/two-d/stage/script.js.map +1 -1
  568. package/dist/two-d/stage/twee.d.ts +11 -0
  569. package/dist/two-d/stage/twee.d.ts.map +1 -1
  570. package/dist/two-d/stage/twee.js +11 -0
  571. package/dist/two-d/stage/twee.js.map +1 -1
  572. package/dist/two-d/ui/Bar.d.ts +16 -3
  573. package/dist/two-d/ui/Bar.d.ts.map +1 -1
  574. package/dist/two-d/ui/Bar.js +16 -1
  575. package/dist/two-d/ui/Bar.js.map +1 -1
  576. package/dist/two-d/ui/BitmapLabel.d.ts +23 -1
  577. package/dist/two-d/ui/BitmapLabel.d.ts.map +1 -1
  578. package/dist/two-d/ui/BitmapLabel.js +23 -1
  579. package/dist/two-d/ui/BitmapLabel.js.map +1 -1
  580. package/dist/two-d/ui/Button.d.ts +19 -3
  581. package/dist/two-d/ui/Button.d.ts.map +1 -1
  582. package/dist/two-d/ui/Button.js +15 -0
  583. package/dist/two-d/ui/Button.js.map +1 -1
  584. package/dist/two-d/ui/FloatingText.d.ts +15 -0
  585. package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
  586. package/dist/two-d/ui/FloatingText.js +15 -0
  587. package/dist/two-d/ui/FloatingText.js.map +1 -1
  588. package/dist/two-d/ui/HelpScreen.d.ts +16 -0
  589. package/dist/two-d/ui/HelpScreen.d.ts.map +1 -1
  590. package/dist/two-d/ui/HelpScreen.js +23 -3
  591. package/dist/two-d/ui/HelpScreen.js.map +1 -1
  592. package/dist/two-d/ui/IconGrid.d.ts +27 -1
  593. package/dist/two-d/ui/IconGrid.d.ts.map +1 -1
  594. package/dist/two-d/ui/IconGrid.js +37 -5
  595. package/dist/two-d/ui/IconGrid.js.map +1 -1
  596. package/dist/two-d/ui/Label.d.ts +10 -0
  597. package/dist/two-d/ui/Label.d.ts.map +1 -1
  598. package/dist/two-d/ui/Label.js +10 -0
  599. package/dist/two-d/ui/Label.js.map +1 -1
  600. package/dist/two-d/ui/ListView.d.ts +21 -1
  601. package/dist/two-d/ui/ListView.d.ts.map +1 -1
  602. package/dist/two-d/ui/ListView.js +19 -0
  603. package/dist/two-d/ui/ListView.js.map +1 -1
  604. package/dist/two-d/ui/LoadingScreen.d.ts +24 -1
  605. package/dist/two-d/ui/LoadingScreen.d.ts.map +1 -1
  606. package/dist/two-d/ui/LoadingScreen.js +24 -1
  607. package/dist/two-d/ui/LoadingScreen.js.map +1 -1
  608. package/dist/two-d/ui/MessageBox.d.ts +21 -2
  609. package/dist/two-d/ui/MessageBox.d.ts.map +1 -1
  610. package/dist/two-d/ui/MessageBox.js +19 -0
  611. package/dist/two-d/ui/MessageBox.js.map +1 -1
  612. package/dist/two-d/ui/NinePatch.d.ts +15 -2
  613. package/dist/two-d/ui/NinePatch.d.ts.map +1 -1
  614. package/dist/two-d/ui/NinePatch.js +13 -1
  615. package/dist/two-d/ui/NinePatch.js.map +1 -1
  616. package/dist/two-d/ui/RebindScreen.d.ts +15 -0
  617. package/dist/two-d/ui/RebindScreen.d.ts.map +1 -1
  618. package/dist/two-d/ui/RebindScreen.js +15 -0
  619. package/dist/two-d/ui/RebindScreen.js.map +1 -1
  620. package/dist/two-d/ui/StatsScreen.d.ts +15 -0
  621. package/dist/two-d/ui/StatsScreen.d.ts.map +1 -1
  622. package/dist/two-d/ui/StatsScreen.js +15 -0
  623. package/dist/two-d/ui/StatsScreen.js.map +1 -1
  624. package/dist/two-d/ui/Toast.d.ts +14 -1
  625. package/dist/two-d/ui/Toast.d.ts.map +1 -1
  626. package/dist/two-d/ui/Toast.js +12 -0
  627. package/dist/two-d/ui/Toast.js.map +1 -1
  628. package/dist/two-d/ui/Tooltip.d.ts +14 -0
  629. package/dist/two-d/ui/Tooltip.d.ts.map +1 -1
  630. package/dist/two-d/ui/Tooltip.js +14 -0
  631. package/dist/two-d/ui/Tooltip.js.map +1 -1
  632. package/dist/two-d/ui/VerticalLabel.d.ts +18 -0
  633. package/dist/two-d/ui/VerticalLabel.d.ts.map +1 -1
  634. package/dist/two-d/ui/VerticalLabel.js +18 -0
  635. package/dist/two-d/ui/VerticalLabel.js.map +1 -1
  636. package/dist/two-d/ui/Window.d.ts +12 -0
  637. package/dist/two-d/ui/Window.d.ts.map +1 -1
  638. package/dist/two-d/ui/Window.js +12 -0
  639. package/dist/two-d/ui/Window.js.map +1 -1
  640. package/dist/two-d/ui/theme.d.ts +47 -3
  641. package/dist/two-d/ui/theme.d.ts.map +1 -1
  642. package/dist/two-d/ui/theme.js +45 -1
  643. package/dist/two-d/ui/theme.js.map +1 -1
  644. package/dist/version.d.ts +1 -1
  645. package/dist/version.js +1 -1
  646. package/dist/world/Encounters.d.ts +12 -0
  647. package/dist/world/Encounters.d.ts.map +1 -1
  648. package/dist/world/Encounters.js.map +1 -1
  649. package/dist/world/Environment.d.ts +15 -1
  650. package/dist/world/Environment.d.ts.map +1 -1
  651. package/dist/world/Environment.js +15 -1
  652. package/dist/world/Environment.js.map +1 -1
  653. package/dist/world/Overworld.d.ts +14 -0
  654. package/dist/world/Overworld.d.ts.map +1 -1
  655. package/dist/world/Overworld.js +14 -0
  656. package/dist/world/Overworld.js.map +1 -1
  657. package/dist/world/TurnClock.d.ts +16 -0
  658. package/dist/world/TurnClock.d.ts.map +1 -1
  659. package/dist/world/TurnClock.js +16 -0
  660. package/dist/world/TurnClock.js.map +1 -1
  661. package/dist/world/World.d.ts +14 -0
  662. package/dist/world/World.d.ts.map +1 -1
  663. package/dist/world/World.js +14 -0
  664. package/dist/world/World.js.map +1 -1
  665. package/package.json +10 -3
@@ -0,0 +1,219 @@
1
+ import { diffCatalogKeys } from './Validate.js';
2
+ /**
3
+ * A catalog message reduced to plain, comparable text: a string as-is, a `PluralForms`
4
+ * reduced to its `other` branch (or the first form present, the same fallback
5
+ * `resolvePlural` itself uses with no count), and a `FluentMessage` formatted with no
6
+ * params - best-effort, since a `.ftl` message needing a required variable throws rather
7
+ * than resolving; that failure reads as empty text here rather than aborting the caller's
8
+ * whole scan.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { messageText } from '@datamoc/mw_games/i18n';
13
+ *
14
+ * messageText('Hello'); // 'Hello'
15
+ * messageText({ one: '1 item', other: '{count} items' }); // '{count} items'
16
+ * ```
17
+ */
18
+ export function messageText(value) {
19
+ if (typeof value === 'string')
20
+ return value;
21
+ if (typeof value === 'object' && value !== null && 'format' in value) {
22
+ try {
23
+ return value.format();
24
+ }
25
+ catch {
26
+ return '';
27
+ }
28
+ }
29
+ const forms = value;
30
+ return forms.other ?? Object.values(forms)[0] ?? '';
31
+ }
32
+ /**
33
+ * The classic edit distance: how many single-character insertions, deletions or
34
+ * substitutions turn `a` into `b`. The primitive `findSimilarMessages` is built on, exposed
35
+ * on its own since "how different are these two strings" is useful wherever a catalog's own
36
+ * message text is not the only thing worth comparing.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * import { levenshteinDistance } from '@datamoc/mw_games/i18n';
41
+ *
42
+ * levenshteinDistance('kitten', 'sitting'); // 3
43
+ * levenshteinDistance('same', 'same'); // 0
44
+ * ```
45
+ */
46
+ export function levenshteinDistance(a, b) {
47
+ if (a === b)
48
+ return 0;
49
+ if (a.length === 0)
50
+ return b.length;
51
+ if (b.length === 0)
52
+ return a.length;
53
+ let previous = Array.from({ length: b.length + 1 }, (_, i) => i);
54
+ let current = new Array(b.length + 1);
55
+ for (let i = 1; i <= a.length; i++) {
56
+ current[0] = i;
57
+ for (let j = 1; j <= b.length; j++) {
58
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
59
+ current[j] = Math.min(previous[j] + 1, //deletion
60
+ current[j - 1] + 1, //insertion
61
+ previous[j - 1] + cost //substitution
62
+ );
63
+ }
64
+ [previous, current] = [current, previous];
65
+ }
66
+ return previous[b.length];
67
+ }
68
+ /**
69
+ * Every pair of keys in `catalog` whose message text is at least `minSimilarity` alike
70
+ * (default 0.8), surfaced for a human to decide whether they are genuinely the same message
71
+ * translated three separate times - `mwg` finds the candidates, never merges anything on
72
+ * its own. Empty messages are skipped (nothing to compare), and pairs are sorted most
73
+ * similar first.
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * import { findSimilarMessages } from '@datamoc/mw_games/i18n';
78
+ *
79
+ * const catalog = {
80
+ * locale: 'en', direction: 'ltr' as const,
81
+ * messages: { 'confirm.quit': 'Are you sure?', 'confirm.delete': 'Are you sure?' },
82
+ * };
83
+ *
84
+ * findSimilarMessages(catalog); // [{ a: 'confirm.quit', b: 'confirm.delete', distance: 0, similarity: 1 }]
85
+ * ```
86
+ */
87
+ export function findSimilarMessages(catalog, minSimilarity = 0.8) {
88
+ const entries = Object.entries(catalog.messages)
89
+ .map(([key, value]) => [key, messageText(value)])
90
+ .filter(([, text]) => text.length > 0);
91
+ const pairs = [];
92
+ for (let i = 0; i < entries.length; i++) {
93
+ for (let j = i + 1; j < entries.length; j++) {
94
+ const [keyA, textA] = entries[i];
95
+ const [keyB, textB] = entries[j];
96
+ const maxLen = Math.max(textA.length, textB.length);
97
+ const distance = levenshteinDistance(textA, textB);
98
+ const similarity = maxLen === 0 ? 1 : 1 - distance / maxLen;
99
+ if (similarity >= minSimilarity)
100
+ pairs.push({ a: keyA, b: keyB, distance, similarity });
101
+ }
102
+ }
103
+ return pairs.sort((x, y) => y.similarity - x.similarity);
104
+ }
105
+ /**
106
+ * Which of a catalog's keys a game's own source actually references, and which just sit
107
+ * there. `mwg` has no idea how a game's code names a message key (a string literal, a
108
+ * generated constant, a `SemanticMessage.type`) - `referencedKeys` is however the caller
109
+ * already found that out (typically a grep or a build-time scan over its own source), the
110
+ * same boundary `rollRoster` draws around a game's own roster values.
111
+ *
112
+ * @example
113
+ * ```ts
114
+ * import { catalogUsage } from '@datamoc/mw_games/i18n';
115
+ *
116
+ * const catalog = {
117
+ * locale: 'en', direction: 'ltr' as const,
118
+ * messages: { greeting: 'Hi', unused: 'never shown' },
119
+ * };
120
+ *
121
+ * catalogUsage(catalog, ['greeting']); // { totalKeys: 2, usedKeys: 1, unusedKeys: ['unused'] }
122
+ * ```
123
+ */
124
+ export function catalogUsage(catalog, referencedKeys) {
125
+ const referenced = new Set(referencedKeys);
126
+ const keys = Object.keys(catalog.messages);
127
+ const unusedKeys = keys.filter((key) => !referenced.has(key));
128
+ return { totalKeys: keys.length, usedKeys: keys.length - unusedKeys.length, unusedKeys };
129
+ }
130
+ /**
131
+ * How complete `other` is against `reference`, as a 0-1 fraction of `reference`'s own keys
132
+ * that `other` also has - built on `diffCatalogKeys` rather than recomputing the same set
133
+ * difference, so the two never disagree about what "missing" means.
134
+ *
135
+ * @example
136
+ * ```ts
137
+ * import { catalogCompleteness } from '@datamoc/mw_games/i18n';
138
+ *
139
+ * const en = { locale: 'en', direction: 'ltr' as const, messages: { a: '1', b: '2' } };
140
+ * const fr = { locale: 'fr', direction: 'ltr' as const, messages: { a: '1' } };
141
+ *
142
+ * catalogCompleteness(en, fr); // 0.5
143
+ * ```
144
+ */
145
+ export function catalogCompleteness(reference, other) {
146
+ const referenceKeys = Object.keys(reference.messages);
147
+ if (referenceKeys.length === 0)
148
+ return 1;
149
+ const { missing } = diffCatalogKeys(reference, other);
150
+ return (referenceKeys.length - missing.length) / referenceKeys.length;
151
+ }
152
+ /**
153
+ * How many of a catalog's plural-form messages define each CLDR category - `'few'`/`'many'`
154
+ * sitting at 0 while `'other'` covers every key is exactly the gap a language needing those
155
+ * categories (Polish, Arabic) would otherwise only discover once a player hit the wrong count.
156
+ *
157
+ * @example
158
+ * ```ts
159
+ * import { pluralFormCoverage } from '@datamoc/mw_games/i18n';
160
+ *
161
+ * const catalog = {
162
+ * locale: 'en', direction: 'ltr' as const,
163
+ * messages: { items: { one: '{count} item', other: '{count} items' } },
164
+ * };
165
+ *
166
+ * pluralFormCoverage(catalog); // { pluralKeys: 1, formsPresent: { one: 1, other: 1 } }
167
+ * ```
168
+ */
169
+ export function pluralFormCoverage(catalog) {
170
+ const formsPresent = {};
171
+ let pluralKeys = 0;
172
+ for (const value of Object.values(catalog.messages)) {
173
+ if (typeof value === 'string' || (typeof value === 'object' && value !== null && 'format' in value))
174
+ continue;
175
+ pluralKeys++;
176
+ for (const category of Object.keys(value)) {
177
+ formsPresent[category] = (formsPresent[category] ?? 0) + 1;
178
+ }
179
+ }
180
+ return { pluralKeys, formsPresent };
181
+ }
182
+ /**
183
+ * Drops `mergedKey` from `catalog`, keeping `survivingKey` (and its current text) exactly as
184
+ * it was - the mechanical half of collapsing two keys a human decided are the same message.
185
+ * Apply this to every language's own catalog to merge consistently across all of them.
186
+ *
187
+ * Rewriting whichever call sites used `mergedKey` is deliberately not this function's job:
188
+ * `mwg` has no view into a game's own source tree, the same boundary `catalogUsage`'s
189
+ * `referencedKeys` already draws - a caller doing that rewrite already knows exactly where
190
+ * `mergedKey` is used, since it had to find `referencedKeys` the same way to begin with.
191
+ *
192
+ * @example
193
+ * ```ts
194
+ * import { mergeCatalogKeys } from '@datamoc/mw_games/i18n';
195
+ *
196
+ * const catalog = {
197
+ * locale: 'en', direction: 'ltr' as const,
198
+ * messages: { 'confirm.quit': 'Are you sure?', 'confirm.delete': 'Are you sure?' },
199
+ * };
200
+ *
201
+ * const merged = mergeCatalogKeys(catalog, 'confirm.quit', 'confirm.delete');
202
+ * console.log(Object.keys(merged.messages)); // ['confirm.quit']
203
+ * ```
204
+ */
205
+ export function mergeCatalogKeys(catalog, survivingKey, mergedKey) {
206
+ if (!(survivingKey in catalog.messages)) {
207
+ throw new Error(`mergeCatalogKeys: "${survivingKey}" is not a key in this catalog`);
208
+ }
209
+ if (!(mergedKey in catalog.messages)) {
210
+ throw new Error(`mergeCatalogKeys: "${mergedKey}" is not a key in this catalog`);
211
+ }
212
+ if (survivingKey === mergedKey) {
213
+ throw new Error('mergeCatalogKeys: survivingKey and mergedKey must be different keys');
214
+ }
215
+ const messages = { ...catalog.messages };
216
+ delete messages[mergedKey];
217
+ return { ...catalog, messages };
218
+ }
219
+ //# sourceMappingURL=Content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Content.js","sourceRoot":"","sources":["../../src/i18n/Content.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CAAC,KAAmB;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QACtE,IAAI,CAAC;YACJ,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC;IACD,MAAM,KAAK,GAAG,KAA+B,CAAC;IAC9C,OAAO,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACrD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAS,EAAE,CAAS;IACvD,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IAEpC,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,OAAO,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CACpB,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU;YAC3B,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,WAAW;YAC/B,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc;aACrC,CAAC;QACH,CAAC;QACD,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAUD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,aAAa,GAAG,GAAG;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;SAC9C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,CAAU,CAAC;SACzD,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAExC,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC;YAC5D,IAAI,UAAU,IAAI,aAAa;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACzF,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;AAC1D,CAAC;AASD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB,EAAE,cAAgC;IAC9E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;AAC1F,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAkB,EAAE,KAAc;IACrE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEzC,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACtD,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;AACvE,CAAC;AASD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IAClD,MAAM,YAAY,GAAiD,EAAE,CAAC;IACtE,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,IAAI,KAAK,CAAC;YAAE,SAAS;QAC9G,UAAU,EAAE,CAAC;QACb,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAA0B,EAAE,CAAC;YACpE,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC;IACF,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,YAAoB,EAAE,SAAiB;IACzF,IAAI,CAAC,CAAC,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,sBAAsB,YAAY,gCAAgC,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,gCAAgC,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACzC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3B,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Locale-aware number/date/list formatting, for a catalog message that needs more than
3
+ * `{token}` substitution can give it - "1,234" vs "1 234", "3 items" vs "3 éléments" joined
4
+ * with "and"/"et". A game calls these while building a `t()`/`SemanticMessage` param, the
5
+ * same way it already resolves an entity id to display text; MWG does not parse a format
6
+ * directive out of the message string itself.
7
+ *
8
+ * All three read the active locale from `i18n`'s own `locale()`, so a language switch takes
9
+ * effect the same way it already does for plurals and typography.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { setActive, t, formatNumber, formatDate, formatList } from '@datamoc/mw_games/i18n';
14
+ *
15
+ * setActive({ locale: 'fr-FR', direction: 'ltr', messages: { found: 'Vous trouvez {amount}.' } });
16
+ *
17
+ * console.log(formatNumber(1234.5)); // '1 234,5'
18
+ * console.log(formatDate(new Date(2024, 0, 15))); // '15/01/2024'
19
+ * console.log(t('found', { amount: formatList(['une épée', 'un bouclier']) })); // '... une épée et un bouclier.'
20
+ * ```
21
+ */
22
+ export declare function formatNumber(value: number, options?: Intl.NumberFormatOptions): string;
23
+ export declare function formatDate(value: Date | number, options?: Intl.DateTimeFormatOptions): string;
24
+ export declare function formatList(items: readonly string[], options?: Intl.ListFormatOptions): string;
25
+ //# sourceMappingURL=Format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Format.d.ts","sourceRoot":"","sources":["../../src/i18n/Format.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAEtF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAE7F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAE7F"}
@@ -0,0 +1,32 @@
1
+ import { locale } from './index.js';
2
+ /**
3
+ * Locale-aware number/date/list formatting, for a catalog message that needs more than
4
+ * `{token}` substitution can give it - "1,234" vs "1 234", "3 items" vs "3 éléments" joined
5
+ * with "and"/"et". A game calls these while building a `t()`/`SemanticMessage` param, the
6
+ * same way it already resolves an entity id to display text; MWG does not parse a format
7
+ * directive out of the message string itself.
8
+ *
9
+ * All three read the active locale from `i18n`'s own `locale()`, so a language switch takes
10
+ * effect the same way it already does for plurals and typography.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { setActive, t, formatNumber, formatDate, formatList } from '@datamoc/mw_games/i18n';
15
+ *
16
+ * setActive({ locale: 'fr-FR', direction: 'ltr', messages: { found: 'Vous trouvez {amount}.' } });
17
+ *
18
+ * console.log(formatNumber(1234.5)); // '1 234,5'
19
+ * console.log(formatDate(new Date(2024, 0, 15))); // '15/01/2024'
20
+ * console.log(t('found', { amount: formatList(['une épée', 'un bouclier']) })); // '... une épée et un bouclier.'
21
+ * ```
22
+ */
23
+ export function formatNumber(value, options) {
24
+ return new Intl.NumberFormat(locale(), options).format(value);
25
+ }
26
+ export function formatDate(value, options) {
27
+ return new Intl.DateTimeFormat(locale(), options).format(value);
28
+ }
29
+ export function formatList(items, options) {
30
+ return new Intl.ListFormat(locale(), options).format(items);
31
+ }
32
+ //# sourceMappingURL=Format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Format.js","sourceRoot":"","sources":["../../src/i18n/Format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,OAAkC;IAC7E,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAoB,EAAE,OAAoC;IACpF,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAwB,EAAE,OAAgC;IACpF,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * A structured communication intent, not a finished sentence: a type naming what happened,
3
+ * plus the parameters a catalog needs to say it. The same message renders as a full log
4
+ * line, a compact HUD number, an accessibility announcement, or a debug dump, all from one
5
+ * event the simulation only has to produce once.
6
+ *
7
+ * `params` must already be interpolation-ready by the time a message reaches
8
+ * `MessageFormatter.format` - a game resolves any entity/item id to display text itself
9
+ * (typically through its own `EntityTextResolver`) while building the message, the same way
10
+ * it decides everything else about its own vocabulary. MWG only defines the shape.
11
+ */
12
+ export interface SemanticMessage<TType extends string = string, TParams extends Record<string, unknown> = Record<string, unknown>> {
13
+ type: TType;
14
+ params: TParams;
15
+ }
16
+ /**
17
+ * Resolves a game-defined entity/item id to the display text a message substitutes for it.
18
+ * A type contract only - MWG never calls this itself; a game calls it while building a
19
+ * `SemanticMessage`'s params, the same way it already owns every other piece of vocabulary.
20
+ */
21
+ export type EntityTextResolver<Id = string> = (id: Id) => string;
22
+ /**
23
+ * Optional linguistic metadata about one entity - gender, number, or a proper-noun flag a
24
+ * catalog's own grammar rules may need to pick an article or an agreement. MWG never
25
+ * interprets this itself; it exists so a game's `EntityTextResolver` and catalog can agree
26
+ * on a common shape instead of each game inventing its own.
27
+ */
28
+ export interface GrammaticalEntity {
29
+ gender?: 'masculine' | 'feminine' | 'neuter' | 'common';
30
+ plural?: boolean;
31
+ properNoun?: boolean;
32
+ /** other lexical forms a catalog's grammar might need - a possessive, a vocative */
33
+ forms?: Record<string, string>;
34
+ }
35
+ /** Where the same semantic message ends up: a game log line, a compact HUD number, an
36
+ * accessibility announcement, or a debug dump - one simulation event, several presentations. */
37
+ export type MessageChannel = 'log' | 'compact' | 'accessibility' | 'debug';
38
+ export interface MessageFormatter {
39
+ format(message: SemanticMessage, channel: MessageChannel): string;
40
+ }
41
+ /**
42
+ * The reference `MessageFormatter`: looks up `${type}.${channel}` in the active catalog
43
+ * (`setBase`/`setActive`, `src/i18n/index.ts`), falling back to `${type}` alone for a message
44
+ * that reads the same on every channel, then formats through `t()` - the same interpolation,
45
+ * pluralisation and RTL handling every other message in the game already gets. A catalog
46
+ * missing both keys fails the same observable way `t()` already does for any key: returning
47
+ * the lookup key itself, rather than throwing or going silent.
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * import { setBase, createCatalogFormatter, type SemanticMessage } from '@datamoc/mw_games/i18n';
52
+ *
53
+ * setBase({
54
+ * locale: 'en',
55
+ * direction: 'ltr',
56
+ * messages: {
57
+ * 'combat.damage.log': 'The {target} takes {amount} damage.',
58
+ * 'combat.damage.compact': '-{amount} HP',
59
+ * },
60
+ * });
61
+ *
62
+ * const formatter = createCatalogFormatter();
63
+ * const message: SemanticMessage = { type: 'combat.damage', params: { target: 'gnoll', amount: 7 } };
64
+ *
65
+ * console.log(formatter.format(message, 'log')); // 'The gnoll takes 7 damage.'
66
+ * console.log(formatter.format(message, 'compact')); // '-7 HP'
67
+ * console.log(formatter.format(message, 'debug')); // falls back to the bare type: the key itself, if undeclared
68
+ * ```
69
+ */
70
+ export declare function createCatalogFormatter(): MessageFormatter;
71
+ //# sourceMappingURL=SemanticMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticMessage.d.ts","sourceRoot":"","sources":["../../src/i18n/SemanticMessage.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe,CAC/B,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEjE,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,MAAM,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IACjC,MAAM,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACxD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;gGACgG;AAChG,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,SAAS,GAAG,eAAe,GAAG,OAAO,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAChC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC;CAClE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAQzD"}
@@ -0,0 +1,40 @@
1
+ import { t, has } from './index.js';
2
+ /**
3
+ * The reference `MessageFormatter`: looks up `${type}.${channel}` in the active catalog
4
+ * (`setBase`/`setActive`, `src/i18n/index.ts`), falling back to `${type}` alone for a message
5
+ * that reads the same on every channel, then formats through `t()` - the same interpolation,
6
+ * pluralisation and RTL handling every other message in the game already gets. A catalog
7
+ * missing both keys fails the same observable way `t()` already does for any key: returning
8
+ * the lookup key itself, rather than throwing or going silent.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { setBase, createCatalogFormatter, type SemanticMessage } from '@datamoc/mw_games/i18n';
13
+ *
14
+ * setBase({
15
+ * locale: 'en',
16
+ * direction: 'ltr',
17
+ * messages: {
18
+ * 'combat.damage.log': 'The {target} takes {amount} damage.',
19
+ * 'combat.damage.compact': '-{amount} HP',
20
+ * },
21
+ * });
22
+ *
23
+ * const formatter = createCatalogFormatter();
24
+ * const message: SemanticMessage = { type: 'combat.damage', params: { target: 'gnoll', amount: 7 } };
25
+ *
26
+ * console.log(formatter.format(message, 'log')); // 'The gnoll takes 7 damage.'
27
+ * console.log(formatter.format(message, 'compact')); // '-7 HP'
28
+ * console.log(formatter.format(message, 'debug')); // falls back to the bare type: the key itself, if undeclared
29
+ * ```
30
+ */
31
+ export function createCatalogFormatter() {
32
+ return {
33
+ format(message, channel) {
34
+ const key = `${message.type}.${channel}`;
35
+ const params = message.params;
36
+ return has(key) ? t(key, params) : t(message.type, params);
37
+ },
38
+ };
39
+ }
40
+ //# sourceMappingURL=SemanticMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticMessage.js","sourceRoot":"","sources":["../../src/i18n/SemanticMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,GAAG,EAAsB,MAAM,YAAY,CAAC;AAkDxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,sBAAsB;IACrC,OAAO;QACN,MAAM,CAAC,OAAwB,EAAE,OAAuB;YACvD,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAuB,CAAC;YAC/C,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { Catalog } from './index.ts';
2
+ /** the keys two catalogs disagree on - what a translation catalog missing a key, or one
3
+ * abandoned key nobody removed, looks like structurally. */
4
+ export interface CatalogKeyDiff {
5
+ /** in `reference` but not `other` - an untranslated key */
6
+ missing: readonly string[];
7
+ /** in `other` but not `reference` - a stale or misspelled key */
8
+ extra: readonly string[];
9
+ }
10
+ /**
11
+ * Compares two catalogs' key sets - typically a base language against a translation, so a
12
+ * missing or stray key is caught before a player sees a raw key fall through `t()`'s own
13
+ * fallback, rather than after.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { diffCatalogKeys } from '@datamoc/mw_games/i18n';
18
+ *
19
+ * const en = { locale: 'en', direction: 'ltr' as const, messages: { greeting: 'Hello', farewell: 'Bye' } };
20
+ * const fr = { locale: 'fr', direction: 'ltr' as const, messages: { greeting: 'Bonjour', extra: 'oops' } };
21
+ *
22
+ * console.log(diffCatalogKeys(en, fr)); // { missing: ['farewell'], extra: ['extra'] }
23
+ * ```
24
+ */
25
+ export declare function diffCatalogKeys(reference: Catalog, other: Catalog): CatalogKeyDiff;
26
+ export interface CatalogIssue {
27
+ key: string;
28
+ kind: 'empty-message' | 'plural-missing-other';
29
+ detail: string;
30
+ }
31
+ /**
32
+ * Structural problems inside one catalog, independent of any other: an empty string, or a
33
+ * plural form with no `other` branch - `Intl.PluralRules` guarantees `other` is always a
34
+ * valid category for every locale, so a form set lacking it will silently degrade for any
35
+ * count the more specific branches don't cover (`t()`'s own `resolvePlural` falls back to
36
+ * *any* form present, which hides exactly this mistake instead of surfacing it).
37
+ *
38
+ * This is deliberately not a parameter schema validator: `SemanticMessage<TType, TParams>`
39
+ * already gives a game compile-time checking of which params a message needs, which the
40
+ * source document calls the primary mechanism - a runtime schema on top would duplicate that
41
+ * for no case a game's own types do not already catch.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * import { validateCatalog } from '@datamoc/mw_games/i18n';
46
+ *
47
+ * const catalog = {
48
+ * locale: 'en', direction: 'ltr' as const,
49
+ * messages: { empty: '', broken: { few: 'a few' } },
50
+ * };
51
+ *
52
+ * console.log(validateCatalog(catalog).map((issue) => issue.key)); // ['empty', 'broken']
53
+ * ```
54
+ */
55
+ export declare function validateCatalog(catalog: Catalog): CatalogIssue[];
56
+ //# sourceMappingURL=Validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Validate.d.ts","sourceRoot":"","sources":["../../src/i18n/Validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,YAAY,CAAC;AAExD;4DAC4D;AAC5D,MAAM,WAAW,cAAc;IAC9B,2DAA2D;IAC3D,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,iEAAiE;IACjE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,cAAc,CAOlF;AAED,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,eAAe,GAAG,sBAAsB,CAAC;IAC/C,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,EAAE,CAchE"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Compares two catalogs' key sets - typically a base language against a translation, so a
3
+ * missing or stray key is caught before a player sees a raw key fall through `t()`'s own
4
+ * fallback, rather than after.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { diffCatalogKeys } from '@datamoc/mw_games/i18n';
9
+ *
10
+ * const en = { locale: 'en', direction: 'ltr' as const, messages: { greeting: 'Hello', farewell: 'Bye' } };
11
+ * const fr = { locale: 'fr', direction: 'ltr' as const, messages: { greeting: 'Bonjour', extra: 'oops' } };
12
+ *
13
+ * console.log(diffCatalogKeys(en, fr)); // { missing: ['farewell'], extra: ['extra'] }
14
+ * ```
15
+ */
16
+ export function diffCatalogKeys(reference, other) {
17
+ const referenceKeys = new Set(Object.keys(reference.messages));
18
+ const otherKeys = new Set(Object.keys(other.messages));
19
+ return {
20
+ missing: [...referenceKeys].filter((key) => !otherKeys.has(key)),
21
+ extra: [...otherKeys].filter((key) => !referenceKeys.has(key)),
22
+ };
23
+ }
24
+ /**
25
+ * Structural problems inside one catalog, independent of any other: an empty string, or a
26
+ * plural form with no `other` branch - `Intl.PluralRules` guarantees `other` is always a
27
+ * valid category for every locale, so a form set lacking it will silently degrade for any
28
+ * count the more specific branches don't cover (`t()`'s own `resolvePlural` falls back to
29
+ * *any* form present, which hides exactly this mistake instead of surfacing it).
30
+ *
31
+ * This is deliberately not a parameter schema validator: `SemanticMessage<TType, TParams>`
32
+ * already gives a game compile-time checking of which params a message needs, which the
33
+ * source document calls the primary mechanism - a runtime schema on top would duplicate that
34
+ * for no case a game's own types do not already catch.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { validateCatalog } from '@datamoc/mw_games/i18n';
39
+ *
40
+ * const catalog = {
41
+ * locale: 'en', direction: 'ltr' as const,
42
+ * messages: { empty: '', broken: { few: 'a few' } },
43
+ * };
44
+ *
45
+ * console.log(validateCatalog(catalog).map((issue) => issue.key)); // ['empty', 'broken']
46
+ * ```
47
+ */
48
+ export function validateCatalog(catalog) {
49
+ const issues = [];
50
+ for (const [key, value] of Object.entries(catalog.messages)) {
51
+ if (typeof value === 'string') {
52
+ if (value === '')
53
+ issues.push({ key, kind: 'empty-message', detail: 'message resolves to an empty string' });
54
+ continue;
55
+ }
56
+ if (isPluralForms(value) && value.other === undefined) {
57
+ issues.push({ key, kind: 'plural-missing-other', detail: 'plural forms have no "other" branch' });
58
+ }
59
+ }
60
+ return issues;
61
+ }
62
+ function isPluralForms(value) {
63
+ return typeof value === 'object' && value !== null && !('format' in value);
64
+ }
65
+ //# sourceMappingURL=Validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Validate.js","sourceRoot":"","sources":["../../src/i18n/Validate.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,SAAkB,EAAE,KAAc;IACjE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvD,OAAO;QACN,OAAO,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAC9D,CAAC;AACH,CAAC;AAQD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC/C,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,KAAK,KAAK,EAAE;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC,CAAC;YAC7G,SAAS;QACV,CAAC;QACD,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC,CAAC;QACnG,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAmB;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;AAC5E,CAAC"}
@@ -13,6 +13,40 @@
13
13
  * A missing key in the active language falls back to the base language rather than showing
14
14
  * a raw key to the player - a translation catalog is nearly always incomplete somewhere,
15
15
  * and a placeholder key breaks immersion far worse than the wrong language would.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { setBase, setActive, t, locale, direction, typographic, parseFTL, reset } from '@datamoc/mw_games/i18n';
20
+ *
21
+ * setBase({ locale: 'en', direction: 'ltr', messages: { greeting: 'Hello, {name}!' } });
22
+ *
23
+ * const french = parseFTL('fr', 'greeting = Bonjour, { $name } !');
24
+ * setActive(french);
25
+ *
26
+ * console.log(t('greeting', { name: 'Ada' })); // 'Bonjour, Ada !'
27
+ * console.log(locale(), direction()); // 'fr' 'ltr'
28
+ * console.log(typographic("aujourd'hui")); // "aujourd’hui"
29
+ *
30
+ * reset(); // back to unset, for the next test or a language switch from scratch
31
+ * ```
32
+ *
33
+ * `createCatalogFormatter` (`SemanticMessage.ts`) sits on top of the same catalog: a
34
+ * simulation emits one typed `SemanticMessage` and a game renders it differently per channel
35
+ * (log line, compact HUD, accessibility, debug) without touching the message itself.
36
+ * ```ts
37
+ * import { setBase, createCatalogFormatter, type SemanticMessage } from '@datamoc/mw_games/i18n';
38
+ *
39
+ * setBase({
40
+ * locale: 'en',
41
+ * direction: 'ltr',
42
+ * messages: { 'combat.damage.log': 'The {target} takes {amount} damage.', 'combat.damage.compact': '-{amount} HP' },
43
+ * });
44
+ *
45
+ * const formatter = createCatalogFormatter();
46
+ * const message: SemanticMessage = { type: 'combat.damage', params: { target: 'gnoll', amount: 7 } };
47
+ * console.log(formatter.format(message, 'log'), formatter.format(message, 'compact'));
48
+ * // 'The gnoll takes 7 damage.' '-7 HP'
49
+ * ```
16
50
  */
17
51
  /** left-to-right is the default; right-to-left is the other case `mwg/ui` mirrors against */
18
52
  export type Direction = 'ltr' | 'rtl';
@@ -51,15 +85,52 @@ export interface MessageParams {
51
85
  */
52
86
  export declare function t(key: string, params?: MessageParams): string;
53
87
  /**
54
- * Replaces apostrophes between letters for locales whose ordinary elisions use a curly
55
- * apostrophe. English and other locales are left untouched, as a straight apostrophe can
56
- * be intentional punctuation there.
88
+ * Locale-specific punctuation/spacing conventions, applied on top of interpolation - the
89
+ * things a translator would type by hand if this project asked every catalog to carry
90
+ * literal U+202F/U+00A0 characters, which no one would ever remember to do consistently.
91
+ *
92
+ * French (Imprimerie nationale's rules, `Lexique des règles typographiques`): a narrow
93
+ * no-break space before `; : ! ?` and around `« »`, and an ordinary no-break space between a
94
+ * numbering word and the number following it ("Chapitre 3"). Also replaces apostrophes
95
+ * between letters with a curly one, for French, Italian, and Dutch elisions - English and
96
+ * other locales are left untouched, as a straight apostrophe can be intentional punctuation
97
+ * there.
98
+ *
99
+ * German (Duden K 116/117): a no-break space between a number and its unit ("5 kg"), and
100
+ * after a small set of abbreviations before whatever follows ("Nr. 3", "Dr. Müller").
101
+ *
102
+ * Deliberately not attempted here: a *game's own* units ("pièces d'or", "points de vie") -
103
+ * `mwg` cannot know a game's vocabulary any more than it knows its item names, so gluing a
104
+ * value to a game-specific unit is `nonBreakingUnit`'s job, not this function's.
57
105
  */
58
106
  export declare function typographic(text: string, language?: string): string;
107
+ /** joins a value and its unit with whatever space French/German typography requires to keep
108
+ * them from breaking across a line - the unit's own text ("pièces d'or", "points de vie",
109
+ * "kg") is always the game's own vocabulary; this only picks the space that glues it to the
110
+ * value in front of it, the same division `SemanticMessage`/`EntityTextResolver` already draw
111
+ * between mechanism and content.
112
+ *
113
+ * @example
114
+ * ```ts
115
+ * import { nonBreakingUnit } from '@datamoc/mw_games/i18n';
116
+ *
117
+ * console.log(nonBreakingUnit(12, 'pièces d\'or', 'fr')); // '12 pièces d\'or'
118
+ * console.log(nonBreakingUnit(5, 'kg', 'de')); // '5 kg'
119
+ * console.log(nonBreakingUnit(3, 'gold', 'en')); // '3 gold'
120
+ * ```
121
+ */
122
+ export declare function nonBreakingUnit(value: string | number, unit: string, language?: string): string;
59
123
  /** true when `key` resolves to something other than itself, in either language */
60
124
  export declare function has(key: string): boolean;
61
125
  /** clears both languages, mainly so tests do not leak state into one another */
62
126
  export declare function reset(): void;
63
127
  export { parseFTL } from './Fluent.ts';
64
128
  export type { FluentOptions } from './Fluent.ts';
129
+ export { createCatalogFormatter } from './SemanticMessage.ts';
130
+ export type { SemanticMessage, EntityTextResolver, GrammaticalEntity, MessageChannel, MessageFormatter } from './SemanticMessage.ts';
131
+ export { formatNumber, formatDate, formatList } from './Format.ts';
132
+ export { diffCatalogKeys, validateCatalog } from './Validate.ts';
133
+ export type { CatalogKeyDiff, CatalogIssue } from './Validate.ts';
134
+ export { messageText, levenshteinDistance, findSimilarMessages, catalogUsage, catalogCompleteness, pluralFormCoverage, mergeCatalogKeys, } from './Content.ts';
135
+ export type { SimilarMessagePair, CatalogUsageStats, PluralCoverage } from './Content.ts';
65
136
  //# sourceMappingURL=index.d.ts.map