@oidoid/void 0.1.0-4 → 0.1.0-6

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 (300) hide show
  1. package/dist/meta.json +1 -0
  2. package/dist/package.json +66 -0
  3. package/dist/public/favicon/favicon16.png +0 -0
  4. package/dist/public/favicon/favicon192.png +0 -0
  5. package/dist/public/favicon/favicon32.png +0 -0
  6. package/dist/public/favicon/favicon48.png +0 -0
  7. package/dist/public/favicon/favicon512.png +0 -0
  8. package/dist/public/favicon/favicon64.png +0 -0
  9. package/dist/public/index.html +23 -0
  10. package/dist/public/index.js +3844 -0
  11. package/dist/public/index.js.map +7 -0
  12. package/dist/public/manifest.json +1 -0
  13. package/dist/public/preload-atlas.png +0 -0
  14. package/dist/public/void-v0.1.0-4.html +111 -0
  15. package/dist/public/void-v0.1.0-5.html +111 -0
  16. package/dist/public/void-v0.1.0-6.html +111 -0
  17. package/dist/schema/config-file.d.ts +32 -0
  18. package/dist/schema/config-file.js +41 -0
  19. package/dist/schema/config-file.js.map +1 -0
  20. package/dist/schema/config-file.v0.json +68 -0
  21. package/dist/src/audio.d.ts +7 -0
  22. package/dist/src/audio.js +25 -0
  23. package/dist/src/audio.js.map +1 -0
  24. package/dist/src/demo/assets/manifest.json +46 -0
  25. package/dist/src/demo/assets/preload-atlas.json +193 -0
  26. package/dist/src/demo/ents/clock-ent.d.ts +10 -0
  27. package/dist/src/demo/ents/clock-ent.js +26 -0
  28. package/dist/src/demo/ents/clock-ent.js.map +1 -0
  29. package/dist/src/demo/ents/render-toggle-ent.d.ts +10 -0
  30. package/dist/src/demo/ents/render-toggle-ent.js +38 -0
  31. package/dist/src/demo/ents/render-toggle-ent.js.map +1 -0
  32. package/dist/src/demo/ents/work-counter-ent.d.ts +10 -0
  33. package/dist/src/demo/ents/work-counter-ent.js +24 -0
  34. package/dist/src/demo/ents/work-counter-ent.js.map +1 -0
  35. package/dist/src/demo/game.d.ts +13 -0
  36. package/dist/src/demo/game.js +155 -0
  37. package/dist/src/demo/game.js.map +1 -0
  38. package/dist/src/demo/index.d.ts +1 -0
  39. package/dist/src/demo/index.js +8 -0
  40. package/dist/src/demo/index.js.map +1 -0
  41. package/dist/src/demo/tsconfig.json +15 -0
  42. package/dist/src/demo/types/tag.d.ts +2 -0
  43. package/dist/src/demo/types/tag.js +2 -0
  44. package/dist/src/demo/types/tag.js.map +1 -0
  45. package/dist/src/demo/void.json +11 -0
  46. package/dist/src/ents/button-ent.d.ts +38 -0
  47. package/dist/src/ents/button-ent.js +124 -0
  48. package/dist/src/ents/button-ent.js.map +1 -0
  49. package/dist/src/ents/cursor-ent.d.ts +18 -0
  50. package/dist/src/ents/cursor-ent.js +58 -0
  51. package/dist/src/ents/cursor-ent.js.map +1 -0
  52. package/dist/src/ents/ent.d.ts +7 -0
  53. package/dist/src/ents/ent.js +2 -0
  54. package/dist/src/ents/ent.js.map +1 -0
  55. package/dist/src/ents/follow-cam-ent.d.ts +25 -0
  56. package/dist/src/ents/follow-cam-ent.js +87 -0
  57. package/dist/src/ents/follow-cam-ent.js.map +1 -0
  58. package/dist/src/ents/nine-patch-ent.d.ts +43 -0
  59. package/dist/src/ents/nine-patch-ent.js +143 -0
  60. package/dist/src/ents/nine-patch-ent.js.map +1 -0
  61. package/dist/src/ents/text-ent.d.ts +23 -0
  62. package/dist/src/ents/text-ent.js +109 -0
  63. package/dist/src/ents/text-ent.js.map +1 -0
  64. package/dist/src/ents/zoo.d.ts +16 -0
  65. package/dist/src/ents/zoo.js +38 -0
  66. package/dist/src/ents/zoo.js.map +1 -0
  67. package/dist/src/graphics/atlas-parser.d.ts +4 -0
  68. package/dist/src/graphics/atlas-parser.js +27 -0
  69. package/dist/src/graphics/atlas-parser.js.map +1 -0
  70. package/dist/src/graphics/atlas.d.ts +49 -0
  71. package/dist/src/graphics/atlas.js +7 -0
  72. package/dist/src/graphics/atlas.js.map +1 -0
  73. package/dist/src/graphics/cam.d.ts +89 -0
  74. package/dist/src/graphics/cam.js +211 -0
  75. package/dist/src/graphics/cam.js.map +1 -0
  76. package/dist/src/graphics/gl.d.ts +24 -0
  77. package/dist/src/graphics/gl.js +70 -0
  78. package/dist/src/graphics/gl.js.map +1 -0
  79. package/dist/src/graphics/layer.d.ts +21 -0
  80. package/dist/src/graphics/layer.js +23 -0
  81. package/dist/src/graphics/layer.js.map +1 -0
  82. package/dist/src/graphics/renderer.d.ts +22 -0
  83. package/dist/src/graphics/renderer.js +168 -0
  84. package/dist/src/graphics/renderer.js.map +1 -0
  85. package/dist/src/graphics/sprite-frag.glsl.d.ts +1 -0
  86. package/dist/src/graphics/sprite-frag.glsl.js +35 -0
  87. package/dist/src/graphics/sprite-frag.glsl.js.map +1 -0
  88. package/dist/src/graphics/sprite-vert.glsl.d.ts +1 -0
  89. package/dist/src/graphics/sprite-vert.glsl.js +68 -0
  90. package/dist/src/graphics/sprite-vert.glsl.js.map +1 -0
  91. package/dist/src/graphics/sprite.d.ts +108 -0
  92. package/dist/src/graphics/sprite.js +301 -0
  93. package/dist/src/graphics/sprite.js.map +1 -0
  94. package/dist/src/index.d.ts +30 -0
  95. package/dist/src/index.js +33 -0
  96. package/dist/src/index.js.map +1 -0
  97. package/dist/src/input/context-menu.d.ts +8 -0
  98. package/dist/src/input/context-menu.js +25 -0
  99. package/dist/src/input/context-menu.js.map +1 -0
  100. package/dist/src/input/gamepad.d.ts +18 -0
  101. package/dist/src/input/gamepad.js +49 -0
  102. package/dist/src/input/gamepad.js.map +1 -0
  103. package/dist/src/input/input.d.ts +148 -0
  104. package/dist/src/input/input.js +383 -0
  105. package/dist/src/input/input.js.map +1 -0
  106. package/dist/src/input/keyboard.d.ts +17 -0
  107. package/dist/src/input/keyboard.js +46 -0
  108. package/dist/src/input/keyboard.js.map +1 -0
  109. package/dist/src/input/pointer.d.ts +53 -0
  110. package/dist/src/input/pointer.js +162 -0
  111. package/dist/src/input/pointer.js.map +1 -0
  112. package/dist/src/input/wheel.d.ts +12 -0
  113. package/dist/src/input/wheel.js +30 -0
  114. package/dist/src/input/wheel.js.map +1 -0
  115. package/dist/src/looper.d.ts +15 -0
  116. package/dist/src/looper.js +48 -0
  117. package/dist/src/looper.js.map +1 -0
  118. package/dist/src/mem/pool.d.ts +31 -0
  119. package/dist/src/mem/pool.js +98 -0
  120. package/dist/src/mem/pool.js.map +1 -0
  121. package/dist/src/pixel-ratio-observer.d.ts +10 -0
  122. package/dist/src/pixel-ratio-observer.js +26 -0
  123. package/dist/src/pixel-ratio-observer.js.map +1 -0
  124. package/dist/src/random/random.d.ts +8 -0
  125. package/dist/src/random/random.js +23 -0
  126. package/dist/src/random/random.js.map +1 -0
  127. package/dist/src/storage/local-storage.d.ts +3 -0
  128. package/dist/src/storage/local-storage.js +11 -0
  129. package/dist/src/storage/local-storage.js.map +1 -0
  130. package/dist/src/text/font.d.ts +6 -0
  131. package/dist/src/text/font.js +20 -0
  132. package/dist/src/text/font.js.map +1 -0
  133. package/dist/src/text/mem-prop-5x6.json +573 -0
  134. package/dist/src/text/text-layout.d.ts +19 -0
  135. package/dist/src/text/text-layout.js +85 -0
  136. package/dist/src/text/text-layout.js.map +1 -0
  137. package/dist/src/tsconfig.json +15 -0
  138. package/dist/src/types/geo.d.ts +38 -0
  139. package/dist/src/types/geo.js +61 -0
  140. package/dist/src/types/geo.js.map +1 -0
  141. package/dist/src/types/json.d.ts +31 -0
  142. package/dist/src/types/json.js +2 -0
  143. package/dist/src/types/json.js.map +1 -0
  144. package/dist/src/types/time.d.ts +19 -0
  145. package/dist/src/types/time.js +10 -0
  146. package/dist/src/types/time.js.map +1 -0
  147. package/dist/src/types/void-version.d.ts +9 -0
  148. package/dist/src/types/void-version.js +2 -0
  149. package/dist/src/types/void-version.js.map +1 -0
  150. package/dist/src/utils/async-util.d.ts +11 -0
  151. package/dist/src/utils/async-util.js +36 -0
  152. package/dist/src/utils/async-util.js.map +1 -0
  153. package/dist/src/utils/canvas-util.d.ts +7 -0
  154. package/dist/src/utils/canvas-util.js +128 -0
  155. package/dist/src/utils/canvas-util.js.map +1 -0
  156. package/dist/src/utils/color-util.d.ts +1 -0
  157. package/dist/src/utils/color-util.js +4 -0
  158. package/dist/src/utils/color-util.js.map +1 -0
  159. package/dist/src/utils/debug.d.ts +17 -0
  160. package/dist/src/utils/debug.js +34 -0
  161. package/dist/src/utils/debug.js.map +1 -0
  162. package/dist/src/utils/dom-util.d.ts +3 -0
  163. package/dist/src/utils/dom-util.js +29 -0
  164. package/dist/src/utils/dom-util.js.map +1 -0
  165. package/dist/src/utils/fetch-util.d.ts +3 -0
  166. package/dist/src/utils/fetch-util.js +24 -0
  167. package/dist/src/utils/fetch-util.js.map +1 -0
  168. package/dist/src/utils/math.d.ts +6 -0
  169. package/dist/src/utils/math.js +18 -0
  170. package/dist/src/utils/math.js.map +1 -0
  171. package/dist/src/utils/vibrate.d.ts +1 -0
  172. package/dist/src/utils/vibrate.js +4 -0
  173. package/dist/src/utils/vibrate.js.map +1 -0
  174. package/dist/src/void.d.ts +43 -0
  175. package/dist/src/void.js +95 -0
  176. package/dist/src/void.js.map +1 -0
  177. package/dist/tools/atlas-pack/aseprite.d.ts +58 -0
  178. package/dist/tools/atlas-pack/aseprite.js +16 -0
  179. package/dist/tools/atlas-pack/aseprite.js.map +1 -0
  180. package/dist/tools/atlas-pack/atlas-json-parser.d.ts +21 -0
  181. package/dist/tools/atlas-pack/atlas-json-parser.js +116 -0
  182. package/dist/tools/atlas-pack/atlas-json-parser.js.map +1 -0
  183. package/dist/tools/atlas-pack/atlas-pack.d.ts +2 -0
  184. package/dist/tools/atlas-pack/atlas-pack.js +17 -0
  185. package/dist/tools/atlas-pack/atlas-pack.js.map +1 -0
  186. package/dist/tools/bundle/bundle.d.ts +3 -0
  187. package/dist/tools/bundle/bundle.js +48 -0
  188. package/dist/tools/bundle/bundle.js.map +1 -0
  189. package/dist/tools/bundle/html-plugin.d.ts +3 -0
  190. package/dist/tools/bundle/html-plugin.js +88 -0
  191. package/dist/tools/bundle/html-plugin.js.map +1 -0
  192. package/dist/tools/tsconfig-base.json +45 -0
  193. package/dist/tools/tsconfig.json +21 -0
  194. package/dist/tools/types/config.d.ts +20 -0
  195. package/dist/tools/types/config.js +22 -0
  196. package/dist/tools/types/config.js.map +1 -0
  197. package/dist/tools/utils/argv.d.ts +12 -0
  198. package/dist/tools/utils/argv.js +19 -0
  199. package/dist/tools/utils/argv.js.map +1 -0
  200. package/dist/tools/utils/exec.d.ts +3 -0
  201. package/dist/tools/utils/exec.js +15 -0
  202. package/dist/tools/utils/exec.js.map +1 -0
  203. package/dist/tools/utils/file-util.d.ts +1 -0
  204. package/dist/tools/utils/file-util.js +13 -0
  205. package/dist/tools/utils/file-util.js.map +1 -0
  206. package/dist/tools/utils/html-parser.d.ts +1 -0
  207. package/dist/tools/utils/html-parser.js +10 -0
  208. package/dist/tools/utils/html-parser.js.map +1 -0
  209. package/dist/tools/void.d.ts +17 -0
  210. package/dist/tools/void.js +30 -0
  211. package/dist/tools/void.js.map +1 -0
  212. package/package.json +31 -41
  213. package/readme.md +1 -1
  214. package/schema/config-file.test.ts +55 -0
  215. package/schema/config-file.ts +69 -0
  216. package/schema/config-file.v0.json +68 -0
  217. package/tools/atlas-pack/aseprite.ts +60 -0
  218. package/tools/atlas-pack/atlas-json-parser.test.ts +780 -0
  219. package/tools/atlas-pack/atlas-json-parser.ts +159 -0
  220. package/tools/atlas-pack/atlas-pack.ts +38 -0
  221. package/tools/bundle/bundle.ts +65 -0
  222. package/tools/bundle/html-plugin.ts +135 -0
  223. package/tools/types/config.ts +43 -0
  224. package/tools/utils/argv.test.ts +41 -0
  225. package/tools/utils/argv.ts +29 -0
  226. package/tools/utils/exec.ts +22 -0
  227. package/tools/utils/file-util.ts +11 -0
  228. package/tools/utils/html-parser.ts +9 -0
  229. package/tools/void.ts +54 -0
  230. package/dist/atlas/anim.d.ts +0 -30
  231. package/dist/atlas/anim.js +0 -16
  232. package/dist/atlas/anim.js.map +0 -1
  233. package/dist/atlas/aseprite.d.ts +0 -37
  234. package/dist/atlas/aseprite.js +0 -2
  235. package/dist/atlas/aseprite.js.map +0 -1
  236. package/dist/atlas/atlas-parser.d.ts +0 -52
  237. package/dist/atlas/atlas-parser.js +0 -109
  238. package/dist/atlas/atlas-parser.js.map +0 -1
  239. package/dist/atlas/atlas.d.ts +0 -4
  240. package/dist/atlas/atlas.js +0 -2
  241. package/dist/atlas/atlas.js.map +0 -1
  242. package/dist/audio/synth.d.ts +0 -4
  243. package/dist/audio/synth.js +0 -21
  244. package/dist/audio/synth.js.map +0 -1
  245. package/dist/graphics/bitmap.d.ts +0 -14
  246. package/dist/graphics/bitmap.js +0 -14
  247. package/dist/graphics/bitmap.js.map +0 -1
  248. package/dist/graphics/cam.d.ts +0 -16
  249. package/dist/graphics/cam.js +0 -42
  250. package/dist/graphics/cam.js.map +0 -1
  251. package/dist/graphics/frag.glsl.d.ts +0 -1
  252. package/dist/graphics/frag.glsl.js +0 -15
  253. package/dist/graphics/frag.glsl.js.map +0 -1
  254. package/dist/graphics/frame-listener.d.ts +0 -16
  255. package/dist/graphics/frame-listener.js +0 -83
  256. package/dist/graphics/frame-listener.js.map +0 -1
  257. package/dist/graphics/renderer.d.ts +0 -12
  258. package/dist/graphics/renderer.js +0 -184
  259. package/dist/graphics/renderer.js.map +0 -1
  260. package/dist/graphics/vert.glsl.d.ts +0 -1
  261. package/dist/graphics/vert.glsl.js +0 -46
  262. package/dist/graphics/vert.glsl.js.map +0 -1
  263. package/dist/index.d.ts +0 -31
  264. package/dist/index.js +0 -79
  265. package/dist/index.js.map +0 -1
  266. package/dist/input/gamepad-poller.d.ts +0 -8
  267. package/dist/input/gamepad-poller.js +0 -38
  268. package/dist/input/gamepad-poller.js.map +0 -1
  269. package/dist/input/input.d.ts +0 -44
  270. package/dist/input/input.js +0 -175
  271. package/dist/input/input.js.map +0 -1
  272. package/dist/input/keyboard-poller.d.ts +0 -7
  273. package/dist/input/keyboard-poller.js +0 -30
  274. package/dist/input/keyboard-poller.js.map +0 -1
  275. package/dist/input/pointer-poller.d.ts +0 -12
  276. package/dist/input/pointer-poller.js +0 -67
  277. package/dist/input/pointer-poller.js.map +0 -1
  278. package/dist/sprite/sprite.d.ts +0 -51
  279. package/dist/sprite/sprite.js +0 -161
  280. package/dist/sprite/sprite.js.map +0 -1
  281. package/dist/storage/json-storage.d.ts +0 -4
  282. package/dist/storage/json-storage.js +0 -13
  283. package/dist/storage/json-storage.js.map +0 -1
  284. package/dist/test/tsconfig.json +0 -14
  285. package/dist/text/font.d.ts +0 -6
  286. package/dist/text/font.js +0 -18
  287. package/dist/text/font.js.map +0 -1
  288. package/dist/text/text-layout.d.ts +0 -11
  289. package/dist/text/text-layout.js +0 -73
  290. package/dist/text/text-layout.js.map +0 -1
  291. package/dist/tsconfig.json +0 -13
  292. package/dist/types/2d.d.ts +0 -9
  293. package/dist/types/2d.js +0 -2
  294. package/dist/types/2d.js.map +0 -1
  295. package/dist/void.js +0 -60
  296. package/dist/void.js.map +0 -7
  297. package/dist/void.meta.json +0 -289
  298. package/src/atlas/anim.js +0 -17
  299. package/tools/atlas-parser.js +0 -120
  300. package/tools/void.js +0 -143
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["<define:globalThis.voidVersion>", "../../src/types/void-version.ts", "../../node_modules/mem-font/dist/mem-prop-5x6.json", "../../node_modules/mem-font/src/index.ts", "../../src/graphics/layer.ts", "../../src/types/geo.ts", "../../src/ents/nine-patch-ent.ts", "../../src/text/font.ts", "../../src/text/text-layout.ts", "../../src/ents/text-ent.ts", "../../src/ents/button-ent.ts", "../../src/ents/cursor-ent.ts", "../../src/ents/follow-cam-ent.ts", "../../src/ents/zoo.ts", "../../src/graphics/atlas.ts", "../../src/graphics/atlas-parser.ts", "../../src/graphics/cam.ts", "../../src/utils/math.ts", "../../src/graphics/sprite.ts", "../../src/input/context-menu.ts", "../../src/input/gamepad.ts", "../../src/input/keyboard.ts", "../../src/input/pointer.ts", "../../src/input/wheel.ts", "../../src/input/input.ts", "../../src/utils/debug.ts", "../../src/mem/pool.ts", "../../src/utils/color-util.ts", "../../src/utils/dom-util.ts", "../../src/utils/canvas-util.ts", "../../src/utils/fetch-util.ts", "../../src/graphics/gl.ts", "../../src/graphics/sprite-frag.glsl.ts", "../../src/graphics/sprite-vert.glsl.ts", "../../src/graphics/renderer.ts", "../../src/looper.ts", "../../src/pixel-ratio-observer.ts", "../../src/void.ts", "../../src/index.ts", "../../src/demo/assets/preload-atlas.json", "../../src/demo/ents/clock-ent.ts", "../../src/demo/ents/render-toggle-ent.ts", "../../src/demo/ents/work-counter-ent.ts", "../../src/demo/game.ts", "../../src/demo/index.ts"],
4
+ "sourcesContent": ["{\"hash\":\"2eb97a3\",\"published\":\"20250824\",\"version\":\"0.1.0-4\"}", "export type VoidVersion = {\n /** Git short hash. */\n hash: string\n /** package.json `published` YYYYMMDD. */\n published: string\n /** package.json semantic `version`. */\n version: string\n}\n\ndeclare namespace globalThis {\n var voidVersion: VoidVersion // set by esbuild.\n}\n\nexport const voidVersion: VoidVersion = globalThis.voidVersion\n", "{\n \"id\": \"mem-prop-5x6\",\n \"name\": \"mem 5x6\",\n \"cellWidth\": 5,\n \"cellHeight\": 6,\n \"leading\": 1,\n \"lineHeight\": 7,\n \"baseline\": 1,\n \"kerning\": {\n \" 0\": 0,\n \" 1\": 0,\n \" 2\": 0,\n \" 3\": 0,\n \" 4\": 0,\n \" 5\": 0,\n \" 6\": 0,\n \" 7\": 0,\n \" 8\": 0,\n \" 9\": 0,\n \"##\": -1,\n \"#_\": 0,\n \"',\": 0,\n \"'.\": 0,\n \"'/\": 0,\n \"'J\": 0,\n \"'S\": 0,\n \"'_\": 0,\n \"'j\": 0,\n \"'s\": 0,\n \"(+\": 0,\n \"(-\": 0,\n \"(<\": 0,\n \"(f\": 0,\n \"({\": 0,\n \"(~\": 0,\n \")_\": 0,\n \"*,\": 0,\n \"*.\": 0,\n \"*/\": 0,\n \"*S\": 0,\n \"*_\": 0,\n \"*j\": 0,\n \"*s\": 0,\n \"+)\": 0,\n \"+,\": 0,\n \"+.\": 0,\n \"+/\": 0,\n \"+>\": 0,\n \"+?\": 0,\n \"+I\": 0,\n \"+S\": 0,\n \"+T\": 0,\n \"+Z\": 0,\n \"+]\": 0,\n \"+_\": 0,\n \"+`\": 0,\n \"+j\": 0,\n \"+s\": 0,\n \"+}\": 0,\n \",'\": 0,\n \",*\": 0,\n \",+\": 0,\n \",-\": 0,\n \",<\": 0,\n \",?\": 0,\n \",T\": 0,\n \",Y\": 0,\n \",Z\": 0,\n \",\\\"\": 0,\n \",\\\\\": 0,\n \",^\": 0,\n \",`\": 0,\n \",f\": 0,\n \",t\": 0,\n \",z\": 0,\n \",{\": 0,\n \",~\": 0,\n \"-)\": 0,\n \"-,\": 0,\n \"--\": 0,\n \"-.\": 0,\n \"-/\": 0,\n \"->\": 0,\n \"-?\": 0,\n \"-I\": 0,\n \"-S\": 0,\n \"-T\": 0,\n \"-Z\": 0,\n \"-]\": 0,\n \"-_\": 0,\n \"-`\": 0,\n \"-j\": 0,\n \"-s\": 0,\n \"-}\": 0,\n \".'\": 0,\n \".*\": 0,\n \".+\": 0,\n \".-\": 0,\n \".<\": 0,\n \".?\": 0,\n \".T\": 0,\n \".Y\": 0,\n \".Z\": 0,\n \".\\\"\": 0,\n \".\\\\\": 0,\n \".^\": 0,\n \".`\": 0,\n \".f\": 0,\n \".t\": 0,\n \".z\": 0,\n \".{\": 0,\n \".~\": 0,\n \"/,\": 0,\n \"/.\": 0,\n \"//\": 0,\n \"/J\": 0,\n \"/S\": 0,\n \"/_\": 0,\n \"/j\": 0,\n \"/s\": 0,\n \"0 \": 0,\n \"1 \": 0,\n \"1T\": 0,\n \"1Y\": 0,\n \"1Z\": 0,\n \"1f\": 0,\n \"1t\": 0,\n \"1z\": 0,\n \"2 \": 0,\n \"3 \": 0,\n \"4 \": 0,\n \"5 \": 0,\n \"6 \": 0,\n \"7 \": 0,\n \"8 \": 0,\n \"9 \": 0,\n \":?\": 0,\n \":T\": 0,\n \":Z\": 0,\n \":`\": 0,\n \";?\": 0,\n \";T\": 0,\n \";Z\": 0,\n \"<+\": 0,\n \"<-\": 0,\n \"<<\": 0,\n \"<f\": 0,\n \"<{\": 0,\n \"<~\": 0,\n \"==\": 0,\n \"=_\": 0,\n \">)\": 0,\n \">,\": 0,\n \">.\": 0,\n \">/\": 0,\n \">>\": 0,\n \">?\": 0,\n \">I\": 0,\n \">S\": 0,\n \">T\": 0,\n \">Z\": 0,\n \">]\": 0,\n \">_\": 0,\n \">`\": 0,\n \">j\": 0,\n \">s\": 0,\n \">}\": 0,\n \"?,\": 0,\n \"?.\": 0,\n \"?/\": 0,\n \"?S\": 0,\n \"?_\": 0,\n \"?j\": 0,\n \"?s\": 0,\n \"@_\": 0,\n \"C+\": 0,\n \"C-\": 0,\n \"C<\": 0,\n \"Cf\": 0,\n \"C{\": 0,\n \"C~\": 0,\n \"D_\": 0,\n \"E+\": 0,\n \"E-\": 0,\n \"E<\": 0,\n \"Ef\": 0,\n \"E{\": 0,\n \"E~\": 0,\n \"F&\": 0,\n \"F+\": 0,\n \"F,\": 0,\n \"F-\": 0,\n \"F.\": 0,\n \"F/\": 0,\n \"F:\": 0,\n \"F;\": 0,\n \"F<\": 0,\n \"FJ\": 0,\n \"FS\": 0,\n \"F_\": 0,\n \"Fa\": 0,\n \"Fe\": 0,\n \"Ff\": 0,\n \"Fg\": 0,\n \"Fj\": 0,\n \"Fq\": 0,\n \"Fs\": 0,\n \"F{\": 0,\n \"F~\": 0,\n \"I+\": 0,\n \"I-\": 0,\n \"I<\": 0,\n \"If\": 0,\n \"I{\": 0,\n \"I~\": 0,\n \"L'\": 0,\n \"L*\": 0,\n \"L+\": 0,\n \"L-\": 0,\n \"L4\": 0,\n \"L7\": 0,\n \"L<\": 0,\n \"L?\": 0,\n \"LT\": 0,\n \"LY\": 0,\n \"LZ\": 0,\n \"L\\\"\": 0,\n \"L\\\\\": 0,\n \"L^\": 0,\n \"L`\": 0,\n \"Lf\": 0,\n \"Lt\": 0,\n \"Lz\": 0,\n \"L{\": 0,\n \"L~\": 0,\n \"P,\": 0,\n \"P.\": 0,\n \"P/\": 0,\n \"PS\": 0,\n \"P_\": 0,\n \"Pj\": 0,\n \"Ps\": 0,\n \"S&\": 0,\n \"S+\": 0,\n \"S,\": 0,\n \"S-\": 0,\n \"S.\": 0,\n \"S/\": 0,\n \"S:\": 0,\n \"S;\": 0,\n \"S<\": 0,\n \"SJ\": 0,\n \"SS\": 0,\n \"S_\": 0,\n \"Sa\": 0,\n \"Se\": 0,\n \"Sf\": 0,\n \"Sg\": 0,\n \"Sj\": 0,\n \"Sq\": 0,\n \"Ss\": 0,\n \"S{\": 0,\n \"S~\": 0,\n \"T&\": 0,\n \"T+\": 0,\n \"T,\": 0,\n \"T-\": 0,\n \"T.\": 0,\n \"T/\": 0,\n \"T:\": 0,\n \"T;\": 0,\n \"T<\": 0,\n \"TJ\": 0,\n \"TS\": 0,\n \"T_\": 0,\n \"Ta\": 0,\n \"Te\": 0,\n \"Tf\": 0,\n \"Tg\": 0,\n \"Tj\": 0,\n \"Tq\": 0,\n \"Ts\": 0,\n \"T{\": 0,\n \"T~\": 0,\n \"V_\": 0,\n \"Y,\": 0,\n \"Y.\": 0,\n \"Y/\": 0,\n \"YS\": 0,\n \"Y_\": 0,\n \"Yj\": 0,\n \"Ys\": 0,\n \"Z'\": 0,\n \"Z*\": 0,\n \"Z+\": 0,\n \"Z-\": 0,\n \"Z4\": 0,\n \"Z7\": 0,\n \"Z<\": 0,\n \"Z?\": 0,\n \"ZT\": 0,\n \"ZY\": 0,\n \"ZZ\": 0,\n \"Z\\\"\": 0,\n \"Z\\\\\": 0,\n \"Z^\": 0,\n \"Z`\": 0,\n \"Zf\": 0,\n \"Zt\": 0,\n \"Zz\": 0,\n \"Z{\": 0,\n \"Z~\": 0,\n \"[+\": 0,\n \"[-\": 0,\n \"[<\": 0,\n \"[f\": 0,\n \"[{\": 0,\n \"[~\": 0,\n \"\\\",\": 0,\n \"\\\".\": 0,\n \"\\\"/\": 0,\n \"\\\"J\": 0,\n \"\\\"S\": 0,\n \"\\\"_\": 0,\n \"\\\"j\": 0,\n \"\\\"s\": 0,\n \"\\\\'\": 0,\n \"\\\\*\": 0,\n \"\\\\+\": 0,\n \"\\\\-\": 0,\n \"\\\\<\": 0,\n \"\\\\?\": 0,\n \"\\\\T\": 0,\n \"\\\\Y\": 0,\n \"\\\\Z\": 0,\n \"\\\\\\\"\": 0,\n \"\\\\\\\\\": 0,\n \"\\\\^\": 0,\n \"\\\\`\": 0,\n \"\\\\f\": 0,\n \"\\\\t\": 0,\n \"\\\\z\": 0,\n \"\\\\{\": 0,\n \"\\\\~\": 0,\n \"^,\": 0,\n \"^.\": 0,\n \"^/\": 0,\n \"^J\": 0,\n \"^S\": 0,\n \"^_\": 0,\n \"^j\": 0,\n \"^s\": 0,\n \"_#\": 0,\n \"_%\": 0,\n \"_'\": 0,\n \"_(\": 0,\n \"_*\": 0,\n \"_+\": 0,\n \"_-\": 0,\n \"_<\": 0,\n \"_=\": 0,\n \"_?\": 0,\n \"_@\": 0,\n \"_T\": 0,\n \"_V\": 0,\n \"_Y\": 0,\n \"_Z\": 0,\n \"_\\\"\": 0,\n \"_\\\\\": 0,\n \"_^\": 0,\n \"__\": 0,\n \"_`\": 0,\n \"_a\": 0,\n \"_e\": 0,\n \"_f\": 0,\n \"_t\": 0,\n \"_v\": 0,\n \"_z\": 0,\n \"_{\": 0,\n \"_~\": 0,\n \"`,\": 0,\n \"`.\": 0,\n \"`/\": 0,\n \"`J\": 0,\n \"`S\": 0,\n \"`_\": 0,\n \"`j\": 0,\n \"`s\": 0,\n \"f,\": 0,\n \"f.\": 0,\n \"f/\": 0,\n \"fS\": 0,\n \"f_\": 0,\n \"fj\": 0,\n \"fs\": 0,\n \"q#\": 0,\n \"q$\": 0,\n \"q%\": 0,\n \"q&\": 0,\n \"q'\": 0,\n \"q(\": 0,\n \"q*\": 0,\n \"q+\": 0,\n \"q-\": 0,\n \"q0\": 0,\n \"q1\": 0,\n \"q2\": 0,\n \"q3\": 0,\n \"q4\": 0,\n \"q5\": 0,\n \"q6\": 0,\n \"q7\": 0,\n \"q8\": 0,\n \"q9\": 0,\n \"q<\": 0,\n \"q=\": 0,\n \"q?\": 0,\n \"q@\": 0,\n \"qA\": 0,\n \"qB\": 0,\n \"qC\": 0,\n \"qD\": 0,\n \"qE\": 0,\n \"qF\": 0,\n \"qG\": 0,\n \"qH\": 0,\n \"qI\": 0,\n \"qJ\": 0,\n \"qK\": 0,\n \"qL\": 0,\n \"qM\": 0,\n \"qN\": 0,\n \"qO\": 0,\n \"qP\": 0,\n \"qQ\": 0,\n \"qR\": 0,\n \"qS\": 0,\n \"qT\": 0,\n \"qU\": 0,\n \"qV\": 0,\n \"qW\": 0,\n \"qX\": 0,\n \"qY\": 0,\n \"qZ\": 0,\n \"q[\": 0,\n \"q\\\"\": 0,\n \"q\\\\\": 0,\n \"q]\": 0,\n \"q^\": 0,\n \"q`\": 0,\n \"qa\": 0,\n \"qb\": 0,\n \"qc\": 0,\n \"qd\": 0,\n \"qe\": 0,\n \"qf\": 0,\n \"qh\": 0,\n \"qk\": 0,\n \"qm\": 0,\n \"qn\": 0,\n \"qo\": 0,\n \"qq\": 0,\n \"qr\": 0,\n \"qs\": 0,\n \"qt\": 0,\n \"qu\": 0,\n \"qv\": 0,\n \"qw\": 0,\n \"qx\": 0,\n \"qz\": 0,\n \"q{\": 0,\n \"q}\": 0,\n \"q~\": 0,\n \"r,\": 0,\n \"r.\": 0,\n \"r/\": 0,\n \"rS\": 0,\n \"r_\": 0,\n \"rj\": -1,\n \"rs\": 0,\n \"s,\": 0,\n \"s.\": 0,\n \"s/\": 0,\n \"sJ\": 0,\n \"sS\": 0,\n \"s_\": 0,\n \"sj\": 0,\n \"ss\": 0,\n \"z'\": 0,\n \"z*\": 0,\n \"z+\": 0,\n \"z-\": 0,\n \"z4\": 0,\n \"z7\": 0,\n \"z<\": 0,\n \"z?\": 0,\n \"zT\": 0,\n \"zY\": 0,\n \"zZ\": 0,\n \"z\\\"\": 0,\n \"z\\\\\": 0,\n \"z^\": 0,\n \"z`\": 0,\n \"zf\": 0,\n \"zt\": 0,\n \"zz\": 0,\n \"z{\": 0,\n \"z~\": 0,\n \"{+\": 0,\n \"{-\": 0,\n \"{<\": 0,\n \"{f\": 0,\n \"{{\": 0,\n \"{~\": 0,\n \"})\": 0,\n \"},\": 0,\n \"}.\": 0,\n \"}/\": 0,\n \"}>\": 0,\n \"}?\": 0,\n \"}I\": 0,\n \"}S\": 0,\n \"}T\": 0,\n \"}Z\": 0,\n \"}]\": 0,\n \"}_\": 0,\n \"}`\": 0,\n \"}j\": 0,\n \"}s\": 0,\n \"}}\": 0,\n \"~'\": 0,\n \"~?\": 0,\n \"~T\": 0,\n \"~Z\": 0,\n \"~\\\"\": 0,\n \"~\\\\\": 0,\n \"~^\": 0,\n \"~_\": 0,\n \"~`\": 0,\n \"~t\": 0,\n \"~z\": 0\n },\n \"defaultKerning\": 1,\n \"defaultWhitespaceKerning\": -1,\n \"endOfLineKerning\": 0,\n \"charWidth\": {\n \" \": 4,\n \"!\": 1,\n \"#\": 5,\n \"&\": 4,\n \"'\": 1,\n \"(\": 2,\n \")\": 2,\n \",\": 1,\n \".\": 1,\n \":\": 1,\n \";\": 1,\n \"@\": 5,\n \"M\": 5,\n \"W\": 5,\n \"[\": 2,\n \"\\n\": 0,\n \"]\": 2,\n \"`\": 2,\n \"i\": 1,\n \"l\": 1,\n \"m\": 5,\n \"q\": 4,\n \"w\": 5,\n \"|\": 1\n },\n \"defaultCharWidth\": 3\n}\n", null, "export const Layer = {\n Top: 0,\n UIA: 1,\n UIB: 2,\n UIC: 3,\n UID: 4,\n UIE: 5,\n UIF: 6,\n UIG: 7,\n A: 8,\n B: 9,\n C: 10,\n D: 11,\n E: 12,\n F: 13,\n Bottom: 14,\n Hidden: 15\n} as const\nexport type Layer = (typeof Layer)[keyof typeof Layer]\n\n/** negative is above. returns [top, bottom]; hidden is out of domain. */\nexport function layerOffset(layer: Layer, offset: number): Layer {\n return Math.max(Layer.Top, Math.min(Layer.Bottom, layer + offset)) as Layer\n}\n", "export type Box = XY & WH\nexport type WH = {w: number; h: number}\nexport type XY = {x: number; y: number}\nexport type XYZ = {x: number; y: number; z: number}\n\nexport type CardinalDir = 'W' | 'N' | 'E' | 'S'\nexport type CompassDir = CardinalDir | 'NE' | 'SE' | 'SW' | 'NW' | 'Origin'\n\nexport function boxEq(l: Readonly<Box>, r: Readonly<Box>): boolean {\n return xyEq(l, r) && whEq(l, r)\n}\n\nexport function boxHits(\n l: Readonly<Partial<XY> & WH>,\n r: Readonly<XY & Partial<WH>>\n): boolean {\n const rWH = {w: r.w ?? 1, h: r.h ?? 1} // point? an empty box has no w/h.\n if (!l.w || !l.h || !rWH.w || !rWH.h) return false // noncommutative.\n const lXY = {x: l.x ?? 0, y: l.y ?? 0}\n return (\n lXY.x < r.x + rWH.w &&\n lXY.x + l.w > r.x &&\n lXY.y < r.y + rWH.h &&\n lXY.y + l.h > r.y\n )\n}\n\nexport function whAssign(l: WH, r: Readonly<WH>): void {\n l.w = r.w\n l.h = r.h\n}\n\nexport function whEq(l: Readonly<WH>, r: Readonly<WH>): boolean {\n return l.w === r.w && l.h === r.h\n}\n\n/** l + r. */\nexport function xyAdd(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: l.x + r.x, y: l.y + r.y}\n}\n\n/** l += r. */\nexport function xyAddTo(l: XY, r: Readonly<XY>): void {\n l.x += r.x\n l.y += r.y\n}\n\nexport function xyAssign(l: XY, r: Readonly<XY>): void {\n l.x = r.x\n l.y = r.y\n}\n\n/** nonnegative. */\nexport function xyDistance(from: Readonly<XY>, to: Readonly<XY>): number {\n return xyMagnitude(xySub(from, to))\n}\n\n/** l / r. */\nexport function xyDiv(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: l.x / r.x, y: l.y / r.y}\n}\n\nexport function xyEq(l: Readonly<XY>, r: Readonly<XY>): boolean {\n return l.x === r.x && l.y === r.y\n}\n\n/** nonnegative. */\nexport function xyMagnitude(xy: Readonly<XY>): number {\n return Math.hypot(xy.x, xy.y)\n}\n\n/** the greater of each component. */\nexport function xyMax(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: Math.max(l.x, r.x), y: Math.max(l.y, r.y)}\n}\n\n/** the lesser of each component. */\nexport function xyMin(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: Math.min(l.x, r.x), y: Math.min(l.y, r.y)}\n}\n\n/** l - r. */\nexport function xySub(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: l.x - r.x, y: l.y - r.y}\n}\n", "import type {TagFormat} from '../graphics/atlas.ts'\nimport type {Layer} from '../graphics/layer.ts'\nimport type {Sprite} from '../graphics/sprite.ts'\nimport {\n type CardinalDir,\n type CompassDir,\n type WH,\n whEq,\n type XY,\n xyEq\n} from '../types/geo.ts'\nimport type {Void} from '../void.ts'\nimport type {Ent} from './ent.ts'\n\nexport type NinePatchOpts<Tag extends TagFormat> = {\n margin?: {w?: number | undefined; h?: number | undefined} | undefined\n n: NinePatchDirOpts<Tag>\n origin: NinePatchDirOpts<Tag>\n border?: {[dir in Lowercase<CardinalDir>]?: number | undefined}\n wh?: {w?: number | undefined; h?: number | undefined} | undefined\n x?: number | undefined\n y?: number | undefined\n z?: Layer | undefined\n} & {\n [dir in 'w' | 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw']?:\n | NinePatchDirOpts<Tag>\n | undefined\n}\nexport type NinePatchDirOpts<Tag extends TagFormat> = {\n flip?: {x?: boolean; y?: boolean} | undefined\n tag: Tag\n stretch?: boolean | undefined\n}\n\nexport class NinePatchEnt<Tag extends TagFormat> implements Ent {\n readonly #dir: {readonly [dir in Lowercase<CompassDir>]: Sprite<Tag>}\n readonly #margin: Readonly<WH>\n #invalid: boolean = true\n\n constructor(v: Void<Tag, string>, opts: Readonly<NinePatchOpts<Tag>>) {\n this.#dir = {\n w: v.sprites.alloc(),\n nw: v.sprites.alloc(),\n n: v.sprites.alloc(),\n ne: v.sprites.alloc(),\n e: v.sprites.alloc(),\n se: v.sprites.alloc(),\n s: v.sprites.alloc(),\n sw: v.sprites.alloc(),\n origin: v.sprites.alloc()\n }\n this.#dir.w.tag = opts.w?.tag ?? opts.e?.tag ?? opts.n.tag\n this.#dir.n.tag = opts.n.tag\n this.#dir.e.tag = opts.e?.tag ?? this.#dir.w.tag\n this.#dir.s.tag = opts.s?.tag ?? this.#dir.n.tag\n\n this.#dir.nw.tag = opts.nw?.tag ?? opts.se?.tag ?? opts.n.tag\n this.#dir.ne.tag =\n opts.ne?.tag ?? opts.sw?.tag ?? opts.nw?.tag ?? opts.n.tag\n this.#dir.se.tag = opts.se?.tag ?? this.#dir.nw.tag\n this.#dir.sw.tag = opts.sw?.tag ?? this.#dir.ne.tag\n\n this.#dir.origin.tag = opts.origin.tag\n\n this.#dir.w.z =\n this.#dir.nw.z =\n this.#dir.n.z =\n this.#dir.ne.z =\n this.#dir.e.z =\n this.#dir.se.z =\n this.#dir.s.z =\n this.#dir.sw.z =\n this.#dir.origin.z =\n opts.z ?? 0\n\n this.#dir.w.stretch = opts.w?.stretch ?? opts.e?.stretch ?? false\n this.#dir.n.stretch = opts.n.stretch ?? opts.s?.stretch ?? false\n this.#dir.e.stretch = opts.e?.stretch ?? this.#dir.w.stretch\n this.#dir.s.stretch = opts.s?.stretch ?? this.#dir.n.stretch\n\n this.#dir.nw.stretch = opts.nw?.stretch ?? opts.se?.stretch ?? false\n this.#dir.ne.stretch = opts.ne?.stretch ?? opts.sw?.stretch ?? false\n this.#dir.se.stretch = opts.se?.stretch ?? this.#dir.nw.stretch\n this.#dir.sw.stretch = opts.sw?.stretch ?? this.#dir.ne.stretch\n\n this.#dir.origin.stretch = opts.origin.stretch ?? false\n\n this.#dir.w.flipX = opts.w?.flip?.x ?? !opts.e?.flip?.x\n this.#dir.w.flipY = opts.w?.flip?.y ?? !!opts.e?.flip?.y\n this.#dir.n.flipX = opts.n.flip?.x ?? !!opts.s?.flip?.x\n this.#dir.n.flipY = opts.n.flip?.y ?? !opts.s?.flip?.y\n this.#dir.e.flipX = opts.e?.flip?.x ?? !this.#dir.w.flipX\n this.#dir.e.flipY = opts.e?.flip?.y ?? this.#dir.w.flipY\n this.#dir.s.flipX = opts.s?.flip?.x ?? this.#dir.n.flipX\n this.#dir.s.flipY = opts.s?.flip?.y ?? !this.#dir.n.flipY\n this.#dir.origin.flipX = !!opts.origin.flip?.x\n this.#dir.origin.flipY = !!opts.origin.flip?.y\n\n this.#dir.n.h = opts.border?.n ?? opts.border?.s ?? this.#dir.n.h\n this.#dir.w.w = opts.border?.w ?? opts.border?.e ?? this.#dir.n.h\n this.#dir.e.w = opts.border?.e ?? this.#dir.w.w\n this.#dir.s.h = opts.border?.s ?? this.#dir.n.h\n\n this.#dir.nw.w = this.#dir.w.w\n this.#dir.nw.h = this.#dir.n.h\n this.#dir.ne.w = this.#dir.e.w\n this.#dir.ne.h = this.#dir.n.h\n this.#dir.se.w = this.#dir.e.w\n this.#dir.se.h = this.#dir.s.h\n this.#dir.sw.w = this.#dir.w.w\n this.#dir.sw.h = this.#dir.s.h\n\n this.#margin = {w: opts.margin?.w ?? 0, h: opts.margin?.h ?? 0}\n\n const w =\n opts.wh?.w == null\n ? this.#dir.w.w + this.#dir.n.w + this.#dir.e.w\n : opts.wh.w\n this.#dir.n.w = w - 1 // force resize\n this.wh = {\n w,\n h:\n opts.wh?.h == null\n ? this.#dir.n.h + this.#dir.e.h + this.#dir.s.h\n : opts.wh.h\n }\n\n this.#dir.nw.x = (opts.x ?? 0) - 1 // force move.\n this.xy = {x: opts.x ?? 0, y: opts.y ?? 0}\n }\n\n free(v: Void<Tag, string>): void {\n v.sprites.free(\n this.#dir.w,\n this.#dir.nw,\n this.#dir.n,\n this.#dir.ne,\n this.#dir.e,\n this.#dir.se,\n this.#dir.s,\n this.#dir.sw,\n this.#dir.origin\n )\n }\n\n update(): boolean | undefined {\n if (!this.#invalid) return\n this.#invalid = false\n return true\n }\n\n get wh(): WH {\n return {\n w: this.#dir.w.w + this.#dir.n.w + this.#dir.e.w + this.#margin.w,\n h: this.#dir.n.h + this.#dir.w.h + this.#dir.s.h + this.#margin.h\n }\n }\n\n set wh(wh: Readonly<WH>) {\n if (whEq(wh, this.wh)) return\n\n this.#dir.w.h = wh.h - this.#dir.n.h - this.#dir.s.h - this.#margin.h\n this.#dir.n.w = wh.w - this.#dir.w.w - this.#dir.e.w - this.#margin.w\n this.#dir.s.w = this.#dir.n.w\n this.#dir.e.h = this.#dir.w.h\n\n this.#dir.origin.w = this.#dir.n.w\n this.#dir.origin.h = this.#dir.e.h\n\n this.#setXYRight()\n\n this.#invalid = true\n }\n\n get xy(): XY {\n return {\n x: this.#dir.nw.x - this.#margin.w / 2,\n y: this.#dir.nw.y - this.#margin.h / 2\n }\n }\n\n set xy(xy: Readonly<XY>) {\n if (xyEq(xy, this.xy)) return\n\n this.#dir.nw.x = xy.x + this.#margin.w / 2\n this.#dir.nw.y = xy.y + this.#margin.h / 2\n this.#dir.w.x = this.#dir.nw.x\n this.#dir.w.y = this.#dir.nw.y + this.#dir.nw.h\n this.#dir.n.x = this.#dir.nw.x + this.#dir.nw.w\n this.#dir.n.y = this.#dir.nw.y\n\n this.#dir.origin.x = this.#dir.n.x\n this.#dir.origin.y = this.#dir.nw.y + this.#dir.ne.h\n\n this.#setXYRight()\n\n this.#invalid = true\n }\n\n #setXYRight() {\n this.#dir.ne.x = this.#dir.n.x + this.#dir.n.w\n this.#dir.ne.y = this.#dir.nw.y\n this.#dir.e.x = this.#dir.ne.x\n this.#dir.e.y = this.#dir.nw.y + this.#dir.ne.h\n this.#dir.se.x = this.#dir.e.x\n this.#dir.se.y = this.#dir.e.y + this.#dir.e.h\n this.#dir.s.x = this.#dir.n.x\n this.#dir.s.y = this.#dir.se.y\n this.#dir.sw.x = this.#dir.nw.x\n this.#dir.sw.y = this.#dir.se.y\n }\n}\n", "import type {Font} from 'mem-font'\nimport type {TagFormat} from '../graphics/atlas.ts'\n\nexport function fontCharToTag(font: Readonly<Font>, char: string): TagFormat {\n let pt = char.codePointAt(0)\n if (pt == null || pt > 0xff) pt = 63 // ?\n return `${font.id}--${pt.toString(16).padStart(2, '0')}`\n}\n\n/** @arg r undefined means end of line. */\nexport function fontKerning(\n font: Readonly<Font>,\n l: string,\n r: string | undefined\n): number {\n if (r == null) return font.endOfLineKerning\n if (font.kerning[l + r] != null) return font.kerning[l + r]!\n if (/^\\s?$/.test(l) || /^\\s?$/.test(r)) return font.defaultWhitespaceKerning\n return font.defaultKerning\n}\n\nexport function fontCharWidth(font: Readonly<Font>, letter: string): number {\n return font.charWidth[letter] ?? font.defaultCharWidth\n}\n", "import type {Font} from 'mem-font'\nimport type {Box, WH, XY} from '../types/geo.ts'\nimport {fontCharWidth, fontKerning} from './font.ts'\n\nexport type TextLayout = {\n /** the length of this array matches the string length. */\n chars: (Box | undefined)[]\n /** the offset in pixels. */\n cursor: XY\n wh: WH\n}\n\nexport type TextLayoutOpts = {\n font: Font\n maxW?: number\n scale?: number\n start?: XY\n str: string\n}\n\nexport function layoutText(opts: Readonly<TextLayoutOpts>): TextLayout {\n const chars = []\n const scale = opts.scale ?? 1\n const start = opts.start ?? {x: 0, y: 0}\n const maxW = opts.maxW ?? Infinity\n let cursor = {x: start.x, y: start.y}\n let w = 0\n while (chars.length < opts.str.length) {\n const i = chars.length\n const char = opts.str[i]!\n let layout\n if (char === '\\n') layout = layoutNewline(opts.font, cursor, start.x, scale)\n else if (/^\\s*$/.test(char)) {\n layout = layoutSpace(\n opts.font,\n cursor,\n maxW,\n tracking(opts.font, char, opts.str[i + 1], scale),\n start.x,\n scale\n )\n } else {\n layout = layoutWord(opts.font, cursor, maxW, opts.str, i, start.x, scale)\n if (\n cursor.x > 0 &&\n layout.cursor.y === nextLine(opts.font, start.x, cursor.y, scale).y\n ) {\n const wordW = maxW - cursor.x + layout.cursor.x\n if (wordW <= maxW) {\n // word can fit on one line if cursor is reset to the start of line.\n cursor = nextLine(opts.font, start.x, cursor.y, scale)\n layout = layoutWord(\n opts.font,\n cursor,\n maxW,\n opts.str,\n i,\n start.x,\n scale\n )\n }\n }\n }\n chars.push(...layout.chars)\n cursor.x = layout.cursor.x\n cursor.y = layout.cursor.y\n w = Math.max(w, layout.cursor.x - start.x)\n }\n return {\n chars,\n cursor,\n wh: {w, h: nextLine(opts.font, start.x, cursor.y, scale).y - start.y}\n }\n}\n\n/** @internal */\nexport function layoutWord(\n font: Readonly<Font>,\n cursor: Readonly<XY>,\n maxW: number,\n word: string,\n index: number,\n startX: number,\n scale: number\n): Omit<TextLayout, 'wh'> {\n const chars = []\n let {x, y} = cursor\n for (; ; index++) {\n const char = word[index]\n if (!char || /^\\s*$/.test(char)) break\n\n const span = tracking(font, char, word[index + 1], scale)\n if (x > startX && x + span > startX + maxW)\n ({x, y} = nextLine(font, startX, y, scale))\n\n // width is not span since, with kerning, that may exceed the actual\n // width of the character's sprite. eg, if w has the maximal character width\n // of five pixels and a one pixel kerning for a given pair of characters, it\n // will have a span of six pixels which is greater than the maximal five\n // pixel sprite that can be rendered.\n chars.push({x, y, w: fontCharWidth(font, char), h: font.cellHeight})\n x += span\n }\n return {chars, cursor: {x, y}}\n}\n\nfunction nextLine(\n font: Readonly<Font>,\n startX: number,\n curY: number,\n scale: number\n): XY {\n return {x: startX, y: curY + font.lineHeight * scale}\n}\n\nfunction layoutNewline(\n font: Readonly<Font>,\n cursor: Readonly<XY>,\n startX: number,\n scale: number\n): Omit<TextLayout, 'wh'> {\n return {chars: [undefined], cursor: nextLine(font, startX, cursor.y, scale)}\n}\n\n/**\n * @arg span the distance in pixels from the start of the current character to\n * the start of the next including scale.\n */\nfunction layoutSpace(\n font: Readonly<Font>,\n cursor: Readonly<XY>,\n w: number,\n span: number,\n startX: number,\n scale: number\n): Omit<TextLayout, 'wh'> {\n const nextCursor =\n cursor.x > 0 && cursor.x + span >= w\n ? nextLine(font, startX, cursor.y, scale)\n : {x: cursor.x + span, y: cursor.y}\n return {chars: [undefined], cursor: nextCursor}\n}\n\n/**\n * the distance in pixels from the start of lhs to the start of rhs including\n * scale.\n */\nfunction tracking(\n font: Readonly<Font>,\n l: string,\n r: string | undefined,\n scale: number\n): number {\n return scale * (fontCharWidth(font, l) + fontKerning(font, l, r))\n}\n", "import {memProp5x6} from 'mem-font'\nimport type {TagFormat} from '../graphics/atlas.ts'\nimport {Layer} from '../graphics/layer.ts'\nimport type {Sprite} from '../graphics/sprite.ts'\nimport {fontCharToTag} from '../text/font.ts'\nimport {layoutText} from '../text/text-layout.ts'\nimport {type WH, type XY, xyEq} from '../types/geo.ts'\nimport type {Void} from '../void.ts'\nimport type {Ent} from './ent.ts'\n\nexport class TextEnt implements Ent {\n #maxW: number = Infinity\n #layout: 'Rendered' | 'Updated' | 'Outdated' = 'Outdated'\n #z: Layer = Layer.UIA\n #scale: number = 1\n readonly #sprites: Sprite<TagFormat>[] = []\n #str: string = ''\n #wh: WH = {w: 0, h: 0}\n readonly #xy: XY = {x: 0, y: 0}\n\n free(v: Void<TagFormat, string>): void {\n v.sprites.free(...this.#sprites)\n }\n\n layout(v: Void<TagFormat, string>): boolean {\n if (this.#layout !== 'Outdated') return false\n let len = 0\n const layout = layoutText({\n font: memProp5x6,\n maxW: this.#maxW,\n scale: this.#scale,\n start: this.#xy,\n str: this.#str\n })\n this.#wh = {w: layout.wh.w, h: layout.wh.h}\n for (const [i, char] of layout.chars.entries()) {\n if (char == null) continue\n const sprite = (this.#sprites[len] ??= v.sprites.alloc())\n sprite.x = char.x\n sprite.y = char.y\n sprite.tag = fontCharToTag(memProp5x6, this.#str[i]!)\n sprite.stretch = true\n sprite.w *= this.#scale\n sprite.h *= this.#scale\n sprite.z = this.#z\n len++\n }\n while (this.#sprites.length > len) v.sprites.free(this.#sprites.pop()!)\n this.#layout = 'Updated'\n return true\n }\n\n get maxW(): number {\n return this.#maxW\n }\n\n set maxW(w: number) {\n if (w === this.#maxW) return\n this.#maxW = w\n this.#layout = 'Outdated'\n }\n\n get scale() {\n return this.#scale\n }\n\n set scale(scale: number) {\n if (scale === this.#scale) return\n this.#scale = scale\n this.#layout = 'Outdated'\n }\n\n get text(): string {\n return this.#str\n }\n\n set text(str: string) {\n if (str === this.#str) return\n this.#str = str\n this.#layout = 'Outdated'\n }\n\n update(v: Void<TagFormat, string>): boolean | undefined {\n if (this.#layout === 'Rendered') return\n if (this.#layout === 'Outdated') this.layout(v)\n this.#layout = 'Rendered'\n return true\n }\n\n get scaledLeading(): number {\n return memProp5x6.leading * this.#scale\n }\n\n get wh(): Readonly<WH> {\n return this.#wh\n }\n\n get xy(): Readonly<XY> {\n return this.#xy\n }\n\n set xy(xy: Readonly<XY>) {\n if (xyEq(xy, this.#xy)) return\n this.#xy.x = xy.x\n this.#xy.y = xy.y\n this.#layout = 'Outdated'\n }\n\n get z(): Layer {\n return this.#z\n }\n\n set z(layer: Layer) {\n if (layer === this.#z) return\n this.#z = layer\n this.#layout = 'Outdated'\n }\n}\n", "import type {TagFormat} from '../graphics/atlas.ts'\nimport {Layer, layerOffset} from '../graphics/layer.ts'\nimport type {Sprite} from '../graphics/sprite.ts'\nimport {type XY, xyEq} from '../types/geo.ts'\nimport type {Void} from '../void.ts'\nimport type {Ent} from './ent.ts'\nimport {NinePatchEnt, type NinePatchOpts} from './nine-patch-ent.ts'\nimport {TextEnt} from './text-ent.ts'\n\nexport type ButtonOpts<Tag extends TagFormat> = {\n button: Omit<NinePatchOpts<Tag>, 'x' | 'y' | 'wh'>\n pressed: {tag: Tag; z?: Layer | undefined}\n selected: {tag: Tag; z?: Layer | undefined}\n toggle?: boolean | undefined\n text?:\n | {\n text?: string | undefined\n scale?: number | undefined\n z?: Layer | undefined\n }\n | undefined\n w?: number | undefined\n h?: number | undefined\n x?: number | undefined\n y?: number | undefined\n}\n\nexport class ButtonEnt<Tag extends TagFormat, Button extends string>\n implements Ent\n{\n readonly #button: NinePatchEnt<Tag>\n #invalid: boolean = true\n readonly #pressed: {sprite: Sprite<Tag>; z: Layer}\n readonly #selected: {sprite: Sprite<Tag>; z: Layer}\n #started: boolean = false\n readonly #toggle: boolean = false\n readonly #text: TextEnt = new TextEnt()\n readonly #xy: XY = {x: 0, y: 0}\n\n constructor(v: Void<Tag, string>, opts: Readonly<ButtonOpts<Tag>>) {\n const buttonZ = opts.button.z ?? Layer.UID\n this.#button = new NinePatchEnt(v, {\n ...opts.button,\n x: opts.x,\n y: opts.y,\n z: buttonZ,\n wh: {w: opts.w, h: opts.h}\n })\n this.#pressed = {\n sprite: v.sprites.alloc(),\n z: opts.pressed.z ?? layerOffset(buttonZ, 2)\n }\n this.#selected = {\n sprite: v.sprites.alloc(),\n z: opts.selected.z ?? layerOffset(this.#pressed.z, -1)\n }\n\n this.#pressed.sprite.tag = opts.pressed.tag\n this.#pressed.sprite.x = opts.x ?? 0\n this.#pressed.sprite.y = opts.y ?? 0\n this.#pressed.sprite.w = opts.w ?? this.#button.wh.w\n this.#pressed.sprite.h = opts.h ?? this.#button.wh.h\n this.#pressed.sprite.z = Layer.Hidden\n\n this.#selected.sprite.tag = opts.selected.tag\n this.#selected.sprite.x = opts.x ?? 0\n this.#selected.sprite.y = opts.y ?? 0\n this.#selected.sprite.w = opts.w ?? this.#button.wh.w\n this.#selected.sprite.h = opts.h ?? this.#button.wh.h\n this.#selected.sprite.z = Layer.Hidden\n\n this.#text.text = opts.text?.text ?? ''\n this.#text.scale = opts.text?.scale ?? 1\n this.#text.layout(v)\n this.#moveText(v)\n this.#text.maxW = opts.w ?? this.#button.wh.w\n this.#text.z = opts.text?.z ?? layerOffset(buttonZ, -1)\n\n this.#toggle = opts.toggle ?? false\n }\n\n get selected(): boolean {\n return this.#selected.z !== Layer.Hidden\n }\n\n free(v: Void<Tag, string>): void {\n this.#button.free(v)\n this.#text.free(v)\n v.sprites.free(this.#selected.sprite, this.#pressed.sprite)\n }\n\n get on(): boolean {\n return this.#pressed.sprite.z !== Layer.Hidden\n }\n\n // to-do: offStart() for pointer up listen? would need a boundary check too.\n get onStart(): boolean {\n return this.on && this.#started\n }\n\n set text(str: string) {\n this.#text.text = str\n }\n\n update(v: Void<Tag, 'A' | 'Click' | Button>): boolean | undefined {\n let invalid = this.#invalid\n if (this.#button.update()) invalid = true\n if (this.#text.update(v)) invalid = true\n\n const hitsCursor =\n !v.input.handled && !!v.zoo.cursor?.hits(v, this.#selected.sprite, 'UI')\n const clickStarted =\n (hitsCursor && v.input.isOnStart('Click')) ||\n (v.zoo.cursor?.keyboard && v.input.isOnStart('A'))\n\n const on = clickStarted\n ? this.#toggle\n ? !this.on\n : true\n : this.#toggle\n ? this.on\n : v.input.isOn('Click') || (v.zoo.cursor?.keyboard && v.input.isOn('A'))\n this.#started = this.on !== on\n if (this.#started) {\n this.#pressed.sprite.z = on ? this.#pressed.z : Layer.Hidden\n invalid = true\n }\n\n if (\n hitsCursor &&\n (v.input.point?.click || v.input.point?.type === 'Mouse')\n ) {\n invalid ||= this.#selected.sprite.z !== this.#selected.z\n this.#selected.sprite.z = this.#selected.z\n } else {\n invalid ||= this.#selected.z !== Layer.Hidden\n this.#selected.sprite.z = Layer.Hidden\n }\n\n v.input.handled ||= hitsCursor\n this.#invalid = false\n return invalid\n }\n\n setXY(v: Void<Tag, string>, xy: Readonly<XY>): void {\n if (xyEq(xy, this.#xy)) return\n this.#xy.x = xy.x\n this.#xy.y = xy.y\n this.#button.xy = xy\n this.#moveText(v)\n this.#pressed.sprite.xy = xy\n this.#selected.sprite.xy = xy\n this.#invalid = true\n }\n\n #moveText(v: Void<Tag, string>): void {\n this.#text.layout(v)\n this.#text.xy = {\n x: this.#button.xy.x + this.#button.wh.w / 2 - this.#text.wh.w / 2,\n y:\n this.#button.xy.y +\n this.#button.wh.h / 2 -\n (this.#text.wh.h - this.#text.scaledLeading) / 2\n }\n }\n}\n", "import type {TagFormat} from '../graphics/atlas.ts'\nimport {Layer} from '../graphics/layer.ts'\nimport type {Sprite} from '../graphics/sprite.ts'\nimport {type Box, boxHits, type WH, type XY} from '../types/geo.ts'\nimport type {Void} from '../void.ts'\nimport type {Ent} from './ent.ts'\n\n/**\n * update this ent first. always prefer testing against cursor, not input, in\n * other ents. the cursor may be moved by keyboard and has a hitbox.\n */\nexport class CursorEnt<out Tag extends TagFormat> implements Ent {\n keyboard: boolean = false\n readonly #sprite: Sprite<Tag>\n\n constructor(v: Void<Tag, string>, tag: Tag) {\n this.#sprite = v.sprites.alloc()\n this.#sprite.tag = tag\n this.#sprite.z = Layer.Hidden\n }\n\n free(v: Void<Tag, string>): void {\n v.sprites.free(this.#sprite)\n }\n\n hitbox(v: Readonly<Void<Tag, string>>, coords: 'Level' | 'UI'): Box {\n const lvl = coords === 'Level'\n const hitbox = this.#sprite.hitbox\n if (!hitbox) throw Error('cursor has no hitbox')\n return {\n x: (lvl ? v.cam.x : 0) + hitbox.x,\n y: (lvl ? v.cam.y : 0) + hitbox.y,\n w: hitbox.w,\n h: hitbox.h\n }\n }\n\n hits(\n v: Readonly<Void<Tag, string>>,\n box: Readonly<XY & Partial<WH>>,\n coords: 'Level' | 'UI'\n ): boolean {\n return this.visible && boxHits(this.hitbox(v, coords), box)\n }\n\n update(v: Void<Tag, 'L' | 'R' | 'U' | 'D'>): boolean | undefined {\n if (v.input.point?.invalid) {\n this.#sprite.xy = v.input.point.local\n this.#sprite.z =\n v.input.point?.type === 'Mouse' ? Layer.Top : Layer.Hidden\n return true\n }\n\n if (this.keyboard && v.input.isAnyOn('L', 'R', 'U', 'D')) {\n const epsilon = 1\n if (v.input.isOn('L')) this.#sprite.x -= epsilon\n if (v.input.isOn('R')) this.#sprite.x += epsilon\n if (v.input.isOn('U')) this.#sprite.y -= epsilon\n if (v.input.isOn('D')) this.#sprite.y += epsilon\n this.#sprite.z = Layer.Top\n\n return true\n }\n }\n\n get visible(): boolean {\n return this.#sprite.z !== Layer.Hidden\n }\n}\n", "import type {TagFormat} from '../graphics/atlas.ts'\nimport type {Layer} from '../graphics/layer.ts'\nimport type {Sprite} from '../graphics/sprite.ts'\nimport {\n type CompassDir,\n type WH,\n whAssign,\n whEq,\n type XY,\n xyAssign,\n xyEq\n} from '../types/geo.ts'\nimport type {Void} from '../void.ts'\nimport type {Ent} from './ent.ts'\n\nexport class FollowCamEnt<Tag extends TagFormat> implements Ent {\n #fill: 'X' | 'Y' | 'XY' | undefined\n #invalid: boolean = true\n readonly #margin: WH = {w: 0, h: 0}\n readonly #modulo: XY = {x: 0, y: 0}\n #pivot: CompassDir\n readonly #sprite: Sprite<Tag>\n\n constructor(v: Void<Tag, string>, tag: Tag, pivot: CompassDir) {\n this.#sprite = v.sprites.alloc()\n this.#sprite.tag = tag\n this.#pivot = pivot\n }\n\n get fill(): 'X' | 'Y' | 'XY' | undefined {\n return this.#fill\n }\n\n set fill(fill: 'X' | 'Y' | 'XY' | undefined) {\n if (this.#fill === fill) return\n this.#fill = fill\n this.#invalid = true\n }\n\n free(v: Void<Tag, string>): void {\n v.sprites.free(this.#sprite)\n }\n\n get h(): number {\n return this.#sprite.h\n }\n\n set h(h: number) {\n if (this.#sprite.h === h) return\n this.#sprite.h = h\n this.#invalid = true\n }\n\n get margin(): Readonly<WH> {\n return this.#margin\n }\n\n set margin(margin: Readonly<WH>) {\n if (whEq(margin, this.#margin)) return\n whAssign(this.#margin, margin)\n this.#invalid = true\n }\n\n get modulo(): Readonly<XY> {\n return this.#modulo\n }\n\n set modulo(modulo: Readonly<XY>) {\n if (xyEq(modulo, this.#modulo)) return\n xyAssign(this.#modulo, modulo)\n this.#invalid = true\n }\n\n get pivot(): CompassDir {\n return this.#pivot\n }\n\n set pivot(pivot: CompassDir) {\n if (this.#pivot === pivot) return\n this.#pivot = pivot\n this.#invalid = true\n }\n\n update(v: Void<Tag, string>): boolean | undefined {\n if (!this.#invalid && !v.cam.invalid) return\n const follow = v.cam.follow(\n {w: this.#sprite.w, h: this.#sprite.h},\n this.#sprite.z,\n this.#pivot,\n {fill: this.#fill, modulo: this.#modulo, margin: this.#margin}\n )\n this.#sprite.x = follow.x\n this.#sprite.y = follow.y\n this.#invalid = false\n return true\n }\n\n get w(): number {\n return this.#sprite.w\n }\n\n set w(w: number) {\n if (this.#sprite.w === w) return\n this.#sprite.w = w\n this.#invalid = true\n }\n\n get z(): Layer {\n return this.#sprite.z\n }\n\n set z(z: Layer) {\n this.#sprite.z = z\n }\n}\n", "import type {TagFormat} from '../graphics/atlas.ts'\nimport type {Void} from '../void.ts'\nimport {CursorEnt} from './cursor-ent.ts'\nimport type {Ent} from './ent.ts'\n\n/**\n * ents are updated in insertion order. composed ents are updated by their\n * owning ents.\n */\nexport class Zoo<out Tag extends TagFormat> {\n #cursor: CursorEnt<Tag> | undefined\n readonly #ents: Set<Ent> = new Set()\n\n add(...ents: readonly Ent[]): void {\n for (const ent of ents) {\n this.#ents.add(ent)\n if (ent instanceof CursorEnt) this.#cursor = ent\n }\n }\n\n clear(): void {\n this.#cursor = undefined\n this.#ents.clear()\n }\n\n get cursor(): CursorEnt<Tag> | undefined {\n return this.#cursor\n }\n\n remove(...ents: readonly Readonly<Ent>[]): void {\n for (const ent of ents) {\n this.#ents.delete(ent)\n if (ent === this.#cursor) this.#cursor = undefined\n }\n }\n\n update(v: Void<TagFormat, string>): boolean {\n let invalid = false\n for (const ent of this.#ents) if (ent.update?.(v)) invalid = true\n return invalid\n }\n}\n", "import type {Box} from '../types/geo.ts'\nimport type {Millis} from '../types/time.ts'\n\n/** every animation is padded to 16 cels as needed by repeating the sequence. */\nexport const animCels: number = 16\n/** max animation loop duration. */\nexport const animMillis: Millis = 1000 as Millis\n/** 62.5 millis. */\nexport const celMillis: Millis = (animMillis / animCels) as Millis\n\nexport type Atlas = {\n anim: {[tag: string]: Anim}\n /**\n * cell source XYWH by `Anim.id` and `Anim.cel`. every animation is padded to\n * 16 cels (`maxAnimCels`) as needed by repeating the sequence.\n */\n celXYWH: number[]\n /** tag by `Anim.id`. */\n tags: string[]\n}\n\nexport type AtlasJSON = {\n anim: {[tag: string]: Anim}\n /**\n * cel source XY by `Anim.id` and `Anim.cel` for one cycle. truncated to\n * `animCels`.\n */\n celXY: number[]\n}\n\nexport type Anim = {\n /**\n * number of cels in a full animation cycle including cels extended for\n * duration and the second half of pingpongs.\n */\n cels: number\n /** outgoing collision rectangle (red / blue). */\n hitbox?: Box | undefined\n /** incoming collision rectangle (green / blue). */\n hurtbox?: Box | undefined\n /** atlas tag index. */\n id: number\n /** clipbox / source width. */\n w: number\n /** clipbox / source height. */\n h: number\n}\n\n/** `--tagname-format={filestem}--{animation}`. */\nexport type TagFormat = `${string}--${string}`\n", "import {type Anim, type Atlas, type AtlasJSON, animCels} from './atlas.ts'\n\nexport function parseAtlas(json: Readonly<AtlasJSON>): Atlas {\n return {\n anim: json.anim,\n celXYWH: parseCelXYWH(json),\n tags: Object.keys(json.anim)\n }\n}\n\nfunction parseCelXYWH(json: Readonly<AtlasJSON>): number[] {\n const cels = []\n let i = 0\n for (const anim of Object.values(json.anim)) {\n cels.push(...parseXYWH(anim, json.celXY, i))\n i += anim.cels * 2\n }\n return cels\n}\n\n/** @internal */\nexport function parseXYWH(\n anim: Readonly<Anim>,\n celXY: readonly number[],\n i: number\n): number[] {\n const xywh = []\n for (let ii = 0; ii < animCels; ii++) {\n const iii = i + 2 * (ii % anim.cels)\n xywh.push(celXY[iii]!, celXY[iii + 1]!, anim.w, anim.h)\n }\n return xywh\n}\n", "import {\n type Box,\n boxHits,\n type CompassDir,\n type WH,\n type XY\n} from '../types/geo.ts'\nimport {Layer} from './layer.ts'\n\nexport type LevelClientLocalXY = {\n /** position relative canvas top-left (in DPI scale). */\n client: XY\n /**\n * position relative canvas top-left in level scale (like level xy but no cam\n * offset) within cam.\n */\n local: XY\n /** level x-coord within cam. */\n x: number\n /** level y-coord within cam. */\n y: number\n}\n\ntype Canvas = {\n width: number\n height: number\n style: {width: string; height: string}\n parentElement: {clientWidth: number; clientHeight: number} | null\n}\n\n/** given a min WH and scale, size the camera to the max WH. */\nexport class Cam {\n #h: number = 1\n #invalid: boolean = true\n #minScale: number = 1\n readonly #minWH: WH = {w: Infinity, h: Infinity}\n #mode: 'Int' | 'Fraction' = 'Int'\n #scale: number = 1\n #w: number = 1\n readonly #whClient: WH = {w: 1, h: 1}\n #x: number = 0\n #y: number = 0\n #zoomOut: number = 0\n\n center(xy: Readonly<XY>): void {\n this.x = Math.floor(xy.x - this.w / 2)\n this.y = Math.floor(xy.y - this.h / 2)\n }\n\n /** position in fractional level coordinates. */\n clientToXY(client: Readonly<XY>): XY {\n const local = this.clientToXYLocal(client)\n return {x: this.#x + local.x, y: this.#y + local.y}\n }\n\n /**\n * position relative canvas top-left in level scale (like level xy but no cam\n * offset). often used for UI that is fixed within the cam.\n */\n clientToXYLocal(client: Readonly<XY>): XY {\n return {\n x: (client.x / this.#whClient.w) * this.#w,\n y: (client.y / this.#whClient.h) * this.#h\n }\n }\n\n follow(\n wh: Readonly<WH>,\n z: Layer,\n pivot: CompassDir,\n opts?: {\n readonly fill?: 'X' | 'Y' | 'XY' | undefined\n readonly margin?: Partial<Readonly<WH>> | undefined\n readonly modulo?: Partial<Readonly<XY>> | undefined\n }\n ): Box {\n const marginW = opts?.margin?.w ?? 0\n let x = z > Layer.UIG ? Math.trunc(this.x) : 0\n switch (pivot) {\n case 'SW':\n case 'W':\n case 'NW':\n x += marginW\n break\n case 'SE':\n case 'E':\n case 'NE':\n x += this.w - (wh.w + marginW)\n break\n case 'N':\n case 'S':\n case 'Origin':\n x += Math.trunc(this.w / 2) - Math.trunc(wh.w / 2)\n break\n }\n x -= x % ((opts?.modulo?.x ?? x) || 1)\n\n const marginH = opts?.margin?.h ?? 0\n let y = z > Layer.UIG ? Math.trunc(this.y) : 0\n switch (pivot) {\n case 'N':\n case 'NE':\n case 'NW':\n y += marginH\n break\n case 'SE':\n case 'S':\n case 'SW':\n y += this.h - (wh.h + marginH)\n break\n case 'E':\n case 'W':\n case 'Origin':\n y += Math.trunc(this.h / 2) - Math.trunc(wh.h / 2)\n break\n }\n y -= y % ((opts?.modulo?.y ?? y) || 1)\n\n const w =\n opts?.fill === 'X' || opts?.fill === 'XY' ? this.w - 2 * marginW : wh.w\n const h =\n opts?.fill === 'Y' || opts?.fill === 'XY' ? this.h - 2 * marginH : wh.h\n\n return {x, y, w, h}\n }\n\n /** positive int in level px. */\n get h(): number {\n return this.#h\n }\n\n isVisible(box: Readonly<XY & Partial<WH>>): boolean {\n return boxHits(this, box)\n }\n\n /** true if cam moved or resized since last update. */\n get invalid(): boolean {\n return this.#invalid\n }\n\n /** positive int or fraction depending on mode. */\n get minScale(): number {\n return this.#minScale\n }\n\n set minScale(scale: number) {\n if (this.#scale === scale) return\n this.#scale = scale\n this.#invalidateWH()\n }\n\n /**\n * positive int or infinite min dimensions. set to\n * `{w: Infinity, h: Infinity}` to always use min scale.\n */\n get minWH(): Readonly<WH> {\n return this.#minWH\n }\n\n set minWH(wh: Readonly<WH>) {\n if (this.#minWH.w === wh.w && this.#minWH.h === wh.h) return\n this.#minWH.w = wh.w\n this.#minWH.h = wh.h\n this.#invalidateWH()\n }\n\n get mode(): 'Int' | 'Fraction' {\n return this.#mode\n }\n\n set mode(mode: 'Int' | 'Fraction') {\n if (this.#mode === mode) return\n this.#mode = mode\n this.#invalidateWH()\n }\n\n get portrait(): boolean {\n return this.h > this.w\n }\n\n postupdate(): void {\n this.#invalid = false\n }\n\n /** positive int or fraction depending on mode. */\n get scale(): number {\n return this.#scale\n }\n\n toString(): string {\n return `Cam{(${this.x} ${this.y}) ${this.w}\u00D7${this.h}}`\n }\n\n /**\n * call after input processing but before ent processing. ents that move the\n * camera should be called immediately after update so that the invalid state\n * can be considered.\n */\n update(canvas: Canvas): void {\n if (!canvas.parentElement) throw Error('canvas has no parent')\n const {clientWidth, clientHeight} = canvas.parentElement\n\n this.#invalid ||=\n this.#whClient.w !== clientWidth || this.#whClient.h !== clientHeight\n if (!this.#invalid) return\n this.#whClient.w = clientWidth\n this.#whClient.h = clientHeight\n this.#invalidateWH()\n\n canvas.width = this.#w\n canvas.height = this.#h\n // ~parentW / parentH.\n canvas.style.width = `${(this.#w * this.#scale) / devicePixelRatio}px`\n canvas.style.height = `${(this.#h * this.#scale) / devicePixelRatio}px`\n }\n\n /** positive int in level px. */\n get w(): number {\n return this.#w\n }\n\n /**\n * positive int dimensions in client px of canvas (often\n * `canvas.parentElement.clientWidth/Height` since the canvas is resized)\n * which is assumed to be max WH.\n */\n get whClient(): Readonly<WH> {\n return this.#whClient\n }\n\n /** fractional. */\n get x(): number {\n return this.#x\n }\n\n set x(x: number) {\n this.#invalid ||= this.x !== x\n this.#x = x\n }\n\n /** fractional. */\n get y(): number {\n return this.#y\n }\n\n set y(y: number) {\n this.#invalid ||= this.y !== y\n this.#y = y\n }\n\n /** nonnegative int or fraction depending on mode. */\n get zoomOut(): number {\n return this.#zoomOut\n }\n\n set zoomOut(out: number) {\n out = Math.max(0, out)\n if (this.#zoomOut === out) return\n this.#zoomOut = out\n this.#invalidateWH()\n }\n\n #invalidateWH(): void {\n this.#invalid = true\n\n const phy = {\n w: this.#whClient.w * devicePixelRatio,\n h: this.#whClient.h * devicePixelRatio\n }\n\n const scale = Math.max(\n this.#minScale,\n Math.min(phy.w / this.#minWH.w, phy.h / this.#minWH.h) -\n (this.#mode === 'Int' ? Math.trunc(this.#zoomOut) : this.#zoomOut)\n )\n this.#scale = this.#mode === 'Int' ? Math.trunc(scale) : scale\n\n this.#w = Math.ceil(phy.w / this.#scale)\n this.#h = Math.ceil(phy.h / this.#scale)\n }\n}\n", "// to-do: port tests.\nexport function clamp(val: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, val))\n}\n\nexport function closeTo(lhs: number, rhs: number, tolerance: number): boolean {\n return Math.abs(lhs - rhs) <= tolerance\n}\n\n// to-do: port tests.\n/** ratio is [0, 1] to return [start, end]. */\nexport function lerp(start: number, end: number, ratio: number): number {\n return start + (end - start) * ratio\n}\n\n// to-do: test.\n/** returns positive modulo. */\nexport function mod(dividend: number, divisor: number): number {\n return ((dividend % divisor) + divisor) % divisor\n}\n", "import {\n type Anim,\n type Atlas,\n animCels,\n celMillis,\n type TagFormat\n} from '../graphics/atlas.ts'\nimport type {Block} from '../mem/pool.ts'\nimport {type Box, boxHits, type WH, type XY} from '../types/geo.ts'\nimport type {Millis} from '../types/time.ts'\nimport {mod} from '../utils/math.ts'\nimport type {Layer} from './layer.ts'\n\nexport const drawableBytes: number = 12\n/** granularity (0.015625) of `Drawable` coords. */\nexport const drawableEpsilon: number = 1 / 64\nexport const drawableMaxWH: WH = {w: 4095, h: 4095}\n\n/**\n * everything not requiring an atlas. the box is the drawn region. assume little\n * endian.\n *\n * 0 xxxx xxxx x [-131072, 131071.984375] (1/64th fixed-point). 1b sign, 17b\n * 1 xxxx xxxx int, 6b fraction.\n * 2 xxxx xxxx\n * 3 yyyy yyyy y.\n * 4 yyyy yyyy\n * 5 yyyy yyyy\n * 6 sxyz llll stretch, flip x, flip y, zend, z layer (4b).\n * 7 wwww wwww width [0, 4095]. zero means discard.\n * 8 hhhh wwww height. zero means discard.\n * 9 hhhh hhhh\n * a iiic cccc animation ID [0, 2047], animation cel [0, 31].\n * b iiii iiii\n *\n * animations default to looping without CPU interaction.\n * @internal\n */\nexport abstract class Drawable implements Block, Box {\n i: number\n readonly #pool: {readonly view: DataView<ArrayBuffer>}\n\n constructor(pool: {readonly view: DataView<ArrayBuffer>}, i: number) {\n this.#pool = pool\n this.i = i\n }\n\n above(draw: Readonly<Drawable>): boolean {\n const compare =\n this.z === draw.z\n ? (draw.zend ? draw.y + draw.h : draw.y) -\n (this.zend ? this.y + this.h : this.y)\n : this.z - draw.z\n return compare < 0\n }\n\n get cel(): number {\n const iiic_cccc = this.#pool.view.getUint8(this.i + 10)\n return iiic_cccc & 0x1f\n }\n\n /**\n * [0, 31]. rendered cel offset. call reset() to play animation from start.\n */\n set cel(cel: number) {\n const iiic_cccc = this.#pool.view.getUint8(this.i + 10)\n this.#pool.view.setUint8(this.i + 10, (iiic_cccc & ~0x1f) | (cel & 0x1f))\n }\n\n /** test if render area overlaps box or sprite render area. */\n clips(box: Readonly<XY & Partial<WH>>): boolean {\n return boxHits(this, box)\n }\n\n get flipX(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x40)\n }\n\n set flipX(flip: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0x40) | (-flip & 0x40))\n }\n\n get flipY(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x20)\n }\n\n set flipY(flip: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0x20) | (-flip & 0x20))\n }\n\n get h(): number {\n const h12_wwww = this.#pool.view.getUint16(this.i + 8, true)\n return h12_wwww >>> 4\n }\n\n /** [0, 4095]. */\n set h(h: number) {\n const h12_wwww = this.#pool.view.getUint16(this.i + 8, true)\n this.#pool.view.setUint16(\n this.i + 8,\n (h12_wwww & ~(0xfff << 4)) | ((h & 0xfff) << 4),\n true\n )\n }\n\n get id(): number {\n const i11_c5 = this.#pool.view.getUint16(this.i + 10, true)\n return (i11_c5 >>> 5) & 0x7ff\n }\n\n /** [0, 2047]. */\n set id(id: number) {\n const i11_c5 = this.#pool.view.getUint16(this.i + 10, true)\n this.#pool.view.setUint16(\n this.i + 10,\n (i11_c5 & ~(0x7ff << 5)) | ((id & 0x7ff) << 5),\n true\n )\n }\n\n get stretch(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x80)\n }\n\n /** wrap texture (default) or stretch to width and height. */\n set stretch(stretch: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(\n this.i + 6,\n (sxyz_llll & ~0x80) | (-stretch & 0x80)\n )\n }\n\n get w(): number {\n const hhhh_w12 = this.#pool.view.getUint16(this.i + 7, true)\n return hhhh_w12 & 0xfff\n }\n\n /** [0, 4095]. */\n set w(w: number) {\n const hhhh_w12 = this.#pool.view.getUint16(this.i + 7, true)\n this.#pool.view.setUint16(\n this.i + 7,\n (hhhh_w12 & ~0xfff) | (w & 0xfff),\n true\n )\n }\n\n get x(): number {\n const y8_x24 = this.#pool.view.getUint32(this.i + 0, true)\n return ((y8_x24 << 8) >> 8) / 64 // signed shift.\n }\n\n /** [-131072, 131071.984375] with 1/64th (0.015625) granularity. */\n set x(x: number) {\n const y8_x24 = this.#pool.view.getUint32(this.i + 0, true)\n this.#pool.view.setUint32(\n this.i + 0,\n (y8_x24 & ~0xff_ffff) | ((x * 64) & 0xff_ffff),\n true\n )\n }\n\n get xy(): XY {\n return {x: this.x, y: this.y}\n }\n\n set xy(xy: Readonly<XY>) {\n this.x = xy.x\n this.y = xy.y\n }\n\n get y(): number {\n const sxyz_llll_y24 = this.#pool.view.getUint32(this.i + 3, true)\n return ((sxyz_llll_y24 << 8) >> 8) / 64 // signed shift.\n }\n\n /** [-131072, 131071.984375] with 1/64th (0.015625) granularity. */\n set y(y: number) {\n const sxyz_llll_y24 = this.#pool.view.getUint32(this.i + 3, true)\n this.#pool.view.setUint32(\n this.i + 3,\n (sxyz_llll_y24 & ~0xff_ffff) | ((y * 64) & 0xff_ffff),\n true\n )\n }\n\n get z(): Layer {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return (sxyz_llll & 0xf) as Layer\n }\n\n /** layer [0 (closest), 14 (furthest)]; 15 is hidden. */\n set z(z: Layer) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0xf) | (z & 0xf))\n }\n\n get zend(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x10)\n }\n\n /** z-order by top (default) or bottom of box. */\n set zend(end: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0x10) | (-end & 0x10))\n }\n}\n\n// to-do: can I declaration merge or namespace merge away from the tag type?\nexport class Sprite<out Tag extends TagFormat> extends Drawable {\n readonly #atlas: Readonly<Atlas>\n readonly #framer: {readonly age: Millis}\n #hitbox: Box | undefined\n #hurtbox: Box | undefined\n\n constructor(\n pool: {readonly view: DataView<ArrayBuffer>},\n i: number,\n atlas: Readonly<Atlas>,\n framer: {readonly age: Millis}\n ) {\n super(pool, i)\n this.#atlas = atlas\n this.#framer = framer\n }\n\n get anim(): Anim {\n return this.#atlas.anim[this.tag]!\n }\n\n override get flipX(): boolean {\n return super.flipX\n }\n\n override set flipX(flip: boolean) {\n if (this.flipX === flip) return\n super.flipX = flip\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get flipY(): boolean {\n return super.flipY\n }\n\n override set flipY(flip: boolean) {\n if (this.flipY === flip) return\n super.flipY = flip\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get h(): number {\n return super.h\n }\n\n override set h(h: number) {\n if (this.h === h) return\n super.h = h\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n get hitbox(): Box | undefined {\n if (this.#hitbox) return this.#hitbox\n const {hitbox} = this.anim\n if (!hitbox) return\n return (this.#hitbox ??= {\n x: this.x + (this.flipX ? this.w - hitbox.w - hitbox.x : hitbox.x),\n y: this.y + (this.flipY ? this.h - hitbox.h - hitbox.y : hitbox.y),\n w: hitbox.w,\n h: hitbox.h\n })\n }\n\n hits(box: Readonly<XY | Box>): boolean {\n const hitbox = this.hitbox\n if (!hitbox) return false\n const hurtbox = box instanceof Sprite ? box.hurtbox : box\n return !!hurtbox && boxHits(hitbox, hurtbox)\n }\n\n get hurtbox(): Box | undefined {\n if (this.#hurtbox) return this.#hurtbox\n const {hurtbox} = this.anim\n if (!hurtbox) return\n return (this.#hurtbox ??= {\n x: this.x + (this.flipX ? this.w - hurtbox.w - hurtbox.x : hurtbox.x),\n y: this.y + (this.flipY ? this.h - hurtbox.h - hurtbox.y : hurtbox.y),\n w: hurtbox.w,\n h: hurtbox.h\n })\n }\n\n override get id(): number {\n return super.id\n }\n\n override set id(id: number) {\n if (this.id === id) return\n super.id = id\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n /** true if animation has played once. */\n get looped(): boolean {\n // this comparison resets after the second loop since cel can only count to\n // 2 * anim.cels.\n return mod(this.#currentCel - this.cel, animCels * 2) >= this.anim.cels\n }\n\n /** sets cel to animation start. */\n reset(): void {\n this.cel = this.#currentCel // setter truncates.\n }\n\n // to-do: unit test and catch up on unit tests elsewhere.\n\n get tag(): Tag {\n return this.#atlas.tags[this.id] as Tag\n }\n\n /** sets animation, resets cel, dimensions, hitbox, and hurtbox. */\n set tag(tag: Tag) {\n const anim = this.#atlas.anim[tag]!\n this.w = anim.w\n this.h = anim.h\n this.id = anim.id\n this.reset()\n }\n\n override toString(): string {\n return `Sprite{${this.tag} (${this.x} ${this.y} ${this.z}) ${this.w}\u00D7${this.h}}`\n }\n\n override get w(): number {\n return super.w\n }\n\n override set w(w: number) {\n if (this.w === w) return\n super.w = w\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get x(): number {\n return super.x\n }\n\n override set x(x: number) {\n if (this.x === x) return\n super.x = x\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get y(): number {\n return super.y\n }\n\n override set y(y: number) {\n if (this.y === y) return\n super.y = y\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n /** current fractional cel in [0, 2 * anim.cels). */\n get #currentCel(): number {\n const cel = this.#framer.age / celMillis\n return cel % (this.anim.cels * 2)\n }\n}\n", "/** @internal */\nexport class ContextMenu {\n enable: boolean = false\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n fn('contextmenu', this.#onContextMenu as EventListener)\n // disable long press vibration. nonpassive must be explicit.\n fn('touchstart', this.#onContextMenu as EventListener, {passive: false})\n return this\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #onContextMenu = (ev: PointerEvent | TouchEvent): void => {\n if (!ev.isTrusted || ev.metaKey || ev.altKey || ev.ctrlKey) return\n if (!this.enable) ev.preventDefault()\n }\n}\n", "/** @internal */\nexport class Gamepad {\n bits: number = 0\n // to-do: support analog button values, expose connected status and vibration,\n // and distinct devices. would be nice if vibration could merge with\n // navigator.vibrate().\n readonly bitByAxis: {[axis: number]: [less: number, more: number]} = {}\n readonly bitByButton: {[btn: number]: number} = {}\n onEvent: () => void = () => {}\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n get connected(): boolean {\n return isSecureContext && navigator.getGamepads().filter(Boolean).length > 0\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n fn('gamepadconnected', this.onEvent)\n fn('gamepaddisconnected', this.onEvent)\n return this\n }\n\n reset(): void {\n this.bits = 0\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n update(): void {\n if (!isSecureContext) return\n for (const pad of navigator.getGamepads()) {\n for (const [index, axis] of pad?.axes.entries() ?? []) {\n const lessMore = this.bitByAxis[index]\n if (!lessMore) continue\n const bit = axis < 0 ? lessMore[0] : axis === 0 ? 0 : lessMore[1]\n this.bits |= Math.abs(axis) >= 0.5 ? bit : 0\n }\n for (const [index, btn] of pad?.buttons.entries() ?? []) {\n const bit = this.bitByButton[index]\n if (bit == null) continue\n this.bits |= btn.pressed ? bit : 0\n }\n }\n }\n}\n", "/** @internal */\nexport class Keyboard {\n /** KeyboardEvent.code to bit. */\n readonly bitByCode: {[code: string]: number} = {}\n invalid: boolean = false\n /** KeyboardEvent.code to state. Multiple keys may map to the same bit. */\n onEvent: () => void = () => {}\n #on: {[code: string]: boolean} = {}\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n get bits(): number {\n let bits = 0\n for (const k in this.bitByCode) bits |= this.#on[k] ? this.bitByCode[k]! : 0\n return bits\n }\n\n postupdate(): void {\n this.invalid = false\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n for (const ev of ['keydown', 'keyup']) fn(ev, this.#onKey as EventListener)\n return this\n }\n\n reset(): void {\n this.invalid = false\n this.#on = {}\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #onKey = (ev: KeyboardEvent): void => {\n if (!ev.isTrusted || this.bitByCode[ev.code] == null) return\n if (ev.type === 'keydown' && (ev.metaKey || ev.altKey || ev.ctrlKey)) return\n this.invalid = true\n this.#on[ev.code] = ev.type === 'keydown'\n ev.preventDefault()\n this.onEvent()\n }\n}\n", "import {\n type Box,\n type XY,\n xyAdd,\n xyDistance,\n xyMax,\n xyMin,\n xySub\n} from '../types/geo.ts'\n\nexport type PointType =\n (typeof pointTypeByPointerType)[keyof typeof pointTypeByPointerType]\n\nexport type PointEvent = {\n bits: number\n /** most recent click. */\n clickClient: XY | undefined\n drag: boolean\n ev: (typeof pointEvents)[number]\n id: number\n /**\n * cursors should only use the primary inputs to avoid flickering between\n * distant points. inputs may be only secondaries.\n */\n primary: boolean\n type: PointType | undefined\n xyClient: XY\n}\n\nconst pointTypeByPointerType = {\n mouse: 'Mouse',\n pen: 'Pen',\n touch: 'Touch'\n} as const\nconst pointEvents = [\n 'pointercancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup'\n] as const\n\n/** @internal */\nexport class Pointer {\n readonly bitByButton: {[btn: number]: number} = {}\n dragMinClient: number = 5\n invalid: boolean = false\n onEvent: () => void = () => {}\n /** primary may be on or off. */\n primary: Readonly<PointEvent> | undefined\n /**\n * secondaries are deleted when buttons are off. secondaries are only present\n * when primary is defined.\n */\n readonly secondary: {[id: number]: Readonly<PointEvent>} = {}\n /** nonnegative. */\n #pinchStartClient: XY | undefined\n readonly #target: Element\n\n constructor(target: Element) {\n this.#target = target\n }\n\n get boundsClient(): Box | undefined {\n if (!this.primary?.bits && !Object.keys(this.secondary).length) return\n let min = {x: Infinity, y: Infinity}\n let max = {x: -Infinity, y: -Infinity}\n for (const pt of [this.primary, ...Object.values(this.secondary)]) {\n if (!pt?.bits) continue\n min = xyMin(min, pt.xyClient)\n max = xyMax(max, pt.xyClient)\n }\n return {x: min.x, y: min.y, w: max.x - min.x, h: max.y - min.y}\n }\n\n get centerClient(): XY | undefined {\n const bounds = this.boundsClient\n if (!bounds) return this.primary?.xyClient\n return xyAdd(bounds, {x: bounds.w / 2, y: bounds.h / 2})\n }\n\n get locked(): boolean {\n return this.#target.ownerDocument.pointerLockElement === this.#target\n }\n\n get pinchClient(): XY | undefined {\n if (!this.#pinchStartClient) return\n const end = this.#newPinchClient\n return end ? xySub(end, this.#pinchStartClient) : undefined\n }\n\n postupdate(): void {\n this.invalid = false\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n for (const ev of pointEvents) fn(ev, this.#onInput as EventListener)\n return this\n }\n\n reset(): void {\n this.invalid = false\n this.primary = undefined\n for (const pt in this.secondary) delete this.secondary[pt]\n this.#pinchStartClient = undefined\n }\n\n update(): void {\n const on =\n (this.primary?.bits ? 1 : 0) + Object.values(this.secondary).length\n if (on < 2 || !this.#pinchStartClient)\n this.#pinchStartClient = this.#newPinchClient\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #evButtonsToBits(btns: number): number {\n let bits = 0\n for (let btn = 1; btn <= btns; btn <<= 1)\n if ((btn & btns) === btn) bits |= this.bitByButton[btn] ?? 0\n return bits\n }\n\n #onInput = (ev: PointerEvent): void => {\n if (!ev.isTrusted) return\n\n this.invalid = true\n const bits =\n ev.metaKey || ev.altKey || ev.ctrlKey\n ? 0\n : this.#evButtonsToBits(ev.buttons)\n if (bits) ev.preventDefault() // only prevent mapped buttons.\n const locked = this.locked\n if (ev.type === 'pointerdown' && !locked)\n try {\n this.#target.setPointerCapture(ev.pointerId)\n } catch {}\n\n const prevPt = ev.isPrimary ? this.primary : this.secondary[ev.pointerId]\n\n let xyClient\n if (locked) {\n // `devicePixelRatio` seems to be incorrect. when zoom is 500%, DPR is 10.\n // in full screen, this would give the actual zoom allowing `movementX`\n // to match the `offsetX` delta:\n // const scale = document.documentElement.clientWidth / screen.availWidth\n // console.log(\n // `screenDelta=${ev.screenX - prevScreen.x} movementX=${ev.movementX} movementXScaled=${ev.movementX * scale} offsetDelta=${ev.offsetX - prevOffset.x} clientDelta=${ev.clientX - prevClient.x}`\n // )\n // probably wouldn't work across devices though.\n const scale = 1 / devicePixelRatio\n\n // to-do: this should allow offscreen.\n xyClient = {\n x: Math.min(\n Math.max(\n 0,\n (prevPt?.xyClient.x ?? ev.offsetX) + ev.movementX * scale\n ),\n this.#target.clientWidth\n ),\n y: Math.min(\n Math.max(\n 0,\n (prevPt?.xyClient.y ?? ev.offsetY) + ev.movementY * scale\n ),\n this.#target.clientHeight\n )\n }\n } else xyClient = {x: ev.offsetX, y: ev.offsetY}\n\n const evType = ev.type as (typeof pointEvents)[number]\n const type =\n pointTypeByPointerType[\n ev.pointerType as keyof typeof pointTypeByPointerType\n ]\n let clickClient\n if (ev.type === 'pointerdown') clickClient = {x: xyClient.x, y: xyClient.y}\n else if (ev.type === 'pointermove') clickClient = prevPt?.clickClient\n const drag =\n !!bits &&\n (prevPt?.drag ||\n (!!clickClient &&\n xyDistance(clickClient, xyClient) >= this.dragMinClient))\n\n const pt = {\n clickClient,\n bits,\n drag,\n ev: evType,\n id: ev.pointerId,\n primary: ev.isPrimary,\n type,\n xyClient\n }\n if (ev.isPrimary) this.primary = pt\n else if (!bits) delete this.secondary[ev.pointerId]\n else this.secondary[ev.pointerId] = pt\n\n this.onEvent()\n }\n\n get #newPinchClient(): XY | undefined {\n if ((this.primary?.bits ? 1 : 0) + Object.values(this.secondary).length < 2)\n return\n const bounds = this.boundsClient\n return bounds ? {x: bounds.w, y: bounds.h} : undefined\n }\n}\n", "import type {XYZ} from '../types/geo.ts'\n\n/** @internal */\nexport class Wheel {\n deltaClient: Readonly<XYZ> | undefined\n onEvent: () => void = () => {}\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n postupdate(): void {\n this.deltaClient = undefined\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n fn('wheel', this.#onInput as EventListener, {passive: true})\n return this\n }\n\n reset(): void {\n this.deltaClient = undefined\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #onInput = (ev: WheelEvent): void => {\n if (!ev.isTrusted || ev.metaKey || ev.altKey || ev.ctrlKey) return\n this.deltaClient = {x: ev.deltaX, y: ev.deltaY, z: ev.deltaZ}\n this.onEvent()\n }\n}\n", "import type {Cam, LevelClientLocalXY} from '../graphics/cam.ts'\nimport type {XY, XYZ} from '../types/geo.ts'\nimport type {Millis} from '../types/time.ts'\nimport {ContextMenu} from './context-menu.ts'\nimport {Gamepad} from './gamepad.ts'\nimport {Keyboard} from './keyboard.ts'\nimport type {PointType} from './pointer.ts'\nimport {Pointer} from './pointer.ts'\nimport {Wheel} from './wheel.ts'\n\nexport type Chord<Button> = [Button, ...Button[]]\nexport type Combo<Button> = [Chord<Button>, ...Chord<Button>[]]\n\n// biome-ignore format:;\nexport type DefaultButton =\n | 'L' | 'R' | 'U' | 'D' // dpad.\n | 'A' | 'B' | 'C' // primary, secondary, tertiary.\n | 'Click' | 'Click2' | 'ClickMiddle'\n | 'Menu' | 'Back'\n\nexport type Point = LevelClientLocalXY & {\n click: LevelClientLocalXY | undefined\n type: PointType | undefined\n}\n\n/**\n * doesn't consider handled. local and level positions are reevaluated each\n * frame.\n */\ntype PointerState = Point & {\n center: LevelClientLocalXY\n /** false when pinched. */\n drag: {on: boolean; start: boolean; end: boolean}\n /** true if changed since last update. */\n invalid: boolean\n /** may be negative. */\n pinch:\n | {\n client: XY\n /** level / local. */\n xy: XY\n }\n | undefined\n /** secondary points. */\n secondary: Point[]\n}\n\n/** triggered. */\ntype WheelState = {\n delta: {\n client: Readonly<XYZ>\n /** level / local. */\n xy: XY\n }\n}\n\n/**\n * input device abstraction. aggregates devices, records history, and provides\n * a convenient API.\n *\n * devices own as much device-specific detail and as little coordination (time\n * and device) as practical. devices avoid caching state which is the\n * responsibility of Input. devices strive to provide the current state and\n * nothing else.\n *\n * if you miss reporting on a event between long updates, you just miss it.\n * that's the nature of polling. there's no queue.\n *\n * to-do: expose analog state of gamepad. offer direction as a number instead of\n * bool.\n * to-do: multiplayer. possible if devices were requested instead of sought.\n * to-do: expose input source device.\n */\nexport class Input<Button extends string> {\n /** time allowed between combo inputs. */\n comboMaxIntervalMillis: Millis = 300 as Millis\n /**\n * true if any button, key, or click was _ever_ on. doesn't consider handled.\n */\n gestured: boolean = false\n /** clear buttonish inputs for rest of frame. */\n handled: boolean = false\n /** true if _any_ input has changed since previous update. */\n invalid: boolean = false\n /**\n * minimum duration for an input to be considered held. durations are\n * calculated at frame boundaries, not on actual press. devices are treated\n * strictly as polled aggregates.\n */\n minHeldMillis: Millis = 300 as Millis\n readonly #bitByButton: {[btn in Button]?: number} = {}\n readonly #buttonByBit: {[bit: number]: Button} = {}\n #bits: number = 0\n readonly #cam: Readonly<Cam>\n /**\n * sequence of nonzero bits ordered from oldest to latest. combos end only by\n * expiration.\n */\n readonly #combo: number[] = []\n readonly #contextMenu: ContextMenu\n readonly #gamepad: Gamepad\n /** time since buttons changed. */\n #heldMillis: Millis = 0 as Millis\n readonly #keyboard: Keyboard\n readonly #pointer: Pointer\n #pointerState: PointerState | undefined\n /** bits last update. may not be equal to `#combo.at(-1)`. */\n #prevBits: number = 0\n readonly #wheel: Wheel\n #wheelState: Readonly<WheelState> | undefined\n\n constructor(cam: Readonly<Cam>, target: Element) {\n this.#cam = cam\n this.#contextMenu = new ContextMenu(target)\n this.#gamepad = new Gamepad(globalThis)\n this.#keyboard = new Keyboard(target.ownerDocument)\n this.#pointer = new Pointer(target)\n this.#wheel = new Wheel(target)\n }\n\n get anyOn(): boolean {\n return this.#bits !== 0\n }\n\n /** for debugging. */\n get combo(): Button[][] {\n const chords: Button[][] = []\n for (const bits of this.#combo) {\n const chord: Button[] = []\n for (let bit = 1; bit <= bits; bit <<= 1) {\n if ((bit & bits) === bit && this.#buttonByBit[bit])\n chord.push(this.#buttonByBit[bit]!)\n }\n chord.sort()\n chords.push(chord)\n }\n return chords\n }\n\n /**\n * enable when game is paused or in photo mode to allow right clicks and long\n * presses to save canvas.\n */\n get contextMenu(): {enable: boolean} {\n return this.#contextMenu\n }\n\n /** doesn't consider handled. gamepads must be polled. */\n get gamepad(): Readonly<object | undefined> {\n return this.#gamepad.connected ? {} : undefined\n }\n\n /** true if bits hasn't changed for a while. */\n get held(): boolean {\n return !this.handled && this.#heldMillis >= this.minHeldMillis\n }\n\n isAnyOn(...btns: Readonly<Chord<Button>>): boolean {\n return !this.handled && !!(this.#bits & this.#mapBits(btns))\n }\n\n isAnyOnStart(...btns: Readonly<Chord<Button>>): boolean {\n return this.started && this.isAnyOn(...btns)\n }\n\n /**\n * buttons are exact. eg, up won't match up AND down like `isOn('U')` will.\n * combo is exact too. `['A'], ['A']` will match `['A'], ['A']` but not\n * `['A'], ['A'], ['A']`.\n */\n isCombo(...combo: Readonly<Combo<Button>>): boolean {\n return combo.length === this.#combo.length && this.isComboEndsWith(...combo)\n }\n\n /**\n * `['A'], ['A']` will match `['A'], ['A']` and `['B'], ['A'], ['A']`. eg,\n * double-clicks often don't care about any preceding buttons.\n */\n isComboEndsWith(...combo: Readonly<Combo<Button>>): boolean {\n for (const [i, btns] of combo.entries()) {\n const bits = this.#mapBits(btns)\n if (this.#combo.at(-combo.length + i) !== bits) return false\n }\n // #combo is a historical record of buttons. whenever buttons changes, a new\n // entry is pushed. make sure the current entry is the current state.\n return !this.handled && (this.#combo.at(-1) === this.#bits || !this.#bits)\n }\n\n /** like isComboEndsWith() but test if the last button is triggered. */\n isComboEndsWithStart(...combo: Readonly<Combo<Button>>): boolean {\n // isOnStart() can handle zero-length.\n return this.isOnStart(...combo.at(-1)!) && this.isComboEndsWith(...combo)\n }\n\n /** like isCombo() but test if the last button is triggered. */\n isComboStart(...combo: Readonly<Combo<Button>>): boolean {\n return this.isOnStart(...combo.at(-1)!) && this.isCombo(...combo)\n }\n\n /*:\n * true if any button in chord is not on. this is usually what's wanted. eg:\n * ```ts\n * if (isOn('A', 'B')) console.log('on')\n * if (isOff('A', 'B')) console.log('not A+B; A and/or B is off')\n * ```\n */\n isOff(...btns: Readonly<Chord<Button>>): boolean {\n return !this.handled && !this.isOn(...btns)\n }\n\n isOffStart(...btns: Readonly<Chord<Button>>): boolean {\n const bits = this.#mapBits(btns)\n const wasOn = (this.#prevBits & bits) === bits\n // don't test this.#bits === 0 since it might forever miss the off event for\n // the specific bits.\n return wasOn && this.started && this.isOff(...btns)\n }\n\n /**\n * true if all buttons are on inclusively. eg, `isOn('U')` is true when up is\n * pressed or when up and down are pressed.\n */\n isOn(...btns: Readonly<Chord<Button>>): boolean {\n const bits = this.#mapBits(btns)\n return !this.handled && (this.#bits & bits) === bits\n }\n\n isOnStart(...btns: Readonly<Chord<Button>>): boolean {\n return this.started && this.isOn(...btns)\n }\n\n get key(): {invalid: boolean} {\n return {invalid: this.#keyboard.invalid}\n }\n\n mapDefault(): Input<Button | DefaultButton> {\n const input = this as Input<Button | DefaultButton>\n input.mapKeyboardCode('L', 'ArrowLeft')\n input.mapKeyboardCode('R', 'ArrowRight')\n input.mapKeyboardCode('U', 'ArrowUp')\n input.mapKeyboardCode('D', 'ArrowDown')\n input.mapKeyboardCode('C', 'KeyC')\n input.mapKeyboardCode('A', 'KeyX')\n input.mapKeyboardCode('B', 'KeyZ')\n input.mapKeyboardCode('Menu', 'Enter')\n input.mapKeyboardCode('Back', 'Escape')\n\n // https://w3c.github.io/gamepad/#remapping\n input.mapGamepadAxis('L', 'R', 0, 2)\n input.mapGamepadAxis('U', 'D', 1, 3)\n input.mapGamepadButton('L', 14)\n input.mapGamepadButton('R', 15)\n input.mapGamepadButton('U', 12)\n input.mapGamepadButton('D', 13)\n input.mapGamepadButton('C', 2)\n input.mapGamepadButton('B', 0) // to-do: not good from PS perspective.\n input.mapGamepadButton('A', 1) // to-do: not good from PS perspective.\n input.mapGamepadButton('Menu', 9)\n input.mapGamepadButton('Back', 8)\n\n input.mapPointerClick('Click', 1)\n input.mapPointerClick('Click2', 2)\n input.mapPointerClick('ClickMiddle', 4)\n return input\n }\n\n // to-do: support analog values.\n mapGamepadAxis(less: Button, more: Button, ...axes: readonly number[]): void {\n for (const axis of axes) {\n this.#gamepad.bitByAxis[axis] = [\n this.#mapButton(less),\n this.#mapButton(more)\n ]\n }\n }\n\n mapGamepadButton(btn: Button, ...indices: readonly number[]): void {\n for (const index of indices)\n this.#gamepad.bitByButton[index] = this.#mapButton(btn)\n }\n\n /** @arg codes union of KeyboardEvent.code. */\n mapKeyboardCode(btn: Button, ...codes: readonly string[]): void {\n for (const code of codes)\n this.#keyboard.bitByCode[code] = this.#mapButton(btn)\n }\n\n mapPointerClick(btn: Button, ...clicks: readonly number[]): void {\n for (const click of clicks)\n this.#pointer.bitByButton[click] = this.#mapButton(btn)\n }\n\n get on(): Button[] {\n const on: Button[] = []\n for (const btn in this.#bitByButton) if (this.isOn(btn)) on.push(btn)\n return on.sort()\n }\n\n set onEvent(cb: () => void) {\n this.#gamepad.onEvent = cb\n this.#keyboard.onEvent = cb\n this.#pointer.onEvent = cb\n this.#wheel.onEvent = cb\n }\n\n /** doesn't consider handled. */\n get point(): PointerState | undefined {\n return this.#pointerState\n }\n\n get pointer(): {dragMinClient: number} {\n return this.#pointer\n }\n\n register(op: 'add' | 'remove'): this {\n globalThis[`${op}EventListener`]('blur', this.reset) // keyup is lost if window loses focus.\n this.#contextMenu.register(op)\n this.#gamepad.register(op)\n this.#keyboard.register(op)\n this.#pointer.register(op)\n this.#wheel.register(op)\n return this\n }\n\n reset = (): void => {\n this.#bits = 0\n this.#prevBits = 0\n this.handled = false\n this.#heldMillis = 0 as Millis\n this.#combo.length = 0\n this.#gamepad.reset()\n this.#keyboard.reset()\n this.#pointer.reset()\n this.#pointerState = undefined\n this.#wheel.reset()\n this.#wheelState = undefined\n }\n\n /** true if bits has changed. */\n get started(): boolean {\n return !this.handled && this.#bits !== this.#prevBits\n }\n\n /**\n * call on new frame before altering cam. dispatches always occur before an\n * update.\n * @arg millis duration since last update.\n */\n update(millis: Millis): void {\n this.handled = false\n this.#gamepad.update()\n this.#pointer.update()\n\n this.#prevBits = this.#bits\n this.#bits =\n this.#gamepad.bits |\n this.#keyboard.bits |\n (this.#pointer.primary?.bits ?? 0)\n this.invalid =\n this.#bits !== this.#prevBits ||\n this.#pointer.invalid ||\n !!this.#wheel.deltaClient\n this.gestured ||= !!this.#bits\n\n if (\n (millis > this.comboMaxIntervalMillis && this.#bits !== this.#prevBits) ||\n (this.#heldMillis + millis > this.comboMaxIntervalMillis && !this.#bits)\n )\n this.#combo.length = 0\n\n if (this.#bits === this.#prevBits)\n this.#heldMillis = (this.#heldMillis + millis) as Millis\n else this.#heldMillis = millis\n\n if (this.#bits && this.#bits !== this.#prevBits) {\n if (this.#prevBits) this.#combo.length = 0 // new button without release.\n this.#combo.push(this.#bits)\n }\n\n if (this.#pointer.primary) {\n const pinchClient = this.#pointer.pinchClient\n const dragOn =\n this.#pointer.primary.drag &&\n !Object.values(this.#pointer.secondary).length\n const secondary: Point[] = []\n for (const pt of Object.values(this.#pointer.secondary)) {\n secondary.push({\n type: pt.type,\n click: pt.clickClient\n ? {\n client: pt.clickClient,\n local: this.#cam.clientToXYLocal(pt.clickClient),\n ...this.#cam.clientToXY(pt.clickClient)\n }\n : undefined,\n ...this.#cam.clientToXY(pt.xyClient),\n client: pt.xyClient,\n local: this.#cam.clientToXYLocal(pt.xyClient)\n })\n }\n const centerClient = this.#pointer.centerClient!\n const center = {\n client: centerClient,\n local: this.#cam.clientToXYLocal(centerClient),\n ...this.#cam.clientToXY(centerClient)\n }\n this.#pointerState = {\n center,\n click: this.#pointer.primary.clickClient\n ? {\n client: this.#pointer.primary.clickClient,\n local: this.#cam.clientToXYLocal(\n this.#pointer.primary.clickClient\n ),\n ...this.#cam.clientToXY(this.#pointer.primary.clickClient)\n }\n : undefined,\n drag: {\n on: dragOn,\n start: !this.#pointerState?.drag.on && dragOn,\n end: !!this.#pointerState?.drag.on && !dragOn\n },\n invalid: this.#pointer.invalid,\n pinch: pinchClient\n ? {client: pinchClient, xy: this.#cam.clientToXY(pinchClient)}\n : undefined,\n secondary,\n type: this.#pointer.primary.type,\n ...this.#cam.clientToXY(this.#pointer.primary.xyClient),\n client: this.#pointer.primary.xyClient,\n local: this.#cam.clientToXYLocal(this.#pointer.primary.xyClient)\n }\n }\n // secondary should never be set when primary isn't.\n else this.#pointerState = undefined\n\n this.#wheelState = this.#wheel.deltaClient\n ? {\n delta: {\n client: this.#wheel.deltaClient,\n xy: this.#cam.clientToXY(this.#wheel.deltaClient)\n }\n }\n : undefined\n this.#keyboard.postupdate()\n this.#pointer.postupdate()\n this.#wheel.postupdate()\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n /** doesn't consider handled. */\n get wheel(): Readonly<WheelState | undefined> {\n return this.#wheelState\n }\n\n /** get bits for buttons. */\n #mapBits(btns: Readonly<Chord<Button>>): number {\n let bits = 0\n for (const btn of btns) bits |= this.#bitByButton[btn] ?? 0\n return bits\n }\n\n /** assign button to bit. */\n #mapButton(btn: Button): number {\n const bit = (this.#bitByButton[btn] ??=\n 1 << Object.keys(this.#bitByButton).length)\n this.#buttonByBit[bit] = btn\n return bit\n }\n}\n", "/**\n * proxy for debug CSV query param with case-insensitive keys. when a key\n * exists, the value is as specified or `'true'` if no value. void values\n * default to `'true'` when the `debug` param is empty or `'void'` is set (eg,\n * `localhost:1234?debug` or `localhost:1234?debug=void,foo=bar`). all values\n * default to true when `'all'` is set. extend interface for additional types.\n * doesn't handle multiple values like `localhost:1234?debug=a=1,b=2&debug=b=3`.\n */\nexport interface Debug {\n cam?: string\n input?: string\n mem?: string\n render?: string\n}\n\nexport const debug: Readonly<Debug> | undefined = Debug(\n globalThis.location?.href\n)\n\n/** @internal */\nexport function Debug(url: string | undefined): Debug | undefined {\n if (!url) return\n const csv = [...new URL(url).searchParams].find(\n ([k]) => k.toLowerCase() === 'debug'\n )?.[1]\n if (csv == null) return\n const map = Object.fromEntries(\n csv\n .split(',') // split KV pairs.\n .filter(Boolean) // drop empties.\n .map(kv => kv.split('=')) // split each pair.\n )\n\n const target: {[k: string]: string} = {}\n for (const k in map) target[k.toLowerCase()] = map[k] || 'true'\n\n const voidKeyset: {[_ in keyof Debug]-?: undefined} = {\n cam: undefined,\n input: undefined,\n mem: undefined,\n render: undefined\n }\n\n return new Proxy<{[k: string]: string}>(target, {\n get(target, k): string | undefined {\n if (typeof k !== 'string') return target[k as unknown as string]\n k = k.toLowerCase()\n return !csv || 'all' in map || (k in voidKeyset && 'void' in map)\n ? target[k] || 'true'\n : target[k]\n }\n })\n}\n", "import {debug} from '../utils/debug.ts'\n\nexport type PoolOpts<out T extends Block> = {\n alloc(pool: Pool<T>): T\n allocBytes: number\n minPages?: number\n pageBlocks: number\n}\n\nexport type Block = {/** variable pool byte offset. */ i: number}\n\n/**\n * a contiguous resizable TypedArray associated with an array of objects.\n *\n * alternatives:\n * - operating on the array without classes would probably be faster but the DX\n * sucks:\n * this.#sprite = this.#pool.alloc()\n * this.#pool.setX(this.#sprite, this.#pool.getX(this.#sprite) + 1)\n * - sprite classes owning all the data is nice DX but requires a copy on every\n * frame.\n * - ArrayBuffer.resize() is incompatible with WebGL.\n */\nexport class Pool<out T extends Block> {\n /** the next free block is always at size. */\n readonly #blocks: T[]\n readonly #opts: Readonly<Required<PoolOpts<T>>>\n #size: number = 0\n #u8: Uint8Array<ArrayBuffer>\n #view!: DataView<ArrayBuffer>\n\n constructor(opts: Readonly<PoolOpts<T>>) {\n if (opts.allocBytes <= 0) throw Error('byte allocation must be > 0')\n if (opts.pageBlocks <= 0) throw Error('page blocks must be > 0')\n this.#opts = {...opts, minPages: opts.minPages ?? 1}\n const initSize = this.#opts.minPages * opts.pageBlocks\n this.#blocks = new Array(initSize)\n this.#u8 = new Uint8Array()\n this.#resize(initSize, 'Init')\n }\n\n alloc(): T {\n if (this.#size >= this.#currentCapacity)\n this.#resize(this.#currentCapacity + this.#opts.pageBlocks, 'Call')\n const block = this.#blocks[this.#size]!\n block.i = this.#size * this.#opts.allocBytes\n this.#size++\n return block\n }\n\n clear(): void {\n this.#size = 0\n const minCapacity = this.#opts.minPages * this.#opts.pageBlocks\n if (this.#currentCapacity > minCapacity) this.#resize(minCapacity, 'Call')\n }\n\n free(...blocks: readonly T[]): void {\n for (const block of blocks) this.#freeBlock(block)\n }\n\n get size(): number {\n return this.#size\n }\n\n get view(): DataView<ArrayBuffer> {\n return this.#view\n }\n\n toDebugString(): string {\n let str = ''\n for (let i = 0; i < this.#u8.buffer.byteLength; i++) {\n if (i && !(i % this.#opts.allocBytes)) str += ' '\n str += this.#u8[i]!.toString(16).padStart(2, '0')\n }\n return str\n }\n\n get #currentCapacity(): number {\n return this.#u8.buffer.byteLength / this.#opts.allocBytes\n }\n\n #freeBlock(block: T): void {\n if (!this.#size) throw Error('pool underflow')\n\n this.#size--\n const start = this.#size * this.#opts.allocBytes\n this.#u8.copyWithin(block.i, start, start + this.#opts.allocBytes)\n this.#blocks[this.#size]!.i = block.i\n ;[this.#blocks[block.i], this.#blocks[this.#size]] = [\n this.#blocks[this.#size]!,\n this.#blocks[block.i]!\n ]\n\n const free = Math.floor(\n (this.#currentCapacity - this.#size) / this.#opts.pageBlocks\n )\n if (\n free &&\n this.#currentCapacity / this.#opts.pageBlocks - free >=\n this.#opts.minPages\n )\n this.#resize(this.#currentCapacity - free * this.#opts.pageBlocks, 'Call')\n }\n\n #resize(capacity: number, origin: 'Init' | 'Call'): void {\n if (origin === 'Call' && debug?.mem)\n console.debug(\n `[mem] ${capacity < this.#currentCapacity ? 'shrinking' : 'growing'} pool to ${capacity}`\n )\n\n this.#blocks.length = capacity\n for (let i = this.#currentCapacity; i < capacity; i++)\n this.#blocks[i] = this.#opts.alloc(this)\n\n const buffer = new ArrayBuffer(capacity * this.#opts.allocBytes)\n const u8 = new Uint8Array(buffer)\n u8.set(this.#u8.subarray(0, capacity * this.#opts.allocBytes))\n this.#u8 = u8\n this.#view = new DataView(buffer)\n }\n}\n", "export function rgbaHex(rgba: number): `#${string}` {\n return `#${rgba.toString(16).padStart(8, '0')}`\n}\n", "import {rgbaHex} from './color-util.ts'\n\nexport function initMetaViewport(): void {\n if (document.querySelector('meta[name=\"viewport\"]')) return\n const meta = document.createElement('meta')\n meta.name = 'viewport'\n // don't wait for double-tap scaling on mobile.\n meta.content =\n 'width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no'\n document.head.appendChild(meta)\n}\n\nexport function initBody(\n canvas: Readonly<HTMLCanvasElement>,\n rgba: number\n): void {\n if (canvas.parentNode !== document.body) return\n document.body.style.margin = '0'\n // fill the screen except for UI chrome.\n document.body.style.width = '100dvw'\n document.body.style.height = '100dvh'\n document.body.style.overflow = 'hidden'\n document.body.style.background = rgbaHex(rgba)\n}\n\nexport function download(uri: string, filename: string): void {\n const a = document.createElement('a')\n a.href = uri\n a.download = filename\n a.click()\n a.remove()\n}\n", "import {dateToTimestamp} from '../types/time.ts'\nimport {download} from './dom-util.ts'\n\nexport async function downloadScreenshot(\n canvas: HTMLCanvasElement,\n name: string\n): Promise<void> {\n using img = await screenshot(canvas)\n download(img.uri, `${name}-screenshot-${dateToTimestamp(new Date())}.png`)\n}\n\nexport function initCanvas(\n canvas: HTMLCanvasElement | undefined,\n mode: 'Int' | 'Fraction'\n): HTMLCanvasElement {\n canvas ??= document.createElement('canvas')\n canvas.width = 0 // guarantee Renderer.#resize().\n canvas.style.cursor = 'none'\n canvas.style.display = 'block' // no line height spacing.\n canvas.style.outline = 'none' // disable focus outline.\n canvas.style.cursor = 'none'\n if (mode === 'Int') canvas.style.imageRendering = 'pixelated' // to-do: why doesn't cam mode set this?\n // update on each pointermove *touch* Event like *mouse* Events.\n canvas.style.touchAction = 'none'\n canvas.tabIndex = 0\n canvas.focus()\n if (!canvas.parentNode) document.body.append(canvas)\n return canvas\n}\n\nexport async function requestFullscreen(\n canvas: HTMLCanvasElement\n): Promise<boolean> {\n if (!document.fullscreenEnabled) return false\n\n if (document.fullscreenElement !== canvas)\n try {\n await canvas.requestFullscreen({navigationUI: 'hide'})\n } catch {\n return false\n }\n\n if (!document.pointerLockElement) {\n try {\n await canvas.requestPointerLock({unadjustedMovement: true})\n } catch (err) {\n if (err instanceof Error && err.name === 'NotSupportedError')\n try {\n await canvas.requestPointerLock()\n } catch {}\n }\n }\n\n return true\n}\n\n/** draws a canvas to a blob URI. */\nexport function screenshot(\n canvas: HTMLCanvasElement\n): Promise<Disposable & {uri: string}> {\n return new Promise((fulfil, reject) => {\n canvas.toBlob(blob => {\n if (blob) {\n const img = {\n [Symbol.dispose]() {\n URL.revokeObjectURL(this.uri)\n },\n uri: URL.createObjectURL(blob)\n }\n fulfil(img)\n } else reject(Error('no blob'))\n }, 'image/png')\n })\n}\n", "export async function fetchAudio(url: string): Promise<ArrayBuffer> {\n const rsp = await fetch(url, {headers: {accept: 'audio/mpeg'}})\n if (!rsp.ok)\n throw Error(`fetch error ${rsp.status}: ${rsp.statusText} for ${url}`)\n const type = rsp.headers.get('Content-Type')\n // to-do: ogg\n if (!type?.startsWith('audio/mpeg'))\n throw Error(`bad fetch response type ${type} for ${url}`)\n return await rsp.arrayBuffer()\n}\n\nexport function fetchImage(url: string): Promise<HTMLImageElement> {\n const img = new Image()\n const promise = loadImage(img)\n img.src = url\n return promise\n}\n\nexport async function loadImage(\n img: HTMLImageElement\n): Promise<HTMLImageElement> {\n const promise = new Promise<HTMLImageElement>((fulfil, reject) => {\n img.onload = () => fulfil(img)\n img.onerror = () => reject(Error(`image load error for ${img.src}`))\n })\n return img.complete ? img : await promise\n}\n", "import {debug} from '../utils/debug.ts'\n\n/** @internal */\nexport type GL2 = WebGL2RenderingContext\n/** @internal */\nexport type GLProgram = WebGLProgram\n/** @internal */\nexport type GLShader = WebGLShader\n/** @internal */\nexport type GLTexture = WebGLTexture\n/** @internal */\nexport type GLUniformLocation = WebGLUniformLocation\n/** @internal */\nexport type GLUniformMap = {[name: string]: GLUniformLocation}\n\n/** @internal */\nexport type Shader = {\n program: GLProgram | null\n buffer: WebGLBuffer | null\n uniform: GLUniformMap\n vao: WebGLVertexArrayObject | null\n textures: GLTexture[]\n}\n\n/** @internal */\nexport function Shader(\n gl: GL2,\n vertGLSL: string,\n fragGLSL: string,\n textures: GLTexture[]\n): Shader {\n const program = loadProgram(gl, vertGLSL, fragGLSL)\n gl.useProgram(program)\n return {\n buffer: gl.createBuffer(),\n program,\n textures,\n uniform: GLUniformMap(gl, program),\n vao: gl.createVertexArray()\n }\n}\n\nfunction GLUniformMap(gl: GL2, pgm: GLProgram | null): GLUniformMap {\n const len = pgm ? gl.getProgramParameter(pgm, gl.ACTIVE_UNIFORMS) : 0\n const map = debug?.render\n ? new Proxy<GLUniformMap>(\n {},\n {\n get(target, k: string): GLUniformLocation {\n if (target[k] == null) throw Error(`no shader uniform \"${k}\"`)\n return target[k]\n }\n }\n )\n : {}\n for (let i = 0; i < len; ++i) {\n const uniform = gl.getActiveUniform(pgm!, i)\n if (!uniform) throw Error(`no shader uniform at index ${i}`)\n const location = gl.getUniformLocation(pgm!, uniform.name)\n if (!location) throw Error(`no shader uniform \"${uniform.name}\"`)\n const name = uniform.name.replace('[0]', '') // arrays.\n map[name] = location\n }\n return map\n}\n\nfunction loadProgram(\n gl: GL2,\n vertGLSL: string,\n fragGLSL: string\n): GLProgram | null {\n const pgm = gl.createProgram()\n if (!pgm) return null\n\n const vert = compileShader(gl, 'VERTEX_SHADER', vertGLSL)\n const frag = compileShader(gl, 'FRAGMENT_SHADER', fragGLSL)\n if (!vert || !frag) return null\n gl.attachShader(pgm, vert)\n gl.attachShader(pgm, frag)\n gl.linkProgram(pgm)\n\n if (debug?.render && !gl.getProgramParameter(pgm, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(pgm)?.slice(0, -1)\n throw Error(`shader link failure; ${log}`)\n }\n\n gl.detachShader(pgm, frag)\n gl.detachShader(pgm, vert)\n gl.deleteShader(frag)\n gl.deleteShader(vert)\n\n return pgm\n}\n\nfunction compileShader(\n gl: GL2,\n type: 'FRAGMENT_SHADER' | 'VERTEX_SHADER',\n glsl: string\n): GLShader | null {\n const shader = gl.createShader(gl[type])\n if (!shader) return shader\n gl.shaderSource(shader, glsl.trim())\n gl.compileShader(shader)\n\n if (debug?.render && !gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader)?.slice(0, -1)\n throw Error(`shader compile failure; ${log}`)\n }\n\n return shader\n}\n", "export const spriteFragGLSL: string = `#version 300 es\n#pragma debug(${debug?.render ? 'on' : 'off'}) \n#pragma optimize(${debug?.render ? 'off' : 'on'})\n\nprecision highp int;\nprecision highp float;\nprecision highp usampler2D;\n\nuniform sampler2D uTex;\nuniform uvec2 uTexWH;\n\nflat in uint vStretch;\nflat in ivec4 vTexXYWH;\nflat in int vZ;\nin vec2 vDstWH;\nflat in ivec2 vDstWHFixed;\n\nout vec4 oRGBA;\n\nvoid main() {\n if (vZ == ${Layer.Hidden} || vDstWHFixed.x == 0 || vDstWHFixed.y == 0)\n discard;\n\n vec2 px = vec2(vTexXYWH.xy) + (\n vStretch == 1u ? (vDstWH * vec2(vTexXYWH.zw) / vec2(vDstWHFixed))\n : mod(vDstWH, vec2(vTexXYWH.zw))\n );\n\n oRGBA = texture(uTex, px / vec2(uTexWH));\n if(oRGBA.a < .001) discard;\n}\n`\n\nimport {debug} from '../utils/debug.ts'\nimport {Layer} from './layer.ts'\n", "export const spriteVertGLSL: string = `#version 300 es\n#pragma debug(${debug?.render ? 'on' : 'off'}) \n#pragma optimize(${debug?.render ? 'off' : 'on'})\n\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2\nprecision highp int;\nprecision highp float;\nprecision highp usampler2D;\n\nuniform ivec4 uCam;\nuniform usampler2D uCels;\nuniform float uAge;\n\nlayout (location=0) in ivec2 iUV;\nlayout (location=1) in uint iy8_x24;\nlayout (location=2) in uint iw8_sxyz_llll_y16;\nlayout (location=3) in uint ii11_c5_h12_w4;\n\nconst int maxY = 0x20000;\nconst int layers = 16;\nconst int maxDepth = maxY * layers;\n\nflat out uint vStretch;\nflat out ivec4 vTexXYWH;\nflat out int vZ;\nout vec2 vDstWH;\nflat out ivec2 vDstWHFixed;\n\nvoid main() {\n int x = (int((iy8_x24 & 0xffffffu) << 8) >> 8) / 64;\n int y = (int(iy8_x24 >> 24) | (int(iw8_sxyz_llll_y16 & 0xffffu) << 16 >> 8)) / 64;\n int z = int((iw8_sxyz_llll_y16 >> 16) & 0xfu);\n bool zend = bool(iw8_sxyz_llll_y16 & 0x100000u);\n bool flipY = bool(iw8_sxyz_llll_y16 & 0x200000u);\n bool flipX = bool(iw8_sxyz_llll_y16 & 0x400000u);\n bool stretch = bool(iw8_sxyz_llll_y16 & 0x800000u);\n int id = int((ii11_c5_h12_w4 >> 17) & 0x7ff0u); // ignore cel.\n int cel = int((ii11_c5_h12_w4 >> 16) & 0xfu); // ignore the MSB.\n int w = int(((ii11_c5_h12_w4 & 0xfu) << 8) | (iw8_sxyz_llll_y16 >> 24));\n int h = int((ii11_c5_h12_w4 >> 4) & 0xfffu);\n\n // https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel\n float depth = float((z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);\n\n ivec2 targetWH = iUV * ivec2(w, h);\n\n vec2 end = vec2(x + targetWH.x, y + targetWH.y);\n // UI layers are always given in screen coordinates.\n // to-do: how to handle non-int mode?\n vec2 camXY = z < ${Layer.A} ? vec2(0, 0) : vec2(uCam.xy);\n vec2 clip = ((-2. * camXY + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);\n gl_Position = vec4(clip, depth, 1);\n\n int frame = (((int(uAge / ${celMillis}) & 0x1f) - cel) + ${animCels}) & 0xf;\n uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);\n vTexXYWH = ivec4(texXYWH);\n vZ = z;\n\n vDstWH = vec2(targetWH * ivec2(flipX ? -1 : 1, flipY ? -1 : 1));\n vDstWHFixed = ivec2(w, h) * ivec2(flipX ? -1 : 1, flipY ? -1 : 1);\n\n vStretch = stretch ? 1u : 0u;\n}\n`\n\nimport {debug} from '../utils/debug.ts'\nimport {animCels, celMillis} from './atlas.ts'\nimport {Layer} from './layer.ts'\n", "import type {Pool} from '../mem/pool.ts'\nimport {type WH, whEq} from '../types/geo.ts'\nimport type {Millis} from '../types/time.ts'\nimport {debug} from '../utils/debug.ts'\nimport type {Atlas, TagFormat} from './atlas.ts'\nimport type {Cam} from './cam.ts'\nimport {type GL2, Shader} from './gl.ts'\nimport {drawableBytes, type Sprite} from './sprite.ts'\nimport {spriteFragGLSL} from './sprite-frag.glsl.ts'\nimport {spriteVertGLSL} from './sprite-vert.glsl.ts'\n\ntype Context = {gl: GL2; spriteShader: Shader; viewport: WH}\n\nconst uv: Readonly<Int8Array> = new Int8Array([1, 1, 0, 1, 1, 0, 0, 0])\n\nexport class Renderer {\n /** when off, ents should avoid requesting renders. */\n always: boolean = false\n invalid: boolean = false\n loseContext: WEBGL_lose_context | undefined\n readonly #canvas: HTMLCanvasElement\n #clearRGBA: number = 0\n #ctx: Context | undefined\n readonly #preloadAtlas: Readonly<Atlas>\n #preloadAtlasImage: Readonly<HTMLImageElement> | undefined\n\n constructor(preloadAtlas: Readonly<Atlas>, canvas: HTMLCanvasElement) {\n this.#preloadAtlas = preloadAtlas\n this.#canvas = canvas\n this.#ctx = this.#Context()\n }\n\n clear(rgba: number): void {\n if (!this.#ctx) return\n const {gl} = this.#ctx\n if (this.#clearRGBA !== rgba) {\n this.#clearRGBA = rgba\n gl.clearColor(\n ((rgba >>> 24) & 0xff) / 0xff,\n ((rgba >>> 16) & 0xff) / 0xff,\n ((rgba >>> 8) & 0xff) / 0xff,\n ((rgba >>> 0) & 0xff) / 0xff\n )\n }\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)\n }\n\n draw(pool: Readonly<Pool<Sprite<TagFormat>>>): void {\n if (!this.#preloadAtlasImage || !this.#ctx) return\n const {gl, spriteShader} = this.#ctx\n\n gl.bindBuffer(gl.ARRAY_BUFFER, spriteShader.buffer)\n gl.bufferData(\n gl.ARRAY_BUFFER,\n pool.view,\n gl.DYNAMIC_DRAW,\n 0,\n pool.size * drawableBytes\n )\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n gl.bindVertexArray(spriteShader.vao)\n gl.drawArraysInstanced(\n gl.TRIANGLE_STRIP,\n 0,\n uv.length / 2, // d\n pool.size\n )\n gl.bindVertexArray(null)\n\n this.invalid = false\n }\n\n load(preloadAtlas: Readonly<HTMLImageElement> | undefined): void {\n this.#preloadAtlasImage = preloadAtlas\n this.#ctx = this.#Context()\n }\n\n predraw(cam: Readonly<Cam>, framer: {readonly age: Millis}): void {\n if (!this.#ctx) return\n const {gl, spriteShader, viewport} = this.#ctx\n\n if (!whEq(viewport, cam)) {\n gl.viewport(0, 0, cam.w, cam.h)\n viewport.w = cam.w\n viewport.h = cam.h\n }\n\n gl.useProgram(spriteShader.program)\n\n gl.uniform4i(spriteShader.uniform.uCam!, cam.x, cam.y, cam.w, cam.h)\n gl.uniform1f(spriteShader.uniform.uAge!, framer.age)\n\n for (const [i, tex] of spriteShader.textures.entries()) {\n gl.activeTexture(gl.TEXTURE0 + i)\n gl.bindTexture(gl.TEXTURE_2D, tex)\n }\n }\n\n register(op: 'add' | 'remove'): this {\n this.#canvas[`${op}EventListener`]('webglcontextlost', this.#onContextLost)\n this.#canvas[`${op}EventListener`](\n 'webglcontextrestored',\n this.#onContextRestored\n )\n return this\n }\n\n setDepth(enable: boolean): void {\n if (!this.#ctx) return\n if (enable) this.#ctx.gl.enable(this.#ctx.gl.DEPTH_TEST)\n else this.#ctx.gl.disable(this.#ctx.gl.DEPTH_TEST)\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #Context(): Context | undefined {\n const gl = this.#ctx?.gl ?? GL2(this.#canvas)\n if (!gl) return\n\n const shader = Shader(gl, spriteVertGLSL, spriteFragGLSL, [\n gl.createTexture(),\n gl.createTexture()\n ])\n\n // allow translucent textures to be layered.\n gl.enable(gl.BLEND)\n gl.blendFuncSeparate(\n gl.SRC_ALPHA,\n gl.ONE_MINUS_SRC_ALPHA,\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA\n )\n\n // enable z-buffer for [0, 1] ([foreground, background]).\n gl.depthRange(0, 1)\n gl.clearDepth(1)\n gl.depthFunc(gl.LESS)\n\n // disable image colorspace conversions. the default is browser dependent.\n gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, false)\n\n gl.bindVertexArray(shader.vao)\n\n gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer())\n gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW)\n gl.enableVertexAttribArray(0)\n gl.vertexAttribIPointer(0, 2, gl.BYTE, 0, 0)\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n gl.bindBuffer(gl.ARRAY_BUFFER, shader.buffer)\n gl.enableVertexAttribArray(1)\n gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, drawableBytes, 0)\n gl.vertexAttribDivisor(1, 1)\n gl.enableVertexAttribArray(2)\n gl.vertexAttribIPointer(2, 1, gl.UNSIGNED_INT, drawableBytes, 4)\n gl.vertexAttribDivisor(2, 1)\n gl.enableVertexAttribArray(3)\n gl.vertexAttribIPointer(3, 1, gl.UNSIGNED_INT, drawableBytes, 8)\n gl.vertexAttribDivisor(3, 1)\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n gl.bindTexture(gl.TEXTURE_2D, shader.textures[0]!)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n if (this.#preloadAtlasImage)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n this.#preloadAtlasImage\n )\n gl.bindTexture(gl.TEXTURE_2D, null)\n\n gl.bindTexture(gl.TEXTURE_2D, shader.textures[1]!)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA16UI, // source XYWH cannot be > 65535.\n 1,\n this.#preloadAtlas.celXYWH.length / 4, // 4 u16s per row\n 0,\n gl.RGBA_INTEGER,\n gl.UNSIGNED_SHORT,\n new Uint16Array(this.#preloadAtlas.celXYWH)\n )\n gl.bindTexture(gl.TEXTURE_2D, null)\n\n gl.bindVertexArray(null)\n\n gl.uniform1i(shader.uniform.uTex!, 0)\n gl.uniform1i(shader.uniform.uCels!, 1)\n if (this.#preloadAtlasImage)\n gl.uniform2ui(\n shader.uniform.uTexWH!,\n this.#preloadAtlasImage.naturalWidth,\n this.#preloadAtlasImage.naturalHeight\n )\n\n this.invalid = true\n // keep outside of #context so it can be restored.\n this.loseContext = gl.getExtension('WEBGL_lose_context') ?? undefined\n return (this.#ctx = {gl, spriteShader: shader, viewport: {w: 0, h: 0}})\n }\n\n #onContextLost = (ev: Event): void => {\n ev.preventDefault() // required.\n console.debug('[render] WebGL context lost')\n this.#ctx = undefined\n }\n\n #onContextRestored = (): void => {\n console.debug('[render] WebGL context restored')\n this.#ctx = this.#Context()\n }\n}\n\nfunction GL2(canvas: HTMLCanvasElement): GL2 | undefined {\n const gl = canvas.getContext('webgl2', {\n // to-do: expose.\n antialias: false,\n powerPreference: 'low-power',\n // avoid flicker caused by clearing the drawing buffer. see\n // https://developer.chrome.com/blog/desynchronized/.\n preserveDrawingBuffer: true,\n ...(!debug?.render && {desynchronized: true})\n })\n if (!gl) {\n console.debug('[render] no GL context')\n return\n }\n\n if (debug?.render && !gl.getContextAttributes()?.desynchronized)\n console.debug('[render] no WebGL DOM desynchronization')\n\n return gl\n}\n", "import type {Millis} from './types/time.ts'\n\n/**\n * requests frames except when hidden. frames are requested even when idle to\n * poll gamepads.\n * autoloop?\n */\nexport class Looper {\n /** duration of frames observed. */\n age: Millis = 0 as Millis\n onFrame: ((millis: Millis) => void) | undefined\n #req: number = 0\n #registered: boolean = false\n\n register(op: 'add' | 'remove'): this {\n const fn = `${op}EventListener` as const\n document[fn]('visibilitychange', this.#onVisibility)\n if (op === 'remove') this.#cancel()\n // try to let user drive initial frame since assets may be loading.\n this.#registered = op === 'add'\n return this\n }\n\n requestFrame(): void {\n if (this.#req || document.hidden || !this.#registered) return\n this.#req = requestAnimationFrame(this.#onFrame as FrameRequestCallback)\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #cancel(): void {\n if (this.#req) cancelAnimationFrame(this.#req)\n this.#req = 0\n }\n\n #onFrame = (now: Millis): void => {\n this.age = now\n this.#req = 0\n this.onFrame?.((now - (this.age || now)) as Millis)\n }\n\n #onVisibility = (ev: Event): void => {\n if (!ev.isTrusted) return\n if (document.hidden) this.#cancel()\n else this.requestFrame()\n }\n}\n", "/**\n * when moving the window across monitors, resolution changes may not trigger a\n * resize. observe density changes.\n */\nexport class PixelRatioObserver {\n onChange: () => void = () => {}\n #mediaQuery: MediaQueryList | undefined\n\n register(op: 'add' | 'remove'): this {\n this.#mediaQuery?.removeEventListener('change', this.#onChange)\n\n if (op === 'add') {\n this.#mediaQuery = matchMedia(`not (resolution: ${devicePixelRatio}dppx)`)\n this.#mediaQuery.addEventListener('change', this.#onChange)\n } else this.#mediaQuery = undefined\n\n return this\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #onChange = (): void => {\n this.register('add')\n this.onChange()\n }\n}\n", "import {Zoo} from './ents/zoo.ts'\nimport type {Atlas, AtlasJSON, TagFormat} from './graphics/atlas.ts'\nimport {parseAtlas} from './graphics/atlas-parser.ts'\nimport {Cam} from './graphics/cam.ts'\nimport {Renderer} from './graphics/renderer.ts'\nimport {drawableBytes, Sprite} from './graphics/sprite.ts'\nimport {type DefaultButton, Input} from './input/input.ts'\nimport {Looper} from './looper.ts'\nimport {Pool, type PoolOpts} from './mem/pool.ts'\nimport {PixelRatioObserver} from './pixel-ratio-observer.ts'\nimport type {WH} from './types/geo.ts'\nimport type {Millis} from './types/time.ts'\nimport {initCanvas} from './utils/canvas-util.ts'\nimport {initBody, initMetaViewport} from './utils/dom-util.ts'\nimport {loadImage} from './utils/fetch-util.ts'\n\nexport type VoidOpts<out Tag extends TagFormat> = {\n preloadAtlas?: {image: HTMLImageElement; json: AtlasJSON} | undefined\n backgroundRGBA?: number\n canvas?: HTMLCanvasElement | undefined\n minWH?: WH | undefined\n input?: 'Custom' | 'Default' | undefined\n mode?: 'Int' | 'Fraction' | undefined\n sprites?:\n | Partial<Omit<PoolOpts<Sprite<Tag>>, 'alloc' | 'allocBytes'>>\n | undefined\n}\n\nexport class Void<\n out Tag extends TagFormat,\n Button extends string = DefaultButton\n> {\n readonly cam: Cam = new Cam()\n readonly canvas: HTMLCanvasElement\n readonly framer: Looper = new Looper()\n readonly input: Input<Button>\n readonly preload: Atlas\n readonly renderer: Renderer\n readonly sprites: Pool<Sprite<Tag>>\n readonly zoo: Zoo<Tag> = new Zoo()\n readonly #pixelRatioObserver: PixelRatioObserver = new PixelRatioObserver()\n readonly #preloadAtlasImage: HTMLImageElement | undefined\n readonly #resizeObserver = new ResizeObserver(() => this.onResize())\n\n constructor(opts: Readonly<VoidOpts<Tag>>) {\n initMetaViewport()\n this.canvas = initCanvas(opts.canvas, opts.mode ?? 'Int')\n initBody(this.canvas, opts.backgroundRGBA ?? 0x000000ff)\n\n if (opts.minWH) this.cam.minWH = opts.minWH\n this.cam.mode = opts.mode ?? 'Int'\n this.cam.update(this.canvas)\n\n this.input = new Input(this.cam, this.canvas)\n if (opts.input !== 'Custom') this.input.mapDefault()\n this.input.onEvent = () => this.onEvent()\n\n this.#pixelRatioObserver.onChange = () => this.onResize()\n\n if (opts.preloadAtlas) this.#preloadAtlasImage = opts.preloadAtlas.image\n\n this.preload = opts.preloadAtlas\n ? parseAtlas(opts.preloadAtlas.json)\n : {anim: {}, celXYWH: [], tags: []}\n\n this.renderer = new Renderer(this.preload ?? {}, this.canvas)\n\n this.sprites = new Pool<Sprite<Tag>>({\n alloc: pool => this.onAllocSprite(pool),\n allocBytes: drawableBytes,\n minPages: opts.sprites?.minPages ?? 3,\n pageBlocks: opts.sprites?.pageBlocks ?? 1000\n })\n\n this.framer.onFrame = millis => this.onFrame(millis)\n }\n\n onAllocSprite(pool: Pool<Sprite<TagFormat>>): Sprite<Tag> {\n return new Sprite(pool, 0, this.preload, this.framer)\n }\n\n onEvent(): void {\n this.framer.requestFrame()\n }\n\n /** update input, update canvas, update cam, update world, then render. */\n onFrame(millis: Millis): void {\n if (document.hidden) return\n this.input.update(millis)\n\n this.onLoop(millis)\n\n this.cam.postupdate()\n }\n\n // biome-ignore lint/correctness/noUnusedFunctionParameters:;\n onLoop(millis: Millis): void {}\n\n onResize(): void {\n this.framer.requestFrame()\n }\n\n async register(op: 'add' | 'remove'): Promise<void> {\n this.input.register(op)\n this.renderer.register(op)\n this.framer.register(op)\n if (!this.canvas.parentElement) throw Error('no canvas parent')\n if (op === 'add') this.#resizeObserver.observe(this.canvas.parentElement)\n else this.#resizeObserver.unobserve(this.canvas.parentElement)\n this.#pixelRatioObserver.register(op)\n\n this.framer.requestFrame()\n\n if (this.#preloadAtlasImage) await loadImage(this.#preloadAtlasImage)\n this.renderer.load(this.#preloadAtlasImage)\n }\n\n requestFrame(): void {\n if (this.renderer.always || this.input.anyOn || this.input.gamepad)\n this.framer.requestFrame()\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.register('remove')\n }\n}\n", "import {voidVersion} from './types/void-version.ts'\n\nexport {type Font, memProp5x6} from 'mem-font'\nexport * from './ents/button-ent.ts'\nexport * from './ents/cursor-ent.ts'\nexport * from './ents/ent.ts'\nexport * from './ents/follow-cam-ent.ts'\nexport * from './ents/nine-patch-ent.ts'\nexport * from './ents/text-ent.ts'\nexport * from './ents/zoo.ts'\nexport * from './graphics/atlas.ts'\nexport * from './graphics/atlas-parser.ts'\nexport * from './graphics/cam.ts'\nexport * from './graphics/layer.ts'\nexport * from './graphics/sprite.ts'\nexport * from './input/input.ts'\nexport type {PointEvent} from './input/pointer.ts'\nexport * from './mem/pool.ts'\nexport * from './random/random.ts'\nexport * from './storage/local-storage.ts'\nexport * from './text/font.ts'\nexport * from './text/text-layout.ts'\nexport * from './types/geo.ts'\nexport * from './types/json.ts'\nexport * from './types/time.ts'\nexport * from './utils/async-util.ts'\nexport * from './utils/canvas-util.ts'\nexport * from './utils/debug.ts'\nexport * from './utils/dom-util.ts'\nexport * from './utils/fetch-util.ts'\nexport * from './void.ts'\n\nexport const version: string = voidVersion\n ? `${voidVersion.version}+${voidVersion.published}.${voidVersion.hash}`\n : '?'\n", "{\n \"anim\": {\n \"background--OrangeCheckerboard\": {\"cels\": 1, \"h\": 2, \"id\": 0, \"w\": 2},\n \"background--GreyCheckerboard\": {\"cels\": 1, \"h\": 2, \"id\": 1, \"w\": 2},\n \"background--Kiwi\": {\"cels\": 1, \"h\": 2, \"id\": 2, \"w\": 2},\n \"background--Strawberry\": {\"cels\": 1, \"h\": 2, \"id\": 3, \"w\": 2},\n \"background--Grape\": {\"cels\": 1, \"h\": 2, \"id\": 4, \"w\": 2},\n \"background--Blueberry\": {\"cels\": 1, \"h\": 2, \"id\": 5, \"w\": 2},\n \"background--Bubblegum\": {\"cels\": 1, \"h\": 2, \"id\": 6, \"w\": 2},\n \"background--Transparent\": {\"cels\": 1, \"h\": 2, \"id\": 7, \"w\": 2},\n \"background--Black\": {\"cels\": 1, \"h\": 2, \"id\": 8, \"w\": 2},\n \"backpacker--WalkRight\": {\n \"cels\": 16,\n \"h\": 13,\n \"hitbox\": {\"x\": 2, \"y\": 0, \"w\": 4, \"h\": 4},\n \"id\": 9,\n \"w\": 8\n },\n \"backpacker--WalkDown\": {\n \"cels\": 16,\n \"h\": 13,\n \"hitbox\": {\"x\": 2, \"y\": 0, \"w\": 4, \"h\": 4},\n \"id\": 10,\n \"w\": 8\n },\n \"backpacker--WalkUp\": {\n \"cels\": 16,\n \"h\": 13,\n \"hitbox\": {\"x\": 2, \"y\": 0, \"w\": 4, \"h\": 4},\n \"id\": 11,\n \"w\": 8\n },\n \"cursor--Pointer\": {\n \"cels\": 1,\n \"h\": 14,\n \"hitbox\": {\"x\": 0, \"y\": 0, \"w\": 2, \"h\": 2},\n \"hurtbox\": {\"x\": 0, \"y\": 0, \"w\": 2, \"h\": 2},\n \"id\": 12,\n \"w\": 8\n },\n \"mem-prop-5x6--00\": {\"cels\": 1, \"h\": 6, \"id\": 13, \"w\": 5},\n \"mem-prop-5x6--01\": {\"cels\": 1, \"h\": 6, \"id\": 14, \"w\": 5},\n \"mem-prop-5x6--02\": {\"cels\": 1, \"h\": 6, \"id\": 15, \"w\": 5},\n \"mem-prop-5x6--03\": {\"cels\": 1, \"h\": 6, \"id\": 16, \"w\": 5},\n \"mem-prop-5x6--04\": {\"cels\": 1, \"h\": 6, \"id\": 17, \"w\": 5},\n \"mem-prop-5x6--05\": {\"cels\": 1, \"h\": 6, \"id\": 18, \"w\": 5},\n \"mem-prop-5x6--06\": {\"cels\": 1, \"h\": 6, \"id\": 19, \"w\": 5},\n \"mem-prop-5x6--07\": {\"cels\": 1, \"h\": 6, \"id\": 20, \"w\": 5},\n \"mem-prop-5x6--08\": {\"cels\": 1, \"h\": 6, \"id\": 21, \"w\": 5},\n \"mem-prop-5x6--09\": {\"cels\": 1, \"h\": 6, \"id\": 22, \"w\": 5},\n \"mem-prop-5x6--0a\": {\"cels\": 1, \"h\": 6, \"id\": 23, \"w\": 5},\n \"mem-prop-5x6--0b\": {\"cels\": 1, \"h\": 6, \"id\": 24, \"w\": 5},\n \"mem-prop-5x6--0c\": {\"cels\": 1, \"h\": 6, \"id\": 25, \"w\": 5},\n \"mem-prop-5x6--0d\": {\"cels\": 1, \"h\": 6, \"id\": 26, \"w\": 5},\n \"mem-prop-5x6--0e\": {\"cels\": 1, \"h\": 6, \"id\": 27, \"w\": 5},\n \"mem-prop-5x6--0f\": {\"cels\": 1, \"h\": 6, \"id\": 28, \"w\": 5},\n \"mem-prop-5x6--10\": {\"cels\": 1, \"h\": 6, \"id\": 29, \"w\": 5},\n \"mem-prop-5x6--11\": {\"cels\": 1, \"h\": 6, \"id\": 30, \"w\": 5},\n \"mem-prop-5x6--12\": {\"cels\": 1, \"h\": 6, \"id\": 31, \"w\": 5},\n \"mem-prop-5x6--13\": {\"cels\": 1, \"h\": 6, \"id\": 32, \"w\": 5},\n \"mem-prop-5x6--14\": {\"cels\": 1, \"h\": 6, \"id\": 33, \"w\": 5},\n \"mem-prop-5x6--15\": {\"cels\": 1, \"h\": 6, \"id\": 34, \"w\": 5},\n \"mem-prop-5x6--16\": {\"cels\": 1, \"h\": 6, \"id\": 35, \"w\": 5},\n \"mem-prop-5x6--17\": {\"cels\": 1, \"h\": 6, \"id\": 36, \"w\": 5},\n \"mem-prop-5x6--18\": {\"cels\": 1, \"h\": 6, \"id\": 37, \"w\": 5},\n \"mem-prop-5x6--19\": {\"cels\": 1, \"h\": 6, \"id\": 38, \"w\": 5},\n \"mem-prop-5x6--1a\": {\"cels\": 1, \"h\": 6, \"id\": 39, \"w\": 5},\n \"mem-prop-5x6--1b\": {\"cels\": 1, \"h\": 6, \"id\": 40, \"w\": 5},\n \"mem-prop-5x6--1c\": {\"cels\": 1, \"h\": 6, \"id\": 41, \"w\": 5},\n \"mem-prop-5x6--1d\": {\"cels\": 1, \"h\": 6, \"id\": 42, \"w\": 5},\n \"mem-prop-5x6--1e\": {\"cels\": 1, \"h\": 6, \"id\": 43, \"w\": 5},\n \"mem-prop-5x6--1f\": {\"cels\": 1, \"h\": 6, \"id\": 44, \"w\": 5},\n \"mem-prop-5x6--20\": {\"cels\": 1, \"h\": 6, \"id\": 45, \"w\": 5},\n \"mem-prop-5x6--21\": {\"cels\": 1, \"h\": 6, \"id\": 46, \"w\": 5},\n \"mem-prop-5x6--22\": {\"cels\": 1, \"h\": 6, \"id\": 47, \"w\": 5},\n \"mem-prop-5x6--23\": {\"cels\": 1, \"h\": 6, \"id\": 48, \"w\": 5},\n \"mem-prop-5x6--24\": {\"cels\": 1, \"h\": 6, \"id\": 49, \"w\": 5},\n \"mem-prop-5x6--25\": {\"cels\": 1, \"h\": 6, \"id\": 50, \"w\": 5},\n \"mem-prop-5x6--26\": {\"cels\": 1, \"h\": 6, \"id\": 51, \"w\": 5},\n \"mem-prop-5x6--27\": {\"cels\": 1, \"h\": 6, \"id\": 52, \"w\": 5},\n \"mem-prop-5x6--28\": {\"cels\": 1, \"h\": 6, \"id\": 53, \"w\": 5},\n \"mem-prop-5x6--29\": {\"cels\": 1, \"h\": 6, \"id\": 54, \"w\": 5},\n \"mem-prop-5x6--2a\": {\"cels\": 1, \"h\": 6, \"id\": 55, \"w\": 5},\n \"mem-prop-5x6--2b\": {\"cels\": 1, \"h\": 6, \"id\": 56, \"w\": 5},\n \"mem-prop-5x6--2c\": {\"cels\": 1, \"h\": 6, \"id\": 57, \"w\": 5},\n \"mem-prop-5x6--2d\": {\"cels\": 1, \"h\": 6, \"id\": 58, \"w\": 5},\n \"mem-prop-5x6--2e\": {\"cels\": 1, \"h\": 6, \"id\": 59, \"w\": 5},\n \"mem-prop-5x6--2f\": {\"cels\": 1, \"h\": 6, \"id\": 60, \"w\": 5},\n \"mem-prop-5x6--30\": {\"cels\": 1, \"h\": 6, \"id\": 61, \"w\": 5},\n \"mem-prop-5x6--31\": {\"cels\": 1, \"h\": 6, \"id\": 62, \"w\": 5},\n \"mem-prop-5x6--32\": {\"cels\": 1, \"h\": 6, \"id\": 63, \"w\": 5},\n \"mem-prop-5x6--33\": {\"cels\": 1, \"h\": 6, \"id\": 64, \"w\": 5},\n \"mem-prop-5x6--34\": {\"cels\": 1, \"h\": 6, \"id\": 65, \"w\": 5},\n \"mem-prop-5x6--35\": {\"cels\": 1, \"h\": 6, \"id\": 66, \"w\": 5},\n \"mem-prop-5x6--36\": {\"cels\": 1, \"h\": 6, \"id\": 67, \"w\": 5},\n \"mem-prop-5x6--37\": {\"cels\": 1, \"h\": 6, \"id\": 68, \"w\": 5},\n \"mem-prop-5x6--38\": {\"cels\": 1, \"h\": 6, \"id\": 69, \"w\": 5},\n \"mem-prop-5x6--39\": {\"cels\": 1, \"h\": 6, \"id\": 70, \"w\": 5},\n \"mem-prop-5x6--3a\": {\"cels\": 1, \"h\": 6, \"id\": 71, \"w\": 5},\n \"mem-prop-5x6--3b\": {\"cels\": 1, \"h\": 6, \"id\": 72, \"w\": 5},\n \"mem-prop-5x6--3c\": {\"cels\": 1, \"h\": 6, \"id\": 73, \"w\": 5},\n \"mem-prop-5x6--3d\": {\"cels\": 1, \"h\": 6, \"id\": 74, \"w\": 5},\n \"mem-prop-5x6--3e\": {\"cels\": 1, \"h\": 6, \"id\": 75, \"w\": 5},\n \"mem-prop-5x6--3f\": {\"cels\": 1, \"h\": 6, \"id\": 76, \"w\": 5},\n \"mem-prop-5x6--40\": {\"cels\": 1, \"h\": 6, \"id\": 77, \"w\": 5},\n \"mem-prop-5x6--41\": {\"cels\": 1, \"h\": 6, \"id\": 78, \"w\": 5},\n \"mem-prop-5x6--42\": {\"cels\": 1, \"h\": 6, \"id\": 79, \"w\": 5},\n \"mem-prop-5x6--43\": {\"cels\": 1, \"h\": 6, \"id\": 80, \"w\": 5},\n \"mem-prop-5x6--44\": {\"cels\": 1, \"h\": 6, \"id\": 81, \"w\": 5},\n \"mem-prop-5x6--45\": {\"cels\": 1, \"h\": 6, \"id\": 82, \"w\": 5},\n \"mem-prop-5x6--46\": {\"cels\": 1, \"h\": 6, \"id\": 83, \"w\": 5},\n \"mem-prop-5x6--47\": {\"cels\": 1, \"h\": 6, \"id\": 84, \"w\": 5},\n \"mem-prop-5x6--48\": {\"cels\": 1, \"h\": 6, \"id\": 85, \"w\": 5},\n \"mem-prop-5x6--49\": {\"cels\": 1, \"h\": 6, \"id\": 86, \"w\": 5},\n \"mem-prop-5x6--4a\": {\"cels\": 1, \"h\": 6, \"id\": 87, \"w\": 5},\n \"mem-prop-5x6--4b\": {\"cels\": 1, \"h\": 6, \"id\": 88, \"w\": 5},\n \"mem-prop-5x6--4c\": {\"cels\": 1, \"h\": 6, \"id\": 89, \"w\": 5},\n \"mem-prop-5x6--4d\": {\"cels\": 1, \"h\": 6, \"id\": 90, \"w\": 5},\n \"mem-prop-5x6--4e\": {\"cels\": 1, \"h\": 6, \"id\": 91, \"w\": 5},\n \"mem-prop-5x6--4f\": {\"cels\": 1, \"h\": 6, \"id\": 92, \"w\": 5},\n \"mem-prop-5x6--50\": {\"cels\": 1, \"h\": 6, \"id\": 93, \"w\": 5},\n \"mem-prop-5x6--51\": {\"cels\": 1, \"h\": 6, \"id\": 94, \"w\": 5},\n \"mem-prop-5x6--52\": {\"cels\": 1, \"h\": 6, \"id\": 95, \"w\": 5},\n \"mem-prop-5x6--53\": {\"cels\": 1, \"h\": 6, \"id\": 96, \"w\": 5},\n \"mem-prop-5x6--54\": {\"cels\": 1, \"h\": 6, \"id\": 97, \"w\": 5},\n \"mem-prop-5x6--55\": {\"cels\": 1, \"h\": 6, \"id\": 98, \"w\": 5},\n \"mem-prop-5x6--56\": {\"cels\": 1, \"h\": 6, \"id\": 99, \"w\": 5},\n \"mem-prop-5x6--57\": {\"cels\": 1, \"h\": 6, \"id\": 100, \"w\": 5},\n \"mem-prop-5x6--58\": {\"cels\": 1, \"h\": 6, \"id\": 101, \"w\": 5},\n \"mem-prop-5x6--59\": {\"cels\": 1, \"h\": 6, \"id\": 102, \"w\": 5},\n \"mem-prop-5x6--5a\": {\"cels\": 1, \"h\": 6, \"id\": 103, \"w\": 5},\n \"mem-prop-5x6--5b\": {\"cels\": 1, \"h\": 6, \"id\": 104, \"w\": 5},\n \"mem-prop-5x6--5c\": {\"cels\": 1, \"h\": 6, \"id\": 105, \"w\": 5},\n \"mem-prop-5x6--5d\": {\"cels\": 1, \"h\": 6, \"id\": 106, \"w\": 5},\n \"mem-prop-5x6--5e\": {\"cels\": 1, \"h\": 6, \"id\": 107, \"w\": 5},\n \"mem-prop-5x6--5f\": {\"cels\": 1, \"h\": 6, \"id\": 108, \"w\": 5},\n \"mem-prop-5x6--60\": {\"cels\": 1, \"h\": 6, \"id\": 109, \"w\": 5},\n \"mem-prop-5x6--61\": {\"cels\": 1, \"h\": 6, \"id\": 110, \"w\": 5},\n \"mem-prop-5x6--62\": {\"cels\": 1, \"h\": 6, \"id\": 111, \"w\": 5},\n \"mem-prop-5x6--63\": {\"cels\": 1, \"h\": 6, \"id\": 112, \"w\": 5},\n \"mem-prop-5x6--64\": {\"cels\": 1, \"h\": 6, \"id\": 113, \"w\": 5},\n \"mem-prop-5x6--65\": {\"cels\": 1, \"h\": 6, \"id\": 114, \"w\": 5},\n \"mem-prop-5x6--66\": {\"cels\": 1, \"h\": 6, \"id\": 115, \"w\": 5},\n \"mem-prop-5x6--67\": {\"cels\": 1, \"h\": 6, \"id\": 116, \"w\": 5},\n \"mem-prop-5x6--68\": {\"cels\": 1, \"h\": 6, \"id\": 117, \"w\": 5},\n \"mem-prop-5x6--69\": {\"cels\": 1, \"h\": 6, \"id\": 118, \"w\": 5},\n \"mem-prop-5x6--6a\": {\"cels\": 1, \"h\": 6, \"id\": 119, \"w\": 5},\n \"mem-prop-5x6--6b\": {\"cels\": 1, \"h\": 6, \"id\": 120, \"w\": 5},\n \"mem-prop-5x6--6c\": {\"cels\": 1, \"h\": 6, \"id\": 121, \"w\": 5},\n \"mem-prop-5x6--6d\": {\"cels\": 1, \"h\": 6, \"id\": 122, \"w\": 5},\n \"mem-prop-5x6--6e\": {\"cels\": 1, \"h\": 6, \"id\": 123, \"w\": 5},\n \"mem-prop-5x6--6f\": {\"cels\": 1, \"h\": 6, \"id\": 124, \"w\": 5},\n \"mem-prop-5x6--70\": {\"cels\": 1, \"h\": 6, \"id\": 125, \"w\": 5},\n \"mem-prop-5x6--71\": {\"cels\": 1, \"h\": 6, \"id\": 126, \"w\": 5},\n \"mem-prop-5x6--72\": {\"cels\": 1, \"h\": 6, \"id\": 127, \"w\": 5},\n \"mem-prop-5x6--73\": {\"cels\": 1, \"h\": 6, \"id\": 128, \"w\": 5},\n \"mem-prop-5x6--74\": {\"cels\": 1, \"h\": 6, \"id\": 129, \"w\": 5},\n \"mem-prop-5x6--75\": {\"cels\": 1, \"h\": 6, \"id\": 130, \"w\": 5},\n \"mem-prop-5x6--76\": {\"cels\": 1, \"h\": 6, \"id\": 131, \"w\": 5},\n \"mem-prop-5x6--77\": {\"cels\": 1, \"h\": 6, \"id\": 132, \"w\": 5},\n \"mem-prop-5x6--78\": {\"cels\": 1, \"h\": 6, \"id\": 133, \"w\": 5},\n \"mem-prop-5x6--79\": {\"cels\": 1, \"h\": 6, \"id\": 134, \"w\": 5},\n \"mem-prop-5x6--7a\": {\"cels\": 1, \"h\": 6, \"id\": 135, \"w\": 5},\n \"mem-prop-5x6--7b\": {\"cels\": 1, \"h\": 6, \"id\": 136, \"w\": 5},\n \"mem-prop-5x6--7c\": {\"cels\": 1, \"h\": 6, \"id\": 137, \"w\": 5},\n \"mem-prop-5x6--7d\": {\"cels\": 1, \"h\": 6, \"id\": 138, \"w\": 5},\n \"mem-prop-5x6--7e\": {\"cels\": 1, \"h\": 6, \"id\": 139, \"w\": 5},\n \"mem-prop-5x6--7f\": {\"cels\": 1, \"h\": 6, \"id\": 140, \"w\": 5},\n \"oidoid--Default\": {\"cels\": 1, \"h\": 16, \"id\": 141, \"w\": 16}\n },\n \"celXY\": [\n 22, 37, 21, 27, 21, 29, 21, 31, 20, 33, 22, 33, 20, 35, 22, 35, 20, 37, 24,\n 26, 24, 26, 8, 16, 8, 16, 0, 16, 0, 16, 16, 14, 16, 14, 72, 13, 72, 13, 32,\n 26, 32, 26, 0, 16, 0, 16, 64, 13, 64, 13, 56, 13, 56, 13, 48, 13, 48, 13,\n 40, 13, 40, 13, 32, 13, 32, 13, 56, 13, 56, 13, 24, 13, 24, 13, 72, 0, 72,\n 0, 64, 0, 64, 0, 24, 0, 24, 0, 56, 0, 56, 0, 48, 0, 48, 0, 48, 0, 48, 0, 24,\n 0, 24, 0, 40, 0, 40, 0, 32, 0, 32, 0, 32, 0, 32, 0, 16, 0, 45, 56, 45, 56,\n 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45,\n 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56,\n 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45,\n 56, 45, 56, 45, 56, 40, 56, 10, 53, 5, 53, 0, 53, 35, 51, 30, 51, 25, 51,\n 20, 51, 15, 51, 35, 45, 70, 50, 65, 50, 60, 50, 55, 50, 50, 50, 45, 50, 40,\n 50, 10, 47, 5, 47, 0, 47, 70, 62, 50, 56, 65, 62, 60, 62, 55, 62, 50, 62,\n 45, 62, 40, 62, 10, 59, 5, 59, 0, 59, 35, 57, 70, 32, 30, 57, 25, 57, 20,\n 57, 15, 57, 75, 56, 70, 56, 65, 56, 60, 56, 75, 50, 55, 56, 10, 35, 75, 32,\n 15, 33, 0, 35, 5, 35, 40, 38, 45, 38, 65, 32, 60, 32, 55, 32, 50, 32, 45,\n 32, 40, 26, 50, 26, 55, 26, 60, 26, 65, 26, 70, 26, 75, 26, 16, 27, 0, 29,\n 5, 29, 10, 29, 40, 32, 45, 26, 10, 41, 30, 45, 25, 45, 20, 45, 15, 45, 75,\n 44, 70, 44, 65, 44, 60, 44, 55, 44, 50, 44, 45, 44, 40, 44, 50, 38, 5, 41,\n 0, 41, 35, 39, 30, 39, 25, 39, 20, 39, 15, 39, 75, 38, 70, 38, 65, 38, 60,\n 38, 55, 38, 45, 56, 0, 0\n ]\n}\n", "import * as V from '../../index.ts'\nimport type {Game} from '../game.ts'\n\nexport class ClockEnt implements V.Ent {\n readonly #time: V.TextEnt = new V.TextEnt()\n\n constructor() {\n this.#time.scale = 3\n this.#time.z = V.Layer.A\n }\n\n free(v: Game): void {\n this.#time.free(v)\n }\n\n update(v: Game): boolean | undefined {\n const now = new Date()\n this.#time.text = timeString(now)\n\n if (this.#time.layout(v) || v.cam.invalid)\n this.#time.xy = v.cam.follow(\n {w: this.#time.wh.w, h: this.#time.wh.h - this.#time.scaledLeading},\n this.#time.z,\n 'N',\n {margin: {h: 8}}\n )\n\n return this.#time.update(v)\n }\n}\n\n/** @internal */\nexport function timeString(time: Readonly<Date>): string {\n const hh = `${time.getHours() % 12 || 12}`.padStart(2, ' ')\n const mm = `${time.getMinutes()}`.padStart(2, '0')\n const ss = `${time.getSeconds()}`.padStart(2, '0')\n return `${hh}:${mm}:${ss}`\n}\n", "import * as V from '../../index.ts'\nimport type {Game} from '../game.ts'\nimport type {Tag} from '../types/tag.ts'\n\n// to-do: follow cam sw.\nexport class RenderToggleEnt implements V.Ent {\n readonly #toggle: V.ButtonEnt<Tag, V.DefaultButton>\n\n constructor(v: Game) {\n this.#toggle = new V.ButtonEnt(v, {\n button: {\n w: {tag: 'background--Strawberry'},\n nw: {tag: 'background--Transparent'},\n n: {tag: 'background--Bubblegum'},\n e: {tag: 'background--Blueberry'},\n s: {tag: 'background--Kiwi'},\n origin: {tag: 'background--Grape'},\n border: {n: 1},\n margin: {w: 2, h: 2}\n },\n selected: {tag: 'background--OrangeCheckerboard'},\n toggle: true,\n text: {text: 'render', scale: 2},\n w: 64,\n h: 22,\n x: 50,\n y: 25,\n pressed: {tag: 'background--Bubblegum'}\n })\n }\n\n get on(): boolean {\n return this.#toggle.on\n }\n\n free(v: Game): void {\n this.#toggle.free(v)\n }\n\n /** always updates but never invalidates. */\n update(v: Game): boolean | undefined {\n return this.#toggle.update(v)\n }\n}\n", "import * as V from '../../index.ts'\nimport type {Game} from '../game.ts'\n\nexport class WorkCounterEnt implements V.Ent {\n #renders: number = 0\n readonly #text: V.TextEnt = new V.TextEnt()\n #updates: number = 0\n\n constructor() {\n this.#text.z = V.Layer.A\n }\n\n free(v: Game): void {\n this.#text.free(v)\n }\n\n incrementRender(): void {\n this.#renders++\n }\n\n /** always updates but never invalidates. */\n update(v: Game): undefined {\n this.#updates++\n this.#text.text = `${this.#updates} updates\\n${this.#renders + 1} renders`\n this.#text.layout(v)\n this.#text.xy = v.cam.follow(\n {w: this.#text.wh.w, h: this.#text.wh.h - this.#text.scaledLeading},\n this.#text.z,\n 'NE',\n {margin: {w: 8, h: 8}}\n )\n this.#text.update(v)\n }\n}\n", "import * as V from '../index.ts'\nimport preloadAtlasJSON from './assets/preload-atlas.json' with {type: 'json'}\nimport {ClockEnt} from './ents/clock-ent.ts'\nimport {RenderToggleEnt} from './ents/render-toggle-ent.ts'\nimport {WorkCounterEnt} from './ents/work-counter-ent.ts'\nimport type {Tag} from './types/tag.ts'\n\nexport class Game extends V.Void<Tag> {\n #filterSprites: V.Pool<V.Sprite<Tag>>\n #interval: number = 0\n #renderToggle: RenderToggleEnt\n #timer: number = 0\n #workCounter: WorkCounterEnt\n\n constructor() {\n super({\n preloadAtlas: {\n image: document.querySelector('#preload-atlas')!,\n json: preloadAtlasJSON\n },\n backgroundRGBA: 0xffffb1ff,\n minWH: {w: 320, h: 240}\n })\n this.#filterSprites = new V.Pool<V.Sprite<Tag>>({\n alloc: pool => new V.Sprite(pool, 0, this.preload, this.framer),\n allocBytes: V.drawableBytes,\n pageBlocks: 10\n })\n this.#renderToggle = new RenderToggleEnt(this)\n this.#workCounter = new WorkCounterEnt()\n this.#initZoo()\n }\n\n override async register(op: 'add' | 'remove'): Promise<void> {\n await super.register(op)\n if (op === 'add') {\n this.framer.requestFrame()\n this.#startTimer()\n } else {\n this.#stopTimer()\n }\n }\n\n override onLoop(_millis: V.Millis): void {\n this.renderer.always = this.#renderToggle.on || !!V.debug?.invalid\n\n let render = this.#updateCam()\n\n const updated = this.zoo.update(this)\n\n if (V.debug?.input) this.#printInput()\n\n render ||=\n updated ||\n this.cam.invalid ||\n this.renderer.invalid ||\n this.renderer.always\n if (render) {\n this.#workCounter.incrementRender()\n this.renderer.clear(0xffffb1ff)\n this.renderer.predraw(this.cam, this.framer)\n this.renderer.setDepth(true)\n this.renderer.draw(this.sprites)\n this.renderer.setDepth(false)\n this.renderer.draw(this.#filterSprites)\n }\n\n this.requestFrame()\n }\n\n #initZoo(): void {\n // to-do: why can I use follow cam ent with an ent?\n const border = new V.NinePatchEnt<Tag>(this, {\n n: {tag: 'background--Black'},\n origin: {tag: 'background--Transparent'},\n border: {n: 1},\n z: V.Layer.UIA // to-do: default 0 layer is dumb.\n })\n this.zoo.add(border)\n const box = this.cam.follow({w: 0, h: 0}, V.Layer.UIA, 'NW', {fill: 'XY'})\n border.xy = box // to-do: use x, y, w, h everywhere so the interfaces align and I can just assing here.\n border.wh = box\n\n const backpacker = this.sprites.alloc()\n backpacker.tag = 'backpacker--WalkRight'\n backpacker.x = 7\n backpacker.y = 7\n backpacker.z = V.Layer.C\n backpacker.stretch = true\n backpacker.w *= 5\n backpacker.h *= 5\n\n const oidoid = new V.FollowCamEnt(this, 'oidoid--Default', 'SW')\n oidoid.z = V.Layer.UIG\n oidoid.margin = {w: 4, h: 4}\n\n this.zoo.add(\n new V.CursorEnt(this, 'cursor--Pointer'),\n this.#renderToggle,\n new ClockEnt(),\n this.#workCounter,\n oidoid\n )\n\n const overlay = this.#filterSprites.alloc()\n overlay.tag = 'background--GreyCheckerboard'\n overlay.w = V.drawableMaxWH.w\n overlay.h = V.drawableMaxWH.h\n overlay.z = V.Layer.UIA\n }\n\n #printInput(): void {\n if (this.input.started) {\n const on = !!this.input.on.length\n if (on) console.debug(`[input] buttons on: ${this.input.on.join(' ')}.`)\n else console.debug(`[input] buttons off.`)\n const combo = this.input.combo\n if (combo.length > 1 && on)\n console.debug(\n `[input] combo: ${combo.map(set => set.join('+')).join(' ')}.`\n )\n }\n if (\n this.input.point?.invalid &&\n this.input.point?.click &&\n !this.input.point.pinch\n )\n console.debug(\n `[input] ${this.input.point.drag.on ? 'drag' : 'click'} xy: ${this.input.point.x} ${this.input.point.y}.`\n )\n if (this.input.point?.pinch)\n console.debug(\n `[input] pinch xy: ${this.input.point.pinch.xy.x} ${this.input.point.pinch.xy.y}.`\n )\n if (this.input.wheel)\n console.debug(\n `[input] wheel xy: ${this.input.wheel.delta.xy.x} ${this.input.wheel.delta.xy.y}.`\n )\n }\n\n #startTimer(): void {\n this.#timer = setTimeout(\n () => {\n this.framer.requestFrame()\n this.#interval = setInterval(\n () => this.framer.requestFrame(),\n (V.debug?.seconds ? 1 : 60) * 1000\n )\n },\n renderDelayMillis(new Date(), V.debug?.seconds)\n )\n }\n\n #stopTimer(): void {\n clearTimeout(this.#timer)\n clearInterval(this.#interval)\n }\n\n #updateCam(): boolean {\n let render = this.input.isAnyOn('L', 'R', 'U', 'D')\n\n if (this.input.isAnyOnStart('L', 'R', 'U', 'D')) {\n this.cam.x = Math.trunc(this.cam.x)\n this.cam.y = Math.trunc(this.cam.y)\n }\n\n const d = 1 / 4\n if (this.input.isOn('L')) this.cam.x -= d\n if (this.input.isOn('R')) this.cam.x += d\n if (this.input.isOn('U')) this.cam.y -= d\n if (this.input.isOn('D')) this.cam.y += d\n\n if (this.input.wheel?.delta.xy.y) {\n render = true\n this.cam.zoomOut -= this.input.wheel.delta.client.y * 0.01\n }\n\n this.cam.update(this.canvas)\n\n return render\n }\n}\n\n/**\n * returns [0, 59_999].\n * @internal\n */\nexport function renderDelayMillis(\n time: Readonly<Date>,\n debugSecs: string | undefined\n): number {\n return (\n ((debugSecs ? 0 : (59 - (time.getSeconds() % 60)) * 1000) +\n 1000 -\n (time.getMilliseconds() % 1000)) %\n (debugSecs ? 1000 : 60_000)\n )\n}\n", "import * as V from '../index.ts'\nimport {Game} from './game.ts'\n\nconsole.debug(`void v${V.version} \u2500\u2500\u2500oidoid>\u00B0\u2500\u2500`)\n\nconst v = new Game()\nawait v.register('add')\nif (V.debug) (globalThis as unknown as {v: Game}).v = v\n"],
5
+ "mappings": ";;;AAAA,8CAAC,MAAO,WAAU,WAAY,YAAW,SAAU,UAAS;;;ACarD,IAAM,cAA2B;;;ACbxC;AAAA,EACI,IAAM;AAAA,EACN,MAAQ;AAAA,EACR,WAAa;AAAA,EACb,YAAc;AAAA,EACd,SAAW;AAAA,EACX,YAAc;AAAA,EACd,UAAY;AAAA,EACZ,SAAW;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAO;AAAA,IACP,MAAO;AAAA,IACP,MAAO;AAAA,IACP,MAAO;AAAA,IACP,MAAO;AAAA,IACP,MAAO;AAAA,IACP,MAAO;AAAA,IACP,MAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,IAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA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GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,IAAI,GAAK,EAAC;AAAA,IACxD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,oBAAoB,EAAC,MAAQ,GAAG,GAAK,GAAG,IAAM,KAAK,GAAK,EAAC;AAAA,IACzD,mBAAmB,EAAC,MAAQ,GAAG,GAAK,IAAI,IAAM,KAAK,GAAK,GAAE;AAAA,EAC5D;AAAA,EACA,OAAS;AAAA,IACP;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACxE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACxE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACtE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAG;AAAA,IACvE;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IACzE;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACvE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACxE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACxE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACxE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACtE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACxE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACtE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACtE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACxE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACtE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAG;AAAA,IACvE;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACvE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAG;AAAA,IA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",
6
+ "names": ["v", "v", "v", "v", "v", "v", "target", "v", "v", "v"]
7
+ }
@@ -0,0 +1 @@
1
+ {"author":"oidoid","background_color":"#ffffb1","description":"void 2D game library demo.","display":"standalone","homepage_url":"https://oidoid.com/","icons":[{"src":"favicon/favicon16.png","sizes":"16x16","type":"image/png"},{"src":"favicon/favicon32.png","sizes":"32x32","type":"image/png"},{"src":"favicon/favicon48.png","sizes":"48x48","type":"image/png"},{"src":"favicon/favicon64.png","sizes":"64x64","type":"image/png"},{"src":"favicon/favicon192.png","sizes":"192x192","type":"image/png"},{"src":"favicon/favicon512.png","sizes":"512x512","type":"image/png"}],"manifest_version":3,"name":"void","orientation":"any","short_name":"void","start_url":"http://localhost:1234","theme_color":"#ffffb1","version":"0.1.0-4"}
Binary file