@datamoc/mw_games 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/README.md +73 -24
  2. package/dist/actors/Affix.d.ts +26 -0
  3. package/dist/actors/Affix.d.ts.map +1 -1
  4. package/dist/actors/Affix.js +32 -1
  5. package/dist/actors/Affix.js.map +1 -1
  6. package/dist/actors/Barrier.d.ts +47 -0
  7. package/dist/actors/Barrier.d.ts.map +1 -0
  8. package/dist/actors/Barrier.js +70 -0
  9. package/dist/actors/Barrier.js.map +1 -0
  10. package/dist/actors/Charges.d.ts +22 -0
  11. package/dist/actors/Charges.d.ts.map +1 -1
  12. package/dist/actors/Charges.js +26 -0
  13. package/dist/actors/Charges.js.map +1 -1
  14. package/dist/actors/Equipment.d.ts +30 -0
  15. package/dist/actors/Equipment.d.ts.map +1 -1
  16. package/dist/actors/Equipment.js +33 -1
  17. package/dist/actors/Equipment.js.map +1 -1
  18. package/dist/actors/Inventory.d.ts +58 -3
  19. package/dist/actors/Inventory.d.ts.map +1 -1
  20. package/dist/actors/Inventory.js +97 -5
  21. package/dist/actors/Inventory.js.map +1 -1
  22. package/dist/actors/ItemState.d.ts +11 -2
  23. package/dist/actors/ItemState.d.ts.map +1 -1
  24. package/dist/actors/ItemState.js +18 -2
  25. package/dist/actors/ItemState.js.map +1 -1
  26. package/dist/actors/Loot.js +1 -1
  27. package/dist/actors/Loot.js.map +1 -1
  28. package/dist/actors/Progression.d.ts +9 -0
  29. package/dist/actors/Progression.d.ts.map +1 -1
  30. package/dist/actors/Progression.js +7 -0
  31. package/dist/actors/Progression.js.map +1 -1
  32. package/dist/actors/Resource.d.ts +16 -0
  33. package/dist/actors/Resource.d.ts.map +1 -1
  34. package/dist/actors/Resource.js +22 -0
  35. package/dist/actors/Resource.js.map +1 -1
  36. package/dist/actors/SkillPoints.d.ts +14 -0
  37. package/dist/actors/SkillPoints.d.ts.map +1 -1
  38. package/dist/actors/SkillPoints.js +16 -0
  39. package/dist/actors/SkillPoints.js.map +1 -1
  40. package/dist/actors/StatBlock.d.ts +16 -0
  41. package/dist/actors/StatBlock.d.ts.map +1 -1
  42. package/dist/actors/StatBlock.js +21 -0
  43. package/dist/actors/StatBlock.js.map +1 -1
  44. package/dist/actors/Support.d.ts +2 -2
  45. package/dist/actors/Support.d.ts.map +1 -1
  46. package/dist/actors/Support.js +2 -2
  47. package/dist/actors/Support.js.map +1 -1
  48. package/dist/actors/index.d.ts +8 -5
  49. package/dist/actors/index.d.ts.map +1 -1
  50. package/dist/actors/index.js +3 -2
  51. package/dist/actors/index.js.map +1 -1
  52. package/dist/assets/ByteProgress.d.ts +27 -0
  53. package/dist/assets/ByteProgress.d.ts.map +1 -0
  54. package/dist/assets/ByteProgress.js +44 -0
  55. package/dist/assets/ByteProgress.js.map +1 -0
  56. package/dist/assets/Streaming.d.ts +10 -4
  57. package/dist/assets/Streaming.d.ts.map +1 -1
  58. package/dist/assets/Streaming.js +18 -7
  59. package/dist/assets/Streaming.js.map +1 -1
  60. package/dist/assets/index.d.ts +11 -44
  61. package/dist/assets/index.d.ts.map +1 -1
  62. package/dist/assets/index.js +9 -76
  63. package/dist/assets/index.js.map +1 -1
  64. package/dist/assets/loader.d.ts +34 -0
  65. package/dist/assets/loader.d.ts.map +1 -0
  66. package/dist/assets/loader.js +61 -0
  67. package/dist/assets/loader.js.map +1 -0
  68. package/dist/assets/paths.d.ts +40 -0
  69. package/dist/assets/paths.d.ts.map +1 -0
  70. package/dist/assets/paths.js +49 -0
  71. package/dist/assets/paths.js.map +1 -0
  72. package/dist/audio/Music.d.ts +10 -0
  73. package/dist/audio/Music.d.ts.map +1 -1
  74. package/dist/audio/Music.js +36 -1
  75. package/dist/audio/Music.js.map +1 -1
  76. package/dist/audio/Playable.d.ts +3 -0
  77. package/dist/audio/Playable.d.ts.map +1 -1
  78. package/dist/audio/Playable.js +1 -1
  79. package/dist/audio/Playable.js.map +1 -1
  80. package/dist/battle/Field.d.ts +2 -2
  81. package/dist/battle/Field.d.ts.map +1 -1
  82. package/dist/battle/Field.js +3 -3
  83. package/dist/battle/Field.js.map +1 -1
  84. package/dist/battle/Hooks.d.ts +7 -13
  85. package/dist/battle/Hooks.d.ts.map +1 -1
  86. package/dist/battle/Hooks.js +20 -18
  87. package/dist/battle/Hooks.js.map +1 -1
  88. package/dist/core/Feedback.d.ts +3 -9
  89. package/dist/core/Feedback.d.ts.map +1 -1
  90. package/dist/core/Feedback.js +6 -18
  91. package/dist/core/Feedback.js.map +1 -1
  92. package/dist/core/Hooks.d.ts +34 -0
  93. package/dist/core/Hooks.d.ts.map +1 -0
  94. package/dist/core/Hooks.js +33 -0
  95. package/dist/core/Hooks.js.map +1 -0
  96. package/dist/core/HttpTransport.d.ts +22 -0
  97. package/dist/core/HttpTransport.d.ts.map +1 -0
  98. package/dist/core/HttpTransport.js +33 -0
  99. package/dist/core/HttpTransport.js.map +1 -0
  100. package/dist/core/Input.d.ts +41 -0
  101. package/dist/core/Input.d.ts.map +1 -1
  102. package/dist/core/Input.js +126 -21
  103. package/dist/core/Input.js.map +1 -1
  104. package/dist/core/Multiplayer.d.ts +63 -0
  105. package/dist/core/Multiplayer.d.ts.map +1 -0
  106. package/dist/core/Multiplayer.js +73 -0
  107. package/dist/core/Multiplayer.js.map +1 -0
  108. package/dist/core/PlayerInput.d.ts +5 -0
  109. package/dist/core/PlayerInput.d.ts.map +1 -1
  110. package/dist/core/PlayerInput.js +11 -0
  111. package/dist/core/PlayerInput.js.map +1 -1
  112. package/dist/core/Random.d.ts +14 -5
  113. package/dist/core/Random.d.ts.map +1 -1
  114. package/dist/core/Random.js +14 -5
  115. package/dist/core/Random.js.map +1 -1
  116. package/dist/core/SaveSync.d.ts +17 -14
  117. package/dist/core/SaveSync.d.ts.map +1 -1
  118. package/dist/core/SaveSync.js +35 -31
  119. package/dist/core/SaveSync.js.map +1 -1
  120. package/dist/core/Scene.d.ts +16 -6
  121. package/dist/core/Scene.d.ts.map +1 -1
  122. package/dist/core/Scene.js +18 -6
  123. package/dist/core/Scene.js.map +1 -1
  124. package/dist/core/SceneStack.d.ts +8 -4
  125. package/dist/core/SceneStack.d.ts.map +1 -1
  126. package/dist/core/SceneStack.js +4 -0
  127. package/dist/core/SceneStack.js.map +1 -1
  128. package/dist/core/Stats.d.ts +33 -0
  129. package/dist/core/Stats.d.ts.map +1 -0
  130. package/dist/core/Stats.js +34 -0
  131. package/dist/core/Stats.js.map +1 -0
  132. package/dist/core/Telemetry.d.ts +34 -0
  133. package/dist/core/Telemetry.d.ts.map +1 -0
  134. package/dist/core/Telemetry.js +47 -0
  135. package/dist/core/Telemetry.js.map +1 -0
  136. package/dist/core/index.d.ts +9 -2
  137. package/dist/core/index.d.ts.map +1 -1
  138. package/dist/core/index.js +4 -1
  139. package/dist/core/index.js.map +1 -1
  140. package/dist/index.d.ts +5 -5
  141. package/dist/index.d.ts.map +1 -1
  142. package/dist/index.js +5 -5
  143. package/dist/index.js.map +1 -1
  144. package/dist/mw_games.global.js +88 -87
  145. package/dist/roguelike/Boss.d.ts +4 -4
  146. package/dist/roguelike/Boss.d.ts.map +1 -1
  147. package/dist/roguelike/Boss.js +6 -6
  148. package/dist/roguelike/Boss.js.map +1 -1
  149. package/dist/roguelike/Combat.d.ts +10 -11
  150. package/dist/roguelike/Combat.d.ts.map +1 -1
  151. package/dist/roguelike/Combat.js +9 -16
  152. package/dist/roguelike/Combat.js.map +1 -1
  153. package/dist/roguelike/ContentRoll.d.ts +43 -0
  154. package/dist/roguelike/ContentRoll.d.ts.map +1 -0
  155. package/dist/roguelike/ContentRoll.js +38 -0
  156. package/dist/roguelike/ContentRoll.js.map +1 -0
  157. package/dist/roguelike/DungeonParity.d.ts +42 -0
  158. package/dist/roguelike/DungeonParity.d.ts.map +1 -0
  159. package/dist/roguelike/DungeonParity.js +63 -0
  160. package/dist/roguelike/DungeonParity.js.map +1 -0
  161. package/dist/roguelike/Features.d.ts +42 -0
  162. package/dist/roguelike/Features.d.ts.map +1 -0
  163. package/dist/roguelike/Features.js +59 -0
  164. package/dist/roguelike/Features.js.map +1 -0
  165. package/dist/roguelike/MonsterAI.js +1 -1
  166. package/dist/roguelike/MonsterAI.js.map +1 -1
  167. package/dist/roguelike/MultiStageAbility.d.ts +43 -0
  168. package/dist/roguelike/MultiStageAbility.d.ts.map +1 -0
  169. package/dist/roguelike/MultiStageAbility.js +60 -0
  170. package/dist/roguelike/MultiStageAbility.js.map +1 -0
  171. package/dist/roguelike/RoomBuilders.d.ts +43 -0
  172. package/dist/roguelike/RoomBuilders.d.ts.map +1 -0
  173. package/dist/roguelike/RoomBuilders.js +40 -0
  174. package/dist/roguelike/RoomBuilders.js.map +1 -0
  175. package/dist/roguelike/Targeting.d.ts +22 -0
  176. package/dist/roguelike/Targeting.d.ts.map +1 -1
  177. package/dist/roguelike/Targeting.js +20 -0
  178. package/dist/roguelike/Targeting.js.map +1 -1
  179. package/dist/roguelike/TriggerTracker.d.ts +36 -0
  180. package/dist/roguelike/TriggerTracker.d.ts.map +1 -0
  181. package/dist/roguelike/TriggerTracker.js +49 -0
  182. package/dist/roguelike/TriggerTracker.js.map +1 -0
  183. package/dist/roguelike/generate.d.ts +49 -0
  184. package/dist/roguelike/generate.d.ts.map +1 -1
  185. package/dist/roguelike/generate.js +38 -10
  186. package/dist/roguelike/generate.js.map +1 -1
  187. package/dist/roguelike/index.d.ts +16 -4
  188. package/dist/roguelike/index.d.ts.map +1 -1
  189. package/dist/roguelike/index.js +8 -2
  190. package/dist/roguelike/index.js.map +1 -1
  191. package/dist/rpg/EventRunner.d.ts +30 -8
  192. package/dist/rpg/EventRunner.d.ts.map +1 -1
  193. package/dist/rpg/EventRunner.js +1 -13
  194. package/dist/rpg/EventRunner.js.map +1 -1
  195. package/dist/rpg/FreeMover.d.ts +2 -2
  196. package/dist/rpg/FreeMover.d.ts.map +1 -1
  197. package/dist/rpg/FreeMover.js +5 -5
  198. package/dist/rpg/FreeMover.js.map +1 -1
  199. package/dist/rpg/GridMover.d.ts +2 -2
  200. package/dist/rpg/GridMover.d.ts.map +1 -1
  201. package/dist/rpg/GridMover.js +5 -5
  202. package/dist/rpg/GridMover.js.map +1 -1
  203. package/dist/rpg/MovableSprite.d.ts +25 -0
  204. package/dist/rpg/MovableSprite.d.ts.map +1 -0
  205. package/dist/rpg/MovableSprite.js +2 -0
  206. package/dist/rpg/MovableSprite.js.map +1 -0
  207. package/dist/rpg/Quest.d.ts +6 -1
  208. package/dist/rpg/Quest.d.ts.map +1 -1
  209. package/dist/rpg/Quest.js +6 -1
  210. package/dist/rpg/Quest.js.map +1 -1
  211. package/dist/rpg/automap.d.ts +24 -2
  212. package/dist/rpg/automap.d.ts.map +1 -1
  213. package/dist/rpg/automap.js +9 -1
  214. package/dist/rpg/automap.js.map +1 -1
  215. package/dist/rpg/index.d.ts +4 -4
  216. package/dist/rpg/index.d.ts.map +1 -1
  217. package/dist/rpg/index.js +1 -1
  218. package/dist/rpg/index.js.map +1 -1
  219. package/dist/simulation/Scenario.d.ts +29 -0
  220. package/dist/simulation/Scenario.d.ts.map +1 -0
  221. package/dist/simulation/Scenario.js +25 -0
  222. package/dist/simulation/Scenario.js.map +1 -0
  223. package/dist/simulation/Turns.d.ts +29 -0
  224. package/dist/simulation/Turns.d.ts.map +1 -0
  225. package/dist/simulation/Turns.js +30 -0
  226. package/dist/simulation/Turns.js.map +1 -0
  227. package/dist/simulation/index.d.ts +5 -0
  228. package/dist/simulation/index.d.ts.map +1 -0
  229. package/dist/simulation/index.js +3 -0
  230. package/dist/simulation/index.js.map +1 -0
  231. package/dist/three-d/Character3D.d.ts +26 -1
  232. package/dist/three-d/Character3D.d.ts.map +1 -1
  233. package/dist/three-d/Character3D.js +31 -14
  234. package/dist/three-d/Character3D.js.map +1 -1
  235. package/dist/three-d/Collision3D.d.ts +63 -0
  236. package/dist/three-d/Collision3D.d.ts.map +1 -0
  237. package/dist/three-d/Collision3D.js +75 -0
  238. package/dist/three-d/Collision3D.js.map +1 -0
  239. package/dist/three-d/Models.js +1 -1
  240. package/dist/three-d/index.d.ts +3 -1
  241. package/dist/three-d/index.d.ts.map +1 -1
  242. package/dist/three-d/index.js +1 -0
  243. package/dist/three-d/index.js.map +1 -1
  244. package/dist/{core → two-d}/Game.d.ts +7 -6
  245. package/dist/two-d/Game.d.ts.map +1 -0
  246. package/dist/{core → two-d}/Game.js +3 -3
  247. package/dist/two-d/Game.js.map +1 -0
  248. package/dist/two-d/Scene2D.d.ts +19 -0
  249. package/dist/two-d/Scene2D.d.ts.map +1 -0
  250. package/dist/two-d/Scene2D.js +23 -0
  251. package/dist/two-d/Scene2D.js.map +1 -0
  252. package/dist/two-d/index.d.ts +20 -0
  253. package/dist/two-d/index.d.ts.map +1 -0
  254. package/dist/two-d/index.js +18 -0
  255. package/dist/two-d/index.js.map +1 -0
  256. package/dist/two-d/render/ActorAnimator.d.ts.map +1 -0
  257. package/dist/two-d/render/ActorAnimator.js.map +1 -0
  258. package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -0
  259. package/dist/two-d/render/AnimatedSprite.js.map +1 -0
  260. package/dist/two-d/render/Autotile.d.ts.map +1 -0
  261. package/dist/two-d/render/Autotile.js.map +1 -0
  262. package/dist/two-d/render/Camera.d.ts.map +1 -0
  263. package/dist/{render → two-d/render}/Camera.js +2 -2
  264. package/dist/two-d/render/Camera.js.map +1 -0
  265. package/dist/two-d/render/Capabilities.d.ts.map +1 -0
  266. package/dist/two-d/render/Capabilities.js.map +1 -0
  267. package/dist/two-d/render/ColorBlindness.d.ts.map +1 -0
  268. package/dist/two-d/render/ColorBlindness.js.map +1 -0
  269. package/dist/two-d/render/ColorTransformBatcher.d.ts.map +1 -0
  270. package/dist/{render → two-d/render}/ColorTransformBatcher.js +3 -2
  271. package/dist/two-d/render/ColorTransformBatcher.js.map +1 -0
  272. package/dist/two-d/render/LayeredSprite.d.ts.map +1 -0
  273. package/dist/two-d/render/LayeredSprite.js.map +1 -0
  274. package/dist/two-d/render/Minimap.d.ts.map +1 -0
  275. package/dist/{render → two-d/render}/Minimap.js +1 -1
  276. package/dist/two-d/render/Minimap.js.map +1 -0
  277. package/dist/two-d/render/Particles.d.ts +109 -0
  278. package/dist/two-d/render/Particles.d.ts.map +1 -0
  279. package/dist/two-d/render/Particles.js +178 -0
  280. package/dist/two-d/render/Particles.js.map +1 -0
  281. package/dist/two-d/render/Projectile.d.ts.map +1 -0
  282. package/dist/two-d/render/Projectile.js.map +1 -0
  283. package/dist/two-d/render/ScreenEffects.d.ts +71 -0
  284. package/dist/two-d/render/ScreenEffects.d.ts.map +1 -0
  285. package/dist/two-d/render/ScreenEffects.js +133 -0
  286. package/dist/two-d/render/ScreenEffects.js.map +1 -0
  287. package/dist/two-d/render/SpriteSheet.d.ts.map +1 -0
  288. package/dist/{render → two-d/render}/SpriteSheet.js +1 -1
  289. package/dist/two-d/render/SpriteSheet.js.map +1 -0
  290. package/dist/two-d/render/StatusVisuals.d.ts +46 -0
  291. package/dist/two-d/render/StatusVisuals.d.ts.map +1 -0
  292. package/dist/two-d/render/StatusVisuals.js +48 -0
  293. package/dist/two-d/render/StatusVisuals.js.map +1 -0
  294. package/dist/two-d/render/TileMap.d.ts.map +1 -0
  295. package/dist/{render → two-d/render}/TileMap.js +1 -1
  296. package/dist/two-d/render/TileMap.js.map +1 -0
  297. package/dist/{rpg → two-d/render}/TiledMap.d.ts +2 -2
  298. package/dist/two-d/render/TiledMap.d.ts.map +1 -0
  299. package/dist/{rpg → two-d/render}/TiledMap.js +2 -2
  300. package/dist/two-d/render/TiledMap.js.map +1 -0
  301. package/dist/two-d/render/TintedSprite.d.ts.map +1 -0
  302. package/dist/two-d/render/TintedSprite.js.map +1 -0
  303. package/dist/two-d/render/Viewport.d.ts.map +1 -0
  304. package/dist/two-d/render/Viewport.js.map +1 -0
  305. package/dist/{render → two-d/render}/index.d.ts +8 -0
  306. package/dist/two-d/render/index.d.ts.map +1 -0
  307. package/dist/{render → two-d/render}/index.js +4 -0
  308. package/dist/two-d/render/index.js.map +1 -0
  309. package/dist/two-d/stage/DialogueStage.d.ts.map +1 -0
  310. package/dist/{stage → two-d/stage}/DialogueStage.js +1 -1
  311. package/dist/two-d/stage/DialogueStage.js.map +1 -0
  312. package/dist/two-d/stage/index.d.ts.map +1 -0
  313. package/dist/two-d/stage/index.js.map +1 -0
  314. package/dist/two-d/stage/script.d.ts.map +1 -0
  315. package/dist/{stage → two-d/stage}/script.js +0 -0
  316. package/dist/two-d/stage/script.js.map +1 -0
  317. package/dist/two-d/stage/twee.d.ts.map +1 -0
  318. package/dist/two-d/stage/twee.js.map +1 -0
  319. package/dist/two-d/ui/Bar.d.ts.map +1 -0
  320. package/dist/two-d/ui/Bar.js.map +1 -0
  321. package/dist/two-d/ui/BitmapLabel.d.ts.map +1 -0
  322. package/dist/two-d/ui/BitmapLabel.js.map +1 -0
  323. package/dist/{ui → two-d/ui}/Button.d.ts +25 -2
  324. package/dist/two-d/ui/Button.d.ts.map +1 -0
  325. package/dist/{ui → two-d/ui}/Button.js +35 -9
  326. package/dist/two-d/ui/Button.js.map +1 -0
  327. package/dist/two-d/ui/EventDialogue.d.ts +23 -0
  328. package/dist/two-d/ui/EventDialogue.d.ts.map +1 -0
  329. package/dist/two-d/ui/EventDialogue.js +27 -0
  330. package/dist/two-d/ui/EventDialogue.js.map +1 -0
  331. package/dist/two-d/ui/FloatingText.d.ts.map +1 -0
  332. package/dist/two-d/ui/FloatingText.js.map +1 -0
  333. package/dist/{ui → two-d/ui}/HelpScreen.d.ts +1 -1
  334. package/dist/two-d/ui/HelpScreen.d.ts.map +1 -0
  335. package/dist/two-d/ui/HelpScreen.js.map +1 -0
  336. package/dist/{ui → two-d/ui}/IconGrid.d.ts +1 -1
  337. package/dist/two-d/ui/IconGrid.d.ts.map +1 -0
  338. package/dist/two-d/ui/IconGrid.js.map +1 -0
  339. package/dist/{ui → two-d/ui}/Label.d.ts +8 -0
  340. package/dist/two-d/ui/Label.d.ts.map +1 -0
  341. package/dist/{ui → two-d/ui}/Label.js +3 -0
  342. package/dist/two-d/ui/Label.js.map +1 -0
  343. package/dist/{ui → two-d/ui}/ListView.d.ts +1 -1
  344. package/dist/two-d/ui/ListView.d.ts.map +1 -0
  345. package/dist/two-d/ui/ListView.js.map +1 -0
  346. package/dist/{ui → two-d/ui}/LoadingScreen.d.ts +1 -1
  347. package/dist/two-d/ui/LoadingScreen.d.ts.map +1 -0
  348. package/dist/two-d/ui/LoadingScreen.js.map +1 -0
  349. package/dist/{ui → two-d/ui}/MessageBox.d.ts +1 -1
  350. package/dist/two-d/ui/MessageBox.d.ts.map +1 -0
  351. package/dist/two-d/ui/MessageBox.js.map +1 -0
  352. package/dist/two-d/ui/NinePatch.d.ts.map +1 -0
  353. package/dist/two-d/ui/NinePatch.js.map +1 -0
  354. package/dist/{ui → two-d/ui}/RebindScreen.d.ts +1 -1
  355. package/dist/two-d/ui/RebindScreen.d.ts.map +1 -0
  356. package/dist/{ui → two-d/ui}/RebindScreen.js +1 -1
  357. package/dist/two-d/ui/RebindScreen.js.map +1 -0
  358. package/dist/two-d/ui/StatsScreen.d.ts +25 -0
  359. package/dist/two-d/ui/StatsScreen.d.ts.map +1 -0
  360. package/dist/two-d/ui/StatsScreen.js +27 -0
  361. package/dist/two-d/ui/StatsScreen.js.map +1 -0
  362. package/dist/two-d/ui/Toast.d.ts.map +1 -0
  363. package/dist/{ui → two-d/ui}/Toast.js +1 -1
  364. package/dist/two-d/ui/Toast.js.map +1 -0
  365. package/dist/two-d/ui/Tooltip.d.ts +94 -0
  366. package/dist/two-d/ui/Tooltip.d.ts.map +1 -0
  367. package/dist/two-d/ui/Tooltip.js +149 -0
  368. package/dist/two-d/ui/Tooltip.js.map +1 -0
  369. package/dist/two-d/ui/VerticalLabel.d.ts.map +1 -0
  370. package/dist/two-d/ui/VerticalLabel.js.map +1 -0
  371. package/dist/{ui → two-d/ui}/Window.d.ts +2 -2
  372. package/dist/two-d/ui/Window.d.ts.map +1 -0
  373. package/dist/{ui → two-d/ui}/Window.js +1 -1
  374. package/dist/two-d/ui/Window.js.map +1 -0
  375. package/dist/two-d/ui/WindowStack.d.ts.map +1 -0
  376. package/dist/{ui → two-d/ui}/WindowStack.js +1 -1
  377. package/dist/two-d/ui/WindowStack.js.map +1 -0
  378. package/dist/{ui → two-d/ui}/index.d.ts +7 -1
  379. package/dist/two-d/ui/index.d.ts.map +1 -0
  380. package/dist/{ui → two-d/ui}/index.js +3 -0
  381. package/dist/two-d/ui/index.js.map +1 -0
  382. package/dist/{ui → two-d/ui}/theme.d.ts +2 -2
  383. package/dist/two-d/ui/theme.d.ts.map +1 -0
  384. package/dist/{ui → two-d/ui}/theme.js +1 -1
  385. package/dist/two-d/ui/theme.js.map +1 -0
  386. package/dist/version.d.ts +1 -1
  387. package/dist/version.js +1 -1
  388. package/dist/world/Encounters.js +1 -1
  389. package/dist/world/Encounters.js.map +1 -1
  390. package/dist/world/Environment.d.ts +12 -3
  391. package/dist/world/Environment.d.ts.map +1 -1
  392. package/dist/world/Environment.js +18 -9
  393. package/dist/world/Environment.js.map +1 -1
  394. package/package.json +138 -23
  395. package/dist/core/Game.d.ts.map +0 -1
  396. package/dist/core/Game.js.map +0 -1
  397. package/dist/render/ActorAnimator.d.ts.map +0 -1
  398. package/dist/render/ActorAnimator.js.map +0 -1
  399. package/dist/render/AnimatedSprite.d.ts.map +0 -1
  400. package/dist/render/AnimatedSprite.js.map +0 -1
  401. package/dist/render/Autotile.d.ts.map +0 -1
  402. package/dist/render/Autotile.js.map +0 -1
  403. package/dist/render/Camera.d.ts.map +0 -1
  404. package/dist/render/Camera.js.map +0 -1
  405. package/dist/render/Capabilities.d.ts.map +0 -1
  406. package/dist/render/Capabilities.js.map +0 -1
  407. package/dist/render/ColorBlindness.d.ts.map +0 -1
  408. package/dist/render/ColorBlindness.js.map +0 -1
  409. package/dist/render/ColorTransformBatcher.d.ts.map +0 -1
  410. package/dist/render/ColorTransformBatcher.js.map +0 -1
  411. package/dist/render/LayeredSprite.d.ts.map +0 -1
  412. package/dist/render/LayeredSprite.js.map +0 -1
  413. package/dist/render/Minimap.d.ts.map +0 -1
  414. package/dist/render/Minimap.js.map +0 -1
  415. package/dist/render/Projectile.d.ts.map +0 -1
  416. package/dist/render/Projectile.js.map +0 -1
  417. package/dist/render/SpriteSheet.d.ts.map +0 -1
  418. package/dist/render/SpriteSheet.js.map +0 -1
  419. package/dist/render/TileMap.d.ts.map +0 -1
  420. package/dist/render/TileMap.js.map +0 -1
  421. package/dist/render/TintedSprite.d.ts.map +0 -1
  422. package/dist/render/TintedSprite.js.map +0 -1
  423. package/dist/render/Viewport.d.ts.map +0 -1
  424. package/dist/render/Viewport.js.map +0 -1
  425. package/dist/render/index.d.ts.map +0 -1
  426. package/dist/render/index.js.map +0 -1
  427. package/dist/rpg/TiledMap.d.ts.map +0 -1
  428. package/dist/rpg/TiledMap.js.map +0 -1
  429. package/dist/stage/DialogueStage.d.ts.map +0 -1
  430. package/dist/stage/DialogueStage.js.map +0 -1
  431. package/dist/stage/index.d.ts.map +0 -1
  432. package/dist/stage/index.js.map +0 -1
  433. package/dist/stage/script.d.ts.map +0 -1
  434. package/dist/stage/script.js.map +0 -1
  435. package/dist/stage/twee.d.ts.map +0 -1
  436. package/dist/stage/twee.js.map +0 -1
  437. package/dist/ui/Bar.d.ts.map +0 -1
  438. package/dist/ui/Bar.js.map +0 -1
  439. package/dist/ui/BitmapLabel.d.ts.map +0 -1
  440. package/dist/ui/BitmapLabel.js.map +0 -1
  441. package/dist/ui/Button.d.ts.map +0 -1
  442. package/dist/ui/Button.js.map +0 -1
  443. package/dist/ui/FloatingText.d.ts.map +0 -1
  444. package/dist/ui/FloatingText.js.map +0 -1
  445. package/dist/ui/HelpScreen.d.ts.map +0 -1
  446. package/dist/ui/HelpScreen.js.map +0 -1
  447. package/dist/ui/IconGrid.d.ts.map +0 -1
  448. package/dist/ui/IconGrid.js.map +0 -1
  449. package/dist/ui/Label.d.ts.map +0 -1
  450. package/dist/ui/Label.js.map +0 -1
  451. package/dist/ui/ListView.d.ts.map +0 -1
  452. package/dist/ui/ListView.js.map +0 -1
  453. package/dist/ui/LoadingScreen.d.ts.map +0 -1
  454. package/dist/ui/LoadingScreen.js.map +0 -1
  455. package/dist/ui/MessageBox.d.ts.map +0 -1
  456. package/dist/ui/MessageBox.js.map +0 -1
  457. package/dist/ui/NinePatch.d.ts.map +0 -1
  458. package/dist/ui/NinePatch.js.map +0 -1
  459. package/dist/ui/RebindScreen.d.ts.map +0 -1
  460. package/dist/ui/RebindScreen.js.map +0 -1
  461. package/dist/ui/Toast.d.ts.map +0 -1
  462. package/dist/ui/Toast.js.map +0 -1
  463. package/dist/ui/VerticalLabel.d.ts.map +0 -1
  464. package/dist/ui/VerticalLabel.js.map +0 -1
  465. package/dist/ui/Window.d.ts.map +0 -1
  466. package/dist/ui/Window.js.map +0 -1
  467. package/dist/ui/WindowStack.d.ts.map +0 -1
  468. package/dist/ui/WindowStack.js.map +0 -1
  469. package/dist/ui/index.d.ts.map +0 -1
  470. package/dist/ui/index.js.map +0 -1
  471. package/dist/ui/theme.d.ts.map +0 -1
  472. package/dist/ui/theme.js.map +0 -1
  473. /package/dist/{render → two-d/render}/ActorAnimator.d.ts +0 -0
  474. /package/dist/{render → two-d/render}/ActorAnimator.js +0 -0
  475. /package/dist/{render → two-d/render}/AnimatedSprite.d.ts +0 -0
  476. /package/dist/{render → two-d/render}/AnimatedSprite.js +0 -0
  477. /package/dist/{render → two-d/render}/Autotile.d.ts +0 -0
  478. /package/dist/{render → two-d/render}/Autotile.js +0 -0
  479. /package/dist/{render → two-d/render}/Camera.d.ts +0 -0
  480. /package/dist/{render → two-d/render}/Capabilities.d.ts +0 -0
  481. /package/dist/{render → two-d/render}/Capabilities.js +0 -0
  482. /package/dist/{render → two-d/render}/ColorBlindness.d.ts +0 -0
  483. /package/dist/{render → two-d/render}/ColorBlindness.js +0 -0
  484. /package/dist/{render → two-d/render}/ColorTransformBatcher.d.ts +0 -0
  485. /package/dist/{render → two-d/render}/LayeredSprite.d.ts +0 -0
  486. /package/dist/{render → two-d/render}/LayeredSprite.js +0 -0
  487. /package/dist/{render → two-d/render}/Minimap.d.ts +0 -0
  488. /package/dist/{render → two-d/render}/Projectile.d.ts +0 -0
  489. /package/dist/{render → two-d/render}/Projectile.js +0 -0
  490. /package/dist/{render → two-d/render}/SpriteSheet.d.ts +0 -0
  491. /package/dist/{render → two-d/render}/TileMap.d.ts +0 -0
  492. /package/dist/{render → two-d/render}/TintedSprite.d.ts +0 -0
  493. /package/dist/{render → two-d/render}/TintedSprite.js +0 -0
  494. /package/dist/{render → two-d/render}/Viewport.d.ts +0 -0
  495. /package/dist/{render → two-d/render}/Viewport.js +0 -0
  496. /package/dist/{stage → two-d/stage}/DialogueStage.d.ts +0 -0
  497. /package/dist/{stage → two-d/stage}/index.d.ts +0 -0
  498. /package/dist/{stage → two-d/stage}/index.js +0 -0
  499. /package/dist/{stage → two-d/stage}/script.d.ts +0 -0
  500. /package/dist/{stage → two-d/stage}/twee.d.ts +0 -0
  501. /package/dist/{stage → two-d/stage}/twee.js +0 -0
  502. /package/dist/{ui → two-d/ui}/Bar.d.ts +0 -0
  503. /package/dist/{ui → two-d/ui}/Bar.js +0 -0
  504. /package/dist/{ui → two-d/ui}/BitmapLabel.d.ts +0 -0
  505. /package/dist/{ui → two-d/ui}/BitmapLabel.js +0 -0
  506. /package/dist/{ui → two-d/ui}/FloatingText.d.ts +0 -0
  507. /package/dist/{ui → two-d/ui}/FloatingText.js +0 -0
  508. /package/dist/{ui → two-d/ui}/HelpScreen.js +0 -0
  509. /package/dist/{ui → two-d/ui}/IconGrid.js +0 -0
  510. /package/dist/{ui → two-d/ui}/ListView.js +0 -0
  511. /package/dist/{ui → two-d/ui}/LoadingScreen.js +0 -0
  512. /package/dist/{ui → two-d/ui}/MessageBox.js +0 -0
  513. /package/dist/{ui → two-d/ui}/NinePatch.d.ts +0 -0
  514. /package/dist/{ui → two-d/ui}/NinePatch.js +0 -0
  515. /package/dist/{ui → two-d/ui}/Toast.d.ts +0 -0
  516. /package/dist/{ui → two-d/ui}/VerticalLabel.d.ts +0 -0
  517. /package/dist/{ui → two-d/ui}/VerticalLabel.js +0 -0
  518. /package/dist/{ui → two-d/ui}/WindowStack.d.ts +0 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Where a game's assets come from, as pure path arithmetic.
