@datamoc/mw_games 0.7.6 → 0.7.8

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 (367) hide show
  1. package/CHANGELOG.md +359 -0
  2. package/README.md +7 -7
  3. package/dist/actors/Inventory.d.ts +7 -1
  4. package/dist/actors/Inventory.d.ts.map +1 -1
  5. package/dist/actors/Inventory.js.map +1 -1
  6. package/dist/actors/Shop.d.ts.map +1 -1
  7. package/dist/actors/Shop.js +4 -1
  8. package/dist/actors/Shop.js.map +1 -1
  9. package/dist/actors/craft.d.ts +35 -14
  10. package/dist/actors/craft.d.ts.map +1 -1
  11. package/dist/actors/craft.js +56 -24
  12. package/dist/actors/craft.js.map +1 -1
  13. package/dist/actors/index.d.ts +1 -1
  14. package/dist/actors/index.d.ts.map +1 -1
  15. package/dist/ai/Heuristics.d.ts +240 -0
  16. package/dist/ai/Heuristics.d.ts.map +1 -0
  17. package/dist/ai/Heuristics.js +298 -0
  18. package/dist/ai/Heuristics.js.map +1 -0
  19. package/dist/ai/index.d.ts +4 -0
  20. package/dist/ai/index.d.ts.map +1 -1
  21. package/dist/ai/index.js +2 -0
  22. package/dist/ai/index.js.map +1 -1
  23. package/dist/ai/lua.d.ts +21 -0
  24. package/dist/ai/lua.d.ts.map +1 -1
  25. package/dist/ai/lua.js +21 -0
  26. package/dist/ai/lua.js.map +1 -1
  27. package/dist/ai/score.d.ts +162 -0
  28. package/dist/ai/score.d.ts.map +1 -0
  29. package/dist/ai/score.js +147 -0
  30. package/dist/ai/score.js.map +1 -0
  31. package/dist/assets/loader.d.ts +18 -4
  32. package/dist/assets/loader.d.ts.map +1 -1
  33. package/dist/assets/loader.js +40 -11
  34. package/dist/assets/loader.js.map +1 -1
  35. package/dist/audio/Positional.d.ts +125 -0
  36. package/dist/audio/Positional.d.ts.map +1 -0
  37. package/dist/audio/Positional.js +135 -0
  38. package/dist/audio/Positional.js.map +1 -0
  39. package/dist/audio/Sound.d.ts +7 -1
  40. package/dist/audio/Sound.d.ts.map +1 -1
  41. package/dist/audio/Sound.js +8 -2
  42. package/dist/audio/Sound.js.map +1 -1
  43. package/dist/audio/index.d.ts +2 -0
  44. package/dist/audio/index.d.ts.map +1 -1
  45. package/dist/audio/index.js +1 -0
  46. package/dist/audio/index.js.map +1 -1
  47. package/dist/battle/AttackDialog.d.ts +75 -0
  48. package/dist/battle/AttackDialog.d.ts.map +1 -0
  49. package/dist/battle/AttackDialog.js +115 -0
  50. package/dist/battle/AttackDialog.js.map +1 -0
  51. package/dist/battle/AttackPreview.d.ts +70 -0
  52. package/dist/battle/AttackPreview.d.ts.map +1 -0
  53. package/dist/battle/AttackPreview.js +78 -0
  54. package/dist/battle/AttackPreview.js.map +1 -0
  55. package/dist/battle/BattleStats.d.ts +45 -0
  56. package/dist/battle/BattleStats.d.ts.map +1 -0
  57. package/dist/battle/BattleStats.js +63 -0
  58. package/dist/battle/BattleStats.js.map +1 -0
  59. package/dist/battle/UnitSelector.d.ts +72 -0
  60. package/dist/battle/UnitSelector.d.ts.map +1 -0
  61. package/dist/battle/UnitSelector.js +117 -0
  62. package/dist/battle/UnitSelector.js.map +1 -0
  63. package/dist/battle/Whiteboard.d.ts +50 -0
  64. package/dist/battle/Whiteboard.d.ts.map +1 -0
  65. package/dist/battle/Whiteboard.js +94 -0
  66. package/dist/battle/Whiteboard.js.map +1 -0
  67. package/dist/battle/index.d.ts +10 -0
  68. package/dist/battle/index.d.ts.map +1 -1
  69. package/dist/battle/index.js +5 -0
  70. package/dist/battle/index.js.map +1 -1
  71. package/dist/board/Classics.d.ts.map +1 -1
  72. package/dist/board/Classics.js +51 -39
  73. package/dist/board/Classics.js.map +1 -1
  74. package/dist/board/FogOfWar.d.ts +32 -2
  75. package/dist/board/FogOfWar.d.ts.map +1 -1
  76. package/dist/board/FogOfWar.js +70 -6
  77. package/dist/board/FogOfWar.js.map +1 -1
  78. package/dist/board/HexSkirmish.d.ts.map +1 -1
  79. package/dist/board/HexSkirmish.js +69 -20
  80. package/dist/board/HexSkirmish.js.map +1 -1
  81. package/dist/board/Tactics.d.ts +7 -0
  82. package/dist/board/Tactics.d.ts.map +1 -1
  83. package/dist/board/Tactics.js +2 -2
  84. package/dist/board/Tactics.js.map +1 -1
  85. package/dist/core/Achievements.d.ts +40 -7
  86. package/dist/core/Achievements.d.ts.map +1 -1
  87. package/dist/core/Achievements.js +53 -7
  88. package/dist/core/Achievements.js.map +1 -1
  89. package/dist/core/Hex.d.ts +26 -6
  90. package/dist/core/Hex.d.ts.map +1 -1
  91. package/dist/core/Hex.js +40 -13
  92. package/dist/core/Hex.js.map +1 -1
  93. package/dist/core/Input.d.ts +36 -0
  94. package/dist/core/Input.d.ts.map +1 -1
  95. package/dist/core/Input.js +63 -1
  96. package/dist/core/Input.js.map +1 -1
  97. package/dist/core/Random.d.ts +93 -0
  98. package/dist/core/Random.d.ts.map +1 -1
  99. package/dist/core/Random.js +177 -0
  100. package/dist/core/Random.js.map +1 -1
  101. package/dist/core/SyncGuard.d.ts +57 -0
  102. package/dist/core/SyncGuard.d.ts.map +1 -0
  103. package/dist/core/SyncGuard.js +116 -0
  104. package/dist/core/SyncGuard.js.map +1 -0
  105. package/dist/core/index.d.ts +3 -1
  106. package/dist/core/index.d.ts.map +1 -1
  107. package/dist/core/index.js +2 -1
  108. package/dist/core/index.js.map +1 -1
  109. package/dist/i18n/Po.d.ts +51 -0
  110. package/dist/i18n/Po.d.ts.map +1 -0
  111. package/dist/i18n/Po.js +176 -0
  112. package/dist/i18n/Po.js.map +1 -0
  113. package/dist/i18n/index.d.ts +2 -0
  114. package/dist/i18n/index.d.ts.map +1 -1
  115. package/dist/i18n/index.js +1 -0
  116. package/dist/i18n/index.js.map +1 -1
  117. package/dist/mw_games.global.js +104 -98
  118. package/dist/mwl/MapFile.d.ts +41 -0
  119. package/dist/mwl/MapFile.d.ts.map +1 -0
  120. package/dist/mwl/MapFile.js +43 -0
  121. package/dist/mwl/MapFile.js.map +1 -0
  122. package/dist/mwl/actors.d.ts +46 -2
  123. package/dist/mwl/actors.d.ts.map +1 -1
  124. package/dist/mwl/actors.js +46 -2
  125. package/dist/mwl/actors.js.map +1 -1
  126. package/dist/mwl/campaign.d.ts +51 -0
  127. package/dist/mwl/campaign.d.ts.map +1 -0
  128. package/dist/mwl/campaign.js +58 -0
  129. package/dist/mwl/campaign.js.map +1 -0
  130. package/dist/mwl/carryover.d.ts +86 -0
  131. package/dist/mwl/carryover.d.ts.map +1 -0
  132. package/dist/mwl/carryover.js +70 -0
  133. package/dist/mwl/carryover.js.map +1 -0
  134. package/dist/mwl/catalog.d.ts +10 -1
  135. package/dist/mwl/catalog.d.ts.map +1 -1
  136. package/dist/mwl/catalog.js +10 -1
  137. package/dist/mwl/catalog.js.map +1 -1
  138. package/dist/mwl/compiler.d.ts +70 -3
  139. package/dist/mwl/compiler.d.ts.map +1 -1
  140. package/dist/mwl/compiler.js +70 -3
  141. package/dist/mwl/compiler.js.map +1 -1
  142. package/dist/mwl/conditions.d.ts +10 -1
  143. package/dist/mwl/conditions.d.ts.map +1 -1
  144. package/dist/mwl/conditions.js +10 -1
  145. package/dist/mwl/conditions.js.map +1 -1
  146. package/dist/mwl/content.d.ts +21 -0
  147. package/dist/mwl/content.d.ts.map +1 -1
  148. package/dist/mwl/content.js +19 -0
  149. package/dist/mwl/content.js.map +1 -1
  150. package/dist/mwl/expression.d.ts +21 -0
  151. package/dist/mwl/expression.d.ts.map +1 -1
  152. package/dist/mwl/expression.js +21 -0
  153. package/dist/mwl/expression.js.map +1 -1
  154. package/dist/mwl/fengari.d.ts +12 -1
  155. package/dist/mwl/fengari.d.ts.map +1 -1
  156. package/dist/mwl/fengari.js +12 -1
  157. package/dist/mwl/fengari.js.map +1 -1
  158. package/dist/mwl/grammar.d.ts +45 -1
  159. package/dist/mwl/grammar.d.ts.map +1 -1
  160. package/dist/mwl/grammar.js +45 -1
  161. package/dist/mwl/grammar.js.map +1 -1
  162. package/dist/mwl/hooks.d.ts +51 -6
  163. package/dist/mwl/hooks.d.ts.map +1 -1
  164. package/dist/mwl/hooks.js +45 -1
  165. package/dist/mwl/hooks.js.map +1 -1
  166. package/dist/mwl/index.d.ts +9 -3
  167. package/dist/mwl/index.d.ts.map +1 -1
  168. package/dist/mwl/index.js +5 -2
  169. package/dist/mwl/index.js.map +1 -1
  170. package/dist/mwl/persistence.d.ts +32 -0
  171. package/dist/mwl/persistence.d.ts.map +1 -1
  172. package/dist/mwl/persistence.js +32 -0
  173. package/dist/mwl/persistence.js.map +1 -1
  174. package/dist/mwl/readers.d.ts +24 -2
  175. package/dist/mwl/readers.d.ts.map +1 -1
  176. package/dist/mwl/readers.js +27 -4
  177. package/dist/mwl/readers.js.map +1 -1
  178. package/dist/mwl/report.d.ts +21 -2
  179. package/dist/mwl/report.d.ts.map +1 -1
  180. package/dist/mwl/report.js +21 -2
  181. package/dist/mwl/report.js.map +1 -1
  182. package/dist/mwl/runtime.d.ts +212 -7
  183. package/dist/mwl/runtime.d.ts.map +1 -1
  184. package/dist/mwl/runtime.js +682 -90
  185. package/dist/mwl/runtime.js.map +1 -1
  186. package/dist/mwl/schema.d.ts +57 -1
  187. package/dist/mwl/schema.d.ts.map +1 -1
  188. package/dist/mwl/schema.js +181 -21
  189. package/dist/mwl/schema.js.map +1 -1
  190. package/dist/mwl/scripts.d.ts +12 -1
  191. package/dist/mwl/scripts.d.ts.map +1 -1
  192. package/dist/mwl/scripts.js +12 -1
  193. package/dist/mwl/scripts.js.map +1 -1
  194. package/dist/mwl/utils.d.ts +2 -0
  195. package/dist/mwl/utils.d.ts.map +1 -1
  196. package/dist/mwl/utils.js +4 -1
  197. package/dist/mwl/utils.js.map +1 -1
  198. package/dist/roguelike/MultiTurnBeam.d.ts +50 -12
  199. package/dist/roguelike/MultiTurnBeam.d.ts.map +1 -1
  200. package/dist/roguelike/MultiTurnBeam.js +100 -53
  201. package/dist/roguelike/MultiTurnBeam.js.map +1 -1
  202. package/dist/roguelike/Targeting.d.ts +94 -0
  203. package/dist/roguelike/Targeting.d.ts.map +1 -1
  204. package/dist/roguelike/Targeting.js +123 -0
  205. package/dist/roguelike/Targeting.js.map +1 -1
  206. package/dist/roguelike/index.d.ts +3 -1
  207. package/dist/roguelike/index.d.ts.map +1 -1
  208. package/dist/roguelike/index.js +1 -0
  209. package/dist/roguelike/index.js.map +1 -1
  210. package/dist/rpg/GameState.d.ts +2 -2
  211. package/dist/rpg/GameState.js +2 -2
  212. package/dist/simulation/CampaignSave.d.ts +68 -0
  213. package/dist/simulation/CampaignSave.d.ts.map +1 -0
  214. package/dist/simulation/CampaignSave.js +54 -0
  215. package/dist/simulation/CampaignSave.js.map +1 -0
  216. package/dist/simulation/EventPresentation.d.ts +111 -0
  217. package/dist/simulation/EventPresentation.d.ts.map +1 -0
  218. package/dist/simulation/EventPresentation.js +120 -0
  219. package/dist/simulation/EventPresentation.js.map +1 -0
  220. package/dist/simulation/index.d.ts +4 -0
  221. package/dist/simulation/index.d.ts.map +1 -1
  222. package/dist/simulation/index.js +2 -0
  223. package/dist/simulation/index.js.map +1 -1
  224. package/dist/two-d/pixi-interop.d.ts +18 -6
  225. package/dist/two-d/pixi-interop.d.ts.map +1 -1
  226. package/dist/two-d/pixi-interop.js +18 -6
  227. package/dist/two-d/pixi-interop.js.map +1 -1
  228. package/dist/two-d/render/AnimatedSprite.d.ts +74 -7
  229. package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -1
  230. package/dist/two-d/render/AnimatedSprite.js +88 -26
  231. package/dist/two-d/render/AnimatedSprite.js.map +1 -1
  232. package/dist/two-d/render/Camera.d.ts +64 -4
  233. package/dist/two-d/render/Camera.d.ts.map +1 -1
  234. package/dist/two-d/render/Camera.js +132 -11
  235. package/dist/two-d/render/Camera.js.map +1 -1
  236. package/dist/two-d/render/ColorTransformBatcher.d.ts +7 -1
  237. package/dist/two-d/render/ColorTransformBatcher.d.ts.map +1 -1
  238. package/dist/two-d/render/ColorTransformBatcher.js +10 -1
  239. package/dist/two-d/render/ColorTransformBatcher.js.map +1 -1
  240. package/dist/two-d/render/Halo.d.ts +58 -0
  241. package/dist/two-d/render/Halo.d.ts.map +1 -0
  242. package/dist/two-d/render/Halo.js +48 -0
  243. package/dist/two-d/render/Halo.js.map +1 -0
  244. package/dist/two-d/render/ImageModifiers.d.ts +174 -0
  245. package/dist/two-d/render/ImageModifiers.d.ts.map +1 -1
  246. package/dist/two-d/render/ImageModifiers.js +454 -1
  247. package/dist/two-d/render/ImageModifiers.js.map +1 -1
  248. package/dist/two-d/render/LightningArc.d.ts +57 -0
  249. package/dist/two-d/render/LightningArc.d.ts.map +1 -0
  250. package/dist/two-d/render/LightningArc.js +91 -0
  251. package/dist/two-d/render/LightningArc.js.map +1 -0
  252. package/dist/two-d/render/PaletteRemap.d.ts +135 -0
  253. package/dist/two-d/render/PaletteRemap.d.ts.map +1 -0
  254. package/dist/two-d/render/PaletteRemap.js +181 -0
  255. package/dist/two-d/render/PaletteRemap.js.map +1 -0
  256. package/dist/two-d/render/Particles.d.ts +26 -0
  257. package/dist/two-d/render/Particles.d.ts.map +1 -1
  258. package/dist/two-d/render/Particles.js +23 -2
  259. package/dist/two-d/render/Particles.js.map +1 -1
  260. package/dist/two-d/render/SpriteAttachment.d.ts +55 -0
  261. package/dist/two-d/render/SpriteAttachment.d.ts.map +1 -0
  262. package/dist/two-d/render/SpriteAttachment.js +60 -0
  263. package/dist/two-d/render/SpriteAttachment.js.map +1 -0
  264. package/dist/two-d/render/TerrainGraphics.d.ts +142 -0
  265. package/dist/two-d/render/TerrainGraphics.d.ts.map +1 -0
  266. package/dist/two-d/render/TerrainGraphics.js +161 -0
  267. package/dist/two-d/render/TerrainGraphics.js.map +1 -0
  268. package/dist/two-d/render/TerrainGraphicsLayer.d.ts +55 -0
  269. package/dist/two-d/render/TerrainGraphicsLayer.d.ts.map +1 -0
  270. package/dist/two-d/render/TerrainGraphicsLayer.js +54 -0
  271. package/dist/two-d/render/TerrainGraphicsLayer.js.map +1 -0
  272. package/dist/two-d/render/TintedSprite.js +2 -2
  273. package/dist/two-d/render/TintedSprite.js.map +1 -1
  274. package/dist/two-d/render/index.d.ts +15 -3
  275. package/dist/two-d/render/index.d.ts.map +1 -1
  276. package/dist/two-d/render/index.js +7 -1
  277. package/dist/two-d/render/index.js.map +1 -1
  278. package/dist/two-d/stage/StoryScreen.d.ts +110 -0
  279. package/dist/two-d/stage/StoryScreen.d.ts.map +1 -0
  280. package/dist/two-d/stage/StoryScreen.js +178 -0
  281. package/dist/two-d/stage/StoryScreen.js.map +1 -0
  282. package/dist/two-d/stage/index.d.ts +2 -0
  283. package/dist/two-d/stage/index.d.ts.map +1 -1
  284. package/dist/two-d/stage/index.js +1 -0
  285. package/dist/two-d/stage/index.js.map +1 -1
  286. package/dist/two-d/ui/Checkbox.d.ts +44 -0
  287. package/dist/two-d/ui/Checkbox.d.ts.map +1 -0
  288. package/dist/two-d/ui/Checkbox.js +89 -0
  289. package/dist/two-d/ui/Checkbox.js.map +1 -0
  290. package/dist/two-d/ui/DataTable.d.ts +79 -0
  291. package/dist/two-d/ui/DataTable.d.ts.map +1 -0
  292. package/dist/two-d/ui/DataTable.js +164 -0
  293. package/dist/two-d/ui/DataTable.js.map +1 -0
  294. package/dist/two-d/ui/Dropdown.d.ts +72 -0
  295. package/dist/two-d/ui/Dropdown.d.ts.map +1 -0
  296. package/dist/two-d/ui/Dropdown.js +126 -0
  297. package/dist/two-d/ui/Dropdown.js.map +1 -0
  298. package/dist/two-d/ui/FloatingText.d.ts +43 -4
  299. package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
  300. package/dist/two-d/ui/FloatingText.js +52 -5
  301. package/dist/two-d/ui/FloatingText.js.map +1 -1
  302. package/dist/two-d/ui/FloatingTextStack.d.ts +86 -13
  303. package/dist/two-d/ui/FloatingTextStack.d.ts.map +1 -1
  304. package/dist/two-d/ui/FloatingTextStack.js +89 -18
  305. package/dist/two-d/ui/FloatingTextStack.js.map +1 -1
  306. package/dist/two-d/ui/Layout.d.ts +105 -0
  307. package/dist/two-d/ui/Layout.d.ts.map +1 -0
  308. package/dist/two-d/ui/Layout.js +174 -0
  309. package/dist/two-d/ui/Layout.js.map +1 -0
  310. package/dist/two-d/ui/MarkupText.d.ts +53 -0
  311. package/dist/two-d/ui/MarkupText.d.ts.map +1 -0
  312. package/dist/two-d/ui/MarkupText.js +122 -0
  313. package/dist/two-d/ui/MarkupText.js.map +1 -0
  314. package/dist/two-d/ui/ScrollBox.d.ts +67 -0
  315. package/dist/two-d/ui/ScrollBox.d.ts.map +1 -0
  316. package/dist/two-d/ui/ScrollBox.js +127 -0
  317. package/dist/two-d/ui/ScrollBox.js.map +1 -0
  318. package/dist/two-d/ui/Skins.d.ts +59 -0
  319. package/dist/two-d/ui/Skins.d.ts.map +1 -0
  320. package/dist/two-d/ui/Skins.js +77 -0
  321. package/dist/two-d/ui/Skins.js.map +1 -0
  322. package/dist/two-d/ui/Slider.d.ts +91 -0
  323. package/dist/two-d/ui/Slider.d.ts.map +1 -0
  324. package/dist/two-d/ui/Slider.js +170 -0
  325. package/dist/two-d/ui/Slider.js.map +1 -0
  326. package/dist/two-d/ui/Spinner.d.ts +67 -0
  327. package/dist/two-d/ui/Spinner.d.ts.map +1 -0
  328. package/dist/two-d/ui/Spinner.js +137 -0
  329. package/dist/two-d/ui/Spinner.js.map +1 -0
  330. package/dist/two-d/ui/TabbedList.d.ts +118 -0
  331. package/dist/two-d/ui/TabbedList.d.ts.map +1 -0
  332. package/dist/two-d/ui/TabbedList.js +221 -0
  333. package/dist/two-d/ui/TabbedList.js.map +1 -0
  334. package/dist/two-d/ui/TextModel.d.ts +65 -0
  335. package/dist/two-d/ui/TextModel.d.ts.map +1 -0
  336. package/dist/two-d/ui/TextModel.js +126 -0
  337. package/dist/two-d/ui/TextModel.js.map +1 -0
  338. package/dist/two-d/ui/TreeView.d.ts +68 -0
  339. package/dist/two-d/ui/TreeView.d.ts.map +1 -0
  340. package/dist/two-d/ui/TreeView.js +133 -0
  341. package/dist/two-d/ui/TreeView.js.map +1 -0
  342. package/dist/two-d/ui/Window.d.ts +13 -0
  343. package/dist/two-d/ui/Window.d.ts.map +1 -1
  344. package/dist/two-d/ui/Window.js +23 -0
  345. package/dist/two-d/ui/Window.js.map +1 -1
  346. package/dist/two-d/ui/WindowStack.d.ts.map +1 -1
  347. package/dist/two-d/ui/WindowStack.js +2 -0
  348. package/dist/two-d/ui/WindowStack.js.map +1 -1
  349. package/dist/two-d/ui/index.d.ts +29 -3
  350. package/dist/two-d/ui/index.d.ts.map +1 -1
  351. package/dist/two-d/ui/index.js +15 -2
  352. package/dist/two-d/ui/index.js.map +1 -1
  353. package/dist/two-d/ui/markup.d.ts +181 -0
  354. package/dist/two-d/ui/markup.d.ts.map +1 -0
  355. package/dist/two-d/ui/markup.js +370 -0
  356. package/dist/two-d/ui/markup.js.map +1 -0
  357. package/dist/version.d.ts +1 -1
  358. package/dist/version.js +1 -1
  359. package/dist/world/SideTurns.d.ts +115 -0
  360. package/dist/world/SideTurns.d.ts.map +1 -0
  361. package/dist/world/SideTurns.js +138 -0
  362. package/dist/world/SideTurns.js.map +1 -0
  363. package/dist/world/index.d.ts +2 -0
  364. package/dist/world/index.d.ts.map +1 -1
  365. package/dist/world/index.js +1 -0
  366. package/dist/world/index.js.map +1 -1
  367. package/package.json +2 -1
