@datamoc/mw_games 0.1.1

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 (425) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +327 -0
  3. package/dist/actors/Advancement.d.ts +73 -0
  4. package/dist/actors/Advancement.d.ts.map +1 -0
  5. package/dist/actors/Advancement.js +98 -0
  6. package/dist/actors/Advancement.js.map +1 -0
  7. package/dist/actors/Affix.d.ts +44 -0
  8. package/dist/actors/Affix.d.ts.map +1 -0
  9. package/dist/actors/Affix.js +35 -0
  10. package/dist/actors/Affix.js.map +1 -0
  11. package/dist/actors/Appearances.d.ts +36 -0
  12. package/dist/actors/Appearances.d.ts.map +1 -0
  13. package/dist/actors/Appearances.js +50 -0
  14. package/dist/actors/Appearances.js.map +1 -0
  15. package/dist/actors/Charges.d.ts +31 -0
  16. package/dist/actors/Charges.d.ts.map +1 -0
  17. package/dist/actors/Charges.js +35 -0
  18. package/dist/actors/Charges.js.map +1 -0
  19. package/dist/actors/Equipment.d.ts +40 -0
  20. package/dist/actors/Equipment.d.ts.map +1 -0
  21. package/dist/actors/Equipment.js +57 -0
  22. package/dist/actors/Equipment.js.map +1 -0
  23. package/dist/actors/Inventory.d.ts +50 -0
  24. package/dist/actors/Inventory.d.ts.map +1 -0
  25. package/dist/actors/Inventory.js +56 -0
  26. package/dist/actors/Inventory.js.map +1 -0
  27. package/dist/actors/ItemState.d.ts +21 -0
  28. package/dist/actors/ItemState.d.ts.map +1 -0
  29. package/dist/actors/ItemState.js +34 -0
  30. package/dist/actors/ItemState.js.map +1 -0
  31. package/dist/actors/Loot.d.ts +24 -0
  32. package/dist/actors/Loot.d.ts.map +1 -0
  33. package/dist/actors/Loot.js +14 -0
  34. package/dist/actors/Loot.js.map +1 -0
  35. package/dist/actors/Progression.d.ts +30 -0
  36. package/dist/actors/Progression.d.ts.map +1 -0
  37. package/dist/actors/Progression.js +39 -0
  38. package/dist/actors/Progression.js.map +1 -0
  39. package/dist/actors/Resource.d.ts +23 -0
  40. package/dist/actors/Resource.d.ts.map +1 -0
  41. package/dist/actors/Resource.js +28 -0
  42. package/dist/actors/Resource.js.map +1 -0
  43. package/dist/actors/Scaling.d.ts +22 -0
  44. package/dist/actors/Scaling.d.ts.map +1 -0
  45. package/dist/actors/Scaling.js +9 -0
  46. package/dist/actors/Scaling.js.map +1 -0
  47. package/dist/actors/Shop.d.ts +25 -0
  48. package/dist/actors/Shop.d.ts.map +1 -0
  49. package/dist/actors/Shop.js +33 -0
  50. package/dist/actors/Shop.js.map +1 -0
  51. package/dist/actors/SkillPoints.d.ts +45 -0
  52. package/dist/actors/SkillPoints.d.ts.map +1 -0
  53. package/dist/actors/SkillPoints.js +58 -0
  54. package/dist/actors/SkillPoints.js.map +1 -0
  55. package/dist/actors/StatBlock.d.ts +52 -0
  56. package/dist/actors/StatBlock.d.ts.map +1 -0
  57. package/dist/actors/StatBlock.js +80 -0
  58. package/dist/actors/StatBlock.js.map +1 -0
  59. package/dist/actors/StatusEffect.d.ts +38 -0
  60. package/dist/actors/StatusEffect.d.ts.map +1 -0
  61. package/dist/actors/StatusEffect.js +28 -0
  62. package/dist/actors/StatusEffect.js.map +1 -0
  63. package/dist/actors/craft.d.ts +26 -0
  64. package/dist/actors/craft.d.ts.map +1 -0
  65. package/dist/actors/craft.js +34 -0
  66. package/dist/actors/craft.js.map +1 -0
  67. package/dist/actors/index.d.ts +33 -0
  68. package/dist/actors/index.d.ts.map +1 -0
  69. package/dist/actors/index.js +18 -0
  70. package/dist/actors/index.js.map +1 -0
  71. package/dist/actors/skillCheck.d.ts +13 -0
  72. package/dist/actors/skillCheck.d.ts.map +1 -0
  73. package/dist/actors/skillCheck.js +16 -0
  74. package/dist/actors/skillCheck.js.map +1 -0
  75. package/dist/assets/index.d.ts +37 -0
  76. package/dist/assets/index.d.ts.map +1 -0
  77. package/dist/assets/index.js +62 -0
  78. package/dist/assets/index.js.map +1 -0
  79. package/dist/audio/Music.d.ts +22 -0
  80. package/dist/audio/Music.d.ts.map +1 -0
  81. package/dist/audio/Music.js +67 -0
  82. package/dist/audio/Music.js.map +1 -0
  83. package/dist/audio/Playable.d.ts +16 -0
  84. package/dist/audio/Playable.d.ts.map +1 -0
  85. package/dist/audio/Playable.js +6 -0
  86. package/dist/audio/Playable.js.map +1 -0
  87. package/dist/audio/Sound.d.ts +23 -0
  88. package/dist/audio/Sound.d.ts.map +1 -0
  89. package/dist/audio/Sound.js +30 -0
  90. package/dist/audio/Sound.js.map +1 -0
  91. package/dist/audio/index.d.ts +7 -0
  92. package/dist/audio/index.d.ts.map +1 -0
  93. package/dist/audio/index.js +4 -0
  94. package/dist/audio/index.js.map +1 -0
  95. package/dist/battle/BattleAI.d.ts +24 -0
  96. package/dist/battle/BattleAI.d.ts.map +1 -0
  97. package/dist/battle/BattleAI.js +47 -0
  98. package/dist/battle/BattleAI.js.map +1 -0
  99. package/dist/battle/Evolution.d.ts +22 -0
  100. package/dist/battle/Evolution.d.ts.map +1 -0
  101. package/dist/battle/Evolution.js +25 -0
  102. package/dist/battle/Evolution.js.map +1 -0
  103. package/dist/battle/Field.d.ts +25 -0
  104. package/dist/battle/Field.d.ts.map +1 -0
  105. package/dist/battle/Field.js +31 -0
  106. package/dist/battle/Field.js.map +1 -0
  107. package/dist/battle/Hooks.d.ts +29 -0
  108. package/dist/battle/Hooks.d.ts.map +1 -0
  109. package/dist/battle/Hooks.js +20 -0
  110. package/dist/battle/Hooks.js.map +1 -0
  111. package/dist/battle/Move.d.ts +32 -0
  112. package/dist/battle/Move.d.ts.map +1 -0
  113. package/dist/battle/Move.js +10 -0
  114. package/dist/battle/Move.js.map +1 -0
  115. package/dist/battle/Party.d.ts +21 -0
  116. package/dist/battle/Party.d.ts.map +1 -0
  117. package/dist/battle/Party.js +49 -0
  118. package/dist/battle/Party.js.map +1 -0
  119. package/dist/battle/Species.d.ts +40 -0
  120. package/dist/battle/Species.d.ts.map +1 -0
  121. package/dist/battle/Species.js +31 -0
  122. package/dist/battle/Species.js.map +1 -0
  123. package/dist/battle/StatStages.d.ts +38 -0
  124. package/dist/battle/StatStages.d.ts.map +1 -0
  125. package/dist/battle/StatStages.js +50 -0
  126. package/dist/battle/StatStages.js.map +1 -0
  127. package/dist/battle/TypeMatrix.d.ts +14 -0
  128. package/dist/battle/TypeMatrix.d.ts.map +1 -0
  129. package/dist/battle/TypeMatrix.js +24 -0
  130. package/dist/battle/TypeMatrix.js.map +1 -0
  131. package/dist/battle/index.d.ts +16 -0
  132. package/dist/battle/index.d.ts.map +1 -0
  133. package/dist/battle/index.js +10 -0
  134. package/dist/battle/index.js.map +1 -0
  135. package/dist/board/Classics.d.ts +123 -0
  136. package/dist/board/Classics.d.ts.map +1 -0
  137. package/dist/board/Classics.js +260 -0
  138. package/dist/board/Classics.js.map +1 -0
  139. package/dist/board/Engine.d.ts +23 -0
  140. package/dist/board/Engine.d.ts.map +1 -0
  141. package/dist/board/Engine.js +87 -0
  142. package/dist/board/Engine.js.map +1 -0
  143. package/dist/board/Tactics.d.ts +46 -0
  144. package/dist/board/Tactics.d.ts.map +1 -0
  145. package/dist/board/Tactics.js +108 -0
  146. package/dist/board/Tactics.js.map +1 -0
  147. package/dist/board/chess.d.ts +67 -0
  148. package/dist/board/chess.d.ts.map +1 -0
  149. package/dist/board/chess.js +439 -0
  150. package/dist/board/chess.js.map +1 -0
  151. package/dist/board/index.d.ts +9 -0
  152. package/dist/board/index.d.ts.map +1 -0
  153. package/dist/board/index.js +5 -0
  154. package/dist/board/index.js.map +1 -0
  155. package/dist/core/Achievements.d.ts +53 -0
  156. package/dist/core/Achievements.d.ts.map +1 -0
  157. package/dist/core/Achievements.js +80 -0
  158. package/dist/core/Achievements.js.map +1 -0
  159. package/dist/core/Collection.d.ts +46 -0
  160. package/dist/core/Collection.d.ts.map +1 -0
  161. package/dist/core/Collection.js +61 -0
  162. package/dist/core/Collection.js.map +1 -0
  163. package/dist/core/Game.d.ts +115 -0
  164. package/dist/core/Game.d.ts.map +1 -0
  165. package/dist/core/Game.js +236 -0
  166. package/dist/core/Game.js.map +1 -0
  167. package/dist/core/Hex.d.ts +45 -0
  168. package/dist/core/Hex.d.ts.map +1 -0
  169. package/dist/core/Hex.js +120 -0
  170. package/dist/core/Hex.js.map +1 -0
  171. package/dist/core/Input.d.ts +41 -0
  172. package/dist/core/Input.d.ts.map +1 -0
  173. package/dist/core/Input.js +132 -0
  174. package/dist/core/Input.js.map +1 -0
  175. package/dist/core/Log.d.ts +39 -0
  176. package/dist/core/Log.d.ts.map +1 -0
  177. package/dist/core/Log.js +50 -0
  178. package/dist/core/Log.js.map +1 -0
  179. package/dist/core/Random.d.ts +64 -0
  180. package/dist/core/Random.d.ts.map +1 -0
  181. package/dist/core/Random.js +178 -0
  182. package/dist/core/Random.js.map +1 -0
  183. package/dist/core/Replay.d.ts +71 -0
  184. package/dist/core/Replay.d.ts.map +1 -0
  185. package/dist/core/Replay.js +102 -0
  186. package/dist/core/Replay.js.map +1 -0
  187. package/dist/core/Save.d.ts +52 -0
  188. package/dist/core/Save.d.ts.map +1 -0
  189. package/dist/core/Save.js +81 -0
  190. package/dist/core/Save.js.map +1 -0
  191. package/dist/core/Scene.d.ts +40 -0
  192. package/dist/core/Scene.d.ts.map +1 -0
  193. package/dist/core/Scene.js +56 -0
  194. package/dist/core/Scene.js.map +1 -0
  195. package/dist/core/SceneStack.d.ts +37 -0
  196. package/dist/core/SceneStack.d.ts.map +1 -0
  197. package/dist/core/SceneStack.js +67 -0
  198. package/dist/core/SceneStack.js.map +1 -0
  199. package/dist/core/Signal.d.ts +24 -0
  200. package/dist/core/Signal.d.ts.map +1 -0
  201. package/dist/core/Signal.js +41 -0
  202. package/dist/core/Signal.js.map +1 -0
  203. package/dist/core/index.d.ts +23 -0
  204. package/dist/core/index.d.ts.map +1 -0
  205. package/dist/core/index.js +14 -0
  206. package/dist/core/index.js.map +1 -0
  207. package/dist/i18n/index.d.ts +51 -0
  208. package/dist/i18n/index.d.ts.map +1 -0
  209. package/dist/i18n/index.js +74 -0
  210. package/dist/i18n/index.js.map +1 -0
  211. package/dist/index.d.ts +22 -0
  212. package/dist/index.d.ts.map +1 -0
  213. package/dist/index.js +22 -0
  214. package/dist/index.js.map +1 -0
  215. package/dist/mw_games.global.js +993 -0
  216. package/dist/render/ActorAnimator.d.ts +60 -0
  217. package/dist/render/ActorAnimator.d.ts.map +1 -0
  218. package/dist/render/ActorAnimator.js +76 -0
  219. package/dist/render/ActorAnimator.js.map +1 -0
  220. package/dist/render/AnimatedSprite.d.ts +57 -0
  221. package/dist/render/AnimatedSprite.d.ts.map +1 -0
  222. package/dist/render/AnimatedSprite.js +105 -0
  223. package/dist/render/AnimatedSprite.js.map +1 -0
  224. package/dist/render/Autotile.d.ts +42 -0
  225. package/dist/render/Autotile.d.ts.map +1 -0
  226. package/dist/render/Autotile.js +117 -0
  227. package/dist/render/Autotile.js.map +1 -0
  228. package/dist/render/Camera.d.ts +88 -0
  229. package/dist/render/Camera.d.ts.map +1 -0
  230. package/dist/render/Camera.js +145 -0
  231. package/dist/render/Camera.js.map +1 -0
  232. package/dist/render/ColorTransformBatcher.d.ts +57 -0
  233. package/dist/render/ColorTransformBatcher.d.ts.map +1 -0
  234. package/dist/render/ColorTransformBatcher.js +212 -0
  235. package/dist/render/ColorTransformBatcher.js.map +1 -0
  236. package/dist/render/LayeredSprite.d.ts +27 -0
  237. package/dist/render/LayeredSprite.d.ts.map +1 -0
  238. package/dist/render/LayeredSprite.js +53 -0
  239. package/dist/render/LayeredSprite.js.map +1 -0
  240. package/dist/render/Projectile.d.ts +37 -0
  241. package/dist/render/Projectile.d.ts.map +1 -0
  242. package/dist/render/Projectile.js +50 -0
  243. package/dist/render/Projectile.js.map +1 -0
  244. package/dist/render/SpriteSheet.d.ts +38 -0
  245. package/dist/render/SpriteSheet.d.ts.map +1 -0
  246. package/dist/render/SpriteSheet.js +79 -0
  247. package/dist/render/SpriteSheet.js.map +1 -0
  248. package/dist/render/TileMap.d.ts +188 -0
  249. package/dist/render/TileMap.d.ts.map +1 -0
  250. package/dist/render/TileMap.js +488 -0
  251. package/dist/render/TileMap.js.map +1 -0
  252. package/dist/render/TintedSprite.d.ts +47 -0
  253. package/dist/render/TintedSprite.d.ts.map +1 -0
  254. package/dist/render/TintedSprite.js +173 -0
  255. package/dist/render/TintedSprite.js.map +1 -0
  256. package/dist/render/index.d.ts +18 -0
  257. package/dist/render/index.d.ts.map +1 -0
  258. package/dist/render/index.js +11 -0
  259. package/dist/render/index.js.map +1 -0
  260. package/dist/roguelike/Blob.d.ts +46 -0
  261. package/dist/roguelike/Blob.d.ts.map +1 -0
  262. package/dist/roguelike/Blob.js +98 -0
  263. package/dist/roguelike/Blob.js.map +1 -0
  264. package/dist/roguelike/Boss.d.ts +67 -0
  265. package/dist/roguelike/Boss.d.ts.map +1 -0
  266. package/dist/roguelike/Boss.js +114 -0
  267. package/dist/roguelike/Boss.js.map +1 -0
  268. package/dist/roguelike/Combat.d.ts +23 -0
  269. package/dist/roguelike/Combat.d.ts.map +1 -0
  270. package/dist/roguelike/Combat.js +27 -0
  271. package/dist/roguelike/Combat.js.map +1 -0
  272. package/dist/roguelike/Doors.d.ts +60 -0
  273. package/dist/roguelike/Doors.d.ts.map +1 -0
  274. package/dist/roguelike/Doors.js +102 -0
  275. package/dist/roguelike/Doors.js.map +1 -0
  276. package/dist/roguelike/Elevation.d.ts +26 -0
  277. package/dist/roguelike/Elevation.d.ts.map +1 -0
  278. package/dist/roguelike/Elevation.js +37 -0
  279. package/dist/roguelike/Elevation.js.map +1 -0
  280. package/dist/roguelike/FieldOfView.d.ts +72 -0
  281. package/dist/roguelike/FieldOfView.d.ts.map +1 -0
  282. package/dist/roguelike/FieldOfView.js +134 -0
  283. package/dist/roguelike/FieldOfView.js.map +1 -0
  284. package/dist/roguelike/Level.d.ts +96 -0
  285. package/dist/roguelike/Level.d.ts.map +1 -0
  286. package/dist/roguelike/Level.js +137 -0
  287. package/dist/roguelike/Level.js.map +1 -0
  288. package/dist/roguelike/MonsterAI.d.ts +40 -0
  289. package/dist/roguelike/MonsterAI.d.ts.map +1 -0
  290. package/dist/roguelike/MonsterAI.js +69 -0
  291. package/dist/roguelike/MonsterAI.js.map +1 -0
  292. package/dist/roguelike/Pathfinder.d.ts +82 -0
  293. package/dist/roguelike/Pathfinder.d.ts.map +1 -0
  294. package/dist/roguelike/Pathfinder.js +192 -0
  295. package/dist/roguelike/Pathfinder.js.map +1 -0
  296. package/dist/roguelike/Scheduler.d.ts +45 -0
  297. package/dist/roguelike/Scheduler.d.ts.map +1 -0
  298. package/dist/roguelike/Scheduler.js +82 -0
  299. package/dist/roguelike/Scheduler.js.map +1 -0
  300. package/dist/roguelike/Secrets.d.ts +44 -0
  301. package/dist/roguelike/Secrets.d.ts.map +1 -0
  302. package/dist/roguelike/Secrets.js +64 -0
  303. package/dist/roguelike/Secrets.js.map +1 -0
  304. package/dist/roguelike/Targeting.d.ts +66 -0
  305. package/dist/roguelike/Targeting.d.ts.map +1 -0
  306. package/dist/roguelike/Targeting.js +150 -0
  307. package/dist/roguelike/Targeting.js.map +1 -0
  308. package/dist/roguelike/generate.d.ts +44 -0
  309. package/dist/roguelike/generate.d.ts.map +1 -0
  310. package/dist/roguelike/generate.js +88 -0
  311. package/dist/roguelike/generate.js.map +1 -0
  312. package/dist/roguelike/index.d.ts +23 -0
  313. package/dist/roguelike/index.d.ts.map +1 -0
  314. package/dist/roguelike/index.js +15 -0
  315. package/dist/roguelike/index.js.map +1 -0
  316. package/dist/rpg/Event.d.ts +33 -0
  317. package/dist/rpg/Event.d.ts.map +1 -0
  318. package/dist/rpg/Event.js +19 -0
  319. package/dist/rpg/Event.js.map +1 -0
  320. package/dist/rpg/EventRunner.d.ts +72 -0
  321. package/dist/rpg/EventRunner.d.ts.map +1 -0
  322. package/dist/rpg/EventRunner.js +76 -0
  323. package/dist/rpg/EventRunner.js.map +1 -0
  324. package/dist/rpg/GameState.d.ts +22 -0
  325. package/dist/rpg/GameState.d.ts.map +1 -0
  326. package/dist/rpg/GameState.js +35 -0
  327. package/dist/rpg/GameState.js.map +1 -0
  328. package/dist/rpg/GridMover.d.ts +51 -0
  329. package/dist/rpg/GridMover.d.ts.map +1 -0
  330. package/dist/rpg/GridMover.js +91 -0
  331. package/dist/rpg/GridMover.js.map +1 -0
  332. package/dist/rpg/Quest.d.ts +67 -0
  333. package/dist/rpg/Quest.d.ts.map +1 -0
  334. package/dist/rpg/Quest.js +92 -0
  335. package/dist/rpg/Quest.js.map +1 -0
  336. package/dist/rpg/TiledMap.d.ts +107 -0
  337. package/dist/rpg/TiledMap.d.ts.map +1 -0
  338. package/dist/rpg/TiledMap.js +123 -0
  339. package/dist/rpg/TiledMap.js.map +1 -0
  340. package/dist/rpg/automap.d.ts +40 -0
  341. package/dist/rpg/automap.d.ts.map +1 -0
  342. package/dist/rpg/automap.js +81 -0
  343. package/dist/rpg/automap.js.map +1 -0
  344. package/dist/rpg/index.d.ts +14 -0
  345. package/dist/rpg/index.d.ts.map +1 -0
  346. package/dist/rpg/index.js +8 -0
  347. package/dist/rpg/index.js.map +1 -0
  348. package/dist/stage/DialogueStage.d.ts +75 -0
  349. package/dist/stage/DialogueStage.d.ts.map +1 -0
  350. package/dist/stage/DialogueStage.js +207 -0
  351. package/dist/stage/DialogueStage.js.map +1 -0
  352. package/dist/stage/index.d.ts +7 -0
  353. package/dist/stage/index.d.ts.map +1 -0
  354. package/dist/stage/index.js +4 -0
  355. package/dist/stage/index.js.map +1 -0
  356. package/dist/stage/script.d.ts +111 -0
  357. package/dist/stage/script.d.ts.map +1 -0
  358. package/dist/stage/script.js +133 -0
  359. package/dist/stage/script.js.map +1 -0
  360. package/dist/stage/twee.d.ts +42 -0
  361. package/dist/stage/twee.d.ts.map +1 -0
  362. package/dist/stage/twee.js +169 -0
  363. package/dist/stage/twee.js.map +1 -0
  364. package/dist/ui/IconGrid.d.ts +110 -0
  365. package/dist/ui/IconGrid.d.ts.map +1 -0
  366. package/dist/ui/IconGrid.js +284 -0
  367. package/dist/ui/IconGrid.js.map +1 -0
  368. package/dist/ui/Label.d.ts +26 -0
  369. package/dist/ui/Label.d.ts.map +1 -0
  370. package/dist/ui/Label.js +41 -0
  371. package/dist/ui/Label.js.map +1 -0
  372. package/dist/ui/ListView.d.ts +67 -0
  373. package/dist/ui/ListView.d.ts.map +1 -0
  374. package/dist/ui/ListView.js +167 -0
  375. package/dist/ui/ListView.js.map +1 -0
  376. package/dist/ui/MessageBox.d.ts +66 -0
  377. package/dist/ui/MessageBox.d.ts.map +1 -0
  378. package/dist/ui/MessageBox.js +161 -0
  379. package/dist/ui/MessageBox.js.map +1 -0
  380. package/dist/ui/NinePatch.d.ts +34 -0
  381. package/dist/ui/NinePatch.d.ts.map +1 -0
  382. package/dist/ui/NinePatch.js +45 -0
  383. package/dist/ui/NinePatch.js.map +1 -0
  384. package/dist/ui/VerticalLabel.d.ts +46 -0
  385. package/dist/ui/VerticalLabel.d.ts.map +1 -0
  386. package/dist/ui/VerticalLabel.js +81 -0
  387. package/dist/ui/VerticalLabel.js.map +1 -0
  388. package/dist/ui/Window.d.ts +71 -0
  389. package/dist/ui/Window.d.ts.map +1 -0
  390. package/dist/ui/Window.js +126 -0
  391. package/dist/ui/Window.js.map +1 -0
  392. package/dist/ui/WindowStack.d.ts +40 -0
  393. package/dist/ui/WindowStack.d.ts.map +1 -0
  394. package/dist/ui/WindowStack.js +106 -0
  395. package/dist/ui/WindowStack.js.map +1 -0
  396. package/dist/ui/index.d.ts +18 -0
  397. package/dist/ui/index.d.ts.map +1 -0
  398. package/dist/ui/index.js +10 -0
  399. package/dist/ui/index.js.map +1 -0
  400. package/dist/ui/theme.d.ts +50 -0
  401. package/dist/ui/theme.d.ts.map +1 -0
  402. package/dist/ui/theme.js +36 -0
  403. package/dist/ui/theme.js.map +1 -0
  404. package/dist/world/Encounters.d.ts +20 -0
  405. package/dist/world/Encounters.d.ts.map +1 -0
  406. package/dist/world/Encounters.js +9 -0
  407. package/dist/world/Encounters.js.map +1 -0
  408. package/dist/world/Overworld.d.ts +25 -0
  409. package/dist/world/Overworld.d.ts.map +1 -0
  410. package/dist/world/Overworld.js +26 -0
  411. package/dist/world/Overworld.js.map +1 -0
  412. package/dist/world/TurnClock.d.ts +25 -0
  413. package/dist/world/TurnClock.d.ts.map +1 -0
  414. package/dist/world/TurnClock.js +33 -0
  415. package/dist/world/TurnClock.js.map +1 -0
  416. package/dist/world/World.d.ts +50 -0
  417. package/dist/world/World.d.ts.map +1 -0
  418. package/dist/world/World.js +77 -0
  419. package/dist/world/World.js.map +1 -0
  420. package/dist/world/index.d.ts +8 -0
  421. package/dist/world/index.d.ts.map +1 -0
  422. package/dist/world/index.js +5 -0
  423. package/dist/world/index.js.map +1 -0
  424. package/package.json +76 -0
  425. package/tools/compile-resources.mjs +129 -0