3
+ *
4
+ * In a built game, `tools/compile-resources` has already turned every asset into a `data:`
5
+ * URI inside a script that runs before the game does. `resolve` then hands back that URI
6
+ * instead of a path, which is what lets the page work from `file://`: see the tool for
7
+ * why plain files next to the page do not.
8
+ *
9
+ * During development there is no compiled bundle, so paths are used as they are and the
10
+ * dev server serves them. Game code says `load('tiles.png')` either way.
11
+ *
12
+ * Kept separate from `loader.ts` because none of this needs a renderer. Resolving a path is
13
+ * string-and-map work; only actually fetching and decoding an asset needs Pixi's loader. That
14
+ * split is what lets `mwg/3d` resolve a `.glb` path through the same compiled-asset map every
15
+ * 2D game uses while handing the fetch to Babylon, without a Babylon-only game importing
16
+ * Pixi at all - which it did, transitively, purely because these two halves shared a file.
17
+ */
18
+ declare global {
19
+ interface Window {
20
+ __MWG_ASSETS__?: Record<string, string>;
21
+ }
22
+ }
23
+ /** points dev-mode lookups at the folder assets are served from */
24
+ export declare function setBase(path: string): void;
25
+ /** true when running against a compiled bundle rather than a dev server */
26
+ export declare function isCompiled(): boolean;
27
+ export declare function paths(): string[];
28
+ export declare function has(path: string): boolean;
29
+ /** an asset path resolved to something the browser can actually load */
30
+ export declare function resolve(path: string): string;
31
+ /**
32
+ * 0 (started) to 1 (complete) - a count of assets finished, not a byte count. Pixi's own
33
+ * loaders do not expose bytes transferred across every asset type uniformly, so this reports
34
+ * what is actually available rather than a byte figure it cannot back with a real number.
35
+ *
36
+ * Lives here rather than with the loader so `Streaming.ts` can name it without either file
37
+ * importing the other's module barrel, which is what made these two a cycle before.
38
+ */
39
+ export type AssetProgress = (fraction: number) => void;
40
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/assets/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;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;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Where a game's assets come from, as pure path arithmetic.
3
+ *
4
+ * In a built game, `tools/compile-resources` has already turned every asset into a `data:`
5
+ * URI inside a script that runs before the game does. `resolve` then hands back that URI
6
+ * instead of a path, which is what lets the page work from `file://`: see the tool for
7
+ * why plain files next to the page do not.
8
+ *
9
+ * During development there is no compiled bundle, so paths are used as they are and the
10
+ * dev server serves them. Game code says `load('tiles.png')` either way.
11
+ *
12
+ * Kept separate from `loader.ts` because none of this needs a renderer. Resolving a path is
13
+ * string-and-map work; only actually fetching and decoding an asset needs Pixi's loader. That
14
+ * split is what lets `mwg/3d` resolve a `.glb` path through the same compiled-asset map every
15
+ * 2D game uses while handing the fetch to Babylon, without a Babylon-only game importing
16
+ * Pixi at all - which it did, transitively, purely because these two halves shared a file.
17
+ */
18
+ /** the base for dev-mode paths, when assets are served rather than compiled in */
19
+ let base = '';
20
+ /** points dev-mode lookups at the folder assets are served from */
21
+ export function setBase(path) {
22
+ base = path.endsWith('/') || path === '' ? path : path + '/';
23
+ }
24
+ function compiled() {
25
+ return typeof window === 'undefined' ? undefined : window.__MWG_ASSETS__;
26
+ }
27
+ /** true when running against a compiled bundle rather than a dev server */
28
+ export function isCompiled() {
29
+ return compiled() !== undefined;
30
+ }
31
+ export function paths() {
32
+ return Object.keys(compiled() ?? {});
33
+ }
34
+ export function has(path) {
35
+ const map = compiled();
36
+ return map ? path in map : true;
37
+ }
38
+ /** an asset path resolved to something the browser can actually load */
39
+ export function resolve(path) {
40
+ const map = compiled();
41
+ if (!map)
42
+ return base + path;
43
+ const found = map[path];
44
+ if (found === undefined) {
45
+ throw new Error(`asset "${path}" is not in this build - check it is under the folder passed to compile-resources`);
46
+ }
47
+ return found;
48
+ }
49
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/assets/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,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"}
@@ -12,10 +12,20 @@ export declare class Music {
12
12
  private current;
13
13
  private fades;
14
14
  private create;
15
+ private trackQueue;
16
+ private playlistFade;
15
17
  volume: number;
16
18
  constructor(options?: MusicOptions);
17
19
  /** @param fadeDuration seconds; 0 switches immediately with no crossfade */
18
20
  play(path: string, fadeDuration?: number): void;
21
+ /**
22
+ * Plays the supplied sequence repeatedly. This is deliberately small and backend-agnostic:
23
+ * callers can repeat entries to weight a track, while HTMLAudioElement's optional `onended`
24
+ * advances the queue when available.
25
+ */
26
+ playTracks(paths: readonly string[], fadeDuration?: number): void;
27
+ private startNextTrack;
28
+ private start;
19
29
  stop(fadeDuration?: number): void;
20
30
  update(dt: number): void;
21
31
  }