@@ -0,0 +1,41 @@
1
+ /**
2
+ * A loaded `.map`: the header keys the file declared, the grid `parseTerrain` already produces,
3
+ * and the same start markers an inline `[map] terrain=` string carries.
4
+ */
5
+ export interface MwlMapFile {
6
+ /** the `key=value` lines before the grid, in the order written (`border_size`, `usage`, ...) */
7
+ readonly header: Readonly<Record<string, string>>;
8
+ readonly width: number;
9
+ readonly height: number;
10
+ /** row-major terrain codes, `width * height` of them */
11
+ readonly codes: string[];
12
+ /** side number -> the hexes its `[side] start` came from, when the grid marks them */
13
+ readonly starts: Record<number, {
14
+ x: number;
15
+ y: number;
16
+ }[]>;
17
+ }
18
+ /**
19
+ * Reads a Wesnoth-shaped `.map` file: `key=value` header lines (`border_size=1`, `usage=map`,
20
+ * and anything else the file carries), then one comma-separated row of terrain codes per line.
21
+ * The header is split off and kept, and the grid goes through the same `parseTerrain` an inline
22
+ * `[map] terrain=` string does, so a cell is `base^overlay` exactly as it is there and a
23
+ * `<side> <code>` token still marks that side's start.
24
+ *
25
+ * A file with no header is a bare grid, and the header keys are not interpreted here: what
26
+ * `usage` or `border_size` means to a game is the game's business, the same way this framework
27
+ * leaves `[terrain_graphics]` rules to content.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * import { parseMapFile } from '@datamoc/mw_games/mwl';
32
+ *
33
+ * const map = parseMapFile('border_size=1\nusage=map\n\nGg, Gg, Gg\nGg, Gg^Vh, Gg\n');
34
+ * map.header.usage; // 'map'
35
+ * map.width; // 3
36
+ * map.height; // 2
37
+ * map.codes; // ['Gg', 'Gg', 'Gg', 'Gg', 'Gg^Vh', 'Gg'] - overlays kept as written
38
+ * ```
39
+ */
40
+ export declare function parseMapFile(text: string): MwlMapFile;
41
+ //# sourceMappingURL=MapFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapFile.d.ts","sourceRoot":"","sources":["../../src/mwl/MapFile.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,WAAW,UAAU;IAC1B,gGAAgG;IAChG,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACzB,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;CAC5D;AAID;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAiBrD"}
@@ -0,0 +1,43 @@
1
+ import { parseTerrain } from './runtime.js';
2
+ const HEADER_LINE = /^\s*([A-Za-z_][\w]*)\s*=\s*(.*?)\s*$/;
3
+ /**
4
+ * Reads a Wesnoth-shaped `.map` file: `key=value` header lines (`border_size=1`, `usage=map`,
5
+ * and anything else the file carries), then one comma-separated row of terrain codes per line.
6
+ * The header is split off and kept, and the grid goes through the same `parseTerrain` an inline
7
+ * `[map] terrain=` string does, so a cell is `base^overlay` exactly as it is there and a
8
+ * `<side> <code>` token still marks that side's start.
9
+ *
10
+ * A file with no header is a bare grid, and the header keys are not interpreted here: what
11
+ * `usage` or `border_size` means to a game is the game's business, the same way this framework
12
+ * leaves `[terrain_graphics]` rules to content.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { parseMapFile } from '@datamoc/mw_games/mwl';
17
+ *
18
+ * const map = parseMapFile('border_size=1\nusage=map\n\nGg, Gg, Gg\nGg, Gg^Vh, Gg\n');
19
+ * map.header.usage; // 'map'
20
+ * map.width; // 3
21
+ * map.height; // 2
22
+ * map.codes; // ['Gg', 'Gg', 'Gg', 'Gg', 'Gg^Vh', 'Gg'] - overlays kept as written
23
+ * ```
24
+ */
25
+ export function parseMapFile(text) {
26
+ const lines = text.split(/\r?\n/);
27
+ const header = {};
28
+ let index = 0;
29
+ for (; index < lines.length; index++) {
30
+ const line = lines[index];
31
+ if (line.trim() === '')
32
+ continue;
33
+ const match = HEADER_LINE.exec(line);
34
+ if (!match)
35
+ break;
36
+ header[match[1]] = match[2];
37
+ }
38
+ //a trailing separator or stray spaces would otherwise become an empty cell
39
+ const grid = lines.slice(index).map((line) => line.replace(/[,\s]+$/, ''));
40
+ const parsed = parseTerrain(grid.join('\n'));
41
+ return { header, ...parsed };
42
+ }
43
+ //# sourceMappingURL=MapFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapFile.js","sourceRoot":"","sources":["../../src/mwl/MapFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAiB5C,MAAM,WAAW,GAAG,sCAAsC,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACjC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,MAAM;QAClB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,2EAA2E;IAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;AAC9B,CAAC"}
@@ -8,11 +8,55 @@ export interface MwlActorItem extends ItemDefinition {
8
8
  readonly slot?: string;
9
9
  readonly modifiers?: Modifier[];
10
10
  }