@@ -0,0 +1,37 @@
1
+ import { Texture } from 'pixi.js';
2
+ /**
3
+ * Where a game's assets come from.
4
+ *
5
+ * In a built game, `tools/compile-resources` has already turned every asset into a `data:`
6
+ * URI inside a script that runs before the game does. `resolve` then hands Pixi that URI
7
+ * instead of a path, which is what lets the page work from `file://` — see the tool for
8
+ * why plain files next to the page do not.
9
+ *
10
+ * During development there is no compiled bundle, so paths are used as they are and the
11
+ * dev server serves them. Game code says `load('tiles.png')` either way.
12
+ */
13
+ declare global {
14
+ interface Window {
15
+ __MWG_ASSETS__?: Record<string, string>;
16
+ }
17
+ }
18
+ /** points dev-mode lookups at the folder assets are served from */
19
+ export declare function setBase(path: string): void;
20
+ /** true when running against a compiled bundle rather than a dev server */
21
+ export declare function isCompiled(): boolean;
22
+ export declare function paths(): string[];
23
+ export declare function has(path: string): boolean;
24
+ /** an asset path resolved to something the browser can actually load */
25
+ export declare function resolve(path: string): string;
26
+ /**
27
+ * Loads assets by path, giving each one an alias equal to its path.
28
+ *
29
+ * Load everything a scene needs before creating it; afterwards `texture()` is synchronous,
30
+ * so game code never has to await in the middle of building a scene.
31
+ */
32
+ export declare function load(paths: string[]): Promise<void>;
33
+ /** a loaded texture, by the same path it was loaded with */
34
+ export declare function texture(path: string): Texture;
35
+ /** a loaded asset of any other kind, such as parsed JSON */
36
+ export declare function get<T>(path: string): T;
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/assets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,OAAO,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;;;;;;GAUG;AAEH,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACxC;CACD;AAKD,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAMD,2EAA2E;AAC3E,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,wBAAgB,KAAK,IAAI,MAAM,EAAE,CAEhC;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGzC;AAED,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAW5C;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzD;AAED,4DAA4D;AAC5D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK7C;AAED,4DAA4D;AAC5D,wBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAKtC"}
@@ -0,0 +1,62 @@
1
+ import { Assets, Texture } from 'pixi.js';
2
+ /** the base for dev-mode paths, when assets are served rather than compiled in */
3
+ let base = '';
4
+ /** points dev-mode lookups at the folder assets are served from */
5
+ export function setBase(path) {
6
+ base = path.endsWith('/') || path === '' ? path : path + '/';
7
+ }
8
+ function compiled() {
9
+ return typeof window === 'undefined' ? undefined : window.__MWG_ASSETS__;
10
+ }
11
+ /** true when running against a compiled bundle rather than a dev server */
12
+ export function isCompiled() {
13
+ return compiled() !== undefined;
14
+ }
15
+ export function paths() {
16
+ return Object.keys(compiled() ?? {});
17
+ }
18
+ export function has(path) {
19
+ const map = compiled();
20
+ return map ? path in map : true;
21
+ }
22
+ /** an asset path resolved to something the browser can actually load */
23
+ export function resolve(path) {
24
+ const map = compiled();
25
+ if (!map)
26
+ return base + path;
27
+ const found = map[path];
28
+ if (found === undefined) {
29
+ throw new Error(`asset "${path}" is not in this build - check it is under the folder passed to compile-resources`);
30
+ }
31
+ return found;
32
+ }
33
+ /**
34
+ * Loads assets by path, giving each one an alias equal to its path.
35
+ *
36
+ * Load everything a scene needs before creating it; afterwards `texture()` is synchronous,
37
+ * so game code never has to await in the middle of building a scene.
38
+ */
39
+ export async function load(paths) {
40
+ const pending = paths.filter((path) => !Assets.cache.has(path));
41
+ if (pending.length === 0)
42
+ return;
43
+ for (const path of pending) {
44
+ Assets.add({ alias: path, src: resolve(path) });
45
+ }
46
+ await Assets.load(pending);
47
+ }
48
+ /** a loaded texture, by the same path it was loaded with */
49
+ export function texture(path) {
50
+ if (!Assets.cache.has(path)) {
51
+ throw new Error(`texture "${path}" has not been loaded - pass it to load() first`);
52
+ }
53
+ return Assets.get(path);
54
+ }
55
+ /** a loaded asset of any other kind, such as parsed JSON */
56
+ export function get(path) {
57
+ if (!Assets.cache.has(path)) {
58
+ throw new Error(`asset "${path}" has not been loaded - pass it to load() first`);
59
+ }
60
+ return Assets.get(path);
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAoB1C,kFAAkF;AAClF,IAAI,IAAI,GAAG,EAAE,CAAC;AAEd,mEAAmE;AACnE,MAAM,UAAU,OAAO,CAAC,IAAY;IACnC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;AAC9D,CAAC;AAED,SAAS,QAAQ;IAChB,OAAO,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;AAC1E,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,UAAU;IACzB,OAAO,QAAQ,EAAE,KAAK,SAAS,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,KAAK;IACpB,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,OAAO,CAAC,IAAY;IACnC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,GAAG,IAAI,CAAC;IAE7B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACd,UAAU,IAAI,mFAAmF,CACjG,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,KAAe;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,OAAO,CAAC,IAAY;IACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,iDAAiD,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAU,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,GAAG,CAAI,IAAY;IAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,iDAAiD,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAI,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type Playable } from './Playable.ts';
2
+ export interface MusicOptions {
3
+ volume?: number;
4
+ create?: (path: string) => Playable;
5
+ }
6
+ /**
7
+ * Background music with crossfade: switching tracks fades the old one out and the new one
8
+ * in over the same span, rather than cutting straight from one to the other. Like
9
+ * `AnimatedSprite`, nothing advances on its own - call `update(dt)` from the scene.
10
+ */
11
+ export declare class Music {
12
+ private current;
13
+ private fades;
14
+ private create;
15
+ volume: number;
16
+ constructor(options?: MusicOptions);
17
+ /** @param fadeDuration seconds; 0 switches immediately with no crossfade */
18
+ play(path: string, fadeDuration?: number): void;
19
+ stop(fadeDuration?: number): void;
20
+ update(dt: number): void;
21
+ }
22
+ //# sourceMappingURL=Music.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Music.d.ts","sourceRoot":"","sources":["../../src/audio/Music.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAW3D,MAAM,WAAW,YAAY;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC;CACpC;AAED;;;;GAIG;AACH,qBAAa,KAAK;IACjB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAA6B;IAC3C,MAAM,EAAE,MAAM,CAAC;IAEf,YAAY,OAAO,GAAE,YAAiB,EAGrC;IAED,4EAA4E;IAC5E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,SAAI,GAAG,IAAI,CA4BzC;IAED,IAAI,CAAC,YAAY,SAAI,GAAG,IAAI,CAU3B;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAevB;CACD"}
@@ -0,0 +1,67 @@
1
+ import { createAudio } from './Playable.js';
2
+ /**
3
+ * Background music with crossfade: switching tracks fades the old one out and the new one
4
+ * in over the same span, rather than cutting straight from one to the other. Like
5
+ * `AnimatedSprite`, nothing advances on its own - call `update(dt)` from the scene.
6
+ */
7
+ export class Music {
8
+ constructor(options = {}) {
9
+ this.current = null;
10
+ this.fades = [];
11
+ this.volume = options.volume ?? 1;
12
+ this.create = options.create ?? createAudio;
13
+ }
14
+ /** @param fadeDuration seconds; 0 switches immediately with no crossfade */
15
+ play(path, fadeDuration = 1) {
16
+ const incoming = this.create(path);
17
+ incoming.loop = true;
18
+ const previous = this.current;
19
+ this.current = incoming;
20
+ if (fadeDuration <= 0) {
21
+ incoming.volume = this.volume;
22
+ void incoming.play();
23
+ previous?.pause();
24
+ return;
25
+ }
26
+ incoming.volume = 0;
27
+ void incoming.play();
28
+ this.fades.push({ audio: incoming, elapsed: 0, duration: fadeDuration, from: 0, to: this.volume, stopAtEnd: false });
29
+ if (previous) {
30
+ this.fades.push({
31
+ audio: previous,
32
+ elapsed: 0,
33
+ duration: fadeDuration,
34
+ from: previous.volume,
35
+ to: 0,
36
+ stopAtEnd: true,
37
+ });
38
+ }
39
+ }
40
+ stop(fadeDuration = 1) {
41
+ const audio = this.current;
42
+ if (!audio)
43
+ return;
44
+ this.current = null;
45
+ if (fadeDuration <= 0) {
46
+ audio.pause();
47
+ return;
48
+ }
49
+ this.fades.push({ audio, elapsed: 0, duration: fadeDuration, from: audio.volume, to: 0, stopAtEnd: true });
50
+ }
51
+ update(dt) {
52
+ //iterate a copy: a fade finishing may not touch the list, but this stays safe if one day it does
53
+ for (const fade of [...this.fades]) {
54
+ fade.elapsed += dt;
55
+ const t = Math.min(1, fade.elapsed / fade.duration);
56
+ fade.audio.volume = fade.from + (fade.to - fade.from) * t;
57
+ if (t >= 1) {
58
+ this.fades.splice(this.fades.indexOf(fade), 1);
59
+ if (fade.stopAtEnd) {
60
+ fade.audio.pause();
61
+ fade.audio.currentTime = 0;
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ //# sourceMappingURL=Music.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Music.js","sourceRoot":"","sources":["../../src/audio/Music.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,eAAe,CAAC;AAgB3D;;;;GAIG;AACH,MAAM,OAAO,KAAK;IAMjB,YAAY,OAAO,GAAiB,EAAE;QAL9B,YAAO,GAAoB,IAAI,CAAC;QAChC,UAAK,GAAW,EAAE,CAAC;QAK1B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC;IAC7C,CAAC;IAED,4EAA4E;IAC5E,IAAI,CAAC,IAAY,EAAE,YAAY,GAAG,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;QAErB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QAExB,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC9B,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrB,QAAQ,EAAE,KAAK,EAAE,CAAC;YAClB,OAAO;QACR,CAAC;QAED,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACpB,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAErH,IAAI,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,CAAC;gBACV,QAAQ,EAAE,YAAY;gBACtB,IAAI,EAAE,QAAQ,CAAC,MAAM;gBACrB,EAAE,EAAE,CAAC;gBACL,SAAS,EAAE,IAAI;aACf,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,IAAI,CAAC,YAAY,GAAG,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO;QACR,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5G,CAAC;IAED,MAAM,CAAC,EAAU;QAChB,iGAAiG;QACjG,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE1D,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACpB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBACnB,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The surface `mwg/audio` needs from a playing sound - exactly what `HTMLAudioElement`
3
+ * already provides, named here so a test (or a game with its own audio backend) can supply
4
+ * a fake without a real `Audio` element existing, which nothing outside a browser can
5
+ * create.
6
+ */
7
+ export interface Playable {
8
+ play(): void | Promise<void>;
9
+ pause(): void;
10
+ currentTime: number;
11
+ volume: number;
12
+ loop: boolean;
13
+ }
14
+ /** the real thing: an `HTMLAudioElement` pointed at a resolved asset path */
15
+ export declare function createAudio(path: string): Playable;
16
+ //# sourceMappingURL=Playable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Playable.d.ts","sourceRoot":"","sources":["../../src/audio/Playable.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACxB,IAAI,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,KAAK,IAAI,IAAI,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACd;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAElD"}
@@ -0,0 +1,6 @@
1
+ import * as Resources from '../assets/index.js';
2
+ /** the real thing: an `HTMLAudioElement` pointed at a resolved asset path */
3
+ export function createAudio(path) {
4
+ return new Audio(Resources.resolve(path));
5
+ }
6
+ //# sourceMappingURL=Playable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Playable.js","sourceRoot":"","sources":["../../src/audio/Playable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAC;AAgBhD,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type Playable } from './Playable.ts';
2
+ export interface SoundOptions {
3
+ /** overlapping instances before the oldest is reused; a footstep needs more than a shout */
4
+ poolSize?: number;
5
+ volume?: number;
6
+ /** creates one playable instance for the resolved path; defaults to a real `Audio` element */
7
+ create?: (path: string) => Playable;
8
+ }
9
+ /**
10
+ * A sound effect, pooled so the same clip can overlap itself. A dozen arrows landing in the
11
+ * same second must not cut each other off, which a single `<audio>` element would - the
12
+ * next play just steals the oldest of the pool, round-robin, rather than restarting the one
13
+ * already mid-sound.
14
+ */
15
+ export declare class Sound {
16
+ private pool;
17
+ private next;
18
+ volume: number;
19
+ constructor(path: string, options?: SoundOptions);
20
+ play(): void;
21
+ stopAll(): void;
22
+ }
23
+ //# sourceMappingURL=Sound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sound.d.ts","sourceRoot":"","sources":["../../src/audio/Sound.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC5B,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC;CACpC;AAED;;;;;GAKG;AACH,qBAAa,KAAK;IACjB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,IAAI,CAAK;IACjB,MAAM,EAAE,MAAM,CAAC;IAEf,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAKnD;IAED,IAAI,IAAI,IAAI,CAOX;IAED,OAAO,IAAI,IAAI,CAKd;CACD"}
@@ -0,0 +1,30 @@
1
+ import { createAudio } from './Playable.js';
2
+ /**
3
+ * A sound effect, pooled so the same clip can overlap itself. A dozen arrows landing in the
4
+ * same second must not cut each other off, which a single `<audio>` element would - the
5
+ * next play just steals the oldest of the pool, round-robin, rather than restarting the one
6
+ * already mid-sound.
7
+ */
8
+ export class Sound {
9
+ constructor(path, options = {}) {
10
+ this.next = 0;
11
+ const size = Math.max(1, options.poolSize ?? 4);
12
+ const create = options.create ?? createAudio;
13
+ this.volume = options.volume ?? 1;
14
+ this.pool = Array.from({ length: size }, () => create(path));
15
+ }
16
+ play() {
17
+ const audio = this.pool[this.next];
18
+ this.next = (this.next + 1) % this.pool.length;
19
+ audio.volume = this.volume;
20
+ audio.currentTime = 0;
21
+ void audio.play();
22
+ }
23
+ stopAll() {
24
+ for (const audio of this.pool) {
25
+ audio.pause();
26
+ audio.currentTime = 0;
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=Sound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sound.js","sourceRoot":"","sources":["../../src/audio/Sound.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,eAAe,CAAC;AAW3D;;;;;GAKG;AACH,MAAM,OAAO,KAAK;IAKjB,YAAY,IAAY,EAAE,OAAO,GAAiB,EAAE;QAH5C,SAAI,GAAG,CAAC,CAAC;QAIhB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAE/C,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;QACtB,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,OAAO;QACN,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,7 @@
1
+ export { Sound } from './Sound.ts';
2
+ export type { SoundOptions } from './Sound.ts';
3
+ export { Music } from './Music.ts';
4
+ export type { MusicOptions } from './Music.ts';
5
+ export { createAudio } from './Playable.ts';
6
+ export type { Playable } from './Playable.ts';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { Sound } from './Sound.js';
2
+ export { Music } from './Music.js';
3
+ export { createAudio } from './Playable.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { TypeMatrix } from './TypeMatrix.ts';
2
+ /**
3
+ * An opposing trainer's move and switch decisions, built on `TypeMatrix` - the one piece of
4
+ * genuinely shared knowledge any two battlers agree on - the same way `decideMonsterAI` is
5
+ * built on `FieldOfView`/`Pathfinder` rather than reimplementing sight or movement. Neither
6
+ * function judges anything beyond type matchups; a game's own damage formula, status
7
+ * conditions, and move priority are free to override the choice this suggests, the same way
8
+ * a game is free to ignore `decideMonsterAI`'s step and hand-roll a boss's own behaviour.
9
+ */
10
+ /** picks the move whose type is most effective against `opponentTypes`, ties keeping the
11
+ * first candidate; `null` for an empty list */
12
+ export declare function chooseMove<M extends {
13
+ type: string;
14
+ }>(moves: readonly M[], matrix: TypeMatrix, opponentTypes: readonly string[], score?: (move: M, opponentTypes: readonly string[]) => number): M | null;
15
+ /**
16
+ * Whether a bench member defends better against `opponentTypes` than whatever is active now.
17
+ *
18
+ * @returns the index into `bench` of the best defensive improvement, or `null` when nothing
19
+ * on the bench is a clear upgrade over staying in
20
+ */
21
+ export declare function chooseSwitch(activeTypes: readonly string[], bench: readonly {
22
+ types: readonly string[];
23
+ }[], matrix: TypeMatrix, opponentTypes: readonly string[]): number | null;
24
+ //# sourceMappingURL=BattleAI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BattleAI.d.ts","sourceRoot":"","sources":["../../src/battle/BattleAI.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;;;;GAOG;AAEH;+CAC+C;AAC/C,wBAAgB,UAAU,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACpD,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,KAAK,GAAE,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,KAAK,MACf,GACrC,CAAC,GAAG,IAAI,CAeV;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC3B,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,KAAK,EAAE,SAAS;IAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAAE,EAC9C,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,SAAS,MAAM,EAAE,GAC9B,MAAM,GAAG,IAAI,CAaf"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * An opposing trainer's move and switch decisions, built on `TypeMatrix` - the one piece of
3
+ * genuinely shared knowledge any two battlers agree on - the same way `decideMonsterAI` is
4
+ * built on `FieldOfView`/`Pathfinder` rather than reimplementing sight or movement. Neither
5
+ * function judges anything beyond type matchups; a game's own damage formula, status
6
+ * conditions, and move priority are free to override the choice this suggests, the same way
7
+ * a game is free to ignore `decideMonsterAI`'s step and hand-roll a boss's own behaviour.
8
+ */
9
+ /** picks the move whose type is most effective against `opponentTypes`, ties keeping the
10
+ * first candidate; `null` for an empty list */
11
+ export function chooseMove(moves, matrix, opponentTypes, score = (move, types) => matrix.multiplierFor(move.type, types)) {
12
+ if (moves.length === 0)
13
+ return null;
14
+ let best = moves[0];
15
+ let bestScore = score(best, opponentTypes);
16
+ for (const move of moves.slice(1)) {
17
+ const candidateScore = score(move, opponentTypes);
18
+ if (candidateScore > bestScore) {
19
+ bestScore = candidateScore;
20
+ best = move;
21
+ }
22
+ }
23
+ return best;
24
+ }
25
+ /**
26
+ * Whether a bench member defends better against `opponentTypes` than whatever is active now.
27
+ *
28
+ * @returns the index into `bench` of the best defensive improvement, or `null` when nothing
29
+ * on the bench is a clear upgrade over staying in
30
+ */
31
+ export function chooseSwitch(activeTypes, bench, matrix, opponentTypes) {
32
+ let bestIndex = null;
33
+ let bestThreat = worstIncoming(activeTypes, matrix, opponentTypes);
34
+ bench.forEach((candidate, index) => {
35
+ const threat = worstIncoming(candidate.types, matrix, opponentTypes);
36
+ if (threat < bestThreat) {
37
+ bestThreat = threat;
38
+ bestIndex = index;
39
+ }
40
+ });
41
+ return bestIndex;
42
+ }
43
+ /** the most damaging multiplier any of `attackingTypes` lands against `defendingTypes` */
44
+ function worstIncoming(defendingTypes, matrix, attackingTypes) {
45
+ return Math.max(...attackingTypes.map((type) => matrix.multiplierFor(type, defendingTypes)));
46
+ }
47
+ //# sourceMappingURL=BattleAI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BattleAI.js","sourceRoot":"","sources":["../../src/battle/BattleAI.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH;+CAC+C;AAC/C,MAAM,UAAU,UAAU,CACzB,KAAmB,EACnB,MAAkB,EAClB,aAAgC,EAChC,KAAK,GAA0D,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC9E,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;IAEvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAClD,IAAI,cAAc,GAAG,SAAS,EAAE,CAAC;YAChC,SAAS,GAAG,cAAc,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC3B,WAA8B,EAC9B,KAA8C,EAC9C,MAAkB,EAClB,aAAgC;IAEhC,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,UAAU,GAAG,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAEnE,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QACrE,IAAI,MAAM,GAAG,UAAU,EAAE,CAAC;YACzB,UAAU,GAAG,MAAM,CAAC;YACpB,SAAS,GAAG,KAAK,CAAC;QACnB,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,0FAA0F;AAC1F,SAAS,aAAa,CAAC,cAAiC,EAAE,MAAkB,EAAE,cAAiC;IAC9G,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Capture, experience, levelling and evolution as replaceable rules.
3
+ *
4
+ * Experience and levelling are `mwg/actors`' `Progression`, unchanged - a creature is not a
5
+ * different shape from a character. Capture has no shape here at all: it is entirely a
6
+ * game's own formula (a ball's catch rate, a chance based on remaining HP, whatever), so
7
+ * `mwg` supplies nothing for it beyond not getting in the way. Evolution is the one piece
8
+ * worth a shared shape, since "check an ordered list of conditions" is the same problem
9
+ * `mwg/rpg`'s event pages already solve.
10
+ */
11
+ export interface EvolutionRule<S> {
12
+ at: (level: number) => boolean;
13
+ into: S;
14
+ }
15
+ /**
16
+ * The last rule whose condition holds at this level, or null when none does - the same
17
+ * "ordered low to high, most-specific-that-matches wins" convention `mwg/rpg`'s event pages
18
+ * use, so a chain authored `[16 -> adult, 32 -> elder]` reaches "elder" at level 40 rather
19
+ * than getting stuck on the first threshold it ever crossed.
20
+ */
21
+ export declare function checkEvolution<S>(rules: readonly EvolutionRule<S>[], level: number): S | null;
22
+ //# sourceMappingURL=Evolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Evolution.d.ts","sourceRoot":"","sources":["../../src/battle/Evolution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC/B,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC;CACR;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAM7F"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Capture, experience, levelling and evolution as replaceable rules.
3
+ *
4
+ * Experience and levelling are `mwg/actors`' `Progression`, unchanged - a creature is not a
5
+ * different shape from a character. Capture has no shape here at all: it is entirely a
6
+ * game's own formula (a ball's catch rate, a chance based on remaining HP, whatever), so
7
+ * `mwg` supplies nothing for it beyond not getting in the way. Evolution is the one piece
8
+ * worth a shared shape, since "check an ordered list of conditions" is the same problem
9
+ * `mwg/rpg`'s event pages already solve.
10
+ */
11
+ /**
12
+ * The last rule whose condition holds at this level, or null when none does - the same
13
+ * "ordered low to high, most-specific-that-matches wins" convention `mwg/rpg`'s event pages
14
+ * use, so a chain authored `[16 -> adult, 32 -> elder]` reaches "elder" at level 40 rather
15
+ * than getting stuck on the first threshold it ever crossed.
16
+ */
17
+ export function checkEvolution(rules, level) {
18
+ let match = null;
19
+ for (const rule of rules) {
20
+ if (rule.at(level))
21
+ match = rule.into;
22
+ }
23
+ return match;
24
+ }
25
+ //# sourceMappingURL=Evolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Evolution.js","sourceRoot":"","sources":["../../src/battle/Evolution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAI,KAAkC,EAAE,KAAa;IAClF,IAAI,KAAK,GAAa,IAAI,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Named conditions the battle itself carries - weather, terrain, a screen like Reflect -
3
+ * rather than any one creature's own `StatBlock`. Every modifier-shaped thing `mwg/actors`
4
+ * has (equipment, buffs, status effects) is scoped to one creature; this is the one place a
5
+ * condition can apply to everyone without a game copying it onto every combatant's own
6
+ * stat block by hand. Deliberately just a named, optionally-timed flag set - it does
7
+ * nothing on its own, the same way `mwg` supplies no move-damage formula: a game reads
8
+ * `field.has('rain')` itself wherever a formula needs to know.
9
+ */
10
+ export interface FieldCondition {
11
+ id: string;
12
+ /** rounds remaining; omit for indefinite, cleared only by an explicit `clear` */
13
+ duration?: number;
14
+ }
15
+ export declare class Field {
16
+ private conditions;
17
+ set(condition: FieldCondition): void;
18
+ has(id: string): boolean;
19
+ get(id: string): FieldCondition | undefined;
20
+ clear(id: string): void;
21
+ get active(): readonly FieldCondition[];
22
+ /** ticks every timed condition down by one round, clearing any that just ran out */
23
+ advance(): void;
24
+ }
25
+ //# sourceMappingURL=Field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/battle/Field.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,KAAK;IACjB,OAAO,CAAC,UAAU,CAAqC;IAEvD,GAAG,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAEnC;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvB;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE1C;IAED,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEtB;IAED,IAAI,MAAM,IAAI,SAAS,cAAc,EAAE,CAEtC;IAED,oFAAoF;IACpF,OAAO,IAAI,IAAI,CAOd;CACD"}
@@ -0,0 +1,31 @@
1
+ export class Field {
2
+ constructor() {
3
+ this.conditions = new Map();
4
+ }
5
+ set(condition) {
6
+ this.conditions.set(condition.id, { ...condition });
7
+ }
8
+ has(id) {
9
+ return this.conditions.has(id);
10
+ }
11
+ get(id) {
12
+ return this.conditions.get(id);
13
+ }
14
+ clear(id) {
15
+ this.conditions.delete(id);
16
+ }
17
+ get active() {
18
+ return [...this.conditions.values()];
19
+ }
20
+ /** ticks every timed condition down by one round, clearing any that just ran out */
21
+ advance() {
22
+ for (const [id, condition] of this.conditions) {
23
+ if (condition.duration === undefined)
24
+ continue;
25
+ condition.duration -= 1;
26
+ if (condition.duration <= 0)
27
+ this.conditions.delete(id);
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=Field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Field.js","sourceRoot":"","sources":["../../src/battle/Field.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,KAAK;IAAlB;QACS,eAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;IA+BxD,CAAC;IA7BA,GAAG,CAAC,SAAyB;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,GAAG,CAAC,EAAU;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,GAAG,CAAC,EAAU;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,EAAU;QACf,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,oFAAoF;IACpF,OAAO;QACN,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC/C,IAAI,SAAS,CAAC,QAAQ,KAAK,SAAS;gBAAE,SAAS;YAE/C,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC;YACxB,IAAI,SAAS,CAAC,QAAQ,IAAI,CAAC;gBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * A battle-scoped place for passive effects to run code, not just push a number - the seam
3
+ * `mwg/actors`' `StatBlock` modifiers and `applyStatusEffect` do not cover, since both are
4
+ * numeric-only. An ability reacting to "this creature switched in," a held item reacting to
5
+ * "this creature was hit," or a sleep/paralysis status answering "can this creature act this
6
+ * turn" are all the same shape: register a handler for a named event, and a game's battle
7
+ * loop calls it at the right moment.
8
+ *
9
+ * `mwg` names no events of its own beyond the strings a game passes - `'switchIn'`, `'hit'`,
10
+ * `'turnStart'`, whatever a game's battle loop actually fires. A "can this creature act"
11
+ * check is a plain convention on top of this, not special-cased: a handler mutates a shared
12
+ * `context` object (`{ skip: false }`, say) the same way any other side effect would, and
13
+ * the battle loop reads it back after `emit` returns.
14
+ */
15
+ export interface BattleHook<C> {
16
+ event: string;
17
+ handler: (creature: C, context?: unknown) => void;
18
+ /** whatever registered this hook - an ability, a held item - for bulk removal via `offSource` */
19
+ source?: unknown;
20
+ }
21
+ export declare class BattleHooks<C> {
22
+ private hooks;
23
+ on(event: string, handler: (creature: C, context?: unknown) => void, source?: unknown): void;
24
+ /** removes every hook registered with this `source` - a fainted creature's ability leaving */
25
+ offSource(source: unknown): void;
26
+ /** runs every handler registered for `event`, in registration order */
27
+ emit(event: string, creature: C, context?: unknown): void;
28
+ }
29
+ //# sourceMappingURL=Hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hooks.d.ts","sourceRoot":"","sources":["../../src/battle/Hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,iGAAiG;IACjG,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,KAAK,CAAuB;IAEpC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAE3F;IAED,8FAA8F;IAC9F,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAE/B;IAED,uEAAuE;IACvE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAIxD;CACD"}
@@ -0,0 +1,20 @@
1
+ export class BattleHooks {
2
+ constructor() {
3
+ this.hooks = [];
4
+ }
5
+ on(event, handler, source) {
6
+ this.hooks.push({ event, handler, source });
7
+ }
8
+ /** removes every hook registered with this `source` - a fainted creature's ability leaving */
9
+ offSource(source) {
10
+ this.hooks = this.hooks.filter((hook) => hook.source !== source);
11
+ }
12
+ /** runs every handler registered for `event`, in registration order */
13
+ emit(event, creature, context) {
14
+ for (const hook of this.hooks) {
15
+ if (hook.event === event)
16
+ hook.handler(creature, context);
17
+ }
18
+ }
19
+ }
20
+ //# sourceMappingURL=Hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hooks.js","sourceRoot":"","sources":["../../src/battle/Hooks.ts"],"names":[],"mappings":"AAqBA,MAAM,OAAO,WAAW;IAAxB;QACS,UAAK,GAAoB,EAAE,CAAC;IAiBrC,CAAC;IAfA,EAAE,CAAC,KAAa,EAAE,OAAiD,EAAE,MAAgB;QACpF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,8FAA8F;IAC9F,SAAS,CAAC,MAAe;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAClE,CAAC;IAED,uEAAuE;IACvE,IAAI,CAAC,KAAa,EAAE,QAAW,EAAE,OAAiB;QACjD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;gBAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * A move, as data: what it costs, what it targets, and its effects - whatever those are.
3
+ * `mwg` does not interpret `effects`; a game's own battle loop reads it and decides what
4
+ * happens, the same way `mwg/actors`' `Modifier` carries a stat and a number without the
5
+ * framework knowing what "poisoned" means.
6
+ */
7
+ export interface Move<TEffect = unknown> {
8
+ id: string;
9
+ type: string;
10
+ /** energy, PP, an action point cost - whatever the game's resource is */
11
+ cost?: number;
12
+ /** a game-defined target shape: 'self', 'single-enemy', 'all-allies', anything else */
13
+ target: string;
14
+ effects?: TEffect;
15
+ }
16
+ export interface BattleAction<C = unknown> {
17
+ actor: C;
18
+ speed: number;
19
+ /** higher acts first regardless of speed; ties fall back to speed */
20
+ priority?: number;
21
+ }
22
+ /**
23
+ * Turn order by speed, with move priority overriding it - one round's worth of ordering,
24
+ * not a persistent queue. `mwg/roguelike`'s `Scheduler` already covers continuous
25
+ * energy-cost time for a dungeon; a battle round picks everyone's action first and then
26
+ * needs only this, a single stable sort.
27
+ */
28
+ export declare function battleOrder<A extends {
29
+ speed: number;
30
+ priority?: number;
31
+ }>(actions: readonly A[]): A[];
32
+ //# sourceMappingURL=Move.d.ts.map