@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,20 @@
1
+ /**
2
+ * A weighted encounter table, checked once per step - what decides that walking through
3
+ * tall grass sometimes meets a wild creature and usually does not, and that a rarer species
4
+ * turns up less often than a common one.
5
+ *
6
+ * Built on `mwg/core`'s `Random.chance` and `Random.weighted` rather than its own dice, so
7
+ * an encounter roll is seeded and reproducible the same way everything else in a run is.
8
+ */
9
+ export interface EncounterEntry<T> {
10
+ value: T;
11
+ weight: number;
12
+ }
13
+ export interface EncounterTable<T> {
14
+ entries: readonly EncounterEntry<T>[];
15
+ /** probability of any encounter at all, per step, 0 to 1 */
16
+ rate: number;
17
+ }
18
+ /** @returns the encounter for this step, or null when the roll misses or the table is empty */
19
+ export declare function rollEncounter<T>(table: EncounterTable<T>): T | null;
20
+ //# sourceMappingURL=Encounters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Encounters.d.ts","sourceRoot":"","sources":["../../src/world/Encounters.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAChC,KAAK,EAAE,CAAC,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAChC,OAAO,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtC,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;CACb;AAED,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAKnE"}
@@ -0,0 +1,9 @@
1
+ import * as Random from '../core/Random.js';
2
+ /** @returns the encounter for this step, or null when the roll misses or the table is empty */
3
+ export function rollEncounter(table) {
4
+ if (table.entries.length === 0 || !Random.chance(table.rate))
5
+ return null;
6
+ const index = Random.weighted(table.entries.map((entry) => entry.weight));
7
+ return index === -1 ? null : table.entries[index].value;
8
+ }
9
+ //# sourceMappingURL=Encounters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Encounters.js","sourceRoot":"","sources":["../../src/world/Encounters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAsB5C,+FAA+F;AAC/F,MAAM,UAAU,aAAa,CAAI,KAAwB;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1E,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACzD,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * A named point on a map that leads somewhere else - a town gate, a cave mouth, a dungeon
3
+ * entrance on the overworld. This is the shared floor `mwg/rpg`'s tile events (item pages,
4
+ * triggers) will sit on top of later; on its own it is just the lookup, by position or by
5
+ * name, that turns "the player stepped here" into "which map, and which spawn, is next".
6
+ */
7
+ export interface Location {
8
+ id: string;
9
+ x: number;
10
+ y: number;
11
+ /** the map id this location leads to */
12
+ leadsTo: string;
13
+ /** the spawn point to enter that map at, passed straight to `World.enter` */
14
+ spawn?: string;
15
+ }
16
+ export declare class Overworld {
17
+ private locations;
18
+ add(location: Location): void;
19
+ remove(id: string): void;
20
+ get(id: string): Location | undefined;
21
+ /** the location at these exact coordinates, if any - for "the player stepped onto it" */
22
+ at(x: number, y: number): Location | undefined;
23
+ get all(): readonly Location[];
24
+ }
25
+ //# sourceMappingURL=Overworld.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Overworld.d.ts","sourceRoot":"","sources":["../../src/world/Overworld.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IAEV,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAEhB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,SAAS;IACrB,OAAO,CAAC,SAAS,CAA+B;IAEhD,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAE5B;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEvB;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAEpC;IAED,yFAAyF;IACzF,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAK7C;IAED,IAAI,GAAG,IAAI,SAAS,QAAQ,EAAE,CAE7B;CACD"}
@@ -0,0 +1,26 @@
1
+ export class Overworld {
2
+ constructor() {
3
+ this.locations = new Map();
4
+ }
5
+ add(location) {
6
+ this.locations.set(location.id, location);
7
+ }
8
+ remove(id) {
9
+ this.locations.delete(id);
10
+ }
11
+ get(id) {
12
+ return this.locations.get(id);
13
+ }
14
+ /** the location at these exact coordinates, if any - for "the player stepped onto it" */
15
+ at(x, y) {
16
+ for (const location of this.locations.values()) {
17
+ if (location.x === x && location.y === y)
18
+ return location;
19
+ }
20
+ return undefined;
21
+ }
22
+ get all() {
23
+ return [...this.locations.values()];
24
+ }
25
+ }
26
+ //# sourceMappingURL=Overworld.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Overworld.js","sourceRoot":"","sources":["../../src/world/Overworld.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,SAAS;IAAtB;QACS,cAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAyBjD,CAAC;IAvBA,GAAG,CAAC,QAAkB;QACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,EAAU;QAChB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,EAAU;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,yFAAyF;IACzF,EAAE,CAAC,CAAS,EAAE,CAAS;QACtB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAChD,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAC;QAC3D,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,IAAI,GAAG;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;CACD"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The slower clock a roguelike's hunger, poison and other long-running effects run on -
3
+ * distinct from `mwg/roguelike`'s `Scheduler`, which decides who acts next *within* a turn.
4
+ * `TurnClock` counts turns that have already happened and drives whatever should happen
5
+ * once per turn, or run out after a fixed number of them, regardless of who took the turn.
6
+ */
7
+ export interface TimedEffect {
8
+ /** called once per `advance`, with the clock's new total */
9
+ tick: (turn: number) => void;
10
+ /** turns remaining before this effect is removed automatically; omit to run forever */
11
+ duration?: number;
12
+ /** called once, the moment `duration` runs out, right before the effect is removed */
13
+ onExpire?: () => void;
14
+ }
15
+ export declare class TurnClock {
16
+ turn: number;
17
+ private effects;
18
+ /** registers an effect and returns a handle for `remove` */
19
+ add(effect: TimedEffect): symbol;
20
+ remove(id: symbol): void;
21
+ has(id: symbol): boolean;
22
+ /** advances the clock and ticks every effect, removing any whose duration has elapsed */
23
+ advance(turns?: number): void;
24
+ }
25
+ //# sourceMappingURL=TurnClock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurnClock.d.ts","sourceRoot":"","sources":["../../src/world/TurnClock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC3B,4DAA4D;IAC5D,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7B,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,qBAAa,SAAS;IACrB,IAAI,SAAK;IAET,OAAO,CAAC,OAAO,CAAkC;IAEjD,4DAA4D;IAC5D,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAI/B;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEvB;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvB;IAED,yFAAyF;IACzF,OAAO,CAAC,KAAK,SAAI,GAAG,IAAI,CAcvB;CACD"}
@@ -0,0 +1,33 @@
1
+ export class TurnClock {
2
+ constructor() {
3
+ this.turn = 0;
4
+ this.effects = new Map();
5
+ }
6
+ /** registers an effect and returns a handle for `remove` */
7
+ add(effect) {
8
+ const id = Symbol();
9
+ this.effects.set(id, { ...effect });
10
+ return id;
11
+ }
12
+ remove(id) {
13
+ this.effects.delete(id);
14
+ }
15
+ has(id) {
16
+ return this.effects.has(id);
17
+ }
18
+ /** advances the clock and ticks every effect, removing any whose duration has elapsed */
19
+ advance(turns = 1) {
20
+ this.turn += turns;
21
+ for (const [id, effect] of this.effects) {
22
+ effect.tick(this.turn);
23
+ if (effect.duration !== undefined) {
24
+ effect.duration -= turns;
25
+ if (effect.duration <= 0) {
26
+ this.effects.delete(id);
27
+ effect.onExpire?.();
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
33
+ //# sourceMappingURL=TurnClock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurnClock.js","sourceRoot":"","sources":["../../src/world/TurnClock.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAO,SAAS;IAAtB;QACC,SAAI,GAAG,CAAC,CAAC;QAED,YAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAiClD,CAAC;IA/BA,4DAA4D;IAC5D,GAAG,CAAC,MAAmB;QACtB,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QACpC,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,CAAC,EAAU;QAChB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,GAAG,CAAC,EAAU;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,yFAAyF;IACzF,OAAO,CAAC,KAAK,GAAG,CAAC;QAChB,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;QAEnB,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEvB,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACnC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC;gBACzB,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACxB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACrB,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Many maps in one world, joined by transitions.
3
+ *
4
+ * `mwg` deliberately does not say what a "map" is here - a `TileMap` and a `Level`, a
5
+ * `DialogueStage`, or a game's own bundle of the two. What `World` owns is the part that is
6
+ * the same regardless: a map is created from a factory registered by id, and by default kept
7
+ * alive for as long as the world exists - so a monster left half-dead in a dungeon room is
8
+ * still half-dead when the player wanders back in, without the game writing that by hand.
9
+ *
10
+ * That default is ADOM's shape, not every game's. A game with SPD's shape - most floors are
11
+ * never revisited, and the ones that are should feel new - marks those maps
12
+ * `persistent: false` at `define` time: `enter` then rebuilds them from the factory every
13
+ * time, discarding whatever was there. Both live in the same `World`; a game's overworld and
14
+ * towns can stay persistent while its dungeon floors do not.
15
+ */
16
+ export declare class World<M> {
17
+ private factories;
18
+ private loaded;
19
+ private currentId;
20
+ private lastSpawn;
21
+ /**
22
+ * Registers how to build a map.
23
+ *
24
+ * @param persistent false rebuilds the map from `create` on every `enter`, discarding
25
+ * its previous state - the default, true, keeps it alive for as long as `World` does
26
+ */
27
+ define(id: string, create: () => M, options?: {
28
+ persistent?: boolean;
29
+ }): void;
30
+ /**
31
+ * Switches to a map - creating it on first entry, reusing it on every one after unless
32
+ * it was defined `persistent: false`, in which case every entry rebuilds it.
33
+ *
34
+ * @param spawn a named entry point within the target map; the game reads it back from
35
+ * `World.spawn` to know where to place the player - `World` does not know what a
36
+ * position is, only that one was asked for
37
+ */
38
+ enter(id: string, spawn?: string): M;
39
+ get current(): M | null;
40
+ get currentMapId(): string | null;
41
+ /** the spawn point passed to the most recent `enter`, for the game to place its player by */
42
+ get spawn(): string | undefined;
43
+ /** true once a map has been created, whether or not it is the current one */
44
+ isLoaded(id: string): boolean;
45
+ /** true if this id was `define`d with `persistent: false` */
46
+ isPersistent(id: string): boolean;
47
+ /** drops a map's live state, so its factory builds a fresh one next time it is entered */
48
+ unload(id: string): void;
49
+ }
50
+ //# sourceMappingURL=World.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"World.d.ts","sourceRoot":"","sources":["../../src/world/World.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;GAcG;AACH,qBAAa,KAAK,CAAC,CAAC;IACnB,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,MAAM,CAAwB;IAEtC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAqB;IAEtC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI,CAEhF;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAanC;IAED,IAAI,OAAO,IAAI,CAAC,GAAG,IAAI,CAEtB;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAEhC;IAED,6FAA6F;IAC7F,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE5B;IAED,6DAA6D;IAC7D,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEhC;IAED,0FAA0F;IAC1F,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAGvB;CACD"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Many maps in one world, joined by transitions.
3
+ *
4
+ * `mwg` deliberately does not say what a "map" is here - a `TileMap` and a `Level`, a
5
+ * `DialogueStage`, or a game's own bundle of the two. What `World` owns is the part that is
6
+ * the same regardless: a map is created from a factory registered by id, and by default kept
7
+ * alive for as long as the world exists - so a monster left half-dead in a dungeon room is
8
+ * still half-dead when the player wanders back in, without the game writing that by hand.
9
+ *
10
+ * That default is ADOM's shape, not every game's. A game with SPD's shape - most floors are
11
+ * never revisited, and the ones that are should feel new - marks those maps
12
+ * `persistent: false` at `define` time: `enter` then rebuilds them from the factory every
13
+ * time, discarding whatever was there. Both live in the same `World`; a game's overworld and
14
+ * towns can stay persistent while its dungeon floors do not.
15
+ */
16
+ export class World {
17
+ constructor() {
18
+ this.factories = new Map();
19
+ this.loaded = new Map();
20
+ this.currentId = null;
21
+ }
22
+ /**
23
+ * Registers how to build a map.
24
+ *
25
+ * @param persistent false rebuilds the map from `create` on every `enter`, discarding
26
+ * its previous state - the default, true, keeps it alive for as long as `World` does
27
+ */
28
+ define(id, create, options = {}) {
29
+ this.factories.set(id, { create, persistent: options.persistent ?? true });
30
+ }
31
+ /**
32
+ * Switches to a map - creating it on first entry, reusing it on every one after unless
33
+ * it was defined `persistent: false`, in which case every entry rebuilds it.
34
+ *
35
+ * @param spawn a named entry point within the target map; the game reads it back from
36
+ * `World.spawn` to know where to place the player - `World` does not know what a
37
+ * position is, only that one was asked for
38
+ */
39
+ enter(id, spawn) {
40
+ const definition = this.factories.get(id);
41
+ if (!definition)
42
+ throw new Error(`no such map: "${id}"`);
43
+ let map = this.loaded.get(id);
44
+ if (!map || !definition.persistent) {
45
+ map = definition.create();
46
+ this.loaded.set(id, map);
47
+ }
48
+ this.currentId = id;
49
+ this.lastSpawn = spawn;
50
+ return map;
51
+ }
52
+ get current() {
53
+ return this.currentId ? (this.loaded.get(this.currentId) ?? null) : null;
54
+ }
55
+ get currentMapId() {
56
+ return this.currentId;
57
+ }
58
+ /** the spawn point passed to the most recent `enter`, for the game to place its player by */
59
+ get spawn() {
60
+ return this.lastSpawn;
61
+ }
62
+ /** true once a map has been created, whether or not it is the current one */
63
+ isLoaded(id) {
64
+ return this.loaded.has(id);
65
+ }
66
+ /** true if this id was `define`d with `persistent: false` */
67
+ isPersistent(id) {
68
+ return this.factories.get(id)?.persistent ?? true;
69
+ }
70
+ /** drops a map's live state, so its factory builds a fresh one next time it is entered */
71
+ unload(id) {
72
+ if (id === this.currentId)
73
+ throw new Error(`cannot unload the current map: "${id}"`);
74
+ this.loaded.delete(id);
75
+ }
76
+ }
77
+ //# sourceMappingURL=World.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"World.js","sourceRoot":"","sources":["../../src/world/World.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,KAAK;IAAlB;QACS,cAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;QAChD,WAAM,GAAG,IAAI,GAAG,EAAa,CAAC;QAE9B,cAAS,GAAkB,IAAI,CAAC;IAgEzC,CAAC;IA7DA;;;;;OAKG;IACH,MAAM,CAAC,EAAU,EAAE,MAAe,EAAE,OAAO,GAA6B,EAAE;QACzE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,EAAU,EAAE,KAAc;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QAEzD,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACpC,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,CAAC;IAED,IAAI,YAAY;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,6FAA6F;IAC7F,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,6EAA6E;IAC7E,QAAQ,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,6DAA6D;IAC7D,YAAY,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,UAAU,IAAI,IAAI,CAAC;IACnD,CAAC;IAED,0FAA0F;IAC1F,MAAM,CAAC,EAAU;QAChB,IAAI,EAAE,KAAK,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;QACrF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;CACD"}
@@ -0,0 +1,8 @@
1
+ export { World } from './World.ts';
2
+ export { Overworld } from './Overworld.ts';
3
+ export type { Location } from './Overworld.ts';
4
+ export { TurnClock } from './TurnClock.ts';
5
+ export type { TimedEffect } from './TurnClock.ts';
6
+ export { rollEncounter } from './Encounters.ts';
7
+ export type { EncounterEntry, EncounterTable } from './Encounters.ts';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/world/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { World } from './World.js';
2
+ export { Overworld } from './Overworld.js';
3
+ export { TurnClock } from './TurnClock.js';
4
+ export { rollEncounter } from './Encounters.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/world/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@datamoc/mw_games",
3
+ "version": "0.1.1",
4
+ "description": "A framework for building 2D top-down games that run from a local file, with no server and no install.",
5
+ "license": "MPL-2.0",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "tools/compile-resources.mjs",
14
+ "LICENSE",
15
+ "README.md"
16
+ ],
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ },
22
+ "./core": "./dist/core/index.js",
23
+ "./render": "./dist/render/index.js",
24
+ "./roguelike": "./dist/roguelike/index.js",
25
+ "./assets": "./dist/assets/index.js",
26
+ "./tools/compile-resources": "./tools/compile-resources.mjs",
27
+ "./ui": "./dist/ui/index.js",
28
+ "./stage": "./dist/stage/index.js",
29
+ "./i18n": "./dist/i18n/index.js",
30
+ "./actors": "./dist/actors/index.js",
31
+ "./world": "./dist/world/index.js",
32
+ "./rpg": "./dist/rpg/index.js",
33
+ "./battle": "./dist/battle/index.js",
34
+ "./board": "./dist/board/index.js",
35
+ "./audio": "./dist/audio/index.js"
36
+ },
37
+ "scripts": {
38
+ "build": "npm run build:pkg && npm run build:global",
39
+ "build:pkg": "tsc -p tsconfig.build.json",
40
+ "build:global": "vite build --config vite.lib.config.ts",
41
+ "check": "tsc --noEmit",
42
+ "example": "vite --config examples/colour-transform/vite.config.ts",
43
+ "example:build": "vite build --config examples/colour-transform/vite.config.ts && node tools/emit-page.mjs examples/colour-transform",
44
+ "test": "node --test \"tests/**/*.test.ts\"",
45
+ "assets": "node tools/make-example-assets.mjs",
46
+ "extract:rgssad": "node tools/extract-rgssad.mjs",
47
+ "example:ui": "vite --config examples/interface/vite.config.ts",
48
+ "example:ui:build": "vite build --config examples/interface/vite.config.ts && node tools/emit-page.mjs examples/interface",
49
+ "example:dialogue": "vite --config examples/dialogue/vite.config.ts",
50
+ "example:dialogue:build": "vite build --config examples/dialogue/vite.config.ts && node tools/emit-page.mjs examples/dialogue",
51
+ "example:dungeon": "vite --config examples/dungeon/vite.config.ts",
52
+ "example:dungeon:build": "vite build --config examples/dungeon/vite.config.ts && node tools/emit-page.mjs examples/dungeon",
53
+ "example:village": "vite --config examples/village/vite.config.ts",
54
+ "example:village:build": "vite build --config examples/village/vite.config.ts && node tools/emit-page.mjs examples/village",
55
+ "example:battle": "vite --config examples/battle/vite.config.ts",
56
+ "example:battle:build": "vite build --config examples/battle/vite.config.ts && node tools/emit-page.mjs examples/battle",
57
+ "example:minigame": "vite --config examples/minigame/vite.config.ts",
58
+ "example:minigame:build": "vite build --config examples/minigame/vite.config.ts && node tools/emit-page.mjs examples/minigame",
59
+ "example:chess": "vite --config examples/chess/vite.config.ts",
60
+ "example:chess:build": "vite build --config examples/chess/vite.config.ts && node tools/emit-page.mjs examples/chess",
61
+ "webpage:examples": "node tools/build-webpage-examples.mjs",
62
+ "webpage:docs": "node tools/build-webpage-docs.mjs"
63
+ },
64
+ "dependencies": {
65
+ "pixi.js": "^8.20.1",
66
+ "rot-js": "^2.2.1"
67
+ },
68
+ "devDependencies": {
69
+ "@types/node": "^26.4.1",
70
+ "typescript": "^7.0.2",
71
+ "vite": "^8.2.2"
72
+ },
73
+ "main": "./dist/index.js",
74
+ "types": "./dist/index.d.ts",
75
+ "unpkg": "./dist/mw_games.global.js"
76
+ }
@@ -0,0 +1,129 @@
1
+ import { readdir, readFile, mkdir, writeFile, rm } from 'node:fs/promises';
2
+ import { join, extname, relative, sep, dirname, basename } from 'node:path';
3
+
4
+ /**
5
+ * Turns a folder of assets into scripts a `file://` page can load.
6
+ *
7
+ * Opening a page from disk removes three things a normal web game relies on:
8
+ *
9
+ * - `fetch()` and XHR are blocked, so nothing can be loaded on demand and no directory
10
+ * can be listed;
11
+ * - ES modules are blocked by CORS, so the page cannot use a module loader;
12
+ * - an `<img>` read from a sibling file counts as cross-origin in Chrome, so uploading
13
+ * it into a WebGL texture throws a SecurityError.
14
+ *
15
+ * The last one is the awkward one: even shipping plain .png files next to the page does
16
+ * not work. What does work is a `<script src>`, which is exempt from those rules. So each
17
+ * asset becomes a `data:` URI inside a generated script, grouped by folder so no single
18
+ * file is enormous and a rebuild only rewrites what changed.
19
+ *
20
+ * The result is a global `__MWG_ASSETS__` mapping asset path to `data:` URI, which
21
+ * `mwg/assets` reads.
22
+ */
23
+
24
+ export const DEFAULT_MIME = {
25
+ '.png': 'image/png',
26
+ '.jpg': 'image/jpeg',
27
+ '.jpeg': 'image/jpeg',
28
+ '.webp': 'image/webp',
29
+ '.gif': 'image/gif',
30
+ '.svg': 'image/svg+xml',
31
+ '.wav': 'audio/wav',
32
+ '.ogg': 'audio/ogg',
33
+ '.mp3': 'audio/mpeg',
34
+ '.ttf': 'font/ttf',
35
+ '.woff2': 'font/woff2',
36
+ '.json': 'application/json',
37
+ '.txt': 'text/plain',
38
+ };
39
+
40
+ async function* walk(dir) {
41
+ let entries;
42
+ try {
43
+ entries = await readdir(dir, { withFileTypes: true });
44
+ } catch {
45
+ return;
46
+ }
47
+ for (const entry of entries) {
48
+ const full = join(dir, entry.name);
49
+ if (entry.isDirectory()) yield* walk(full);
50
+ else yield full;
51
+ }
52
+ }
53
+
54
+ /**
55
+ * @param options.from folder holding the assets
56
+ * @param options.to folder to write the generated scripts into
57
+ * @param options.mime extension to MIME type, merged over the defaults
58
+ * @param options.groupBy how to name the script an asset lands in; defaults to its top folder
59
+ * @returns the group names, in the order the page should load them
60
+ */
61
+ export async function compileResources({ from, to, mime = {}, groupBy } = {}) {
62
+ if (!from || !to) throw new Error('compileResources needs both `from` and `to`');
63
+
64
+ const types = { ...DEFAULT_MIME, ...mime };
65
+ const group = groupBy ?? ((key) => (key.includes('/') ? key.slice(0, key.indexOf('/')) : 'assets'));
66
+
67
+ await rm(to, { recursive: true, force: true });
68
+ await mkdir(to, { recursive: true });
69
+
70
+ const groups = new Map();
71
+ let skipped = 0;
72
+ let rawBytes = 0;
73
+
74
+ for await (const file of walk(from)) {
75
+ const type = types[extname(file).toLowerCase()];
76
+ if (!type) {
77
+ skipped++;
78
+ continue;
79
+ }
80
+
81
+ const key = relative(from, file).split(sep).join('/');
82
+ const data = await readFile(file);
83
+
84
+ const name = group(key);
85
+ if (!groups.has(name)) groups.set(name, {});
86
+ groups.get(name)[key] = `data:${type};base64,${data.toString('base64')}`;
87
+ rawBytes += data.length;
88
+ }
89
+
90
+ const written = [];
91
+ for (const [name, assets] of groups) {
92
+ const js =
93
+ '//generated by mwg/tools/compile-resources, do not edit\n' +
94
+ '(function(){var a=window.__MWG_ASSETS__||(window.__MWG_ASSETS__={});' +
95
+ `var g=${JSON.stringify(assets)};for(var k in g)a[k]=g[k];})();\n`;
96
+
97
+ await writeFile(join(to, `${name}.js`), js, 'utf8');
98
+ written.push({ name, count: Object.keys(assets).length, size: js.length });
99
+ }
100
+
101
+ return { groups: written, rawBytes, skipped };
102
+ }
103
+
104
+ // ---------------------------------------------------------------- CLI
105
+
106
+ const isMain = process.argv[1] && import.meta.url.endsWith(basename(process.argv[1]));
107
+
108
+ if (isMain) {
109
+ const [from, to] = process.argv.slice(2);
110
+ if (!from || !to) {
111
+ console.error('usage: node compile-resources.mjs <asset folder> <output folder>');
112
+ process.exit(1);
113
+ }
114
+
115
+ const { groups, rawBytes, skipped } = await compileResources({
116
+ from,
117
+ to,
118
+ //a flat folder has no subdirectories to group by, so everything lands in one file
119
+ groupBy: (key) => (key.includes('/') ? key.slice(0, key.indexOf('/')) : 'assets'),
120
+ });
121
+
122
+ const kb = (n) => (n / 1024).toFixed(1).padStart(8) + ' KB';
123
+ for (const { name, count, size } of groups) {
124
+ console.log(` ${join(relative(process.cwd(), to), name + '.js').padEnd(40)}${kb(size)} (${count} files)`);
125
+ }
126
+ console.log(` ${groups.length} script(s), ${kb(rawBytes)} of assets` + (skipped ? `, ${skipped} skipped` : ''));
127
+ }
128
+
129
+ export { dirname };