11
- /** Converts MWL's data shape into the actor layer without importing game rules. */
11
+ /**
12
+ * Converts MWL's data shape into the actor layer without importing game rules.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { itemDefinition, type MwlItemDefinition } from '@datamoc/mw_games/mwl';
17
+ *
18
+ * declare const item: MwlItemDefinition;
19
+ * const actorItem = itemDefinition(item, { level: 2 });
20
+ * console.log(actorItem.id);
21
+ * ```
22
+ */
12
23
  export declare function itemDefinition(item: MwlItemDefinition, context?: MwlExpressionContext): MwlActorItem;
24
+ /**
25
+ * Wraps a converted item as an inventory stack of `quantity`.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * import { inventoryItem, itemDefinition, type MwlItemDefinition } from '@datamoc/mw_games/mwl';
30
+ *
31
+ * declare const item: MwlItemDefinition;
32
+ * const stack = inventoryItem(itemDefinition(item), 3);
33
+ * console.log(stack.quantity); // 3
34
+ * ```
35
+ */
13
36
  export declare function inventoryItem(item: MwlActorItem, quantity?: number): InventoryItem;
14
- /** Resolve a declarative MWL effect list using the same rule as StatBlock. */
37
+ /**
38
+ * Resolve a declarative MWL effect list using the same rule as StatBlock.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * import { composeEffects, type MwlEffectDefinition } from '@datamoc/mw_games/mwl';
43
+ *
44
+ * declare const effects: readonly MwlEffectDefinition[];
45
+ * console.log(composeEffects(10, effects, { level: 2 }));
46
+ * ```
47
+ */
15
48
  export declare function composeEffects(base: number, effects: readonly MwlEffectDefinition[], context?: MwlExpressionContext): number;
