@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 @@
1
+ {"version":3,"file":"Random.js","sourceRoot":"","sources":["../../src/core/Random.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import type { Signal } from './Signal.ts';
2
+ /**
3
+ * One action dispatched on one frame of the game loop.
4
+ *
5
+ * The frame is a count of frames since recording started, not a timestamp: a
6
+ * replay re-dispatches the same actions at the same frame counts while driving
7
+ * the loop itself with `Game.step(dt)`, so wall-clock timing never matters.
8
+ */
9
+ export interface ReplayEvent {
10
+ frame: number;
11
+ action: string;
12
+ }
13
+ /**
14
+ * Records every action dispatched on a signal, stamped with the current frame.
15
+ *
16
+ * In a game the two signals are `Input.onAction` and `Game.onFrame`:
17
+ *
18
+ * ```ts
19
+ * const recorder = new Recorder(Input.onAction, game.onFrame);
20
+ * // ...play...
21
+ * const saved = serializeReplay(recorder.toJSON());
22
+ * ```
23
+ *
24
+ * The signals are parameters rather than imports so tests can drive a
25
+ * recorder with plain `Signal` instances instead of a whole `Game`.
26
+ */
27
+ export declare class Recorder {
28
+ private frame;
29
+ private readonly recorded;
30
+ private readonly actions;
31
+ private readonly frames;
32
+ private readonly onAction;
33
+ private readonly onFrame;
34
+ constructor(actions: Signal<string>, frames: Signal<number>);
35
+ get events(): readonly ReplayEvent[];
36
+ /** A deep copy, safe to serialise or hand to a `Player`. */
37
+ toJSON(): ReplayEvent[];
38
+ /** Detaches both listeners; safe to call twice. */
39
+ stop(): void;
40
+ }
41
+ /**
42
+ * Re-dispatches recorded events at their recorded frames.
43
+ *
44
+ * ```ts
45
+ * const player = new Player(deserializeReplay(saved), (a) => Input.onAction.dispatch(a), game.onFrame);
46
+ * // ...drive the loop by hand: game.step(1 / 60) per frame...
47
+ * ```
48
+ *
49
+ * Events are dispatched on the frame signal whose count has reached their
50
+ * stamp, before the player's own count advances - the same relative point a
51
+ * live action held during recording. `dispatch` usually forwards into
52
+ * `Input.onAction`, but tests pass a collector instead.
53
+ */
54
+ export declare class Player {
55
+ private frame;
56
+ private index;
57
+ private readonly events;
58
+ private readonly dispatch;
59
+ private readonly frames;
60
+ private readonly onFrame;
61
+ constructor(events: readonly ReplayEvent[], dispatch: (action: string) => void, frames: Signal<number>);
62
+ /** True once every event has been dispatched. */
63
+ get done(): boolean;
64
+ /** Detaches the frame listener; safe to call twice. */
65
+ stop(): void;
66
+ private pump;
67
+ }
68
+ export declare function serializeReplay(events: readonly ReplayEvent[]): string;
69
+ /** Parses what `serializeReplay` wrote, rejecting anything else. */
70
+ export declare function deserializeReplay(json: string): ReplayEvent[];
71
+ //# sourceMappingURL=Replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Replay.d.ts","sourceRoot":"","sources":["../../src/core/Replay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,QAAQ;IACpB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IAErC,YAAY,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAY1D;IAED,IAAI,MAAM,IAAI,SAAS,WAAW,EAAE,CAEnC;IAED,4DAA4D;IAC5D,MAAM,IAAI,WAAW,EAAE,CAEtB;IAED,mDAAmD;IACnD,IAAI,IAAI,IAAI,CAGX;CACD;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,MAAM;IAClB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IAErC,YACC,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAClC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAOtB;IAED,iDAAiD;IACjD,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,uDAAuD;IACvD,IAAI,IAAI,IAAI,CAEX;IAED,OAAO,CAAC,IAAI;CAOZ;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAEtE;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAe7D"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Records every action dispatched on a signal, stamped with the current frame.
3
+ *
4
+ * In a game the two signals are `Input.onAction` and `Game.onFrame`:
5
+ *
6
+ * ```ts
7
+ * const recorder = new Recorder(Input.onAction, game.onFrame);
8
+ * // ...play...
9
+ * const saved = serializeReplay(recorder.toJSON());
10
+ * ```
11
+ *
12
+ * The signals are parameters rather than imports so tests can drive a
13
+ * recorder with plain `Signal` instances instead of a whole `Game`.
14
+ */
15
+ export class Recorder {
16
+ constructor(actions, frames) {
17
+ this.frame = 0;
18
+ this.recorded = [];
19
+ this.actions = actions;
20
+ this.frames = frames;
21
+ //returns void, never true: recording must not swallow the action
22
+ this.onAction = (action) => {
23
+ this.recorded.push({ frame: this.frame, action });
24
+ };
25
+ this.onFrame = () => {
26
+ this.frame++;
27
+ };
28
+ actions.add(this.onAction);
29
+ frames.add(this.onFrame);
30
+ }
31
+ get events() {
32
+ return this.recorded;
33
+ }
34
+ /** A deep copy, safe to serialise or hand to a `Player`. */
35
+ toJSON() {
36
+ return this.recorded.map((e) => ({ frame: e.frame, action: e.action }));
37
+ }
38
+ /** Detaches both listeners; safe to call twice. */
39
+ stop() {
40
+ this.actions.remove(this.onAction);
41
+ this.frames.remove(this.onFrame);
42
+ }
43
+ }
44
+ /**
45
+ * Re-dispatches recorded events at their recorded frames.
46
+ *
47
+ * ```ts
48
+ * const player = new Player(deserializeReplay(saved), (a) => Input.onAction.dispatch(a), game.onFrame);
49
+ * // ...drive the loop by hand: game.step(1 / 60) per frame...
50
+ * ```
51
+ *
52
+ * Events are dispatched on the frame signal whose count has reached their
53
+ * stamp, before the player's own count advances - the same relative point a
54
+ * live action held during recording. `dispatch` usually forwards into
55
+ * `Input.onAction`, but tests pass a collector instead.
56
+ */
57
+ export class Player {
58
+ constructor(events, dispatch, frames) {
59
+ this.frame = 0;
60
+ this.index = 0;
61
+ this.events = events;
62
+ this.dispatch = dispatch;
63
+ this.frames = frames;
64
+ this.onFrame = () => this.pump();
65
+ frames.add(this.onFrame);
66
+ }
67
+ /** True once every event has been dispatched. */
68
+ get done() {
69
+ return this.index >= this.events.length;
70
+ }
71
+ /** Detaches the frame listener; safe to call twice. */
72
+ stop() {
73
+ this.frames.remove(this.onFrame);
74
+ }
75
+ pump() {
76
+ while (this.index < this.events.length && this.events[this.index].frame <= this.frame) {
77
+ this.dispatch(this.events[this.index].action);
78
+ this.index++;
79
+ }
80
+ this.frame++;
81
+ }
82
+ }
83
+ export function serializeReplay(events) {
84
+ return JSON.stringify(events);
85
+ }
86
+ /** Parses what `serializeReplay` wrote, rejecting anything else. */
87
+ export function deserializeReplay(json) {
88
+ const parsed = JSON.parse(json);
89
+ if (!Array.isArray(parsed))
90
+ throw new Error('a replay must be an array of {frame, action}');
91
+ return parsed.map((entry) => {
92
+ if (typeof entry !== 'object' ||
93
+ entry === null ||
94
+ !Number.isInteger(entry.frame) ||
95
+ entry.frame < 0 ||
96
+ typeof entry.action !== 'string') {
97
+ throw new Error('a replay entry must be {frame: a non-negative integer, action: a string}');
98
+ }
99
+ return { frame: entry.frame, action: entry.action };
100
+ });
101
+ }
102
+ //# sourceMappingURL=Replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Replay.js","sourceRoot":"","sources":["../../src/core/Replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Named save slots, versioned, with a preview - built on plain, JSON-serialisable state
3
+ * rather than truly arbitrary object graphs. A game's own classes are expected to flatten
4
+ * themselves the same way `mwg/rpg`'s `GameState` already does (a `toJSON`/reviving
5
+ * constructor pair), not to be serialised by reference with cycles preserved; that is a
6
+ * different, much larger problem than a save system needs to solve.
7
+ */
8
+ export interface SaveMeta {
9
+ version: number;
10
+ savedAt: number;
11
+ /** whatever a save-select screen shows: a summary string, a screenshot data URI, anything */
12
+ preview?: unknown;
13
+ }
14
+ export interface SaveData<T> {
15
+ meta: SaveMeta;
16
+ state: T;
17
+ }
18
+ /** the storage a `SaveSystem` writes through - `localStorage`'s shape, so that is the default */
19
+ export interface SaveStorage {
20
+ read(key: string): string | null;
21
+ write(key: string, value: string): void;
22
+ remove(key: string): void;
23
+ keys(): string[];
24
+ }
25
+ /** `localStorage` where it exists, the in-memory fallback where it does not (including `file://`) */
26
+ export declare function defaultStorage(): SaveStorage;
27
+ export interface SaveSystemOptions {
28
+ /** namespaces every slot key, so two games sharing an origin never collide */
29
+ namespace: string;
30
+ version: number;
31
+ /** upgrades state saved at key `v` to version `v + 1`; applied in sequence up to `version` */
32
+ migrations?: Record<number, (state: unknown) => unknown>;
33
+ storage?: SaveStorage;
34
+ }
35
+ export declare class SaveSystem<T> {
36
+ private namespace;
37
+ private version;
38
+ private migrations;
39
+ private storage;
40
+ constructor(options: SaveSystemOptions);
41
+ private key;
42
+ save(slot: string, state: T, preview?: unknown): void;
43
+ /** reads a slot, migrating it up to the current version if it was saved at an older one */
44
+ load(slot: string): SaveData<T> | null;
45
+ delete(slot: string): void;
46
+ /** every slot with a save, and its metadata - for a save-select screen */
47
+ list(): Array<{
48
+ slot: string;
49
+ meta: SaveMeta;
50
+ }>;
51
+ }
52
+ //# sourceMappingURL=Save.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Save.d.ts","sourceRoot":"","sources":["../../src/core/Save.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,QAAQ;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAEhB,6FAA6F;IAC7F,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,CAAC,CAAC;CACT;AAED,iGAAiG;AACjG,MAAM,WAAW,WAAW;IAC3B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,IAAI,MAAM,EAAE,CAAC;CACjB;AAuBD,qGAAqG;AACrG,wBAAgB,cAAc,IAAI,WAAW,CAS5C;AAED,MAAM,WAAW,iBAAiB;IACjC,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAEhB,8FAA8F;IAC9F,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,qBAAa,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,OAAO,CAAc;IAE7B,YAAY,OAAO,EAAE,iBAAiB,EAKrC;IAED,OAAO,CAAC,GAAG;IAIX,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAGpD;IAED,2FAA2F;IAC3F,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAWrC;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEzB;IAED,0EAA0E;IAC1E,IAAI,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,CAY9C;CACD"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Named save slots, versioned, with a preview - built on plain, JSON-serialisable state
3
+ * rather than truly arbitrary object graphs. A game's own classes are expected to flatten
4
+ * themselves the same way `mwg/rpg`'s `GameState` already does (a `toJSON`/reviving
5
+ * constructor pair), not to be serialised by reference with cycles preserved; that is a
6
+ * different, much larger problem than a save system needs to solve.
7
+ */
8
+ /** an in-memory fallback, so saving still works where `localStorage` is unavailable */
9
+ class MemoryStorage {
10
+ constructor() {
11
+ this.data = new Map();
12
+ }
13
+ read(key) {
14
+ return this.data.get(key) ?? null;
15
+ }
16
+ write(key, value) {
17
+ this.data.set(key, value);
18
+ }
19
+ remove(key) {
20
+ this.data.delete(key);
21
+ }
22
+ keys() {
23
+ return [...this.data.keys()];
24
+ }
25
+ }
26
+ /** `localStorage` where it exists, the in-memory fallback where it does not (including `file://`) */
27
+ export function defaultStorage() {
28
+ if (typeof localStorage === 'undefined')
29
+ return new MemoryStorage();
30
+ return {
31
+ read: (key) => localStorage.getItem(key),
32
+ write: (key, value) => localStorage.setItem(key, value),
33
+ remove: (key) => localStorage.removeItem(key),
34
+ keys: () => Object.keys(localStorage),
35
+ };
36
+ }
37
+ export class SaveSystem {
38
+ constructor(options) {
39
+ this.namespace = options.namespace;
40
+ this.version = options.version;
41
+ this.migrations = options.migrations ?? {};
42
+ this.storage = options.storage ?? defaultStorage();
43
+ }
44
+ key(slot) {
45
+ return `mwg-save:${this.namespace}:${slot}`;
46
+ }
47
+ save(slot, state, preview) {
48
+ const data = { meta: { version: this.version, savedAt: Date.now(), preview }, state };
49
+ this.storage.write(this.key(slot), JSON.stringify(data));
50
+ }
51
+ /** reads a slot, migrating it up to the current version if it was saved at an older one */
52
+ load(slot) {
53
+ const raw = this.storage.read(this.key(slot));
54
+ if (!raw)
55
+ return null;
56
+ const data = JSON.parse(raw);
57
+ let state = data.state;
58
+ for (let v = data.meta.version; v < this.version; v++) {
59
+ state = (this.migrations[v] ?? ((s) => s))(state);
60
+ }
61
+ return { meta: { ...data.meta, version: this.version }, state: state };
62
+ }
63
+ delete(slot) {
64
+ this.storage.remove(this.key(slot));
65
+ }
66
+ /** every slot with a save, and its metadata - for a save-select screen */
67
+ list() {
68
+ const prefix = `mwg-save:${this.namespace}:`;
69
+ const out = [];
70
+ for (const key of this.storage.keys()) {
71
+ if (!key.startsWith(prefix))
72
+ continue;
73
+ const raw = this.storage.read(key);
74
+ if (!raw)
75
+ continue;
76
+ out.push({ slot: key.slice(prefix.length), meta: JSON.parse(raw).meta });
77
+ }
78
+ return out;
79
+ }
80
+ }
81
+ //# sourceMappingURL=Save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Save.js","sourceRoot":"","sources":["../../src/core/Save.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Container } from 'pixi.js';
2
+ import { Signal } from './Signal.ts';
3
+ /**
4
+ * One screen of the game: a title, a menu, the dungeon itself.
5
+ *
6
+ * A scene owns a Pixi container and everything in it. Switching scenes destroys the old
7
+ * one, so a scene may hold whatever state it likes without cleaning up by hand.
8
+ */
9
+ export declare abstract class Scene {
10
+ /** everything this scene draws hangs off here */
11
+ readonly stage: Container<import("pixi.js").ContainerChild>;
12
+ /** fires when the scene is torn down, for listeners that need to detach */
13
+ readonly onDestroy: Signal<void>;
14
+ private destroyed;
15
+ /** builds the scene's contents; assets are already loaded when this runs */
16
+ abstract create(): void;
17
+ /** @param dt seconds since the previous frame, already clamped */
18
+ update(_dt: number): void;
19
+ /** the display was resized; the scene may relayout rather than be rebuilt */
20
+ resize(_width: number, _height: number): void;
21
+ /**
22
+ * Called when another scene is pushed on top of this one.
23
+ *
24
+ * Updating already stops on its own - only the top scene runs - but input
25
+ * listeners do not stand down by themselves. A scene holding windows, music
26
+ * or key handlers pauses or detaches them here; the default does nothing.
27
+ */
28
+ onSuspend(): void;
29
+ /**
30
+ * Called when the scene above pops, reporting back what it decided.
31
+ *
32
+ * @param result whatever the popped scene passed to `popScene` - a choice,
33
+ * a score, or nothing at all. Games cast it to what their minigame returns.
34
+ */
35
+ onResume(_result: unknown): void;
36
+ destroy(): void;
37
+ get isDestroyed(): boolean;
38
+ }
39
+ export type SceneClass = new () => Scene;
40
+ //# sourceMappingURL=Scene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scene.d.ts","sourceRoot":"","sources":["../../src/core/Scene.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;GAKG;AACH,8BAAsB,KAAK;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,KAAK,8CAAmB;IAEjC,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,eAAsB;IAExC,OAAO,CAAC,SAAS,CAAS;IAE1B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC;IAExB,kEAAkE;IAClE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAExB;IAED,6EAA6E;IAC7E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE5C;IAED;;;;;;OAMG;IACH,SAAS,IAAI,IAAI,CAEhB;IAED;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE/B;IAED,OAAO,IAAI,IAAI,CAOd;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;CACD;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,KAAK,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { Container } from 'pixi.js';
2
+ import { Signal } from './Signal.js';
3
+ /**
4
+ * One screen of the game: a title, a menu, the dungeon itself.
5
+ *
6
+ * A scene owns a Pixi container and everything in it. Switching scenes destroys the old
7
+ * one, so a scene may hold whatever state it likes without cleaning up by hand.
8
+ */
9
+ export class Scene {
10
+ constructor() {
11
+ /** everything this scene draws hangs off here */
12
+ this.stage = new Container();
13
+ /** fires when the scene is torn down, for listeners that need to detach */
14
+ this.onDestroy = new Signal();
15
+ this.destroyed = false;
16
+ }
17
+ /** @param dt seconds since the previous frame, already clamped */
18
+ update(_dt) {
19
+ //scenes that only react to input need no per-frame work
20
+ }
21
+ /** the display was resized; the scene may relayout rather than be rebuilt */
22
+ resize(_width, _height) {
23
+ //most scenes lay out in create() and are rebuilt instead
24
+ }
25
+ /**
26
+ * Called when another scene is pushed on top of this one.
27
+ *
28
+ * Updating already stops on its own - only the top scene runs - but input
29
+ * listeners do not stand down by themselves. A scene holding windows, music
30
+ * or key handlers pauses or detaches them here; the default does nothing.
31
+ */
32
+ onSuspend() {
33
+ //scenes with nothing live need nothing stood down
34
+ }
35
+ /**
36
+ * Called when the scene above pops, reporting back what it decided.
37
+ *
38
+ * @param result whatever the popped scene passed to `popScene` - a choice,
39
+ * a score, or nothing at all. Games cast it to what their minigame returns.
40
+ */
41
+ onResume(_result) {
42
+ //scenes that pushed nothing back need nothing reported
43
+ }
44
+ destroy() {
45
+ if (this.destroyed)
46
+ return;
47
+ this.destroyed = true;
48
+ this.onDestroy.dispatch();
49
+ this.onDestroy.removeAll();
50
+ this.stage.destroy({ children: true });
51
+ }
52
+ get isDestroyed() {
53
+ return this.destroyed;
54
+ }
55
+ }
56
+ //# sourceMappingURL=Scene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scene.js","sourceRoot":"","sources":["../../src/core/Scene.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;GAKG;AACH,MAAM,OAAgB,KAAK;IAA3B;QACC,iDAAiD;QACxC,UAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAEjC,2EAA2E;QAClE,cAAS,GAAG,IAAI,MAAM,EAAQ,CAAC;QAEhC,cAAS,GAAG,KAAK,CAAC;IAgD3B,CAAC;IA3CA,kEAAkE;IAClE,MAAM,CAAC,GAAW;QACjB,wDAAwD;IACzD,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,MAAc,EAAE,OAAe;QACrC,yDAAyD;IAC1D,CAAC;IAED;;;;;;OAMG;IACH,SAAS;QACR,kDAAkD;IACnD,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,OAAgB;QACxB,uDAAuD;IACxD,CAAC;IAED,OAAO;QACN,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,WAAW;QACd,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;CACD"}
@@ -0,0 +1,37 @@
1
+ import type { Scene } from './Scene.ts';
2
+ /**
3
+ * The stack of scenes a `Game` runs: exactly one updates, all render.
4
+ *
5
+ * `switchScene` replaces the whole stack, for moving between screens.
6
+ * `pushScene` suspends the current scene and starts another on top of it - a
7
+ * minigame over the dungeon, a pause menu over play - and `popScene` destroys
8
+ * the top and resumes whatever was underneath, reporting back a result. Only
9
+ * the top scene updates; every scene in the stack stays in the display list, so
10
+ * a pushed scene can be translucent (layered *over*) or opaque (*instead of*).
11
+ *
12
+ * Takes instances, never classes: constructing scenes is the `Game`'s job, and
13
+ * keeping it out is what keeps this testable without a browser.
14
+ */
15
+ export declare class SceneStack {
16
+ private scenes;
17
+ /** the scene that updates, or null when the stack is empty */
18
+ get current(): Scene | null;
19
+ get depth(): number;
20
+ /** replaces everything with one scene, destroying what was there */
21
+ replace(scene: Scene): void;
22
+ /** suspends the current scene and starts another above it */
23
+ push(scene: Scene): void;
24
+ /**
25
+ * Destroys the top scene and resumes the one below with `result`.
26
+ *
27
+ * Throws when only one scene is left: popping it would leave the game with
28
+ * nothing to run, which is always an authoring error rather than intent.
29
+ */
30
+ pop(result?: unknown): void;
31
+ /** only the top scene runs; the suspended ones wait underneath */
32
+ update(dt: number): void;
33
+ /** every scene relayouts, including the suspended ones waiting underneath */
34
+ resize(width: number, height: number): void;
35
+ destroy(): void;
36
+ }
37
+ //# sourceMappingURL=SceneStack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneStack.d.ts","sourceRoot":"","sources":["../../src/core/SceneStack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,MAAM,CAAe;IAE7B,8DAA8D;IAC9D,IAAI,OAAO,IAAI,KAAK,GAAG,IAAI,CAE1B;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,oEAAoE;IACpE,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAI1B;IAED,6DAA6D;IAC7D,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAIvB;IAED;;;;;OAKG;IACH,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAO1B;IAED,kEAAkE;IAClE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEvB;IAED,6EAA6E;IAC7E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE1C;IAED,OAAO,IAAI,IAAI,CAGd;CACD"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The stack of scenes a `Game` runs: exactly one updates, all render.
3
+ *
4
+ * `switchScene` replaces the whole stack, for moving between screens.
5
+ * `pushScene` suspends the current scene and starts another on top of it - a
6
+ * minigame over the dungeon, a pause menu over play - and `popScene` destroys
7
+ * the top and resumes whatever was underneath, reporting back a result. Only
8
+ * the top scene updates; every scene in the stack stays in the display list, so
9
+ * a pushed scene can be translucent (layered *over*) or opaque (*instead of*).
10
+ *
11
+ * Takes instances, never classes: constructing scenes is the `Game`'s job, and
12
+ * keeping it out is what keeps this testable without a browser.
13
+ */
14
+ export class SceneStack {
15
+ constructor() {
16
+ this.scenes = [];
17
+ }
18
+ /** the scene that updates, or null when the stack is empty */
19
+ get current() {
20
+ return this.scenes.length === 0 ? null : this.scenes[this.scenes.length - 1];
21
+ }
22
+ get depth() {
23
+ return this.scenes.length;
24
+ }
25
+ /** replaces everything with one scene, destroying what was there */
26
+ replace(scene) {
27
+ for (const old of this.scenes)
28
+ old.destroy();
29
+ this.scenes = [scene];
30
+ scene.create();
31
+ }
32
+ /** suspends the current scene and starts another above it */
33
+ push(scene) {
34
+ this.current?.onSuspend();
35
+ this.scenes.push(scene);
36
+ scene.create();
37
+ }
38
+ /**
39
+ * Destroys the top scene and resumes the one below with `result`.
40
+ *
41
+ * Throws when only one scene is left: popping it would leave the game with
42
+ * nothing to run, which is always an authoring error rather than intent.
43
+ */
44
+ pop(result) {
45
+ if (this.scenes.length <= 1) {
46
+ throw new Error('cannot pop the last scene off the stack - switchScene somewhere instead');
47
+ }
48
+ const top = this.scenes.pop();
49
+ top?.destroy();
50
+ this.current?.onResume(result);
51
+ }
52
+ /** only the top scene runs; the suspended ones wait underneath */
53
+ update(dt) {
54
+ this.current?.update(dt);
55
+ }
56
+ /** every scene relayouts, including the suspended ones waiting underneath */
57
+ resize(width, height) {
58
+ for (const scene of this.scenes)
59
+ scene.resize(width, height);
60
+ }
61
+ destroy() {
62
+ for (const scene of this.scenes)
63
+ scene.destroy();
64
+ this.scenes = [];
65
+ }
66
+ }
67
+ //# sourceMappingURL=SceneStack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneStack.js","sourceRoot":"","sources":["../../src/core/SceneStack.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,UAAU;IAAvB;QACS,WAAM,GAAY,EAAE,CAAC;IAsD9B,CAAC;IApDA,8DAA8D;IAC9D,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,oEAAoE;IACpE,OAAO,CAAC,KAAY;QACnB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM;YAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,KAAK,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,6DAA6D;IAC7D,IAAI,CAAC,KAAY;QAChB,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,KAAK,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,MAAgB;QACnB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAC9B,GAAG,EAAE,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,kEAAkE;IAClE,MAAM,CAAC,EAAU;QAChB,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,KAAa,EAAE,MAAc;QACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO;QACN,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IAClB,CAAC;CACD"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * A list of listeners that can consume an event.
3
+ *
4
+ * Unlike a DOM event, a listener returning `true` stops the dispatch. Input handling in a
5
+ * roguelike needs that: a modal window has to be able to swallow a keypress before the map
6
+ * below it sees it.
7
+ */
8
+ export type SignalListener<T> = (value: T) => boolean | void;
9
+ export declare class Signal<T> {
10
+ private listeners;
11
+ private readonly stackMode;
12
+ /**
13
+ * @param stackMode when true, new listeners are added at the front rather than the
14
+ * back, so the most recently opened window is offered the event first.
15
+ */
16
+ constructor(stackMode?: boolean);
17
+ add(listener: SignalListener<T>): void;
18
+ remove(listener: SignalListener<T>): void;
19
+ removeAll(): void;
20
+ get size(): number;
21
+ /** @returns true if a listener consumed the event */
22
+ dispatch(value: T): boolean;
23
+ }
24
+ //# sourceMappingURL=Signal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Signal.d.ts","sourceRoot":"","sources":["../../src/core/Signal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;AAE7D,qBAAa,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IAEpC;;;OAGG;IACH,YAAY,SAAS,UAAQ,EAE5B;IAED,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAKrC;IAED,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAGxC;IAED,SAAS,IAAI,IAAI,CAEhB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAS1B;CACD"}
@@ -0,0 +1,41 @@
1
+ export class Signal {
2
+ /**
3
+ * @param stackMode when true, new listeners are added at the front rather than the
4
+ * back, so the most recently opened window is offered the event first.
5
+ */
6
+ constructor(stackMode = false) {
7
+ this.listeners = [];
8
+ this.stackMode = stackMode;
9
+ }
10
+ add(listener) {
11
+ if (!this.listeners.includes(listener)) {
12
+ if (this.stackMode)
13
+ this.listeners.unshift(listener);
14
+ else
15
+ this.listeners.push(listener);
16
+ }
17
+ }
18
+ remove(listener) {
19
+ const i = this.listeners.indexOf(listener);
20
+ if (i !== -1)
21
+ this.listeners.splice(i, 1);
22
+ }
23
+ removeAll() {
24
+ this.listeners.length = 0;
25
+ }
26
+ get size() {
27
+ return this.listeners.length;
28
+ }
29
+ /** @returns true if a listener consumed the event */
30
+ dispatch(value) {
31
+ //iterating a copy lets a listener remove itself, or others, mid-dispatch
32
+ const snapshot = this.listeners.slice();
33
+ for (const listener of snapshot) {
34
+ if (this.listeners.includes(listener) && listener(value) === true) {
35
+ return true;
36
+ }
37
+ }
38
+ return false;
39
+ }
40
+ }
41
+ //# sourceMappingURL=Signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Signal.js","sourceRoot":"","sources":["../../src/core/Signal.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,MAAM;IAIlB;;;OAGG;IACH,YAAY,SAAS,GAAG,KAAK;QAPrB,cAAS,GAAwB,EAAE,CAAC;QAQ3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,GAAG,CAAC,QAA2B;QAC9B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,SAAS;gBAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;;gBAChD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACF,CAAC;IAED,MAAM,CAAC,QAA2B;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,SAAS;QACR,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,qDAAqD;IACrD,QAAQ,CAAC,KAAQ;QAChB,yEAAyE;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACxC,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;gBACnE,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;CACD"}