@@ -1 +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,CA+BzC;IAED,IAAI,CAAC,YAAY,SAAI,GAAG,IAAI,CAU3B;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAevB;CACD"}
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,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,YAAY,CAAK;IACzB,MAAM,EAAE,MAAM,CAAC;IAEf,YAAY,OAAO,GAAE,YAAiB,EAGrC;IAED,4EAA4E;IAC5E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,SAAI,GAAG,IAAI,CAGzC;IAED;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,YAAY,SAAI,GAAG,IAAI,CAQ3D;IAED,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,KAAK;IAuCb,IAAI,CAAC,YAAY,SAAI,GAAG,IAAI,CAW3B;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAevB;CACD"}
@@ -8,13 +8,47 @@ export class Music {
8
8
  constructor(options = {}) {
9
9
  this.current = null;
10
10
  this.fades = [];
11
+ this.trackQueue = null;
12
+ this.playlistFade = 1;
11
13
  this.volume = options.volume ?? 1;
12
14
  this.create = options.create ?? createAudio;
13
15
  }
14
16
  /** @param fadeDuration seconds; 0 switches immediately with no crossfade */
15
17
  play(path, fadeDuration = 1) {
18
+ this.trackQueue = null;
19
+ this.start(path, fadeDuration, true);
20
+ }
21
+ /**
22
+ * Plays the supplied sequence repeatedly. This is deliberately small and backend-agnostic:
23
+ * callers can repeat entries to weight a track, while HTMLAudioElement's optional `onended`
24
+ * advances the queue when available.
25
+ */
26
+ playTracks(paths, fadeDuration = 1) {
27
+ if (paths.length === 0) {
28
+ this.stop(fadeDuration);
29
+ return;
30
+ }
31
+ this.trackQueue = [...paths];
32
+ this.playlistFade = fadeDuration;
33
+ this.startNextTrack();
34
+ }
35
+ startNextTrack() {
36
+ if (!this.trackQueue?.length)
37
+ return;
38
+ const path = this.trackQueue.shift();
39
+ this.trackQueue.push(path);
40
+ this.start(path, this.playlistFade, false);
41
+ }
42
+ start(path, fadeDuration, loop) {
16
43
  const incoming = this.create(path);
17
- incoming.loop = true;
44
+ incoming.loop = loop;
45
+ if (!loop && incoming.onended !== undefined) {
46
+ // A delayed event from a fading-out track must not advance a newer playlist.
47
+ incoming.onended = () => {
48
+ if (this.current === incoming)
49
+ this.startNextTrack();
50
+ };
51
+ }
18
52
  const previous = this.current;
19
53
  this.current = incoming;
20
54
  if (fadeDuration <= 0) {
@@ -41,6 +75,7 @@ export class Music {
41
75
  }
42
76
  }
43
77
  stop(fadeDuration = 1) {
78
+ this.trackQueue = null;
44
79
  const audio = this.current;
45
80
  if (!audio)
46
81
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"Music.js","sourceRoot":"","sources":["../../src/audio/Music.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Music.js","sourceRoot":"","sources":["../../src/audio/Music.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,9 @@ export interface Playable {
10
10
  currentTime: number;
11
11
  volume: number;
12
12
  loop: boolean;
13
+ /** Optional completion hook, matching HTMLAudioElement.onended. Backends without an
14
+ * end event can omit it; single-track Music remains fully usable there. */
15
+ onended?: ((event: Event) => unknown) | null;
13
16
  }
14
17
  /** the real thing: an `HTMLAudioElement` pointed at a resolved asset path */
15
18
  export declare function createAudio(path: string): Playable;
@@ -1 +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"}
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;IACd;+EAC2E;IAC3E,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,GAAG,IAAI,CAAC;CAC7C;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAElD"}
@@ -1,4 +1,4 @@
1
- import * as Resources from '../assets/index.js';
1
+ import * as Resources from '../assets/paths.js';
2
2
  /** the real thing: an `HTMLAudioElement` pointed at a resolved asset path */
3
3
  export function createAudio(path) {
4
4
  return new Audio(Resources.resolve(path));
@@ -1 +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"}
1
+ {"version":3,"file":"Playable.js","sourceRoot":"","sources":["../../src/audio/Playable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAC;AAmBhD,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -19,7 +19,7 @@ export declare class Field {
19
19
  get(id: string): FieldCondition | undefined;
20
20
  clear(id: string): void;
21
21
  get active(): readonly FieldCondition[];
22
- /** ticks every timed condition down by one round, clearing any that just ran out */
23
- advance(): void;
22
+ /** ticks every timed condition down by `rounds`, clearing any that just ran out */
23
+ advance(rounds?: number): void;
24
24
  }
25
25
  //# sourceMappingURL=Field.d.ts.map
@@ -1 +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"}
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,mFAAmF;IACnF,OAAO,CAAC,MAAM,SAAI,GAAG,IAAI,CAOxB;CACD"}
@@ -17,12 +17,12 @@ export class Field {
17
17
  get active() {
18
18
  return [...this.conditions.values()];
19
19
  }
20
- /** ticks every timed condition down by one round, clearing any that just ran out */
21
- advance() {
20
+ /** ticks every timed condition down by `rounds`, clearing any that just ran out */
21
+ advance(rounds = 1) {
22
22
  for (const [id, condition] of this.conditions) {
23
23
  if (condition.duration === undefined)
24
24
  continue;
25
- condition.duration -= 1;
25
+ condition.duration -= rounds;
26
26
  if (condition.duration <= 0)
27
27
  this.conditions.delete(id);
28
28
  }
@@ -1 +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"}
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,mFAAmF;IACnF,OAAO,CAAC,MAAM,GAAG,CAAC;QACjB,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,MAAM,CAAC;YAC7B,IAAI,SAAS,CAAC,QAAQ,IAAI,CAAC;gBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;CACD"}
@@ -1,3 +1,4 @@
1
+ import { HookRegistry } from '../core/Hooks.ts';
1
2
  /**
2
3
  * A battle-scoped place for passive effects to run code, not just push a number - the seam
3
4
  * `mwg/actors`' `StatBlock` modifiers and `applyStatusEffect` do not cover, since both are
@@ -11,19 +12,12 @@
11
12
  * check is a plain convention on top of this, not special-cased: a handler mutates a shared
12
13
  * `context` object (`{ skip: false }`, say) the same way any other side effect would, and
13
14
  * the battle loop reads it back after `emit` returns.
15
+ *
16
+ * The registry itself is `core.HookRegistry`, shared with `roguelike.CombatHooks`. What is
17
+ * battle-specific is only the shape of what a handler receives: the creature the event is
18
+ * about, plus that optional shared context.
14
19
  */
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;
20
+ export declare class BattleHooks<C> extends HookRegistry<[creature: C, context?: unknown]> {
28
21
  }
22
+ export type { Hook as BattleHook } from '../core/Hooks.ts';
29
23
  //# sourceMappingURL=Hooks.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"Hooks.d.ts","sourceRoot":"","sources":["../../src/battle/Hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,WAAW,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;CAAG;AAErF,YAAY,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,20 +1,22 @@
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
- }
1
+ import { HookRegistry } from '../core/Hooks.js';
2
+ /**
3
+ * A battle-scoped place for passive effects to run code, not just push a number - the seam
4
+ * `mwg/actors`' `StatBlock` modifiers and `applyStatusEffect` do not cover, since both are
5
+ * numeric-only. An ability reacting to "this creature switched in," a held item reacting to
6
+ * "this creature was hit," or a sleep/paralysis status answering "can this creature act this
7
+ * turn" are all the same shape: register a handler for a named event, and a game's battle
8
+ * loop calls it at the right moment.
9
+ *
10
+ * `mwg` names no events of its own beyond the strings a game passes - `'switchIn'`, `'hit'`,
11
+ * `'turnStart'`, whatever a game's battle loop actually fires. A "can this creature act"
12
+ * check is a plain convention on top of this, not special-cased: a handler mutates a shared
13
+ * `context` object (`{ skip: false }`, say) the same way any other side effect would, and
14
+ * the battle loop reads it back after `emit` returns.
15
+ *
16
+ * The registry itself is `core.HookRegistry`, shared with `roguelike.CombatHooks`. What is
17
+ * battle-specific is only the shape of what a handler receives: the creature the event is
18
+ * about, plus that optional shared context.
19
+ */
20
+ export class BattleHooks extends HookRegistry {
19
21
  }
20
22
  //# sourceMappingURL=Hooks.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"Hooks.js","sourceRoot":"","sources":["../../src/battle/Hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,WAAe,SAAQ,YAA8C;CAAG"}
@@ -1,22 +1,16 @@
1
+ import { HttpTransport, type HttpTransportOptions } from './HttpTransport.ts';
1
2
  export interface FeedbackRequest {
2
3
  message: string;
3
4
  contact?: string;
4
5
  context?: Record<string, string | number | boolean>;
5
6
  }
6
- export interface FeedbackOptions {
7
- endpoint: string;
8
- timeoutMs?: number;
9
- fetch?: typeof globalThis.fetch;
10
- }
7
+ export type FeedbackOptions = HttpTransportOptions;
11
8
  export interface FeedbackResponse {
12
9
  ok: boolean;
13
10
  status: number;
14
11
  }
15
12
  /** Small, injectable transport for a game's own feedback endpoint. */
16
- export declare class FeedbackClient {
17
- private readonly endpoint;
18
- private readonly timeoutMs;
19
- private readonly fetchFn;
13
+ export declare class FeedbackClient extends HttpTransport {
20
14
  constructor(options: FeedbackOptions);
21
15
  submit(request: FeedbackRequest): Promise<FeedbackResponse>;
22
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Feedback.d.ts","sourceRoot":"","sources":["../../src/core/Feedback.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CACf;AAED,sEAAsE;AACtE,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAElD,YAAY,OAAO,EAAE,eAAe,EAOnC;IAEK,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgBhE;CACD"}
1
+ {"version":3,"file":"Feedback.d.ts","sourceRoot":"","sources":["../../src/core/Feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE9E,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CACpD;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CACf;AAED,sEAAsE;AACtE,qBAAa,cAAe,SAAQ,aAAa;IAChD,YAAY,OAAO,EAAE,eAAe,EAEnC;IAEK,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAYhE;CACD"}
@@ -1,35 +1,23 @@
1
+ import { HttpTransport } from './HttpTransport.js';
1
2
  /** Small, injectable transport for a game's own feedback endpoint. */
2
- export class FeedbackClient {
3
+ export class FeedbackClient extends HttpTransport {
3
4
  constructor(options) {
4
- if (!options.endpoint)
5
- throw new Error('feedback endpoint is required');
6
- this.endpoint = options.endpoint;
7
- this.timeoutMs = options.timeoutMs ?? 10000;
8
- if (!(this.timeoutMs > 0))
9
- throw new Error('feedback timeout must be positive');
10
- this.fetchFn = options.fetch ?? globalThis.fetch;
11
- if (!this.fetchFn)
12
- throw new Error('fetch is unavailable; provide FeedbackOptions.fetch');
5
+ super(options, 'feedback');
13
6
  }
14
7
  async submit(request) {
15
8
  if (!request.message?.trim())
16
9
  throw new Error('feedback message cannot be empty');
17
- const controller = new AbortController();
18
- const timer = setTimeout(() => controller.abort(), this.timeoutMs);
19
- try {
10
+ return this.withTimeout(async (signal) => {
20
11
  const response = await this.fetchFn(this.endpoint, {
21
12
  method: 'POST',
22
13
  headers: { 'content-type': 'application/json' },
23
14
  body: JSON.stringify(request),
24
- signal: controller.signal,
15
+ signal,
25
16
  });
26
17
  if (!response.ok)
27
18
  throw new Error(`feedback request failed with HTTP ${response.status}`);
28
19
  return { ok: true, status: response.status };
29
- }
30
- finally {
31
- clearTimeout(timer);
32
- }
20
+ });
33
21
  }
34
22
  }
35
23
  //# sourceMappingURL=Feedback.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Feedback.js","sourceRoot":"","sources":["../../src/core/Feedback.ts"],"names":[],"mappings":"AAiBA,sEAAsE;AACtE,MAAM,OAAO,cAAc;IAK1B,YAAY,OAAwB;QACnC,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;QAC5C,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAChF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC3F,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAwB;QACpC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;aACzB,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9C,CAAC;gBAAS,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACF,CAAC;CACD"}
1
+ {"version":3,"file":"Feedback.js","sourceRoot":"","sources":["../../src/core/Feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA6B,MAAM,oBAAoB,CAAC;AAe9E,sEAAsE;AACtE,MAAM,OAAO,cAAe,SAAQ,aAAa;IAChD,YAAY,OAAwB;QACnC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAwB;QACpC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM;aACN,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;IACJ,CAAC;CACD"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * A named-event registry whose handlers can be removed in bulk by whatever registered them.
3
+ *
4
+ * Distinct from `Signal`, which is one event with one payload and a consuming, LIFO listener
5
+ * order: this is many events keyed by name, dispatched in registration order, with a `source`
6
+ * tag so everything an ability or a worn item put here comes off in one call when that thing
7
+ * leaves. `mwg` names no events of its own - the strings are whatever a game's own loop
8
+ * actually fires.
9
+ *
10
+ * `battle.BattleHooks` and `roguelike.CombatHooks` are both this, with their argument types
11
+ * fixed and their own documentation attached. They used to be two line-for-line copies of the
12
+ * same class; the difference between them was never the registry, only what a handler is
13
+ * handed when it runs.
14
+ */
15
+ export interface Hook<TArgs extends unknown[]> {
16
+ event: string;
17
+ handler: (...args: TArgs) => void;
18
+ /** whatever registered this hook - an ability, a held item - for bulk removal via `offSource` */
19
+ source?: unknown;
20
+ }
21
+ export declare class HookRegistry<TArgs extends unknown[]> {
22
+ private hooks;
23
+ on(event: string, handler: (...args: TArgs) => void, source?: unknown): void;
24
+ /** removes one specific handler; `offSource` is the usual way, this is for a one-off */
25
+ off(handler: (...args: TArgs) => void): void;
26
+ /** removes every hook registered with this `source` - a fainted creature's ability leaving */
27
+ offSource(source: unknown): void;
28
+ /** runs every handler registered for `event`, in registration order */
29
+ emit(event: string, ...args: TArgs): void;
30
+ /** how many handlers are registered, across every event */
31
+ get size(): number;
32
+ clear(): void;
33
+ }
34
+ //# sourceMappingURL=Hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hooks.d.ts","sourceRoot":"","sources":["../../src/core/Hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,IAAI,CAAC,KAAK,SAAS,OAAO,EAAE;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;IAElC,iGAAiG;IACjG,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,YAAY,CAAC,KAAK,SAAS,OAAO,EAAE;IAChD,OAAO,CAAC,KAAK,CAAqB;IAElC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAE3E;IAED,wFAAwF;IACxF,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAE3C;IAED,8FAA8F;IAC9F,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAE/B;IAED,uEAAuE;IACvE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,CAMxC;IAED,2DAA2D;IAC3D,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,IAAI,CAEZ;CACD"}
@@ -0,0 +1,33 @@
1
+ export class HookRegistry {
2
+ constructor() {
3
+ this.hooks = [];
4
+ }
5
+ on(event, handler, source) {
6
+ this.hooks.push({ event, handler, source });
7
+ }
8
+ /** removes one specific handler; `offSource` is the usual way, this is for a one-off */
9
+ off(handler) {
10
+ this.hooks = this.hooks.filter((hook) => hook.handler !== handler);
11
+ }
12
+ /** removes every hook registered with this `source` - a fainted creature's ability leaving */
13
+ offSource(source) {
14
+ this.hooks = this.hooks.filter((hook) => hook.source !== source);
15
+ }
16
+ /** runs every handler registered for `event`, in registration order */
17
+ emit(event, ...args) {
18
+ //iterate a copy: a handler may remove itself or another, which must not shift the
19
+ //iteration out from under this loop mid-dispatch
20
+ for (const hook of [...this.hooks]) {
21
+ if (hook.event === event)
22
+ hook.handler(...args);
23
+ }
24
+ }
25
+ /** how many handlers are registered, across every event */
26
+ get size() {
27
+ return this.hooks.length;
28
+ }
29
+ clear() {
30
+ this.hooks = [];
31
+ }
32
+ }
33
+ //# sourceMappingURL=Hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hooks.js","sourceRoot":"","sources":["../../src/core/Hooks.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,YAAY;IAAzB;QACS,UAAK,GAAkB,EAAE,CAAC;IAiCnC,CAAC;IA/BA,EAAE,CAAC,KAAa,EAAE,OAAiC,EAAE,MAAgB;QACpE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,wFAAwF;IACxF,GAAG,CAAC,OAAiC;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACpE,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,GAAG,IAAW;QACjC,kFAAkF;QAClF,iDAAiD;QACjD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QACjD,CAAC;IACF,CAAC;IAED,2DAA2D;IAC3D,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACjB,CAAC;CACD"}
@@ -0,0 +1,22 @@
1
+ export interface HttpTransportOptions {
2
+ endpoint: string;
3
+ timeoutMs?: number;
4
+ fetch?: typeof globalThis.fetch;
5
+ }
6
+ /**
7
+ * The constructor validation and timeout-wrapped fetch shared by every injectable HTTPS
8
+ * transport here (`FeedbackClient`, `SaveSyncClient`, `TelemetryClient`) - each one is a
9
+ * plain request/response against a game's own endpoint, differing only in what they send and
10
+ * expect back, not in how the endpoint/timeout/fetch options are validated or how a request
11
+ * is aborted after `timeoutMs`. `label` names the concrete client in its own error messages
12
+ * ("feedback endpoint is required", not a generic one that would leave a game guessing which
13
+ * of several clients threw).
14
+ */
15
+ export declare abstract class HttpTransport {
16
+ protected readonly endpoint: string;
17
+ protected readonly timeoutMs: number;
18
+ protected readonly fetchFn: typeof globalThis.fetch;
19
+ constructor(options: HttpTransportOptions, label: string);
20
+ protected withTimeout<T>(run: (signal: AbortSignal) => Promise<T>): Promise<T>;
21
+ }
22
+ //# sourceMappingURL=HttpTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpTransport.d.ts","sourceRoot":"","sources":["../../src/core/HttpTransport.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,8BAAsB,aAAa;IAClC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAEpD,YAAY,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAOvD;IAED,UAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAQnF;CACD"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The constructor validation and timeout-wrapped fetch shared by every injectable HTTPS
3
+ * transport here (`FeedbackClient`, `SaveSyncClient`, `TelemetryClient`) - each one is a
4
+ * plain request/response against a game's own endpoint, differing only in what they send and
5
+ * expect back, not in how the endpoint/timeout/fetch options are validated or how a request
6
+ * is aborted after `timeoutMs`. `label` names the concrete client in its own error messages
7
+ * ("feedback endpoint is required", not a generic one that would leave a game guessing which
8
+ * of several clients threw).
9
+ */
10
+ export class HttpTransport {
11
+ constructor(options, label) {
12
+ if (!options.endpoint)
13
+ throw new Error(`${label} endpoint is required`);
14
+ this.endpoint = options.endpoint;
15
+ this.timeoutMs = options.timeoutMs ?? 10000;
16
+ if (!(this.timeoutMs > 0))
17
+ throw new Error(`${label} timeout must be positive`);
18
+ this.fetchFn = options.fetch ?? globalThis.fetch;
19
+ if (!this.fetchFn)
20
+ throw new Error(`fetch is unavailable; provide ${label}Options.fetch`);
21
+ }
22
+ async withTimeout(run) {
23
+ const controller = new AbortController();
24
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
25
+ try {
26
+ return await run(controller.signal);
27
+ }
28
+ finally {
29
+ clearTimeout(timer);
30
+ }
31
+ }
32
+ }
33
+ //# sourceMappingURL=HttpTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpTransport.js","sourceRoot":"","sources":["../../src/core/HttpTransport.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,MAAM,OAAgB,aAAa;IAKlC,YAAY,OAA6B,EAAE,KAAa;QACvD,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,uBAAuB,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;QAC5C,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,2BAA2B,CAAC,CAAC;QAChF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,eAAe,CAAC,CAAC;IAC3F,CAAC;IAES,KAAK,CAAC,WAAW,CAAI,GAAwC;QACtE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC;YACJ,OAAO,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;gBAAS,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACF,CAAC;CACD"}