49
+ /**
50
+ * Converts one MWL effect into a `StatBlock` modifier, resolving its value expression.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * import { effectToModifier, type MwlEffectDefinition } from '@datamoc/mw_games/mwl';
55
+ *
56
+ * declare const effect: MwlEffectDefinition;
57
+ * console.log(effectToModifier(effect, { level: 2 }));
58
+ * ```
59
+ */
16
60
  export declare function effectToModifier(effect: MwlEffectDefinition, context?: MwlExpressionContext): Modifier;
17
61
  export type MwlEquipment<Slot extends string> = EquipmentSlots<Slot, MwlActorItem>;
18
62
  //# sourceMappingURL=actors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"actors.d.ts","sourceRoot":"","sources":["../../src/mwl/actors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEhF,MAAM,WAAW,YAAa,SAAQ,cAAc;IACnD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CAChC;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,GAAE,oBAAyB,GAAG,YAAY,CAQxG;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,SAAI,GAAG,aAAa,CAE7E;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,mBAAmB,EAAE,EACvC,OAAO,GAAE,oBAAyB,GAChC,MAAM,CAKR;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,GAAE,oBAAyB,GAAG,QAAQ,CAkB1G;AAED,MAAM,MAAM,YAAY,CAAC,IAAI,SAAS,MAAM,IAAI,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"actors.d.ts","sourceRoot":"","sources":["../../src/mwl/actors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEhF,MAAM,WAAW,YAAa,SAAQ,cAAc;IACnD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CAChC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,GAAE,oBAAyB,GAAG,YAAY,CAQxG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,SAAI,GAAG,aAAa,CAE7E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,mBAAmB,EAAE,EACvC,OAAO,GAAE,oBAAyB,GAChC,MAAM,CAKR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,GAAE,oBAAyB,GAAG,QAAQ,CAkB1G;AAED,MAAM,MAAM,YAAY,CAAC,IAAI,SAAS,MAAM,IAAI,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC"}
