@datamoc/mw_games 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/README.md +57 -32
  2. package/dist/actors/Appearances.js +1 -1
  3. package/dist/actors/Aura.d.ts +29 -0
  4. package/dist/actors/Aura.d.ts.map +1 -0
  5. package/dist/actors/Aura.js +69 -0
  6. package/dist/actors/Aura.js.map +1 -0
  7. package/dist/actors/ItemStatusEffect.d.ts +27 -0
  8. package/dist/actors/ItemStatusEffect.d.ts.map +1 -0
  9. package/dist/actors/ItemStatusEffect.js +35 -0
  10. package/dist/actors/ItemStatusEffect.js.map +1 -0
  11. package/dist/actors/Resource.d.ts.map +1 -1
  12. package/dist/actors/Resource.js +13 -5
  13. package/dist/actors/Resource.js.map +1 -1
  14. package/dist/actors/Support.d.ts +32 -0
  15. package/dist/actors/Support.d.ts.map +1 -0
  16. package/dist/actors/Support.js +60 -0
  17. package/dist/actors/Support.js.map +1 -0
  18. package/dist/actors/Traits.d.ts +29 -0
  19. package/dist/actors/Traits.d.ts.map +1 -0
  20. package/dist/actors/Traits.js +21 -0
  21. package/dist/actors/Traits.js.map +1 -0
  22. package/dist/actors/craft.d.ts.map +1 -1
  23. package/dist/actors/craft.js +6 -2
  24. package/dist/actors/craft.js.map +1 -1
  25. package/dist/actors/index.d.ts +8 -0
  26. package/dist/actors/index.d.ts.map +1 -1
  27. package/dist/actors/index.js +4 -0
  28. package/dist/actors/index.js.map +1 -1
  29. package/dist/assets/Streaming.d.ts +40 -0
  30. package/dist/assets/Streaming.d.ts.map +1 -0
  31. package/dist/assets/Streaming.js +79 -0
  32. package/dist/assets/Streaming.js.map +1 -0
  33. package/dist/assets/index.d.ts +14 -1
  34. package/dist/assets/index.d.ts.map +1 -1
  35. package/dist/assets/index.js +19 -0
  36. package/dist/assets/index.js.map +1 -1
  37. package/dist/audio/Captions.d.ts +15 -0
  38. package/dist/audio/Captions.d.ts.map +1 -0
  39. package/dist/audio/Captions.js +4 -0
  40. package/dist/audio/Captions.js.map +1 -0
  41. package/dist/audio/Midi.d.ts +75 -0
  42. package/dist/audio/Midi.d.ts.map +1 -0
  43. package/dist/audio/Midi.js +186 -0
  44. package/dist/audio/Midi.js.map +1 -0
  45. package/dist/audio/Orchestrator.d.ts +40 -0
  46. package/dist/audio/Orchestrator.d.ts.map +1 -0
  47. package/dist/audio/Orchestrator.js +48 -0
  48. package/dist/audio/Orchestrator.js.map +1 -0
  49. package/dist/audio/Sound.d.ts +3 -0
  50. package/dist/audio/Sound.d.ts.map +1 -1
  51. package/dist/audio/Sound.js +4 -0
  52. package/dist/audio/Sound.js.map +1 -1
  53. package/dist/audio/Synth.d.ts +35 -0
  54. package/dist/audio/Synth.d.ts.map +1 -0
  55. package/dist/audio/Synth.js +96 -0
  56. package/dist/audio/Synth.js.map +1 -0
  57. package/dist/audio/index.d.ts +8 -0
  58. package/dist/audio/index.d.ts.map +1 -1
  59. package/dist/audio/index.js +4 -0
  60. package/dist/audio/index.js.map +1 -1
  61. package/dist/battle/Party.d.ts.map +1 -1
  62. package/dist/battle/Party.js +2 -0
  63. package/dist/battle/Party.js.map +1 -1
  64. package/dist/board/Army.d.ts +17 -0
  65. package/dist/board/Army.d.ts.map +1 -0
  66. package/dist/board/Army.js +48 -0
  67. package/dist/board/Army.js.map +1 -0
  68. package/dist/board/Classics.d.ts.map +1 -1
  69. package/dist/board/Classics.js +14 -6
  70. package/dist/board/Classics.js.map +1 -1
  71. package/dist/board/FogOfWar.d.ts +23 -0
  72. package/dist/board/FogOfWar.d.ts.map +1 -0
  73. package/dist/board/FogOfWar.js +40 -0
  74. package/dist/board/FogOfWar.js.map +1 -0
  75. package/dist/board/Tactics.d.ts +2 -0
  76. package/dist/board/Tactics.d.ts.map +1 -1
  77. package/dist/board/Tactics.js +36 -8
  78. package/dist/board/Tactics.js.map +1 -1
  79. package/dist/board/index.d.ts +5 -1
  80. package/dist/board/index.d.ts.map +1 -1
  81. package/dist/board/index.js +3 -1
  82. package/dist/board/index.js.map +1 -1
  83. package/dist/core/Feedback.d.ts +23 -0
  84. package/dist/core/Feedback.d.ts.map +1 -0
  85. package/dist/core/Feedback.js +35 -0
  86. package/dist/core/Feedback.js.map +1 -0
  87. package/dist/core/Game.d.ts +27 -1
  88. package/dist/core/Game.d.ts.map +1 -1
  89. package/dist/core/Game.js +61 -5
  90. package/dist/core/Game.js.map +1 -1
  91. package/dist/core/Input.d.ts +59 -1
  92. package/dist/core/Input.d.ts.map +1 -1
  93. package/dist/core/Input.js +135 -0
  94. package/dist/core/Input.js.map +1 -1
  95. package/dist/core/Loading.d.ts +48 -0
  96. package/dist/core/Loading.d.ts.map +1 -0
  97. package/dist/core/Loading.js +102 -0
  98. package/dist/core/Loading.js.map +1 -0
  99. package/dist/core/News.d.ts +46 -0
  100. package/dist/core/News.d.ts.map +1 -0
  101. package/dist/core/News.js +79 -0
  102. package/dist/core/News.js.map +1 -0
  103. package/dist/core/PlayerInput.d.ts +38 -0
  104. package/dist/core/PlayerInput.d.ts.map +1 -0
  105. package/dist/core/PlayerInput.js +57 -0
  106. package/dist/core/PlayerInput.js.map +1 -0
  107. package/dist/core/Random.d.ts +2 -2
  108. package/dist/core/Random.js +2 -2
  109. package/dist/core/RunHistory.d.ts +43 -0
  110. package/dist/core/RunHistory.d.ts.map +1 -0
  111. package/dist/core/RunHistory.js +41 -0
  112. package/dist/core/RunHistory.js.map +1 -0
  113. package/dist/core/Sanitize.d.ts +56 -0
  114. package/dist/core/Sanitize.d.ts.map +1 -0
  115. package/dist/core/Sanitize.js +87 -0
  116. package/dist/core/Sanitize.js.map +1 -0
  117. package/dist/core/Save.d.ts +31 -7
  118. package/dist/core/Save.d.ts.map +1 -1
  119. package/dist/core/Save.js +56 -0
  120. package/dist/core/Save.js.map +1 -1
  121. package/dist/core/SaveSync.d.ts +26 -0
  122. package/dist/core/SaveSync.d.ts.map +1 -0
  123. package/dist/core/SaveSync.js +52 -0
  124. package/dist/core/SaveSync.js.map +1 -0
  125. package/dist/core/Scramble.d.ts +13 -0
  126. package/dist/core/Scramble.d.ts.map +1 -0
  127. package/dist/core/Scramble.js +44 -0
  128. package/dist/core/Scramble.js.map +1 -0
  129. package/dist/core/Session.d.ts +21 -0
  130. package/dist/core/Session.d.ts.map +1 -0
  131. package/dist/core/Session.js +11 -0
  132. package/dist/core/Session.js.map +1 -0
  133. package/dist/core/Spawner.d.ts +48 -0
  134. package/dist/core/Spawner.d.ts.map +1 -0
  135. package/dist/core/Spawner.js +65 -0
  136. package/dist/core/Spawner.js.map +1 -0
  137. package/dist/core/Tween.d.ts +25 -0
  138. package/dist/core/Tween.d.ts.map +1 -0
  139. package/dist/core/Tween.js +60 -0
  140. package/dist/core/Tween.js.map +1 -0
  141. package/dist/core/UndoHistory.d.ts +37 -0
  142. package/dist/core/UndoHistory.d.ts.map +1 -0
  143. package/dist/core/UndoHistory.js +49 -0
  144. package/dist/core/UndoHistory.js.map +1 -0
  145. package/dist/core/index.d.ts +22 -0
  146. package/dist/core/index.d.ts.map +1 -1
  147. package/dist/core/index.js +12 -0
  148. package/dist/core/index.js.map +1 -1
  149. package/dist/i18n/Fluent.d.ts +7 -0
  150. package/dist/i18n/Fluent.d.ts.map +1 -0
  151. package/dist/i18n/Fluent.js +86 -0
  152. package/dist/i18n/Fluent.js.map +1 -0
  153. package/dist/i18n/index.d.ts +15 -1
  154. package/dist/i18n/index.d.ts.map +1 -1
  155. package/dist/i18n/index.js +17 -2
  156. package/dist/i18n/index.js.map +1 -1
  157. package/dist/index.d.ts +1 -0
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.js +1 -0
  160. package/dist/index.js.map +1 -1
  161. package/dist/mw_games.global.js +351 -79
  162. package/dist/render/Camera.d.ts +32 -4
  163. package/dist/render/Camera.d.ts.map +1 -1
  164. package/dist/render/Camera.js +58 -23
  165. package/dist/render/Camera.js.map +1 -1
  166. package/dist/render/Capabilities.d.ts +51 -0
  167. package/dist/render/Capabilities.d.ts.map +1 -0
  168. package/dist/render/Capabilities.js +56 -0
  169. package/dist/render/Capabilities.js.map +1 -0
  170. package/dist/render/ColorBlindness.d.ts +16 -0
  171. package/dist/render/ColorBlindness.d.ts.map +1 -0
  172. package/dist/render/ColorBlindness.js +41 -0
  173. package/dist/render/ColorBlindness.js.map +1 -0
  174. package/dist/render/ColorTransformBatcher.d.ts +9 -0
  175. package/dist/render/ColorTransformBatcher.d.ts.map +1 -1
  176. package/dist/render/ColorTransformBatcher.js +131 -19
  177. package/dist/render/ColorTransformBatcher.js.map +1 -1
  178. package/dist/render/Minimap.d.ts +52 -0
  179. package/dist/render/Minimap.d.ts.map +1 -0
  180. package/dist/render/Minimap.js +95 -0
  181. package/dist/render/Minimap.js.map +1 -0
  182. package/dist/render/TileMap.d.ts +2 -2
  183. package/dist/render/TileMap.d.ts.map +1 -1
  184. package/dist/render/TileMap.js +12 -12
  185. package/dist/render/TileMap.js.map +1 -1
  186. package/dist/render/TintedSprite.d.ts +1 -8
  187. package/dist/render/TintedSprite.d.ts.map +1 -1
  188. package/dist/render/TintedSprite.js +3 -111
  189. package/dist/render/TintedSprite.js.map +1 -1
  190. package/dist/render/Viewport.d.ts +46 -0
  191. package/dist/render/Viewport.d.ts.map +1 -0
  192. package/dist/render/Viewport.js +52 -0
  193. package/dist/render/Viewport.js.map +1 -0
  194. package/dist/render/index.d.ts +9 -1
  195. package/dist/render/index.d.ts.map +1 -1
  196. package/dist/render/index.js +5 -1
  197. package/dist/render/index.js.map +1 -1
  198. package/dist/roguelike/FieldOfView.d.ts +1 -1
  199. package/dist/roguelike/Level.d.ts +2 -2
  200. package/dist/roguelike/Level.d.ts.map +1 -1
  201. package/dist/roguelike/Level.js +1 -1
  202. package/dist/roguelike/Level.js.map +1 -1
  203. package/dist/roguelike/Pathfinder.d.ts +3 -3
  204. package/dist/roguelike/Pathfinder.js +2 -2
  205. package/dist/roguelike/Scheduler.d.ts +1 -1
  206. package/dist/roguelike/Scheduler.js +1 -1
  207. package/dist/roguelike/Stealth.d.ts +34 -0
  208. package/dist/roguelike/Stealth.d.ts.map +1 -0
  209. package/dist/roguelike/Stealth.js +35 -0
  210. package/dist/roguelike/Stealth.js.map +1 -0
  211. package/dist/roguelike/generate.d.ts +3 -3
  212. package/dist/roguelike/generate.js +1 -1
  213. package/dist/roguelike/generate.js.map +1 -1
  214. package/dist/roguelike/index.d.ts +2 -0
  215. package/dist/roguelike/index.d.ts.map +1 -1
  216. package/dist/roguelike/index.js +1 -0
  217. package/dist/roguelike/index.js.map +1 -1
  218. package/dist/rpg/Collision.d.ts +42 -0
  219. package/dist/rpg/Collision.d.ts.map +1 -0
  220. package/dist/rpg/Collision.js +77 -0
  221. package/dist/rpg/Collision.js.map +1 -0
  222. package/dist/rpg/FreeMover.d.ts +45 -0
  223. package/dist/rpg/FreeMover.d.ts.map +1 -0
  224. package/dist/rpg/FreeMover.js +68 -0
  225. package/dist/rpg/FreeMover.js.map +1 -0
  226. package/dist/rpg/Marshal.d.ts +65 -0
  227. package/dist/rpg/Marshal.d.ts.map +1 -0
  228. package/dist/rpg/Marshal.js +393 -0
  229. package/dist/rpg/Marshal.js.map +1 -0
  230. package/dist/rpg/Quest.d.ts +41 -0
  231. package/dist/rpg/Quest.d.ts.map +1 -1
  232. package/dist/rpg/Quest.js +39 -6
  233. package/dist/rpg/Quest.js.map +1 -1
  234. package/dist/rpg/index.d.ts +7 -1
  235. package/dist/rpg/index.d.ts.map +1 -1
  236. package/dist/rpg/index.js +3 -0
  237. package/dist/rpg/index.js.map +1 -1
  238. package/dist/stage/DialogueStage.d.ts +2 -3
  239. package/dist/stage/DialogueStage.d.ts.map +1 -1
  240. package/dist/stage/DialogueStage.js +21 -30
  241. package/dist/stage/DialogueStage.js.map +1 -1
  242. package/dist/stage/index.d.ts +1 -1
  243. package/dist/stage/index.d.ts.map +1 -1
  244. package/dist/stage/script.d.ts +32 -3
  245. package/dist/stage/script.d.ts.map +1 -1
  246. package/dist/stage/script.js +0 -0
  247. package/dist/stage/script.js.map +1 -1
  248. package/dist/three-d/Character3D.d.ts +48 -0
  249. package/dist/three-d/Character3D.d.ts.map +1 -0
  250. package/dist/three-d/Character3D.js +96 -0
  251. package/dist/three-d/Character3D.js.map +1 -0
  252. package/dist/three-d/Engine3D.d.ts +23 -0
  253. package/dist/three-d/Engine3D.d.ts.map +1 -0
  254. package/dist/three-d/Engine3D.js +45 -0
  255. package/dist/three-d/Engine3D.js.map +1 -0
  256. package/dist/three-d/Grid.d.ts +14 -0
  257. package/dist/three-d/Grid.d.ts.map +1 -0
  258. package/dist/three-d/Grid.js +13 -0
  259. package/dist/three-d/Grid.js.map +1 -0
  260. package/dist/three-d/Heightmap.d.ts +35 -0
  261. package/dist/three-d/Heightmap.d.ts.map +1 -0
  262. package/dist/three-d/Heightmap.js +29 -0
  263. package/dist/three-d/Heightmap.js.map +1 -0
  264. package/dist/three-d/Models.d.ts +12 -0
  265. package/dist/three-d/Models.d.ts.map +1 -0
  266. package/dist/three-d/Models.js +14 -0
  267. package/dist/three-d/Models.js.map +1 -0
  268. package/dist/three-d/TileGrid3D.d.ts +21 -0
  269. package/dist/three-d/TileGrid3D.d.ts.map +1 -0
  270. package/dist/three-d/TileGrid3D.js +65 -0
  271. package/dist/three-d/TileGrid3D.js.map +1 -0
  272. package/dist/three-d/Vox.d.ts +24 -0
  273. package/dist/three-d/Vox.d.ts.map +1 -0
  274. package/dist/three-d/Vox.js +93 -0
  275. package/dist/three-d/Vox.js.map +1 -0
  276. package/dist/three-d/index.d.ts +13 -0
  277. package/dist/three-d/index.d.ts.map +1 -0
  278. package/dist/three-d/index.js +7 -0
  279. package/dist/three-d/index.js.map +1 -0
  280. package/dist/ui/Bar.d.ts +49 -0
  281. package/dist/ui/Bar.d.ts.map +1 -0
  282. package/dist/ui/Bar.js +70 -0
  283. package/dist/ui/Bar.js.map +1 -0
  284. package/dist/ui/BitmapLabel.d.ts +42 -0
  285. package/dist/ui/BitmapLabel.d.ts.map +1 -0
  286. package/dist/ui/BitmapLabel.js +59 -0
  287. package/dist/ui/BitmapLabel.js.map +1 -0
  288. package/dist/ui/Button.d.ts +52 -0
  289. package/dist/ui/Button.d.ts.map +1 -0
  290. package/dist/ui/Button.js +147 -0
  291. package/dist/ui/Button.js.map +1 -0
  292. package/dist/ui/FloatingText.d.ts +28 -0
  293. package/dist/ui/FloatingText.d.ts.map +1 -0
  294. package/dist/ui/FloatingText.js +39 -0
  295. package/dist/ui/FloatingText.js.map +1 -0
  296. package/dist/ui/HelpScreen.d.ts +29 -0
  297. package/dist/ui/HelpScreen.d.ts.map +1 -0
  298. package/dist/ui/HelpScreen.js +39 -0
  299. package/dist/ui/HelpScreen.js.map +1 -0
  300. package/dist/ui/IconGrid.d.ts +8 -0
  301. package/dist/ui/IconGrid.d.ts.map +1 -1
  302. package/dist/ui/IconGrid.js +27 -1
  303. package/dist/ui/IconGrid.js.map +1 -1
  304. package/dist/ui/Label.d.ts +10 -1
  305. package/dist/ui/Label.d.ts.map +1 -1
  306. package/dist/ui/Label.js +25 -2
  307. package/dist/ui/Label.js.map +1 -1
  308. package/dist/ui/ListView.d.ts +12 -1
  309. package/dist/ui/ListView.d.ts.map +1 -1
  310. package/dist/ui/ListView.js +56 -2
  311. package/dist/ui/ListView.js.map +1 -1
  312. package/dist/ui/LoadingScreen.d.ts +31 -0
  313. package/dist/ui/LoadingScreen.d.ts.map +1 -0
  314. package/dist/ui/LoadingScreen.js +60 -0
  315. package/dist/ui/LoadingScreen.js.map +1 -0
  316. package/dist/ui/MessageBox.d.ts +27 -1
  317. package/dist/ui/MessageBox.d.ts.map +1 -1
  318. package/dist/ui/MessageBox.js +63 -14
  319. package/dist/ui/MessageBox.js.map +1 -1
  320. package/dist/ui/RebindScreen.d.ts +55 -0
  321. package/dist/ui/RebindScreen.d.ts.map +1 -0
  322. package/dist/ui/RebindScreen.js +114 -0
  323. package/dist/ui/RebindScreen.js.map +1 -0
  324. package/dist/ui/Toast.d.ts +44 -0
  325. package/dist/ui/Toast.d.ts.map +1 -0
  326. package/dist/ui/Toast.js +89 -0
  327. package/dist/ui/Toast.js.map +1 -0
  328. package/dist/ui/VerticalLabel.d.ts +5 -0
  329. package/dist/ui/VerticalLabel.d.ts.map +1 -1
  330. package/dist/ui/VerticalLabel.js +18 -7
  331. package/dist/ui/VerticalLabel.js.map +1 -1
  332. package/dist/ui/Window.d.ts +6 -0
  333. package/dist/ui/Window.d.ts.map +1 -1
  334. package/dist/ui/Window.js +16 -1
  335. package/dist/ui/Window.js.map +1 -1
  336. package/dist/ui/WindowStack.d.ts +1 -0
  337. package/dist/ui/WindowStack.d.ts.map +1 -1
  338. package/dist/ui/WindowStack.js +4 -1
  339. package/dist/ui/WindowStack.js.map +1 -1
  340. package/dist/ui/index.d.ts +17 -1
  341. package/dist/ui/index.d.ts.map +1 -1
  342. package/dist/ui/index.js +9 -1
  343. package/dist/ui/index.js.map +1 -1
  344. package/dist/ui/theme.d.ts +21 -0
  345. package/dist/ui/theme.d.ts.map +1 -1
  346. package/dist/ui/theme.js +42 -0
  347. package/dist/ui/theme.js.map +1 -1
  348. package/dist/version.d.ts +13 -0
  349. package/dist/version.d.ts.map +1 -0
  350. package/dist/version.js +13 -0
  351. package/dist/version.js.map +1 -0
  352. package/dist/world/Environment.d.ts +35 -0
  353. package/dist/world/Environment.d.ts.map +1 -0
  354. package/dist/world/Environment.js +55 -0
  355. package/dist/world/Environment.js.map +1 -0
  356. package/dist/world/index.d.ts +2 -0
  357. package/dist/world/index.d.ts.map +1 -1
  358. package/dist/world/index.js +1 -0
  359. package/dist/world/index.js.map +1 -1
  360. package/package.json +40 -4
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Lightweight 2D collision: overlap tests for AABBs and circles, plus a resolver that stops
3
+ * a moving AABB at the edge of a solid tile instead of passing through it.
4
+ *
5
+ * This is not a rigid-body physics engine - out of scope for a tile/turn-first framework the
6
+ * way a full 3D engine is (see item 45's own caution) - it is the missing primitive behind
7
+ * `rpg.FreeMover`'s own doc comment: "both own position and animation only, nothing about
8
+ * collision or passability". A game wires this in itself; `FreeMover` stays unopinionated
9
+ * about whether a game wants tile solidity, circle-vs-circle hits, or no collision at all.
10
+ */
11
+ export interface AABB {
12
+ x: number;
13
+ y: number;
14
+ width: number;
15
+ height: number;
16
+ }
17
+ export interface Circle {
18
+ x: number;
19
+ y: number;
20
+ radius: number;
21
+ }
22
+ export declare function aabbOverlap(a: AABB, b: AABB): boolean;
23
+ export declare function circleOverlap(a: Circle, b: Circle): boolean;
24
+ export declare function circleAabbOverlap(circle: Circle, box: AABB): boolean;
25
+ /** true when tile `(tileX, tileY)` blocks movement */
26
+ export type SolidTile = (tileX: number, tileY: number) => boolean;
27
+ export interface ResolveTileMoveOptions {
28
+ tileSize: number;
29
+ isSolid: SolidTile;
30
+ }
31
+ /**
32
+ * Moves `box` by `(dx, dy)`, one axis at a time, stopping flush against the edge of the
33
+ * first solid tile it would otherwise enter rather than tunnelling through it at high
34
+ * speed. Axis separation (resolve the whole x move, then the whole y move against the
35
+ * already-resolved x) is the standard, simple choice for an axis-aligned tile grid - a full
36
+ * swept-AABB solver buys nothing here since every tile edge is already axis-aligned.
37
+ */
38
+ export declare function resolveAabbAgainstTiles(box: AABB, dx: number, dy: number, options: ResolveTileMoveOptions): {
39
+ x: number;
40
+ y: number;
41
+ };
42
+ //# sourceMappingURL=Collision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Collision.d.ts","sourceRoot":"","sources":["../../src/rpg/Collision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,IAAI;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,MAAM;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAErD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAK3D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAMpE;AAED,sDAAsD;AACtD,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,SAAS,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAOpI"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Lightweight 2D collision: overlap tests for AABBs and circles, plus a resolver that stops
3
+ * a moving AABB at the edge of a solid tile instead of passing through it.
4
+ *
5
+ * This is not a rigid-body physics engine - out of scope for a tile/turn-first framework the
6
+ * way a full 3D engine is (see item 45's own caution) - it is the missing primitive behind
7
+ * `rpg.FreeMover`'s own doc comment: "both own position and animation only, nothing about
8
+ * collision or passability". A game wires this in itself; `FreeMover` stays unopinionated
9
+ * about whether a game wants tile solidity, circle-vs-circle hits, or no collision at all.
10
+ */
11
+ export function aabbOverlap(a, b) {
12
+ return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;
13
+ }
14
+ export function circleOverlap(a, b) {
15
+ const dx = a.x - b.x;
16
+ const dy = a.y - b.y;
17
+ const r = a.radius + b.radius;
18
+ return dx * dx + dy * dy < r * r;
19
+ }
20
+ export function circleAabbOverlap(circle, box) {
21
+ const closestX = clamp(circle.x, box.x, box.x + box.width);
22
+ const closestY = clamp(circle.y, box.y, box.y + box.height);
23
+ const dx = circle.x - closestX;
24
+ const dy = circle.y - closestY;
25
+ return dx * dx + dy * dy < circle.radius * circle.radius;
26
+ }
27
+ /**
28
+ * Moves `box` by `(dx, dy)`, one axis at a time, stopping flush against the edge of the
29
+ * first solid tile it would otherwise enter rather than tunnelling through it at high
30
+ * speed. Axis separation (resolve the whole x move, then the whole y move against the
31
+ * already-resolved x) is the standard, simple choice for an axis-aligned tile grid - a full
32
+ * swept-AABB solver buys nothing here since every tile edge is already axis-aligned.
33
+ */
34
+ export function resolveAabbAgainstTiles(box, dx, dy, options) {
35
+ const { tileSize, isSolid } = options;
36
+ if (!(tileSize > 0))
37
+ throw new Error('collision tileSize must be positive');
38
+ const x = sweepAxis(box.x, box.y, box.width, box.height, dx, tileSize, isSolid, true);
39
+ const y = sweepAxis(x, box.y, box.width, box.height, dy, tileSize, isSolid, false);
40
+ return { x, y };
41
+ }
42
+ function sweepAxis(x, y, width, height, delta, tileSize, isSolid, horizontal) {
43
+ if (delta === 0)
44
+ return horizontal ? x : y;
45
+ const position = horizontal ? x : y;
46
+ const size = horizontal ? width : height;
47
+ const target = position + delta;
48
+ //the perpendicular span of tiles the box's edge sweeps across while moving
49
+ const crossStart = Math.floor((horizontal ? y : x) / tileSize);
50
+ const crossEnd = Math.floor(((horizontal ? y + height : x + width) - 1e-6) / tileSize);
51
+ const solidAt = (leading, cross) => horizontal ? isSolid(leading, cross) : isSolid(cross, leading);
52
+ if (delta > 0) {
53
+ const fromCell = Math.floor((position + size - 1e-6) / tileSize);
54
+ const toCell = Math.floor((target + size - 1e-6) / tileSize);
55
+ for (let cell = fromCell + 1; cell <= toCell; cell++) {
56
+ for (let cross = crossStart; cross <= crossEnd; cross++) {
57
+ if (solidAt(cell, cross))
58
+ return cell * tileSize - size;
59
+ }
60
+ }
61
+ }
62
+ else {
63
+ const fromCell = Math.floor(position / tileSize);
64
+ const toCell = Math.floor(target / tileSize);
65
+ for (let cell = fromCell - 1; cell >= toCell; cell--) {
66
+ for (let cross = crossStart; cross <= crossEnd; cross++) {
67
+ if (solidAt(cell, cross))
68
+ return (cell + 1) * tileSize;
69
+ }
70
+ }
71
+ }
72
+ return target;
73
+ }
74
+ function clamp(value, min, max) {
75
+ return value < min ? min : value > max ? max : value;
76
+ }
77
+ //# sourceMappingURL=Collision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Collision.js","sourceRoot":"","sources":["../../src/rpg/Collision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAeH,MAAM,UAAU,WAAW,CAAC,CAAO,EAAE,CAAO;IAC3C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,CAAS;IACjD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,GAAS;IAC1D,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC;IAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC;IAC/B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC1D,CAAC;AAUD;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAS,EAAE,EAAU,EAAE,EAAU,EAAE,OAA+B;IACzG,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAE5E,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACtF,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACnF,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CACjB,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc,EACd,KAAa,EACb,QAAgB,EAChB,OAAkB,EAClB,UAAmB;IAEnB,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAEhC,2EAA2E;IAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAEvF,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,KAAa,EAAW,EAAE,CAC3D,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEhE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC7D,KAAK,IAAI,IAAI,GAAG,QAAQ,GAAG,CAAC,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YACtD,KAAK,IAAI,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzD,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;oBAAE,OAAO,IAAI,GAAG,QAAQ,GAAG,IAAI,CAAC;YACzD,CAAC;QACF,CAAC;IACF,CAAC;SAAM,CAAC;QACP,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;QAC7C,KAAK,IAAI,IAAI,GAAG,QAAQ,GAAG,CAAC,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YACtD,KAAK,IAAI,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzD,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;oBAAE,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;YACxD,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACrD,OAAO,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { AnimatedSprite } from '../render/AnimatedSprite.ts';
2
+ export interface FreeMoverOptions {
3
+ /** world units crossed per second */
4
+ speed?: number;
5
+ /**
6
+ * An animation to play while moving, given the current facing in radians (0 along +x,
7
+ * increasing clockwise in screen space). Bucketing that into however many directions a
8
+ * sprite sheet actually has (4, 8, whatever) is the game's own job - this stays
9
+ * unopinionated about how many facings exist, the same way `GridMover`'s callbacks are
10
+ * unopinionated about animation names.
11
+ */
12
+ walkAnimation?: (facing: number) => string;
13
+ /** an animation to play while standing still, given the current facing in radians */
14
+ idleAnimation?: (facing: number) => string;
15
+ }
16
+ /**
17
+ * Movement not snapped to any grid: a float position plus a continuous facing angle, for a
18
+ * twin-stick shooter, a bullet-hell, or any top-down game whose player moves and aims freely
19
+ * rather than stepping cell to cell. `rpg.GridMover` is the tile-to-tile counterpart to this;
20
+ * both own position and animation only, nothing about collision or passability.
21
+ */
22
+ export declare class FreeMover {
23
+ x: number;
24
+ y: number;
25
+ /** radians; unchanged while not moving, so a stopped unit keeps facing where it last went */
26
+ facing: number;
27
+ private sprite;
28
+ private speed;
29
+ private options;
30
+ private moving;
31
+ constructor(sprite: AnimatedSprite, x: number, y: number, options?: FreeMoverOptions);
32
+ get isMoving(): boolean;
33
+ /**
34
+ * Moves this frame along `(dx, dy)`, which need not be normalized - only its direction
35
+ * and whether it is nonzero matter, so a caller can pass a raw stick reading straight
36
+ * through. `(0, 0)` stops the unit in place, facing whichever way it was last moving.
37
+ */
38
+ move(dx: number, dy: number, dt: number): void;
39
+ /** faces a direction without moving, the free-movement equivalent of `GridMover.turnTo` */
40
+ turnTo(dx: number, dy: number): void;
41
+ private place;
42
+ private playWalk;
43
+ private playIdle;
44
+ }
45
+ //# sourceMappingURL=FreeMover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FreeMover.d.ts","sourceRoot":"","sources":["../../src/rpg/FreeMover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAChC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAE3C,qFAAqF;IACrF,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IAEV,6FAA6F;IAC7F,MAAM,SAAK;IAEX,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,EASvF;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;;OAIG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAkB7C;IAED,2FAA2F;IAC3F,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAInC;IAED,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,QAAQ;CAIhB"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Movement not snapped to any grid: a float position plus a continuous facing angle, for a
3
+ * twin-stick shooter, a bullet-hell, or any top-down game whose player moves and aims freely
4
+ * rather than stepping cell to cell. `rpg.GridMover` is the tile-to-tile counterpart to this;
5
+ * both own position and animation only, nothing about collision or passability.
6
+ */
7
+ export class FreeMover {
8
+ constructor(sprite, x, y, options = {}) {
9
+ /** radians; unchanged while not moving, so a stopped unit keeps facing where it last went */
10
+ this.facing = 0;
11
+ this.moving = false;
12
+ this.sprite = sprite;
13
+ this.x = x;
14
+ this.y = y;
15
+ this.speed = options.speed ?? 4;
16
+ this.options = options;
17
+ this.place();
18
+ this.playIdle();
19
+ }
20
+ get isMoving() {
21
+ return this.moving;
22
+ }
23
+ /**
24
+ * Moves this frame along `(dx, dy)`, which need not be normalized - only its direction
25
+ * and whether it is nonzero matter, so a caller can pass a raw stick reading straight
26
+ * through. `(0, 0)` stops the unit in place, facing whichever way it was last moving.
27
+ */
28
+ move(dx, dy, dt) {
29
+ const length = Math.hypot(dx, dy);
30
+ if (length > 0) {
31
+ this.facing = Math.atan2(dy, dx);
32
+ this.x += (dx / length) * this.speed * dt;
33
+ this.y += (dy / length) * this.speed * dt;
34
+ if (!this.moving) {
35
+ this.moving = true;
36
+ this.playWalk();
37
+ }
38
+ }
39
+ else if (this.moving) {
40
+ this.moving = false;
41
+ this.playIdle();
42
+ }
43
+ this.place();
44
+ this.sprite.update(dt);
45
+ }
46
+ /** faces a direction without moving, the free-movement equivalent of `GridMover.turnTo` */
47
+ turnTo(dx, dy) {
48
+ if (this.moving || (dx === 0 && dy === 0))
49
+ return;
50
+ this.facing = Math.atan2(dy, dx);
51
+ this.playIdle();
52
+ }
53
+ place() {
54
+ this.sprite.x = this.x;
55
+ this.sprite.y = this.y;
56
+ }
57
+ playWalk() {
58
+ const name = this.options.walkAnimation?.(this.facing);
59
+ if (name && this.sprite.has(name))
60
+ this.sprite.play(name);
61
+ }
62
+ playIdle() {
63
+ const name = this.options.idleAnimation?.(this.facing);
64
+ if (name && this.sprite.has(name))
65
+ this.sprite.play(name);
66
+ }
67
+ }
68
+ //# sourceMappingURL=FreeMover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FreeMover.js","sourceRoot":"","sources":["../../src/rpg/FreeMover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Ruby's `Marshal` binary serialisation format (version 4.8, unchanged since Ruby 1.8) -
3
+ * the container `Game.rxdata` and every other RPG Maker XP/VX save are written in. This is
4
+ * format engineering, not RPG Maker's own code or content: the byte layout below is Ruby's
5
+ * own standard-library format, learned the ordinary way any undocumented format is, by
6
+ * reading real files in it. Nothing here knows what an RPG Maker save's own classes
7
+ * (`Game_Party`, `Game_Actor`) mean; it only turns the container's bytes into a faithful,
8
+ * generic JS shape a game can then interpret however it needs to. See CLAUDE.md's licence
9
+ * convention and ROADMAP.md item 100 for where this line sits.
10
+ *
11
+ * What decodes: nil, true, false, Fixnum, Bignum, Float, String, Symbol, Array, Hash
12
+ * (including one with a default value, read separately via `hashDefaultOf` rather than as a
13
+ * fake entry - a real Hash key equal to any string sentinel would otherwise collide with
14
+ * it), and Object (`o`, a class name plus its instance variables) - everything a plain-data
15
+ * save file actually needs. `_dump`/`_load` values
16
+ * (`u`) decode to their class name plus the opaque bytes their own `_load` would need,
17
+ * since that per-class binary layout is a second, undocumented format nested inside this
18
+ * one and out of scope the same way a container format never explains the media it holds.
19
+ * `marshal_dump`/`marshal_load` values (`U`) decode fully, since their payload is an
20
+ * ordinary Marshal value. Backreferences (`@`, `;`) resolve against the same link tables a
21
+ * real Ruby `Marshal.load` keeps, so a value referenced twice decodes to the same object
22
+ * twice rather than being duplicated.
23
+ */
24
+ /** an RPG Maker (or any other) object: its class name and every instance variable, by name */
25
+ export interface RubyObject {
26
+ class: string;
27
+ ivars: Record<string, unknown>;
28
+ }
29
+ /** a value only `_dump`/`_load` on its own class could decode further - see the module doc */
30
+ export interface RubyUserDefined {
31
+ class: string;
32
+ raw: Uint8Array;
33
+ }
34
+ /**
35
+ * Marks a JS string as a Ruby Symbol rather than a String when encoding - `decodeMarshal`
36
+ * maps both to a plain JS string (the distinction rarely matters for reading a save back),
37
+ * but writing needs to know which one to produce. `RubyObject.ivars`' keys are always
38
+ * written as symbols regardless, since that half of the format has no other option.
39
+ */
40
+ export declare class RubySymbol {
41
+ readonly name: string;
42
+ constructor(name: string);
43
+ }
44
+ /** the default value of a Hash decoded from `Hash.new(default)` (Marshal's `}` tag), if any */
45
+ export declare function hashDefaultOf(hash: Map<unknown, unknown>): unknown;
46
+ /** marks a Map for `encodeMarshal` to write back out as a `Hash.new(default)`, tag `}` */
47
+ export declare function withHashDefault(hash: Map<unknown, unknown>, defaultValue: unknown): Map<unknown, unknown>;
48
+ /** decodes one Marshal document (a whole `.rxdata` file, or any other Marshal dump) */
49
+ export declare function decodeMarshal(bytes: Uint8Array): unknown;
50
+ /**
51
+ * Encodes one Marshal document from the same shapes `decodeMarshal` produces: `null`,
52
+ * `boolean`, `number` (written as a Fixnum when it is a safe integer, a Float otherwise),
53
+ * `string` (a Marshal String, unless wrapped in `RubySymbol`), `Array`, `Map` (a Hash, key
54
+ * order preserved), and `RubyObject`.
55
+ *
56
+ * Every value is written fresh rather than reusing Ruby's own backreference scheme for a
57
+ * repeated string, symbol or object - valid Marshal either way, since backreferences are an
58
+ * optional size optimisation, not something a reader is required to produce. A save written
59
+ * this way is larger than Ruby's own `Marshal.dump` would make it, never incorrect.
60
+ * `RubyUserDefined` (a `_dump`/`_load` value) cannot be re-encoded at all, for the same
61
+ * reason `decodeMarshal` cannot interpret its bytes: that per-class binary layout is a
62
+ * second format this module was never taught.
63
+ */
64
+ export declare function encodeMarshal(value: unknown): Uint8Array;
65
+ //# sourceMappingURL=Marshal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Marshal.d.ts","sourceRoot":"","sources":["../../src/rpg/Marshal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,8FAA8F;AAC9F,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,8FAA8F;AAC9F,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,UAAU,CAAC;CAChB;AAED;;;;;GAKG;AACH,qBAAa,UAAU;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,MAAM,EAEvB;CACD;AASD,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,OAAO,CAElE;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAGzG;AAyND,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAExD;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAIxD"}