@@ -1,6 +1,17 @@
1
1
  import { composeModifiers } from '../actors/StatBlock.js';
2
2
  import { evaluateExpression } from './expression.js';
3
- /** Converts MWL's data shape into the actor layer without importing game rules. */
3
+ /**
4
+ * Converts MWL's data shape into the actor layer without importing game rules.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { itemDefinition, type MwlItemDefinition } from '@datamoc/mw_games/mwl';
9
+ *
10
+ * declare const item: MwlItemDefinition;
11
+ * const actorItem = itemDefinition(item, { level: 2 });
12
+ * console.log(actorItem.id);
13
+ * ```
14
+ */
4
15
  export function itemDefinition(item, context = {}) {
5
16
  return {
6
17
  id: item.id,
@@ -10,13 +21,46 @@ export function itemDefinition(item, context = {}) {
10
21
  modifiers: item.effects.map((effect) => effectToModifier(effect, context)),
11
22
  };
12
23
  }
24
+ /**
25
+ * Wraps a converted item as an inventory stack of `quantity`.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * import { inventoryItem, itemDefinition, type MwlItemDefinition } from '@datamoc/mw_games/mwl';
30
+ *
31
+ * declare const item: MwlItemDefinition;
32
+ * const stack = inventoryItem(itemDefinition(item), 3);
33
+ * console.log(stack.quantity); // 3
34
+ * ```
35
+ */
13
36
  export function inventoryItem(item, quantity = 1) {
14
37
  return { id: item.id, quantity, stackable: item.stackable, weight: item.weight };
15
38
  }
16
- /** Resolve a declarative MWL effect list using the same rule as StatBlock. */
39
+ /**
40
+ * Resolve a declarative MWL effect list using the same rule as StatBlock.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * import { composeEffects, type MwlEffectDefinition } from '@datamoc/mw_games/mwl';
45
+ *
46
+ * declare const effects: readonly MwlEffectDefinition[];
47
+ * console.log(composeEffects(10, effects, { level: 2 }));
48
+ * ```
49
+ */
17
50
  export function composeEffects(base, effects, context = {}) {
18
51
  return composeModifiers(base, effects.map((effect) => effectToModifier(effect, context)));
19
52
  }
53
+ /**
54
+ * Converts one MWL effect into a `StatBlock` modifier, resolving its value expression.
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * import { effectToModifier, type MwlEffectDefinition } from '@datamoc/mw_games/mwl';
59
+ *
60
+ * declare const effect: MwlEffectDefinition;
61
+ * console.log(effectToModifier(effect, { level: 2 }));
62
+ * ```
63
+ */
20
64
  export function effectToModifier(effect, context = {}) {
21
65
  const operation = effect.operation;
22
66
  if (operation !== 'add' &&
@@ -1 +1 @@
1
- {"version":3,"file":"actors.js","sourceRoot":"","sources":["../../src/mwl/actors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAiB,MAAM,wBAAwB,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAA6B,MAAM,iBAAiB,CAAC;AAQhF,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,IAAuB,EAAE,OAAO,GAAyB,EAAE;IACzF,OAAO;QACN,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC1E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAkB,EAAE,QAAQ,GAAG,CAAC;IAC7D,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAClF,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAC7B,IAAY,EACZ,OAAuC,EACvC,OAAO,GAAyB,EAAE;IAElC,OAAO,gBAAgB,CACtB,IAAI,EACJ,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAA2B,EAAE,OAAO,GAAyB,EAAE;IAC/F,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IACC,SAAS,KAAK,KAAK;QACnB,SAAS,KAAK,KAAK;QACnB,SAAS,KAAK,UAAU;QACxB,SAAS,KAAK,QAAQ;QACtB,SAAS,KAAK,KAAK;QAEnB,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,IAAI,EAAE,+BAA+B,CAAC,CAAC;IAC1F,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,IAAI,GAAG,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,OAAO;QACpB,EAAE,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACjF,KAAK,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK;KAChF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"actors.js","sourceRoot":"","sources":["../../src/mwl/actors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAiB,MAAM,wBAAwB,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAA6B,MAAM,iBAAiB,CAAC;AAQhF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,IAAuB,EAAE,OAAO,GAAyB,EAAE;IACzF,OAAO;QACN,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC1E,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,IAAkB,EAAE,QAAQ,GAAG,CAAC;IAC7D,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAClF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAC7B,IAAY,EACZ,OAAuC,EACvC,OAAO,GAAyB,EAAE;IAElC,OAAO,gBAAgB,CACtB,IAAI,EACJ,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAC1D,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA2B,EAAE,OAAO,GAAyB,EAAE;IAC/F,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IACC,SAAS,KAAK,KAAK;QACnB,SAAS,KAAK,KAAK;QACnB,SAAS,KAAK,UAAU;QACxB,SAAS,KAAK,QAAQ;QACtB,SAAS,KAAK,KAAK;QAEnB,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,IAAI,EAAE,+BAA+B,CAAC,CAAC;IAC1F,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,IAAI,GAAG,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,OAAO;QACpB,EAAE,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACjF,KAAK,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK;KAChF,CAAC;AACH,CAAC"}
@@ -0,0 +1,51 @@
1
+ import type { StateValue } from '../core/State.ts';
2
+ import type { CampaignLevel, CampaignLevelResult } from '../simulation/Campaign.ts';
3
+ import type { MwlCampaignDefinition, MwlScenarioLink } from './content.ts';
4
+ /** What playing one scenario means, which only the game can say. */
5
+ export type MwlScenarioRunner<State extends StateValue, Result extends StateValue = StateValue> = (scenario: MwlScenarioLink, state: State, context: {
6
+ readonly levelId: string;
7
+ }) => CampaignLevelResult<State, Result>;
8
+ /** A campaign's chain, shaped for `simulation.Campaign`: where it opens, and one level per scenario. */
9
+ export interface MwlCampaignChain<State extends StateValue, Result extends StateValue = StateValue> {
10
+ readonly start: string;
11
+ readonly levels: readonly CampaignLevel<State, Result>[];
12
+ }
13
+ /**
14
+ * Points a `[campaign]` at `simulation.Campaign`: the order comes out of the content, the playing
15
+ * stays the game's.
16
+ *
17
+ * `first_scenario` opens the campaign, and the first declared scenario opens it when the attribute
18
+ * is not set. Each scenario's `next_scenario` is where it goes when it is won, and a scenario that
19
+ * ends the chain leaves it: the campaign finishes. A scenario that decides for itself keeps its
20
+ * decision, because a result carrying `next` is passed through untouched - which is exactly what a
21
+ * runtime `[endlevel]` does when it overrides the authored chain.
22
+ *
23
+ * Malformed chains throw by name rather than being guessed at: no scenarios, the same id twice, or
24
+ * a `first_scenario` naming something the campaign does not have.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * import { campaignChain } from '@datamoc/mw_games/mwl';
29
+ * import { Campaign } from '@datamoc/mw_games/simulation';
30
+ *
31
+ * const definition = {
32
+ * id: 'prologue',
33
+ * firstScenario: 'opening',
34
+ * scenarios: [{ id: 'opening', nextScenario: 'siege' }, { id: 'siege' }],
35
+ * };
36
+ *
37
+ * const chain = campaignChain(definition, {
38
+ * run: (scenario, state) => ({ outcome: 'completed', state, result: scenario.id }),
39
+ * });
40
+ *
41
+ * const campaign = new Campaign({ levels: chain.levels, start: chain.start, state: { gold: 100 } });
42
+ * campaign.playCurrent();
43
+ * console.log(campaign.currentLevel); // 'siege'
44
+ * campaign.playCurrent();
45
+ * console.log(campaign.currentLevel); // null - the chain is done
46
+ * ```
47
+ */
48
+ export declare function campaignChain<State extends StateValue, Result extends StateValue = StateValue>(definition: MwlCampaignDefinition, options: {
49
+ readonly run: MwlScenarioRunner<State, Result>;
50
+ }): MwlCampaignChain<State, Result>;
51
+ //# sourceMappingURL=campaign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaign.d.ts","sourceRoot":"","sources":["../../src/mwl/campaign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE3E,oEAAoE;AACpE,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,UAAU,EAAE,MAAM,SAAS,UAAU,GAAG,UAAU,IAAI,CACjG,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,KACjC,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAExC,wGAAwG;AACxG,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,UAAU,EAAE,MAAM,SAAS,UAAU,GAAG,UAAU;IACjG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;CACzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,aAAa,CAAC,KAAK,SAAS,UAAU,EAAE,MAAM,SAAS,UAAU,GAAG,UAAU,EAC7F,UAAU,EAAE,qBAAqB,EACjC,OAAO,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;CAAE,GACzD,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAqBjC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Points a `[campaign]` at `simulation.Campaign`: the order comes out of the content, the playing
3
+ * stays the game's.
4
+ *
5
+ * `first_scenario` opens the campaign, and the first declared scenario opens it when the attribute
6
+ * is not set. Each scenario's `next_scenario` is where it goes when it is won, and a scenario that
7
+ * ends the chain leaves it: the campaign finishes. A scenario that decides for itself keeps its
8
+ * decision, because a result carrying `next` is passed through untouched - which is exactly what a
9
+ * runtime `[endlevel]` does when it overrides the authored chain.
10
+ *
11
+ * Malformed chains throw by name rather than being guessed at: no scenarios, the same id twice, or
12
+ * a `first_scenario` naming something the campaign does not have.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { campaignChain } from '@datamoc/mw_games/mwl';
17
+ * import { Campaign } from '@datamoc/mw_games/simulation';
18
+ *
19
+ * const definition = {
20
+ * id: 'prologue',
21
+ * firstScenario: 'opening',
22
+ * scenarios: [{ id: 'opening', nextScenario: 'siege' }, { id: 'siege' }],
23
+ * };
24
+ *
25
+ * const chain = campaignChain(definition, {
26
+ * run: (scenario, state) => ({ outcome: 'completed', state, result: scenario.id }),
27
+ * });
28
+ *
29
+ * const campaign = new Campaign({ levels: chain.levels, start: chain.start, state: { gold: 100 } });
30
+ * campaign.playCurrent();
31
+ * console.log(campaign.currentLevel); // 'siege'
32
+ * campaign.playCurrent();
33
+ * console.log(campaign.currentLevel); // null - the chain is done
34
+ * ```
35
+ */
36
+ export function campaignChain(definition, options) {
37
+ const scenarios = definition.scenarios;
38
+ if (scenarios.length === 0)
39
+ throw new Error(`campaign ${definition.id} declares no scenarios`);
40
+ const known = new Set(scenarios.map((scenario) => scenario.id));
41
+ if (known.size !== scenarios.length)
42
+ throw new Error(`campaign ${definition.id} declares a scenario twice`);
43
+ const start = definition.firstScenario || scenarios[0].id;
44
+ if (!known.has(start))
45
+ throw new Error(`campaign ${definition.id} starts on an unknown scenario: ${start}`);
46
+ return {
47
+ start,
48
+ levels: scenarios.map((scenario) => ({
49
+ id: scenario.id,
50
+ run: (state, context) => {
51
+ const result = options.run(scenario, state, context);
52
+ //the authored chain answers "where next" unless the scenario answered for itself
53
+ return result.next === undefined ? { ...result, next: scenario.nextScenario ?? null } : result;
54
+ },
55
+ })),
56
+ };
57
+ }
58
+ //# sourceMappingURL=campaign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaign.js","sourceRoot":"","sources":["../../src/mwl/campaign.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,aAAa,CAC5B,UAAiC,EACjC,OAA2D;IAE3D,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAE/F,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,CAAC,EAAE,4BAA4B,CAAC,CAAC;IAE5G,MAAM,KAAK,GAAG,UAAU,CAAC,aAAa,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,CAAC,EAAE,mCAAmC,KAAK,EAAE,CAAC,CAAC;IAE5G,OAAO;QACN,KAAK;QACL,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACpC,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBACrD,iFAAiF;gBACjF,OAAO,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAChG,CAAC;SACD,CAAC,CAAC;KACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,86 @@
1
+ import type { MwlWorld } from './runtime.ts';
2
+ /**
3
+ * Wesnoth's default: the share of a side's gold that survives into the next scenario, unless
4
+ * `[endlevel] carryover_percentage` says otherwise. Its engine carries the winner's gold at 80%,
5
+ * which is the number this mirrors rather than one invented here.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { MWL_DEFAULT_CARRYOVER_PERCENTAGE } from '@datamoc/mw_games/mwl';
10
+ *
11
+ * console.log(MWL_DEFAULT_CARRYOVER_PERCENTAGE); // 80
12
+ * ```
13
+ */
14
+ export declare const MWL_DEFAULT_CARRYOVER_PERCENTAGE = 80;
15
+ /**
16
+ * Which side an ending scenario hands on: the id `[side]` declared, which is the one identity the
17
+ * world uses, keying `world.sides` and `world.gold` and carried by `unit.side` alike (item 277).
18
+ */
19
+ export interface MwlSideRef {
20
+ /** the id `[side]` declared, the key `world.sides` and `world.gold` use, and `unit.side` holds */
21
+ readonly id: string;
22
+ }
23
+ /** What `[endlevel]` says when a scenario ends. */
24
+ export interface MwlEndLevel {
25
+ readonly result: 'victory' | 'defeat';
26
+ /** `bonus`: gold added on top of the share, not a share of it */
27
+ readonly bonus?: number;
28
+ /** `carryover_percentage`: the share of the side's gold kept, 80 when unset */
29
+ readonly carryoverPercentage?: number;
30
+ /** `carryover_add`: add the share to the next scenario's gold rather than take the larger of them */
31
+ readonly carryoverAdd?: boolean;
32
+ /** `next_scenario`: where the campaign goes instead of the authored chain, null to end it */
33
+ readonly nextScenario?: string | null;
34
+ }
35
+ /** What one scenario hands to the next. Plain data, so it survives a save. */
36
+ export interface MwlCarryover {
37
+ readonly result: 'victory' | 'defeat';
38
+ /** the gold handed on: the side's share, plus the bonus */
39
+ readonly gold: number;
40
+ /** whether the share is added to the next scenario's gold or taken as a floor under it */
41
+ readonly add: boolean;
42
+ /** ids of the side's units still standing, which become the recall list */
43
+ readonly recall: readonly string[];
44
+ /** where the campaign goes next; null ends it */
45
+ readonly nextScenario: string | null;
46
+ }
47
+ /**
48
+ * Works out what a finished scenario hands on: `bonus` plus `carryover_percentage` of the side's
49
+ * gold, the units of that side still standing, and where the campaign goes next.
50
+ *
51
+ * A side of `null` is a scenario that ended without one (no `[side]`, nothing human-controlled):
52
+ * the result and the next scenario are still recorded, with no gold and nobody to recall.
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * import { endLevelCarryover, carryoverIntoScenario } from '@datamoc/mw_games/mwl';
57
+ *
58
+ * const world = {
59
+ * variables: {},
60
+ * gold: { '1': 200 },
61
+ * sides: { '1': { gold: 0, income: 2, controller: 'human' } },
62
+ * units: { hero: { hp: 30, x: 1, y: 1, alive: true, side: '1' } },
63
+ * maps: {},
64
+ * turn: 1,
65
+ * status: 'playing' as const,
66
+ * };
67
+ *
68
+ * const carried = endLevelCarryover(world, { id: '1' }, {
69
+ * result: 'victory',
70
+ * bonus: 50,
71
+ * nextScenario: 'siege',
72
+ * });
73
+ *
74
+ * console.log(carried.gold); // 210 - 50 bonus plus 80% of 200
75
+ * console.log(carried.recall); // ['hero'] - still standing, so it comes back
76
+ * console.log(carryoverIntoScenario(carried, 100)); // 210 - the larger of the two, not the sum
77
+ * ```
78
+ */
79
+ export declare function endLevelCarryover(world: MwlWorld, side: MwlSideRef | null, end: MwlEndLevel): MwlCarryover;
80
+ /**
81
+ * What the next scenario starts with, given what it declares and what was carried: the two added
82
+ * when the ending asked for that (`carryover_add`), and otherwise the larger of them, so a share
83
+ * never drags a side below the gold its own scenario gives it.
84
+ */
85
+ export declare function carryoverIntoScenario(carryover: MwlCarryover, declaredGold: number): number;
86
+ //# sourceMappingURL=carryover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carryover.d.ts","sourceRoot":"","sources":["../../src/mwl/carryover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,UAAU;IAC1B,kGAAkG;IAClG,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACpB;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAEtC,iEAAiE;IACjE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAExB,+EAA+E;IAC/E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAEtC,qGAAqG;IACrG,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAEhC,6FAA6F;IAC7F,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAEtC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,0FAA0F;IAC1F,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IAEtB,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAEnC,iDAAiD;IACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,YAAY,CAgB1G;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE3F"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Wesnoth's default: the share of a side's gold that survives into the next scenario, unless
3
+ * `[endlevel] carryover_percentage` says otherwise. Its engine carries the winner's gold at 80%,
4
+ * which is the number this mirrors rather than one invented here.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { MWL_DEFAULT_CARRYOVER_PERCENTAGE } from '@datamoc/mw_games/mwl';
9
+ *
10
+ * console.log(MWL_DEFAULT_CARRYOVER_PERCENTAGE); // 80
11
+ * ```
12
+ */
13
+ export const MWL_DEFAULT_CARRYOVER_PERCENTAGE = 80;
14
+ /**
15
+ * Works out what a finished scenario hands on: `bonus` plus `carryover_percentage` of the side's
16
+ * gold, the units of that side still standing, and where the campaign goes next.
17
+ *
18
+ * A side of `null` is a scenario that ended without one (no `[side]`, nothing human-controlled):
19
+ * the result and the next scenario are still recorded, with no gold and nobody to recall.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { endLevelCarryover, carryoverIntoScenario } from '@datamoc/mw_games/mwl';
24
+ *
25
+ * const world = {
26
+ * variables: {},
27
+ * gold: { '1': 200 },
28
+ * sides: { '1': { gold: 0, income: 2, controller: 'human' } },
29
+ * units: { hero: { hp: 30, x: 1, y: 1, alive: true, side: '1' } },
30
+ * maps: {},
31
+ * turn: 1,
32
+ * status: 'playing' as const,
33
+ * };
34
+ *
35
+ * const carried = endLevelCarryover(world, { id: '1' }, {
36
+ * result: 'victory',
37
+ * bonus: 50,
38
+ * nextScenario: 'siege',
39
+ * });
40
+ *
41
+ * console.log(carried.gold); // 210 - 50 bonus plus 80% of 200
42
+ * console.log(carried.recall); // ['hero'] - still standing, so it comes back
43
+ * console.log(carryoverIntoScenario(carried, 100)); // 210 - the larger of the two, not the sum
44
+ * ```
45
+ */
46
+ export function endLevelCarryover(world, side, end) {
47
+ const percentage = end.carryoverPercentage ?? MWL_DEFAULT_CARRYOVER_PERCENTAGE;
48
+ const held = side ? (world.gold[side.id] ?? world.sides[side.id]?.gold ?? 0) : 0;
49
+ return {
50
+ result: end.result,
51
+ gold: Math.floor((held * percentage) / 100) + (end.bonus ?? 0),
52
+ add: end.carryoverAdd ?? false,
53
+ recall: side
54
+ ? Object.entries(world.units)
55
+ .filter(([, unit]) => unit.alive && unit.side === side.id)
56
+ .map(([id]) => id)
57
+ .sort()
58
+ : [],
59
+ nextScenario: end.nextScenario ?? null,
60
+ };
61
+ }
62
+ /**
63
+ * What the next scenario starts with, given what it declares and what was carried: the two added
64
+ * when the ending asked for that (`carryover_add`), and otherwise the larger of them, so a share
65
+ * never drags a side below the gold its own scenario gives it.
66
+ */
67
+ export function carryoverIntoScenario(carryover, declaredGold) {
68
+ return carryover.add ? declaredGold + carryover.gold : Math.max(declaredGold, carryover.gold);
69
+ }
70
+ //# sourceMappingURL=carryover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carryover.js","sourceRoot":"","sources":["../../src/mwl/carryover.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,CAAC;AA6CnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAe,EAAE,IAAuB,EAAE,GAAgB;IAC3F,MAAM,UAAU,GAAG,GAAG,CAAC,mBAAmB,IAAI,gCAAgC,CAAC;IAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjF,OAAO;QACN,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9D,GAAG,EAAE,GAAG,CAAC,YAAY,IAAI,KAAK;QAC9B,MAAM,EAAE,IAAI;YACX,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;iBAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;iBACzD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;iBACjB,IAAI,EAAE;YACT,CAAC,CAAC,EAAE;QACL,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;KACtC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAuB,EAAE,YAAoB;IAClF,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAC/F,CAAC"}
@@ -8,6 +8,15 @@ export interface MwlValidationOptions {
8
8
  }
9
9
  /** Semantic checks shared by all games. Domain rules remain in the game adapter. */
10
10
  export declare function validateCatalog(game: MwlCompiledGame, options?: MwlValidationOptions): MwlDiagnostic[];
11
- /** Convenience for adapters that keep parsed nodes rather than compiled games. */
11
+ /**
12
+ * Convenience for adapters that keep parsed nodes rather than compiled games.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { parse, validateCatalogNodes } from '@datamoc/mw_games/mwl';
17
+ *
18
+ * console.log(validateCatalogNodes(parse('[game]\nschema=0.1\n[/game]'))); // []
19
+ * ```
20
+ */
12
21
  export declare function validateCatalogNodes(nodes: readonly MwlNode[], options?: MwlValidationOptions): MwlDiagnostic[];
13
22
  //# sourceMappingURL=catalog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/mwl/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,eAAe,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAe,OAAO,EAAE,MAAM,cAAc,CAAC;AAIxE,MAAM,WAAW,oBAAoB;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,GAAE,oBAAyB,GAAG,aAAa,EAAE,CAmE1G;AAMD,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,GAAE,oBAAyB,GAAG,aAAa,EAAE,CAGnH"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/mwl/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,eAAe,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAe,OAAO,EAAE,MAAM,cAAc,CAAC;AAIxE,MAAM,WAAW,oBAAoB;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,GAAE,oBAAyB,GAAG,aAAa,EAAE,CAmE1G;AAMD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,GAAE,oBAAyB,GAAG,aAAa,EAAE,CAGnH"}
@@ -51,7 +51,16 @@ export function validateCatalog(game, options = {}) {
51
51
  function diagnostic(code, message, location) {
52
52
  return { code, message, location: location ?? { file: '<mwl>', line: 1, column: 1 } };
53
53
  }
54
- /** Convenience for adapters that keep parsed nodes rather than compiled games. */
54
+ /**
55
+ * Convenience for adapters that keep parsed nodes rather than compiled games.
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * import { parse, validateCatalogNodes } from '@datamoc/mw_games/mwl';
60
+ *
61
+ * console.log(validateCatalogNodes(parse('[game]\nschema=0.1\n[/game]'))); // []
62
+ * ```
63
+ */
55
64
  export function validateCatalogNodes(nodes, options = {}) {
56
65
  const fake = { schema: '0.1', roots: nodes, assets: [], messages: [] };
57
66
  return validateCatalog(fake, options);
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/mwl/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/mwl/catalog.ts"],"names":[],"mappings":"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"}