@oidoid/void 0.1.0-4 → 0.1.0-7

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 (307) 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/favicon16.webp +0 -0
  5. package/dist/public/favicon/favicon192.png +0 -0
  6. package/dist/public/favicon/favicon192.webp +0 -0
  7. package/dist/public/favicon/favicon32.png +0 -0
  8. package/dist/public/favicon/favicon32.webp +0 -0
  9. package/dist/public/favicon/favicon48.png +0 -0
  10. package/dist/public/favicon/favicon48.webp +0 -0
  11. package/dist/public/favicon/favicon64.png +0 -0
  12. package/dist/public/favicon/favicon64.webp +0 -0
  13. package/dist/public/index.js +98 -0
  14. package/dist/public/index.js.map +7 -0
  15. package/dist/public/preload-atlas.png +0 -0
  16. package/dist/public/preload-atlas.webp +0 -0
  17. package/dist/public/void-v0.1.0-6+20251020.7cdf98d.html +111 -0
  18. package/dist/public/void-v0.1.0-6+20251020.e4e9eef.html +111 -0
  19. package/dist/public/void-v0.1.0-7+20251021.7cdf98d.html +111 -0
  20. package/dist/schema/config-file.d.ts +32 -0
  21. package/dist/schema/config-file.js +41 -0
  22. package/dist/schema/config-file.js.map +1 -0
  23. package/dist/schema/config-file.v0.json +68 -0
  24. package/dist/src/audio.d.ts +7 -0
  25. package/dist/src/audio.js +25 -0
  26. package/dist/src/audio.js.map +1 -0
  27. package/dist/src/demo/assets/manifest.json +41 -0
  28. package/dist/src/demo/assets/preload-atlas.json +193 -0
  29. package/dist/src/demo/ents/clock-ent.d.ts +11 -0
  30. package/dist/src/demo/ents/clock-ent.js +26 -0
  31. package/dist/src/demo/ents/clock-ent.js.map +1 -0
  32. package/dist/src/demo/ents/render-toggle-ent.d.ts +12 -0
  33. package/dist/src/demo/ents/render-toggle-ent.js +41 -0
  34. package/dist/src/demo/ents/render-toggle-ent.js.map +1 -0
  35. package/dist/src/demo/ents/work-counter-ent.d.ts +10 -0
  36. package/dist/src/demo/ents/work-counter-ent.js +20 -0
  37. package/dist/src/demo/ents/work-counter-ent.js.map +1 -0
  38. package/dist/src/demo/game.d.ts +12 -0
  39. package/dist/src/demo/game.js +135 -0
  40. package/dist/src/demo/game.js.map +1 -0
  41. package/dist/src/demo/index.d.ts +1 -0
  42. package/dist/src/demo/index.js +8 -0
  43. package/dist/src/demo/index.js.map +1 -0
  44. package/dist/src/demo/tsconfig.json +15 -0
  45. package/dist/src/demo/types/tag.d.ts +2 -0
  46. package/dist/src/demo/types/tag.js +2 -0
  47. package/dist/src/demo/types/tag.js.map +1 -0
  48. package/dist/src/demo/void.json +11 -0
  49. package/dist/src/ents/button-ent.d.ts +39 -0
  50. package/dist/src/ents/button-ent.js +128 -0
  51. package/dist/src/ents/button-ent.js.map +1 -0
  52. package/dist/src/ents/cursor-ent.d.ts +18 -0
  53. package/dist/src/ents/cursor-ent.js +63 -0
  54. package/dist/src/ents/cursor-ent.js.map +1 -0
  55. package/dist/src/ents/ent.d.ts +7 -0
  56. package/dist/src/ents/ent.js +2 -0
  57. package/dist/src/ents/ent.js.map +1 -0
  58. package/dist/src/ents/follow-cam-ent.d.ts +25 -0
  59. package/dist/src/ents/follow-cam-ent.js +87 -0
  60. package/dist/src/ents/follow-cam-ent.js.map +1 -0
  61. package/dist/src/ents/nine-patch-ent.d.ts +43 -0
  62. package/dist/src/ents/nine-patch-ent.js +143 -0
  63. package/dist/src/ents/nine-patch-ent.js.map +1 -0
  64. package/dist/src/ents/text-ent.d.ts +23 -0
  65. package/dist/src/ents/text-ent.js +109 -0
  66. package/dist/src/ents/text-ent.js.map +1 -0
  67. package/dist/src/ents/zoo.d.ts +17 -0
  68. package/dist/src/ents/zoo.js +45 -0
  69. package/dist/src/ents/zoo.js.map +1 -0
  70. package/dist/src/graphics/atlas-parser.d.ts +4 -0
  71. package/dist/src/graphics/atlas-parser.js +27 -0
  72. package/dist/src/graphics/atlas-parser.js.map +1 -0
  73. package/dist/src/graphics/atlas.d.ts +49 -0
  74. package/dist/src/graphics/atlas.js +7 -0
  75. package/dist/src/graphics/atlas.js.map +1 -0
  76. package/dist/src/graphics/cam.d.ts +89 -0
  77. package/dist/src/graphics/cam.js +220 -0
  78. package/dist/src/graphics/cam.js.map +1 -0
  79. package/dist/src/graphics/gl.d.ts +24 -0
  80. package/dist/src/graphics/gl.js +70 -0
  81. package/dist/src/graphics/gl.js.map +1 -0
  82. package/dist/src/graphics/layer.d.ts +21 -0
  83. package/dist/src/graphics/layer.js +23 -0
  84. package/dist/src/graphics/layer.js.map +1 -0
  85. package/dist/src/graphics/renderer.d.ts +36 -0
  86. package/dist/src/graphics/renderer.js +180 -0
  87. package/dist/src/graphics/renderer.js.map +1 -0
  88. package/dist/src/graphics/sprite-frag.glsl.d.ts +1 -0
  89. package/dist/src/graphics/sprite-frag.glsl.js +35 -0
  90. package/dist/src/graphics/sprite-frag.glsl.js.map +1 -0
  91. package/dist/src/graphics/sprite-vert.glsl.d.ts +1 -0
  92. package/dist/src/graphics/sprite-vert.glsl.js +68 -0
  93. package/dist/src/graphics/sprite-vert.glsl.js.map +1 -0
  94. package/dist/src/graphics/sprite.d.ts +108 -0
  95. package/dist/src/graphics/sprite.js +301 -0
  96. package/dist/src/graphics/sprite.js.map +1 -0
  97. package/dist/src/index.d.ts +30 -0
  98. package/dist/src/index.js +33 -0
  99. package/dist/src/index.js.map +1 -0
  100. package/dist/src/input/context-menu.d.ts +8 -0
  101. package/dist/src/input/context-menu.js +25 -0
  102. package/dist/src/input/context-menu.js.map +1 -0
  103. package/dist/src/input/gamepad.d.ts +18 -0
  104. package/dist/src/input/gamepad.js +49 -0
  105. package/dist/src/input/gamepad.js.map +1 -0
  106. package/dist/src/input/input.d.ts +148 -0
  107. package/dist/src/input/input.js +383 -0
  108. package/dist/src/input/input.js.map +1 -0
  109. package/dist/src/input/keyboard.d.ts +17 -0
  110. package/dist/src/input/keyboard.js +46 -0
  111. package/dist/src/input/keyboard.js.map +1 -0
  112. package/dist/src/input/pointer.d.ts +53 -0
  113. package/dist/src/input/pointer.js +162 -0
  114. package/dist/src/input/pointer.js.map +1 -0
  115. package/dist/src/input/wheel.d.ts +12 -0
  116. package/dist/src/input/wheel.js +30 -0
  117. package/dist/src/input/wheel.js.map +1 -0
  118. package/dist/src/looper.d.ts +17 -0
  119. package/dist/src/looper.js +51 -0
  120. package/dist/src/looper.js.map +1 -0
  121. package/dist/src/mem/pool.d.ts +31 -0
  122. package/dist/src/mem/pool.js +98 -0
  123. package/dist/src/mem/pool.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 +7 -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 +19 -0
  160. package/dist/src/utils/debug.js +35 -0
  161. package/dist/src/utils/debug.js.map +1 -0
  162. package/dist/src/utils/delay-interval.d.ts +7 -0
  163. package/dist/src/utils/delay-interval.js +29 -0
  164. package/dist/src/utils/delay-interval.js.map +1 -0
  165. package/dist/src/utils/dom-util.d.ts +3 -0
  166. package/dist/src/utils/dom-util.js +29 -0
  167. package/dist/src/utils/dom-util.js.map +1 -0
  168. package/dist/src/utils/fetch-util.d.ts +3 -0
  169. package/dist/src/utils/fetch-util.js +24 -0
  170. package/dist/src/utils/fetch-util.js.map +1 -0
  171. package/dist/src/utils/math.d.ts +6 -0
  172. package/dist/src/utils/math.js +18 -0
  173. package/dist/src/utils/math.js.map +1 -0
  174. package/dist/src/utils/vibrate.d.ts +1 -0
  175. package/dist/src/utils/vibrate.js +4 -0
  176. package/dist/src/utils/vibrate.js.map +1 -0
  177. package/dist/src/void.d.ts +48 -0
  178. package/dist/src/void.js +102 -0
  179. package/dist/src/void.js.map +1 -0
  180. package/dist/tools/atlas-pack/aseprite.d.ts +58 -0
  181. package/dist/tools/atlas-pack/aseprite.js +16 -0
  182. package/dist/tools/atlas-pack/aseprite.js.map +1 -0
  183. package/dist/tools/atlas-pack/atlas-json-parser.d.ts +21 -0
  184. package/dist/tools/atlas-pack/atlas-json-parser.js +116 -0
  185. package/dist/tools/atlas-pack/atlas-json-parser.js.map +1 -0
  186. package/dist/tools/atlas-pack/atlas-pack.d.ts +2 -0
  187. package/dist/tools/atlas-pack/atlas-pack.js +22 -0
  188. package/dist/tools/atlas-pack/atlas-pack.js.map +1 -0
  189. package/dist/tools/bundle/bundle.d.ts +3 -0
  190. package/dist/tools/bundle/bundle.js +48 -0
  191. package/dist/tools/bundle/bundle.js.map +1 -0
  192. package/dist/tools/bundle/html-plugin.d.ts +3 -0
  193. package/dist/tools/bundle/html-plugin.js +90 -0
  194. package/dist/tools/bundle/html-plugin.js.map +1 -0
  195. package/dist/tools/tsconfig-base.json +48 -0
  196. package/dist/tools/tsconfig.json +19 -0
  197. package/dist/tools/types/config.d.ts +27 -0
  198. package/dist/tools/types/config.js +31 -0
  199. package/dist/tools/types/config.js.map +1 -0
  200. package/dist/tools/types/package-json.d.ts +4 -0
  201. package/dist/tools/types/package-json.js +2 -0
  202. package/dist/tools/types/package-json.js.map +1 -0
  203. package/dist/tools/utils/argv.d.ts +12 -0
  204. package/dist/tools/utils/argv.js +19 -0
  205. package/dist/tools/utils/argv.js.map +1 -0
  206. package/dist/tools/utils/exec.d.ts +3 -0
  207. package/dist/tools/utils/exec.js +15 -0
  208. package/dist/tools/utils/exec.js.map +1 -0
  209. package/dist/tools/utils/file-util.d.ts +1 -0
  210. package/dist/tools/utils/file-util.js +13 -0
  211. package/dist/tools/utils/file-util.js.map +1 -0
  212. package/dist/tools/utils/html-parser.d.ts +1 -0
  213. package/dist/tools/utils/html-parser.js +10 -0
  214. package/dist/tools/utils/html-parser.js.map +1 -0
  215. package/dist/tools/void.d.ts +15 -0
  216. package/dist/tools/void.js +31 -0
  217. package/dist/tools/void.js.map +1 -0
  218. package/package.json +31 -41
  219. package/readme.md +1 -1
  220. package/schema/config-file.test.ts +55 -0
  221. package/schema/config-file.ts +69 -0
  222. package/schema/config-file.v0.json +68 -0
  223. package/tools/atlas-pack/aseprite.ts +60 -0
  224. package/tools/atlas-pack/atlas-json-parser.test.ts +780 -0
  225. package/tools/atlas-pack/atlas-json-parser.ts +159 -0
  226. package/tools/atlas-pack/atlas-pack.ts +51 -0
  227. package/tools/bundle/bundle.ts +64 -0
  228. package/tools/bundle/html-plugin.ts +135 -0
  229. package/tools/types/config.ts +65 -0
  230. package/tools/types/package-json.ts +4 -0
  231. package/tools/utils/argv.test.ts +41 -0
  232. package/tools/utils/argv.ts +29 -0
  233. package/tools/utils/exec.ts +22 -0
  234. package/tools/utils/file-util.ts +11 -0
  235. package/tools/utils/html-parser.ts +9 -0
  236. package/tools/void.ts +55 -0
  237. package/dist/atlas/anim.d.ts +0 -30
  238. package/dist/atlas/anim.js +0 -16
  239. package/dist/atlas/anim.js.map +0 -1
  240. package/dist/atlas/aseprite.d.ts +0 -37
  241. package/dist/atlas/aseprite.js +0 -2
  242. package/dist/atlas/aseprite.js.map +0 -1
  243. package/dist/atlas/atlas-parser.d.ts +0 -52
  244. package/dist/atlas/atlas-parser.js +0 -109
  245. package/dist/atlas/atlas-parser.js.map +0 -1
  246. package/dist/atlas/atlas.d.ts +0 -4
  247. package/dist/atlas/atlas.js +0 -2
  248. package/dist/atlas/atlas.js.map +0 -1
  249. package/dist/audio/synth.d.ts +0 -4
  250. package/dist/audio/synth.js +0 -21
  251. package/dist/audio/synth.js.map +0 -1
  252. package/dist/graphics/bitmap.d.ts +0 -14
  253. package/dist/graphics/bitmap.js +0 -14
  254. package/dist/graphics/bitmap.js.map +0 -1
  255. package/dist/graphics/cam.d.ts +0 -16
  256. package/dist/graphics/cam.js +0 -42
  257. package/dist/graphics/cam.js.map +0 -1
  258. package/dist/graphics/frag.glsl.d.ts +0 -1
  259. package/dist/graphics/frag.glsl.js +0 -15
  260. package/dist/graphics/frag.glsl.js.map +0 -1
  261. package/dist/graphics/frame-listener.d.ts +0 -16
  262. package/dist/graphics/frame-listener.js +0 -83
  263. package/dist/graphics/frame-listener.js.map +0 -1
  264. package/dist/graphics/renderer.d.ts +0 -12
  265. package/dist/graphics/renderer.js +0 -184
  266. package/dist/graphics/renderer.js.map +0 -1
  267. package/dist/graphics/vert.glsl.d.ts +0 -1
  268. package/dist/graphics/vert.glsl.js +0 -46
  269. package/dist/graphics/vert.glsl.js.map +0 -1
  270. package/dist/index.d.ts +0 -31
  271. package/dist/index.js +0 -79
  272. package/dist/index.js.map +0 -1
  273. package/dist/input/gamepad-poller.d.ts +0 -8
  274. package/dist/input/gamepad-poller.js +0 -38
  275. package/dist/input/gamepad-poller.js.map +0 -1
  276. package/dist/input/input.d.ts +0 -44
  277. package/dist/input/input.js +0 -175
  278. package/dist/input/input.js.map +0 -1
  279. package/dist/input/keyboard-poller.d.ts +0 -7
  280. package/dist/input/keyboard-poller.js +0 -30
  281. package/dist/input/keyboard-poller.js.map +0 -1
  282. package/dist/input/pointer-poller.d.ts +0 -12
  283. package/dist/input/pointer-poller.js +0 -67
  284. package/dist/input/pointer-poller.js.map +0 -1
  285. package/dist/sprite/sprite.d.ts +0 -51
  286. package/dist/sprite/sprite.js +0 -161
  287. package/dist/sprite/sprite.js.map +0 -1
  288. package/dist/storage/json-storage.d.ts +0 -4
  289. package/dist/storage/json-storage.js +0 -13
  290. package/dist/storage/json-storage.js.map +0 -1
  291. package/dist/test/tsconfig.json +0 -14
  292. package/dist/text/font.d.ts +0 -6
  293. package/dist/text/font.js +0 -18
  294. package/dist/text/font.js.map +0 -1
  295. package/dist/text/text-layout.d.ts +0 -11
  296. package/dist/text/text-layout.js +0 -73
  297. package/dist/text/text-layout.js.map +0 -1
  298. package/dist/tsconfig.json +0 -13
  299. package/dist/types/2d.d.ts +0 -9
  300. package/dist/types/2d.js +0 -2
  301. package/dist/types/2d.js.map +0 -1
  302. package/dist/void.js +0 -60
  303. package/dist/void.js.map +0 -7
  304. package/dist/void.meta.json +0 -289
  305. package/src/atlas/anim.js +0 -17
  306. package/tools/atlas-parser.js +0 -120
  307. package/tools/void.js +0 -143
package/dist/void.js DELETED
@@ -1,60 +0,0 @@
1
- var l=class{#t;beep(t,e,i,r){this.#t??=new AudioContext;let s=this.#t.currentTime,a=s+r,o=this.#t.createOscillator();o.type=t,o.frequency.setValueAtTime(e,s),o.frequency.exponentialRampToValueAtTime(i,a);let h=this.#t.createGain();h.gain.setValueAtTime(1,s),h.gain.exponentialRampToValueAtTime(.01,a),o.connect(h),h.connect(this.#t.destination),o.start(),o.stop(a)}};var f=class{buffer;size=0;constructor(t){this.buffer=new Uint32Array(t*3)}push(t){this.buffer[this.size*3]=t._xy,this.buffer[this.size*3+1]=t._wh,this.buffer[this.size*3+2]=t._iffzz,this.size++}};var m=class{minWH={w:256,h:256};minScale=1;x=0;y=0;lvl={x:-4096,y:-4096,w:8191,h:8191};#t={w:1,h:1};#e=1;#n=this.minWH.w;#i=this.minWH.h;get h(){return this.#i}resize(t){this.#t.w=innerWidth,this.#t.h=innerHeight;let e=Math.round(this.#t.w*devicePixelRatio),i=Math.round(this.#t.h*devicePixelRatio);this.#e=Math.max(this.minScale,Math.floor(Math.min(e/this.minWH.w,i/this.minWH.h))-(t??0)),this.#n=Math.floor(e/this.#e),this.#i=Math.floor(i/this.#e)}get scale(){return this.#e}toLevelXY(t){return{x:Math.round(this.x+t.x/this.#t.w*this.#n),y:Math.round(this.y+t.y/this.#t.h*this.#i)}}get w(){return this.#n}};var d=class{#t=0;#e={};#n={};get bits(){return this.#t}mapAxis(t,e,i){this.#e[t]=[e,i]}mapButton(t,e){this.#n[t]=e}poll(){if(isSecureContext){this.#t=0;for(let t of navigator.getGamepads()){for(let[e,i]of t?.axes.entries()??[]){let r=this.#e[e];if(r==null)continue;let s=i<0?r[0]:i===0?0:r[1];this.#t|=Math.abs(i)>=.5?s:0}for(let[e,i]of t?.buttons.entries()??[]){let r=this.#n[e];r!=null&&(this.#t|=i.pressed?r:0)}}}}reset(){this.#t=0}};var c=class{#t=0;#e={};get bits(){return this.#t}map(t,e){this.#e[t]=e}register(t){let e=`${t}EventListener`;globalThis[e]("blur",this.reset,{capture:!0,passive:!0});for(let i of["keydown","keyup"]){let r=this.#n;globalThis[e](i,r,{capture:!0,passive:!0})}}reset=()=>{this.#t=0};#n=t=>{let e=t.type==="keydown",i=this.#e[t.key];i!=null&&(this.#t=e?this.#t|i:this.#t&~i)}};var p=class{#t={};#e=0;#n;#i;#o={x:0,y:0};#s;#r;constructor(t,e){this.#n=t,this.#i=e}get bits(){return this.#e}map(t,e){this.#t[t]=e}get type(){return this.#s}register(t){let e=`${t}EventListener`;this.#i[e]("pointercancel",this.reset,{capture:!0,passive:!0});for(let i of["pointerdown","pointermove","pointerup"])this.#i[e](i,this.#u,{capture:!0,passive:i!=="pointerdown"});this.#i[e]("contextmenu",this.#h,{capture:!0})}reset=()=>{this.#e=0,this.#s=void 0,this.#r=void 0};get xy(){return this.#r}#h=t=>t.preventDefault();#u=t=>{if(!t.isPrimary)return;t.type==="pointerdown"&&this.#i.setPointerCapture(t.pointerId),{clientX:this.#o.x,clientY:this.#o.y}=t,this.#e=this.#a(t.buttons),this.#s=["mouse","touch","pen"].find(i=>i===t.pointerType),this.#r=this.#n.toLevelXY(this.#o),t.type!=="pointerdown"||t.preventDefault()};#a(t){let e=0;for(let i=1;i<=t;i<<=1)(i&t)===i&&(e|=this.#t[i]??0);return e}};var y=class{handled=!1;maxInterval=300;minHeld=300;#t=0;#e=0;#n=[];#i={};#o=new d;#s=new c;#r;#h=0;#u=0;constructor(t,e){this.#r=new p(t,e)}isCombo(...t){if(t.length!==this.#n.length)return!1;for(let[e,i]of t.entries()){let r=this.#f(i);if(this.#n[e]!==r)return!1}return this.#n[t.length-1]===this.#a}isComboStart(...t){return this.isCombo(...t)&&!!t.at(-1)?.every(e=>this.isOnStart(e))}isHeld(){return this.#t>=this.minHeld}isOffStart(...t){return!this.isOn(...t)&&this.isStart(...t)}isOn(...t){let e=this.#f(t);return(this.#a&e)===e}isOnStart(...t){return this.isOn(...t)&&this.isStart(...t)}isStart(...t){let e=this.#f(t);return(this.#a&e)!==(this.#e&e)}mapAxis(t,e,...i){for(let r of i)this.#o.mapAxis(r,this.#l(t),this.#l(e))}mapButton(t,...e){for(let i of e)this.#o.mapButton(i,this.#l(t))}mapClick(t,...e){for(let i of e)this.#r.map(i,this.#l(t))}mapStandard(){this.mapKey("L","ArrowLeft","a"),this.mapKey("R","ArrowRight","d"),this.mapKey("U","ArrowUp","w"),this.mapKey("D","ArrowDown","s"),this.mapKey("C","z"),this.mapKey("B","x"),this.mapKey("A","c"),this.mapKey("S","Enter","Escape"),this.mapAxis("L","R",0,2),this.mapAxis("U","D",1,3),this.mapButton("L",14),this.mapButton("R",15),this.mapButton("U",12),this.mapButton("D",13),this.mapButton("A",0),this.mapButton("S",9),this.mapClick("A",1)}mapKey(t,...e){for(let i of e)this.#s.map(i,this.#l(t))}get point(){return this.#r.xy}get pointType(){return this.#r.type}poll(t){this.handled=!1,this.#t+=this.#u,this.#e=this.#h,this.#o.poll(),this.#t>this.maxInterval&&(this.#a===0||this.#a!==this.#e)?(this.#t=0,this.#n.length=0):this.#a!==this.#e?(this.#t=0,this.#a!==0&&this.#n.push(this.#a)):this.#a!==0&&this.#a===this.#e&&(this.#n.pop(),this.#n.push(this.#a)),this.#u=t,this.#h=this.#a}register(t){this.#s.register(t),this.#r.register(t)}reset(){this.handled=!1,this.#o.reset(),this.#s.reset(),this.#r.reset()}get#a(){return this.#o.bits|this.#s.bits|this.#r.bits}#f(t){let e=0;for(let i of t)e|=this.#i[i]??0;return e}#l(t){return this.#i[t]??=1<<Object.keys(this.#i).length}};var B=`#version 300 es
2
- uniform mediump sampler2D uSpritesheet;
3
- uniform mediump uvec2 uSpritesheetSize;
4
-
5
- flat in highp ivec4 vTexXYWH;
6
- in highp vec2 vDstWH;
7
-
8
- out highp vec4 oFrag;
9
-
10
- void main() {
11
- highp vec2 px = vec2(vTexXYWH.xy) + mod(vDstWH, vec2(vTexXYWH.zw));
12
- oFrag = texture(uSpritesheet, px / vec2(uSpritesheetSize));
13
- if(oFrag.a < 1.) discard;
14
- }`;var w=`#version 300 es
15
- // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2
16
- uniform lowp usampler2D uCels;
17
- uniform mediump ivec4 uCam;
18
- uniform highp uint uFrame;
19
-
20
- layout (location=0) in lowp ivec2 iUV;
21
- layout (location=1) in highp uint iXY;
22
- layout (location=2) in highp uint iWH;
23
- layout (location=3) in highp uint iIFFZZ;
24
-
25
- flat out highp ivec4 vTexXYWH;
26
- out highp vec2 vDstWH;
27
-
28
- const mediump int maxY = 0x1000;
29
- const lowp int maxZ = 8;
30
- const mediump int maxDepth = maxY * maxZ;
31
-
32
- void main() {
33
- mediump int x = int(iXY) >> 19;
34
- mediump int y = int(iXY << 16) >> 19;
35
- lowp int z = int(iIFFZZ & 0x7u);
36
- bool zend = bool(iIFFZZ & 0x8u);
37
- bool flipX = bool(iIFFZZ & 0x20u);
38
- bool flipY = bool(iIFFZZ & 0x10u);
39
- mediump int id = int((iIFFZZ >> 6) & 0x7ff0u);
40
- lowp int cel = int((iIFFZZ >> 6) & 0xfu);
41
- mediump int w = int((iWH >> 12) & 0xfffu);
42
- mediump int h = int(iWH & 0xfffu);
43
-
44
- lowp int frame = ((int(uFrame) - cel) / 4) & 0xf;
45
- mediump uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);
46
-
47
- // https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel
48
- highp float depth = float((z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);
49
-
50
- highp ivec2 targetWH = ivec2(iUV) * ivec2(w, h);
51
- highp ivec2 origWH = ivec2(iUV) * ivec2(texXYWH.zw);
52
-
53
- highp vec2 end = vec2(x + targetWH.x, y + targetWH.y);
54
- highp vec2 clip = ((-2. * vec2(uCam.xy) + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);
55
- gl_Position = vec4(clip, depth, 1);
56
- vTexXYWH = ivec4(texXYWH);
57
- vDstWH = vec2(targetWH * ivec2(flipX ? -1 : 1, flipY ? -1 : 1));
58
- }`;var R=new Int8Array([1,1,0,1,1,0,0,0]),x=class{#t=null;#e;#n;#i;#o=null;#s;#r={};#h=null;constructor(t,e,i){this.#e=e,this.#s=i,this.#n=new Uint16Array(H(t))}clearColor(t){this.#i.clearColor((t>>>24&255)/255,(t>>>16&255)/255,(t>>>8&255)/255,(t>>>0&255)/255)}initGL(){let t=this.#e.getContext("webgl2",{antialias:!1,desynchronized:!0,powerPreference:"high-performance"});if(!t)throw Error("WebGL v2 unsupported");this.#i=t,t.enable(t.BLEND),t.blendFunc(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA),t.enable(t.DEPTH_TEST),t.depthRange(0,1),t.clearDepth(1),t.depthFunc(t.LESS),t.pixelStorei(t.UNPACK_COLORSPACE_CONVERSION_WEBGL,!1);let e=I(t,w,B);this.#r=C(t,e),t.uniform2ui(this.#r.uSpritesheetSize,this.#s.naturalWidth,this.#s.naturalHeight),this.#h=t.createVertexArray(),t.bindVertexArray(this.#h);let i=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,i),t.enableVertexAttribArray(0),t.vertexAttribIPointer(0,2,t.BYTE,0,0),t.bindBuffer(t.ARRAY_BUFFER,null),this.#t=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,this.#t),t.enableVertexAttribArray(1),t.vertexAttribIPointer(1,1,t.UNSIGNED_INT,12,0),t.vertexAttribDivisor(1,1),t.enableVertexAttribArray(2),t.vertexAttribIPointer(2,1,t.UNSIGNED_INT,12,4),t.vertexAttribDivisor(2,1),t.enableVertexAttribArray(3),t.vertexAttribIPointer(3,1,t.UNSIGNED_INT,12,8),t.vertexAttribDivisor(3,1),t.bindBuffer(t.ARRAY_BUFFER,null),t.bindVertexArray(null),t.bindBuffer(t.ARRAY_BUFFER,i),t.bufferData(t.ARRAY_BUFFER,R,t.STATIC_DRAW),t.bindBuffer(this.#i.ARRAY_BUFFER,null),t.uniform1i(this.#r.uCels,0),t.activeTexture(t.TEXTURE0);let r=t.createTexture();t.bindTexture(t.TEXTURE_2D,r),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texImage2D(t.TEXTURE_2D,0,t.RGBA16UI,1,this.#n.length/4,0,t.RGBA_INTEGER,t.UNSIGNED_SHORT,this.#n),t.uniform1i(this.#r.uSpritesheet,1),t.activeTexture(t.TEXTURE1);let s=t.createTexture();t.bindTexture(t.TEXTURE_2D,s),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,this.#s),this.#o=t.getExtension("WEBGL_lose_context")}get loseContext(){return this.#o}hasContext(){return!this.#i.isContextLost()}render(t,e,i){this.#u(t),this.#i.clear(this.#i.COLOR_BUFFER_BIT|this.#i.DEPTH_BUFFER_BIT),this.#i.uniform4i(this.#r.uCam,t.x,t.y,t.w,t.h),this.#i.uniform1ui(this.#r.uFrame,e),this.#i.bindVertexArray(this.#h),this.#i.bindBuffer(this.#i.ARRAY_BUFFER,this.#t),this.#i.bufferData(this.#i.ARRAY_BUFFER,i.buffer,this.#i.STREAM_DRAW),this.#i.bindBuffer(this.#i.ARRAY_BUFFER,null),this.#i.drawArraysInstanced(this.#i.TRIANGLE_STRIP,0,R.length/2,i.size),this.#i.bindVertexArray(null)}#u(t){let e=this.#e,i={w:t.w*t.scale,h:t.h*t.scale};(e.width!==i.w||e.height!==i.h)&&(e.width=i.w,e.height=i.h,this.#i.viewport(0,0,i.w,i.h));let r=i.w/devicePixelRatio,s=i.h/devicePixelRatio,a=Number.parseFloat(e.style.width.slice(0,-2))-r,o=Number.parseFloat(e.style.height.slice(0,-2))-s;(!Number.isFinite(a)||Math.abs(a)>=.5||!Number.isFinite(o)||Math.abs(o)>=.5)&&(e.style.width=`${r}px`,e.style.height=`${s}px`)}};function E(n,t,e){let i=n.createShader(t);if(!i)throw Error("shader creation failed");n.shaderSource(i,e.trim()),n.compileShader(i);let r=n.getShaderInfoLog(i)?.slice(0,-1);return r&&console.warn(r),i}function C(n,t){if(!t)return{};let e=n.getProgramParameter(t,n.ACTIVE_UNIFORMS),i={};for(let r=0;r<e;++r){let s=n.getActiveUniform(t,r);if(s==null)throw Error(`missing shader uniform at index ${r}`);i[s.name]=n.getUniformLocation(t,s.name)}return i}function I(n,t,e){let i=n.createProgram();if(!i)return null;let r=E(n,n.VERTEX_SHADER,t),s=E(n,n.FRAGMENT_SHADER,e);n.attachShader(i,r),n.attachShader(i,s),n.linkProgram(i),n.useProgram(i);let a=n.getProgramInfoLog(i)?.slice(0,-1);return a&&console.warn(a),n.detachShader(i,s),n.detachShader(i,r),n.deleteShader(s),n.deleteShader(r),i}function H(n){let t=[];for(let e of Object.values(n)){for(let i of e.cels)t.push(i.x,i.y,e.w,e.h);for(let i=e.cels.length;i<16;i++){let r=e.cels[i%e.cels.length];t.push(r.x,r.y,e.w,e.h)}}return t}var b=class{age=0;tick=0;#t;#e;#n;#i;#o;#s;constructor(t,e,i){this.#t=t,this.#o=e,this.#s=i}cancel(){this.#e!=null&&cancelAnimationFrame(this.#e),this.#e=void 0,this.tick=0,this.#i=void 0,this.#o.reset(),this.#n=void 0}get frame(){return Math.trunc(this.age/16.666666666666668)}register(t){let e=`${t}EventListener`;for(let i of["webglcontextrestored","webglcontextlost"])this.#t[e](i,this.#h,!0);globalThis[e]("visibilitychange",this.#h,!0),t==="add"&&this.#s.initGL(),this.#o.register(t)}render(t,e,i){this.#n=i,!(!this.#r()||!this.#s.hasContext())&&(this.#n&&(this.#e??=requestAnimationFrame(this.#u)),this.#s.render(t,this.frame,e))}#r(){return document.visibilityState==="visible"}#h=t=>{t.preventDefault(),t.type==="webglcontextrestored"&&this.#s.initGL(),this.#s.hasContext()&&this.#r()?this.#n&&(this.#e??=requestAnimationFrame(this.#u)):(this.#e!=null&&cancelAnimationFrame(this.#e),this.#e=void 0,this.tick=0,this.#i=void 0,this.#o.reset())};#u=t=>{this.#e=void 0,this.tick=t-(this.#i??t),this.#i=t,this.age+=this.tick;let e=this.#n;this.#n=void 0,this.#o.poll(this.tick),e?.()}};var g=class n{static parse(t,e){if(!(e.tag in t))throw Error(`atlas missing tag "${e.tag}"`);let i=new n(t,e.tag);return i.cel=e.cel??0,i.flipX=e.flip==="X"||e.flip==="XY",i.flipY=e.flip==="Y"||e.flip==="XY",i.x=e.x??0,i.y=e.y??0,i.z=e.z??0,i.zend=e.zend??!1,e.w!=null&&(i.w=e.w),e.h!=null&&(i.h=e.h),i}hitbox={x:0,y:0,w:0,h:0};_iffzz=0;_xy=0;_wh=0;#t={};#e;constructor(t,e){this.#e=t,this.tag=e}above(t){return(this.z===t.z?(t.zend?t.y+t.h:t.y)-(this.zend?this.y+this.h:this.y):this.z-t.z)<0}get cel(){return this._iffzz>>6&15}set cel(t){this._iffzz=this._iffzz&4294966335|(t&15)<<6}get flipX(){return!!(this._iffzz&32)}set flipX(t){if(this.flipX!==t)if(t){this._iffzz|=32;let e=this.hitbox.x-this.x;this.hitbox.x=this.x+this.hitbox.w-e}else{this._iffzz&=4294967263;let e=this.hitbox.x-this.hitbox.w;this.hitbox.x=this.x+e}}get flipY(){return!!(this._iffzz&16)}set flipY(t){if(this.flipY!==t)if(t){this._iffzz|=16;let e=this.hitbox.y-this.y;this.hitbox.y=this.y+this.hitbox.h-e}else{this._iffzz&=4294967279;let e=this.hitbox.y-this.hitbox.h;this.hitbox.y=this.y+e}}get h(){return this._wh&4095}set h(t){this._wh=this._wh&4294963200|t&4095}hits(t){return!this.hitbox.w||!this.hitbox.h?!1:(t instanceof n&&(t=t.hitbox),this.hitbox.x<t.x+(t.w??0)&&this.hitbox.x+this.hitbox.w>t.x&&this.hitbox.y<t.y+(t.h??0)&&this.hitbox.y+this.hitbox.h>t.y)}overlaps(t){return this.x<t.x+(t.w??0)&&this.x+this.w>t.x&&this.y<t.y+(t.h??0)&&this.y+this.h>t.y}get tag(){return this.#t.tag}set tag(t){if(t===this.#t.tag)return;this.#t=this.#e[t];let{hitbox:e}=this.#t;this.hitbox.x=this.x+(this.flipX?e.w-e.x:e.x),this.hitbox.y=this.y+(this.flipY?e.h-e.y:e.y),this.hitbox.w=this.#t.hitbox.w,this.hitbox.h=this.#t.hitbox.h,this.w=this.#t.w,this.h=this.#t.h,this._iffzz=this._iffzz&68717379647|this.#t.id<<6}toString(){return`${this.tag} (${this.x}, ${this.y}) ${this.w}\xD7${this.h}`}get w(){return this._wh>>12&4095}set w(t){this._wh=this._wh&4278194175|(t&4095)<<12}get x(){return(this._xy>>16)/8}set x(t){let e=t-this.x;this._xy=this._xy&65535|(8*t&65535)<<16,this.hitbox.x+=e}set xy(t){this.x=t.x,this.y=t.y}get y(){return(this._xy<<16>>16)/8}set y(t){let e=t-this.y;this._xy=this._xy&4294901760|8*t&65535,this.hitbox.y+=e}get z(){return this._iffzz&7}set z(t){this._iffzz=this._iffzz&4294967288|t&7}get zend(){return!!(this._iffzz&8)}set zend(t){t?this._iffzz|=8:this._iffzz&=4294967287}};var v=class{get(t){let e=localStorage.getItem(t);return e==null?void 0:JSON.parse(e)}put(t,e){e==null?localStorage.removeItem(t):localStorage.setItem(t,JSON.stringify(e))}};function W(n,t){let e=t.codePointAt(0);return(e==null||e>255)&&(e=63),`${n.id}--${e.toString(16).padStart(2,"0")}`}function _(n,t,e){return e==null?n.endOfLineKerning:/^\s*$/.test(t)||/^\s*$/.test(e)?n.whitespaceKerning:n.kerning[t+e]??n.defaultKerning}function T(n,t){return n.charWidth[t]??n.defaultCharWidth}function X(n,t,e){let i=[],r={x:0,y:0};for(;i.length<t.length;){let s=i.length,a=t[s],o;a===`
59
- `?o=Y(n,r):/^\s*$/.test(a)?o=U(n,r,e,L(n,a,t[s+1])):(o=S(n,r,e,t,s),r.x>0&&o.cursor.y===u(n,r.y).y&&e-r.x+o.cursor.x<=e&&(r=u(n,r.y),o=S(n,r,e,t,s))),i.push(...o.chars),r.x=o.cursor.x,r.y=o.cursor.y}return{chars:i,cursor:r}}function S(n,t,e,i,r){let s=[],{x:a,y:o}=t;for(;;){let h=i[r];if(!h||/^\s*$/.test(h))break;let A=L(n,h,i[r+1]);a>0&&a+A>e&&({x:a,y:o}=u(n,o)),s.push({x:a,y:o,w:T(n,h),h:n.cellHeight}),a+=A,r++}return{chars:s,cursor:{x:a,y:o}}}function u(n,t){return{x:0,y:t+n.lineHeight}}function Y(n,t){return{chars:[void 0],cursor:u(n,t.y)}}function U(n,t,e,i){let r=t.x>0&&t.x+i>=e?u(n,t.y):{x:t.x+i,y:t.y};return{chars:[void 0],cursor:r}}function L(n,t,e){return T(n,t)+_(n,t,e)}var z=class n{static async new(){return new n(await G(atlasURI))}atlas=atlas;cam=new m;ctrl;kv=new v;synth=new l;#t=new f(1e6);#e;#n;constructor(t){let e=document.createElement("meta");e.name="viewport",e.content="maximum-scale=1, minimum-scale=1, user-scalable=no",document.head.appendChild(e),document.body.style.margin="0",document.body.style.width="100vw",document.body.style.height="100vh",document.body.style.overflow="hidden";let i=document.createElement("canvas");i.style.cursor="none",i.style.display="block",i.style.imageRendering="pixelated",i.style.touchAction="none",document.body.append(i),this.ctrl=new y(this.cam,i),this.#n=new x(atlas,i,t),this.#e=new b(i,this.ctrl,this.#n),this.#e.register("add"),this.background=255}set background(t){document.body.style.background=`#${t.toString(16).padStart(8,"0")}`,this.#n.clearColor(t)}blit(t){this.#t.push(t)}get frame(){return this.#e.frame}render(t){this.cam.resize(),this.#e.render(this.cam,this.#t,t),this.#t.size=0}sprite(t){return new g(this.atlas,t)}stop(){this.#e.cancel(),this.#e.register("remove"),this.ctrl.register("remove")}};function G(n){return new Promise((t,e)=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>e(i),i.src=n})}export{g as Sprite,z as Void,W as fontCharToTag,X as layoutText};
60
- //# sourceMappingURL=void.js.map
package/dist/void.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/audio/synth.ts", "../src/graphics/bitmap.ts", "../src/graphics/cam.ts", "../src/input/gamepad-poller.ts", "../src/input/keyboard-poller.ts", "../src/input/pointer-poller.ts", "../src/input/input.ts", "../src/graphics/frag.glsl.ts", "../src/graphics/vert.glsl.ts", "../src/graphics/renderer.ts", "../src/graphics/frame-listener.ts", "../src/sprite/sprite.ts", "../src/storage/json-storage.ts", "../src/text/font.ts", "../src/text/text-layout.ts", "../src/index.ts"],
4
- "sourcesContent": ["export class Synth {\n #context?: AudioContext\n\n beep(\n type: OscillatorType,\n startHz: number,\n endHz: number,\n duration: number // why can't this be short?\n ): void {\n this.#context ??= new AudioContext()\n const now = this.#context.currentTime\n const end = now + duration\n\n const oscillator = this.#context.createOscillator()\n oscillator.type = type\n oscillator.frequency.setValueAtTime(startHz, now)\n oscillator.frequency.exponentialRampToValueAtTime(endHz, end)\n\n const gain = this.#context.createGain()\n gain.gain.setValueAtTime(1, now)\n gain.gain.exponentialRampToValueAtTime(0.01, end)\n\n oscillator.connect(gain)\n gain.connect(this.#context.destination)\n\n oscillator.start()\n oscillator.stop(end)\n }\n}\n", "export type Bitmap = {\n /** 8x: i16, 8y: i16 */\n readonly _xy: number\n /** w: u12, h: u12 */\n readonly _wh: number\n /** id+cel: u15, flipX: b1, flipY: b1, zend: b1, z: u3 */\n readonly _iffzz: number\n}\n\nexport class BitmapBuffer {\n readonly buffer: Uint32Array\n size = 0\n\n constructor(capacity: number) {\n this.buffer = new Uint32Array(capacity * 3)\n }\n\n push(bmp: Readonly<Bitmap>): void {\n this.buffer[this.size * 3] = bmp._xy\n this.buffer[this.size * 3 + 1] = bmp._wh\n this.buffer[this.size * 3 + 2] = bmp._iffzz\n this.size++\n }\n}\n", "import type {Box, WH, XY} from '../types/2d.js'\n\nexport class Cam implements Box {\n minWH: WH = {w: 256, h: 256}\n minScale: number = 1\n x: number = 0 //xy?\n y: number = 0\n lvl: Box = {x: -4096, y: -4096, w: 8191, h: 8191}\n\n readonly #clientWH: WH = {w: 1, h: 1}\n #scale = 1\n #w = this.minWH.w\n #h = this.minWH.h\n\n get h(): number {\n return this.#h\n }\n\n /** Fill or just barely not fill the viewport in scaled pixels. */\n resize(zoomOut?: number): void {\n // WH of body in CSS px; document.body.getBoundingClientRect() returns\n // incorrectly large sizing on mobile that includes the address bar\n this.#clientWH.w = innerWidth\n this.#clientWH.h = innerHeight\n\n const nativeW = Math.round(this.#clientWH.w * devicePixelRatio) // physical\n const nativeH = Math.round(this.#clientWH.h * devicePixelRatio)\n\n this.#scale = Math.max(\n this.minScale,\n Math.floor(Math.min(nativeW / this.minWH.w, nativeH / this.minWH.h)) -\n (zoomOut ?? 0) // Default is to zoom in as much as possible.\n )\n this.#w = Math.floor(nativeW / this.#scale)\n this.#h = Math.floor(nativeH / this.#scale)\n }\n\n get scale(): number {\n return this.#scale\n }\n\n /** Returns the integral position in level coordinates. */\n toLevelXY(clientXY: Readonly<XY>): XY {\n return {\n x: Math.round(this.x + (clientXY.x / this.#clientWH.w) * this.#w),\n y: Math.round(this.y + (clientXY.y / this.#clientWH.h) * this.#h)\n }\n }\n\n get w(): number {\n return this.#w\n }\n}\n", "export class GamepadPoller {\n #bits = 0\n readonly #bitByAxis: {[axis: number]: [less: number, more: number]} = {}\n readonly #bitByButton: {[btn: number]: number} = {}\n\n get bits(): number {\n return this.#bits\n }\n\n mapAxis(axis: number, lessBit: number, moreBit: number): void {\n this.#bitByAxis[axis] = [lessBit, moreBit]\n }\n\n mapButton(button: number, bit: number): void {\n this.#bitByButton[button] = bit\n }\n\n poll(): void {\n if (!isSecureContext) return\n this.#bits = 0\n for (const pad of navigator.getGamepads()) {\n for (const [index, axis] of pad?.axes.entries() ?? []) {\n const bits = this.#bitByAxis[index]\n if (bits == null) continue\n const bit = axis < 0 ? bits[0] : axis === 0 ? 0 : bits[1]\n this.#bits |= Math.abs(axis) >= 0.5 ? bit : 0\n }\n for (const [index, button] of pad?.buttons.entries() ?? []) {\n const bit = this.#bitByButton[index]\n if (bit == null) continue\n this.#bits |= button.pressed ? bit : 0\n }\n }\n }\n\n reset(): void {\n this.#bits = 0\n }\n}\n", "export class KeyboardPoller {\n #bits = 0\n readonly #bitByKey: {[key: string]: number} = {}\n\n get bits(): number {\n return this.#bits\n }\n\n map(key: string, bit: number): void {\n this.#bitByKey[key] = bit\n }\n\n register(op: 'add' | 'remove'): void {\n const fn = <const>`${op}EventListener`\n // keyup is not received if window loses focus.\n globalThis[fn]('blur', this.reset, {capture: true, passive: true})\n for (const type of ['keydown', 'keyup']) {\n const callback = <EventListenerOrEventListenerObject>this.#onKey\n globalThis[fn](type, callback, {capture: true, passive: true})\n }\n }\n\n reset = (): void => {\n this.#bits = 0\n }\n\n #onKey = (ev: KeyboardEvent): void => {\n const on = ev.type === 'keydown'\n const bit = this.#bitByKey[ev.key]\n if (bit == null) return\n this.#bits = on ? this.#bits | bit : this.#bits & ~bit\n }\n}\n", "import {Cam} from '../graphics/cam.js'\nimport type {XY} from '../types/2d.js'\n\nexport class PointerPoller {\n readonly #bitByButton: {[btn: number]: number} = {}\n #bits: number = 0\n readonly #cam: Readonly<Cam>\n readonly #canvas: HTMLCanvasElement\n readonly #clientXY: XY = {x: 0, y: 0}\n #type?: 'mouse' | 'touch' | 'pen' | undefined\n #xy?: Readonly<XY> | undefined\n\n constructor(cam: Readonly<Cam>, canvas: HTMLCanvasElement) {\n this.#cam = cam\n this.#canvas = canvas\n }\n\n get bits(): number {\n return this.#bits\n }\n\n map(button: number, bit: number): void {\n this.#bitByButton[button] = bit\n }\n\n get type(): 'mouse' | 'touch' | 'pen' | undefined {\n return this.#type\n }\n\n register(op: 'add' | 'remove'): void {\n const fn = <const>`${op}EventListener`\n this.#canvas[fn]('pointercancel', this.reset, {\n capture: true,\n passive: true\n })\n for (const type of ['pointerdown', 'pointermove', 'pointerup']) {\n this.#canvas[fn](\n type,\n <EventListenerOrEventListenerObject>this.#onPointEvent,\n {capture: true, passive: type !== 'pointerdown'}\n )\n }\n this.#canvas[fn]('contextmenu', this.#onContextMenuEvent, {capture: true})\n }\n\n reset = (): void => {\n this.#bits = 0\n this.#type = undefined\n this.#xy = undefined\n }\n\n get xy(): Readonly<XY> | undefined {\n return this.#xy\n }\n\n #onContextMenuEvent = (ev: Event): void => ev.preventDefault()\n\n #onPointEvent = (ev: PointerEvent): void => {\n // Ignore non-primary inputs to avoid flickering between distant points.\n if (!ev.isPrimary) return\n\n if (ev.type === 'pointerdown') this.#canvas.setPointerCapture(ev.pointerId)\n ;({clientX: this.#clientXY.x, clientY: this.#clientXY.y} = ev)\n\n this.#bits = this.#evButtonsToBits(ev.buttons)\n this.#type = (<const>['mouse', 'touch', 'pen']).find(\n type => type === ev.pointerType\n )\n this.#xy = this.#cam.toLevelXY(this.#clientXY)\n\n const passive = ev.type !== 'pointerdown'\n if (!passive) ev.preventDefault()\n }\n\n #evButtonsToBits(buttons: number): number {\n let bits = 0\n for (let button = 1; button <= buttons; button <<= 1) {\n if ((button & buttons) !== button) continue\n bits |= this.#bitByButton[button] ?? 0\n }\n return bits\n }\n}\n", "import {Cam} from '../graphics/cam.js'\nimport type {XY} from '../types/2d.js'\nimport {GamepadPoller} from './gamepad-poller.js'\nimport {KeyboardPoller} from './keyboard-poller.js'\nimport {PointerPoller} from './pointer-poller.js'\n\n// prettier-ignore\nexport type StandardButton =\n 'L' | 'R' | 'U' | 'D' | // Dpad.\n 'C' | 'B' | 'A' | // Primary, secondary, tertiary.\n 'S' // Start.\n\nexport class Input<Button extends string = StandardButton> {\n handled = false\n /** The maximum duration in milliseconds permitted between combo inputs. */\n maxInterval = 300\n /** The minimum duration in milliseconds for an input to be considered held. */\n minHeld = 300\n\n /** The time in milliseconds since the input changed. */\n #duration = 0\n /** Prior button state, possibly 0, but not necessarily a combo member. */\n #prevBits = 0\n /**\n * A sequence of nonzero buttons ordered from oldest (first) to latest (last).\n * Combos are terminated only by expiration.\n */\n readonly #combo: number[] = []\n /** Logical button to bit. */\n readonly #bitByButton = <{[btn in Button]: number}>{}\n readonly #gamepad = new GamepadPoller()\n readonly #keyboard = new KeyboardPoller()\n readonly #pointer: PointerPoller\n #pollBits = 0\n #pollTick = 0\n\n constructor(cam: Readonly<Cam>, canvas: HTMLCanvasElement) {\n this.#pointer = new PointerPoller(cam, canvas)\n }\n\n /**\n * Combos are interpreted exactly both in buttons pressed per tick (eg, up\n * will not match up and down the way `isOn('Up')` will) and sequence (order\n * and length). Combos only test button on state.\n */\n isCombo(...combo: readonly (readonly Button[])[]): boolean {\n if (combo.length !== this.#combo.length) return false\n for (const [i, buttons] of combo.entries()) {\n const bits = this.#buttonsToBits(buttons)\n if (this.#combo[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 and\n // that the last entry's buttons haven't been released.\n return this.#combo[combo.length - 1] === this.#bits\n }\n\n /** Like isOnCombo() but test if the last button set is triggered. */\n isComboStart(...combo: readonly (readonly Button[])[]): boolean {\n return (\n this.isCombo(...combo) &&\n !!combo.at(-1)?.every(button => this.isOnStart(button))\n )\n }\n\n /** True if held on or off. */\n isHeld(): boolean {\n return this.#duration >= this.minHeld\n }\n\n isOffStart(...buttons: readonly Button[]): boolean {\n return !this.isOn(...buttons) && this.isStart(...buttons)\n }\n\n /**\n * Test if all buttons are on. True if the buttons are pressed regardless of\n * whether other buttons are pressed. Eg, `isOn('Up')` will return true when\n * up is pressed or when up and down are pressed.\n */\n isOn(...buttons: readonly Button[]): boolean {\n const bits = this.#buttonsToBits(buttons)\n return (this.#bits & bits) === bits\n }\n\n isOnStart(...buttons: readonly Button[]): boolean {\n return this.isOn(...buttons) && this.isStart(...buttons)\n }\n\n /** True if triggered on or off. */\n isStart(...buttons: readonly Button[]): boolean {\n const bits = this.#buttonsToBits(buttons)\n return (this.#bits & bits) !== (this.#prevBits & bits)\n }\n\n mapAxis(less: Button, more: Button, ...axes: readonly number[]): void {\n for (const axis of axes) {\n this.#gamepad.mapAxis(axis, this.#map(less), this.#map(more))\n }\n }\n\n mapButton(button: Button, ...indices: readonly number[]): void {\n for (const index of indices) {\n this.#gamepad.mapButton(index, this.#map(button))\n }\n }\n\n mapClick(button: Button, ...clicks: readonly number[]): void {\n for (const click of clicks) this.#pointer.map(click, this.#map(button))\n }\n\n mapStandard(): void {\n this.mapKey(<Button>'L', 'ArrowLeft', 'a')\n this.mapKey(<Button>'R', 'ArrowRight', 'd')\n this.mapKey(<Button>'U', 'ArrowUp', 'w')\n this.mapKey(<Button>'D', 'ArrowDown', 's')\n this.mapKey(<Button>'C', 'z')\n this.mapKey(<Button>'B', 'x')\n this.mapKey(<Button>'A', 'c')\n this.mapKey(<Button>'S', 'Enter', 'Escape')\n\n // https://w3c.github.io/gamepad/#remapping\n this.mapAxis(<Button>'L', <Button>'R', 0, 2)\n this.mapAxis(<Button>'U', <Button>'D', 1, 3)\n this.mapButton(<Button>'L', 14)\n this.mapButton(<Button>'R', 15)\n this.mapButton(<Button>'U', 12)\n this.mapButton(<Button>'D', 13)\n this.mapButton(<Button>'A', 0)\n this.mapButton(<Button>'S', 9)\n\n this.mapClick(<Button>'A', 1)\n }\n\n mapKey(button: Button, ...keys: readonly string[]): void {\n for (const key of keys) this.#keyboard.map(key, this.#map(button))\n }\n\n get point(): Readonly<XY> | undefined {\n return this.#pointer.xy\n }\n\n get pointType(): 'mouse' | 'touch' | 'pen' | undefined {\n return this.#pointer.type\n }\n\n poll(tick: number): void {\n this.handled = false\n this.#duration += this.#pollTick\n this.#prevBits = this.#pollBits\n\n this.#gamepad.poll()\n if (\n this.#duration > this.maxInterval &&\n (this.#bits === 0 || this.#bits !== this.#prevBits)\n ) {\n // Expired.\n this.#duration = 0\n this.#combo.length = 0\n } else if (this.#bits !== this.#prevBits) {\n // Some button state has changed and at least one button is still pressed.\n this.#duration = 0\n if (this.#bits !== 0) this.#combo.push(this.#bits)\n } else if (this.#bits !== 0 && this.#bits === this.#prevBits) {\n // Held. Update combo with the latest buttons.\n this.#combo.pop()\n this.#combo.push(this.#bits)\n }\n\n this.#pollTick = tick\n this.#pollBits = this.#bits\n }\n\n register(op: 'add' | 'remove'): void {\n this.#keyboard.register(op)\n this.#pointer.register(op)\n }\n\n reset(): void {\n this.handled = false\n this.#gamepad.reset()\n this.#keyboard.reset()\n this.#pointer.reset()\n }\n\n /**\n * The current state and prospective combo member. A zero value can never be a\n * combo member but is necessary to persist in previous to distinguish the off\n * state between repeated button presses like up, up.\n */\n get #bits(): number {\n return this.#gamepad.bits | this.#keyboard.bits | this.#pointer.bits\n }\n\n #buttonsToBits(buttons: readonly Button[]): number {\n let bits = 0\n for (const button of buttons) bits |= this.#bitByButton[button] ?? 0\n return bits\n }\n\n #map(button: Button): number {\n return (this.#bitByButton[button] ??=\n 1 << Object.keys(this.#bitByButton).length)\n }\n}\n", "export const fragGLSL = `#version 300 es\nuniform mediump sampler2D uSpritesheet;\nuniform mediump uvec2 uSpritesheetSize;\n\nflat in highp ivec4 vTexXYWH;\nin highp vec2 vDstWH;\n\nout highp vec4 oFrag;\n\nvoid main() {\n highp vec2 px = vec2(vTexXYWH.xy) + mod(vDstWH, vec2(vTexXYWH.zw));\n oFrag = texture(uSpritesheet, px / vec2(uSpritesheetSize));\n if(oFrag.a < 1.) discard;\n}`\n", "export const vertGLSL = `#version 300 es\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2\nuniform lowp usampler2D uCels;\nuniform mediump ivec4 uCam;\nuniform highp uint uFrame;\n\nlayout (location=0) in lowp ivec2 iUV;\nlayout (location=1) in highp uint iXY;\nlayout (location=2) in highp uint iWH;\nlayout (location=3) in highp uint iIFFZZ;\n\nflat out highp ivec4 vTexXYWH;\nout highp vec2 vDstWH;\n\nconst mediump int maxY = 0x1000;\nconst lowp int maxZ = 8;\nconst mediump int maxDepth = maxY * maxZ;\n\nvoid main() {\n mediump int x = int(iXY) >> 19;\n mediump int y = int(iXY << 16) >> 19;\n lowp int z = int(iIFFZZ & 0x7u);\n bool zend = bool(iIFFZZ & 0x8u);\n bool flipX = bool(iIFFZZ & 0x20u);\n bool flipY = bool(iIFFZZ & 0x10u);\n mediump int id = int((iIFFZZ >> 6) & 0x7ff0u);\n lowp int cel = int((iIFFZZ >> 6) & 0xfu);\n mediump int w = int((iWH >> 12) & 0xfffu);\n mediump int h = int(iWH & 0xfffu);\n\n lowp int frame = ((int(uFrame) - cel) / 4) & 0xf;\n mediump uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);\n\n // https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel\n highp float depth = float((z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);\n\n highp ivec2 targetWH = ivec2(iUV) * ivec2(w, h);\n highp ivec2 origWH = ivec2(iUV) * ivec2(texXYWH.zw);\n\n highp vec2 end = vec2(x + targetWH.x, y + targetWH.y);\n highp vec2 clip = ((-2. * vec2(uCam.xy) + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);\n gl_Position = vec4(clip, depth, 1);\n vTexXYWH = ivec4(texXYWH);\n vDstWH = vec2(targetWH * ivec2(flipX ? -1 : 1, flipY ? -1 : 1));\n}`\n", "import {maxAnimCels, type Anim} from '../atlas/anim.js'\nimport type {AnimTag, Atlas} from '../index.js'\nimport {BitmapBuffer} from './bitmap.js'\nimport {Cam} from './cam.js'\nimport {fragGLSL} from './frag.glsl.js'\nimport {vertGLSL} from './vert.glsl.js'\n\ntype GLUniforms = {readonly [name: string]: WebGLUniformLocation | null}\ntype GL = WebGL2RenderingContext\ntype GLProgram = WebGLProgram | null\n\nconst uv: Readonly<Int8Array> = new Int8Array([1, 1, 0, 1, 1, 0, 0, 0])\n\nexport class Renderer {\n #bmpBuffer: Readonly<WebGLBuffer> | null = null\n readonly #canvas: HTMLCanvasElement\n readonly #cels: Readonly<Uint16Array>\n #gl!: GL\n #loseContext: Readonly<WEBGL_lose_context | null> = null\n readonly #spritesheet: HTMLImageElement\n #uniforms: Readonly<GLUniforms> = {}\n #vertArray: WebGLVertexArrayObject | null = null\n\n constructor(\n atlas: Atlas,\n canvas: HTMLCanvasElement,\n spritesheet: HTMLImageElement\n ) {\n this.#canvas = canvas\n this.#spritesheet = spritesheet\n this.#cels = new Uint16Array(newCels(atlas))\n }\n\n clearColor(rgba: number): void {\n this.#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\n initGL(): void {\n const gl = this.#canvas.getContext('webgl2', {\n antialias: false,\n desynchronized: true, // breaks render stats\n powerPreference: 'high-performance'\n })\n if (!gl) throw Error('WebGL v2 unsupported')\n this.#gl = gl\n\n // Allow transparent textures to be layered.\n gl.enable(gl.BLEND)\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)\n\n // Enable z-buffer for [0, 1] ([foreground, background]).\n gl.enable(gl.DEPTH_TEST)\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 const pgm = loadProgram(gl, vertGLSL, fragGLSL)\n this.#uniforms = getUniformLocations(gl, pgm)\n\n gl.uniform2ui(\n this.#uniforms.uSpritesheetSize!,\n this.#spritesheet.naturalWidth,\n this.#spritesheet.naturalHeight\n )\n\n this.#vertArray = gl.createVertexArray()\n gl.bindVertexArray(this.#vertArray)\n\n const uvBuffer = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer)\n gl.enableVertexAttribArray(0)\n gl.vertexAttribIPointer(0, 2, gl.BYTE, 0, 0)\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n this.#bmpBuffer = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, this.#bmpBuffer)\n gl.enableVertexAttribArray(1)\n gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, 12, 0)\n gl.vertexAttribDivisor(1, 1)\n gl.enableVertexAttribArray(2)\n gl.vertexAttribIPointer(2, 1, gl.UNSIGNED_INT, 12, 4)\n gl.vertexAttribDivisor(2, 1)\n gl.enableVertexAttribArray(3)\n gl.vertexAttribIPointer(3, 1, gl.UNSIGNED_INT, 12, 8)\n gl.vertexAttribDivisor(3, 1)\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n gl.bindVertexArray(null)\n\n gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer)\n gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW)\n gl.bindBuffer(this.#gl.ARRAY_BUFFER, null)\n\n gl.uniform1i(this.#uniforms.uCels!, 0)\n gl.activeTexture(gl.TEXTURE0)\n const dataTex = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D, dataTex)\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,\n 1,\n this.#cels.length / 4, // 4 u8s per row\n 0,\n gl.RGBA_INTEGER,\n gl.UNSIGNED_SHORT,\n this.#cels\n )\n\n gl.uniform1i(this.#uniforms.uSpritesheet!, 1)\n gl.activeTexture(gl.TEXTURE1)\n const spritesheetTex = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D, spritesheetTex)\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.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n this.#spritesheet\n )\n\n this.#loseContext = gl.getExtension('WEBGL_lose_context')\n }\n\n get loseContext(): WEBGL_lose_context | null {\n return this.#loseContext\n }\n\n hasContext(): boolean {\n return !this.#gl.isContextLost()\n }\n\n render(\n cam: Readonly<Cam>,\n frame: number,\n bmps: Readonly<BitmapBuffer>\n ): void {\n this.#resize(cam)\n this.#gl.clear(this.#gl.COLOR_BUFFER_BIT | this.#gl.DEPTH_BUFFER_BIT)\n\n this.#gl.uniform4i(this.#uniforms.uCam!, cam.x, cam.y, cam.w, cam.h)\n this.#gl.uniform1ui(this.#uniforms.uFrame!, frame)\n\n this.#gl.bindVertexArray(this.#vertArray)\n\n this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, this.#bmpBuffer)\n this.#gl.bufferData(\n this.#gl.ARRAY_BUFFER,\n bmps.buffer,\n this.#gl.STREAM_DRAW\n )\n this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, null)\n\n this.#gl.drawArraysInstanced(\n this.#gl.TRIANGLE_STRIP,\n 0,\n uv.length / 2, // d\n bmps.size\n )\n\n this.#gl.bindVertexArray(null)\n }\n\n #resize(cam: Readonly<Cam>): void {\n const canvas = this.#canvas\n const nativeWH = {w: cam.w * cam.scale, h: cam.h * cam.scale}\n\n if (canvas.width !== nativeWH.w || canvas.height !== nativeWH.h) {\n canvas.width = nativeWH.w\n canvas.height = nativeWH.h\n this.#gl.viewport(0, 0, nativeWH.w, nativeWH.h)\n }\n\n // These pixels may be greater than, less than, or equal to native.\n const clientW = nativeWH.w / devicePixelRatio\n const clientH = nativeWH.h / devicePixelRatio\n const diffW = Number.parseFloat(canvas.style.width.slice(0, -2)) - clientW\n const diffH = Number.parseFloat(canvas.style.height.slice(0, -2)) - clientH\n if (\n !Number.isFinite(diffW) ||\n Math.abs(diffW) >= 0.5 ||\n !Number.isFinite(diffH) ||\n Math.abs(diffH) >= 0.5\n ) {\n canvas.style.width = `${clientW}px`\n canvas.style.height = `${clientH}px`\n }\n }\n}\n\nfunction compileShader(gl: GL, type: number, src: string): WebGLShader {\n const shader = gl.createShader(type)\n if (!shader) throw Error('shader creation failed')\n gl.shaderSource(shader, src.trim())\n gl.compileShader(shader)\n\n const log = gl.getShaderInfoLog(shader)?.slice(0, -1)\n if (log) console.warn(log)\n\n return shader\n}\n\nfunction getUniformLocations(gl: GL, pgm: GLProgram): GLUniforms {\n if (!pgm) return {}\n const len = gl.getProgramParameter(pgm, gl.ACTIVE_UNIFORMS)\n const locations: {[name: string]: WebGLUniformLocation | null} = {}\n for (let i = 0; i < len; ++i) {\n const uniform = gl.getActiveUniform(pgm, i)\n if (uniform == null) throw Error(`missing shader uniform at index ${i}`)\n locations[uniform.name] = gl.getUniformLocation(pgm, uniform.name)\n }\n return locations\n}\n\nfunction loadProgram(gl: GL, vertGLSL: string, fragGLSL: string): GLProgram {\n const pgm = gl.createProgram()\n if (!pgm) return null\n\n const vert = compileShader(gl, gl.VERTEX_SHADER, vertGLSL)\n const frag = compileShader(gl, gl.FRAGMENT_SHADER, fragGLSL)\n gl.attachShader(pgm, vert)\n gl.attachShader(pgm, frag)\n gl.linkProgram(pgm)\n gl.useProgram(pgm)\n\n const log = gl.getProgramInfoLog(pgm)?.slice(0, -1)\n if (log) console.warn(log)\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\n/** XYWH ordered by ID and padded to 16-cel blocks. */\nfunction newCels(atlas: Atlas): readonly number[] {\n const cels = []\n for (const anim of Object.values<Anim<AnimTag>>(atlas)) {\n // Animations are inserted in ID order.\n for (const cel of anim.cels) cels.push(cel.x, cel.y, anim.w, anim.h)\n for (let i = anim.cels.length; i < maxAnimCels; i++) {\n const cel = anim.cels[i % anim.cels.length]!\n cels.push(cel.x, cel.y, anim.w, anim.h)\n }\n }\n return cels\n}\n", "import {Input} from '../input/input.js'\nimport {BitmapBuffer} from './bitmap.js'\nimport {Cam} from './cam.js'\nimport {Renderer} from './renderer.js'\n\nexport class FrameListener {\n /** The running lifetime in milliseconds. */\n age = 0\n /** The exact duration in milliseconds to apply on a given update step. */\n tick = 0\n\n readonly #canvas: HTMLCanvasElement\n #frame?: number | undefined\n #loop?: (() => void) | undefined\n #time?: number | undefined\n readonly #input: Input\n readonly #renderer: Renderer\n\n constructor(\n canvas: HTMLCanvasElement,\n input: Input<string>,\n renderer: Renderer\n ) {\n this.#canvas = canvas\n this.#input = input\n this.#renderer = renderer\n }\n\n cancel(): void {\n if (this.#frame != null) cancelAnimationFrame(this.#frame)\n this.#frame = undefined\n this.tick = 0\n this.#time = undefined\n this.#input.reset()\n this.#loop = undefined\n }\n\n get frame(): number {\n // Assume 60 FPS so games can scale to this number regardless of actual.\n return Math.trunc(this.age / 16.666666666666668)\n }\n\n register(op: 'add' | 'remove'): void {\n const fn = <const>`${op}EventListener`\n for (const type of ['webglcontextrestored', 'webglcontextlost']) {\n this.#canvas[fn](type, this.#onEvent, true)\n }\n globalThis[fn]('visibilitychange', this.#onEvent, true)\n if (op === 'add') this.#renderer.initGL()\n this.#input.register(op)\n }\n\n render(cam: Readonly<Cam>, buffer: BitmapBuffer, loop?: () => void): void {\n this.#loop = loop\n if (!this.#isVisible() || !this.#renderer.hasContext()) return\n if (this.#loop) this.#frame ??= requestAnimationFrame(this.#onFrame)\n this.#renderer.render(cam, this.frame, buffer)\n }\n\n #isVisible(): boolean {\n return document.visibilityState === 'visible'\n }\n\n #onEvent = (event: Event): void => {\n event.preventDefault()\n if (event.type === 'webglcontextrestored') this.#renderer.initGL()\n\n if (this.#renderer.hasContext() && this.#isVisible()) {\n if (this.#loop) this.#frame ??= requestAnimationFrame(this.#onFrame)\n } else {\n if (this.#frame != null) cancelAnimationFrame(this.#frame)\n this.#frame = undefined\n this.tick = 0\n this.#time = undefined\n this.#input.reset()\n }\n }\n\n #onFrame = (time: number): void => {\n this.#frame = undefined\n this.tick = time - (this.#time ?? time)\n this.#time = time\n this.age += this.tick\n const loop = this.#loop\n this.#loop = undefined\n this.#input.poll(this.tick)\n loop?.()\n }\n}\n", "import type {Anim, AnimTag} from '../atlas/anim.js'\nimport type {Atlas} from '../atlas/atlas.js'\nimport type {Bitmap} from '../graphics/bitmap.js'\nimport type {Box, WH, XY} from '../types/2d.js'\n\nexport type SpriteJSON = {\n cel?: number\n flip?: string\n tag: string\n x?: number\n y?: number\n z?: number\n w?: number\n h?: number\n zend?: boolean\n}\n\nexport class Sprite<T extends AnimTag = AnimTag> implements Bitmap, Box {\n static parse<T extends AnimTag = AnimTag>(\n atlas: Atlas<T>,\n json: Readonly<SpriteJSON>\n ): Sprite<T> {\n if (!(json.tag in atlas)) throw Error(`atlas missing tag \"${json.tag}\"`)\n const sprite = new Sprite(atlas, <T>json.tag)\n sprite.cel = json.cel ?? 0\n sprite.flipX = json.flip === 'X' || json.flip === 'XY'\n sprite.flipY = json.flip === 'Y' || json.flip === 'XY'\n sprite.x = json.x ?? 0\n sprite.y = json.y ?? 0\n sprite.z = json.z ?? 0\n sprite.zend = json.zend ?? false\n if (json.w != null) sprite.w = json.w\n if (json.h != null) sprite.h = json.h\n return sprite\n }\n\n readonly hitbox: Box = {x: 0, y: 0, w: 0, h: 0}\n\n _iffzz = 0\n _xy = 0\n _wh = 0\n\n #anim: Anim<T> = <Anim<T>>{}\n #atlas: Atlas<T>\n\n constructor(atlas: Atlas<T>, tag: T) {\n this.#atlas = atlas\n this.tag = tag\n }\n\n above(sprite: Readonly<Sprite>): boolean {\n const compare =\n this.z === sprite.z\n ? (sprite.zend ? sprite.y + sprite.h : sprite.y) -\n (this.zend ? this.y + this.h : this.y)\n : this.z - sprite.z\n return compare < 0\n }\n\n get cel(): number {\n return (this._iffzz >> 6) & 0xf\n }\n\n /** Set to frame number to start at the beginning. */\n set cel(cel: number) {\n this._iffzz = (this._iffzz & 0xfffffc3f) | ((cel & 0xf) << 6)\n }\n\n get flipX(): boolean {\n return !!(this._iffzz & 0x20)\n }\n\n set flipX(flip: boolean) {\n if (this.flipX === flip) return\n if (flip) {\n this._iffzz |= 0x20\n const diff = this.hitbox.x - this.x\n this.hitbox.x = this.x + this.hitbox.w - diff\n } else {\n this._iffzz &= 0xffffffdf\n const diff = this.hitbox.x - this.hitbox.w\n this.hitbox.x = this.x + diff\n }\n }\n\n get flipY(): boolean {\n return !!(this._iffzz & 0x10)\n }\n\n set flipY(flip: boolean) {\n if (this.flipY === flip) return\n if (flip) {\n this._iffzz |= 0x10\n const diff = this.hitbox.y - this.y\n this.hitbox.y = this.y + this.hitbox.h - diff\n } else {\n this._iffzz &= 0xffffffef\n const diff = this.hitbox.y - this.hitbox.h\n this.hitbox.y = this.y + diff\n }\n }\n\n get h(): number {\n return this._wh & 0xfff\n }\n\n set h(h: number) {\n this._wh = (this._wh & 0xfffff000) | (h & 0xfff)\n }\n\n hits(box: Readonly<XY & Partial<WH>>): boolean {\n if (!this.hitbox.w || !this.hitbox.h) return false\n if (box instanceof Sprite) box = box.hitbox\n return (\n this.hitbox.x < box.x + (box.w ?? 0) &&\n this.hitbox.x + this.hitbox.w > box.x &&\n this.hitbox.y < box.y + (box.h ?? 0) &&\n this.hitbox.y + this.hitbox.h > box.y\n )\n }\n\n overlaps(box: Readonly<XY & Partial<WH>>): boolean {\n return (\n this.x < box.x + (box.w ?? 0) &&\n this.x + this.w > box.x &&\n this.y < box.y + (box.h ?? 0) &&\n this.y + this.h > box.y\n )\n }\n\n get tag(): T {\n return this.#anim.tag\n }\n\n set tag(tag: T) {\n if (tag === this.#anim.tag) return\n this.#anim = this.#atlas[tag]\n const {hitbox} = this.#anim\n this.hitbox.x = this.x + (this.flipX ? hitbox.w - hitbox.x : hitbox.x)\n this.hitbox.y = this.y + (this.flipY ? hitbox.h - hitbox.y : hitbox.y)\n this.hitbox.w = this.#anim.hitbox.w\n this.hitbox.h = this.#anim.hitbox.h\n this.w = this.#anim.w\n this.h = this.#anim.h\n this._iffzz = (this._iffzz & 0xfffe0003f) | (this.#anim.id << 6)\n }\n\n toString(): string {\n return `${this.tag} (${this.x}, ${this.y}) ${this.w}\u00D7${this.h}`\n }\n\n get w(): number {\n return (this._wh >> 12) & 0xfff\n }\n\n set w(w: number) {\n this._wh = (this._wh & 0xff000fff) | ((w & 0xfff) << 12)\n }\n\n get x(): number {\n return (this._xy >> 16) / 8\n }\n\n set x(x: number) {\n const diff = x - this.x\n this._xy = (this._xy & 0x0000ffff) | (((8 * x) & 0xffff) << 16)\n this.hitbox.x += diff\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 return ((this._xy << 16) >> 16) / 8\n }\n\n set y(y: number) {\n const diff = y - this.y\n this._xy = (this._xy & 0xffff0000) | ((8 * y) & 0xffff)\n this.hitbox.y += diff\n }\n\n get z(): number {\n return this._iffzz & 7\n }\n\n /** Greater is further. */\n set z(z: number) {\n this._iffzz = (this._iffzz & 0xfffffff8) | (z & 0x7)\n }\n\n get zend(): boolean {\n return !!(this._iffzz & 0x8)\n }\n\n set zend(end: boolean) {\n if (end) this._iffzz |= 0x8\n else this._iffzz &= 0xfffffff7\n }\n}\n", "export class JSONStorage {\n get<T>(key: string): T | undefined {\n const val = localStorage.getItem(key)\n return val == null ? undefined : JSON.parse(val)\n }\n\n put<T>(key: string, val: T): void {\n if (val == null) localStorage.removeItem(key)\n else localStorage.setItem(key, JSON.stringify(val))\n }\n}\n", "import type {Font} from 'mem-font'\nimport type {AnimTag} from '../atlas/anim.js'\n\nexport function fontCharToTag(self: Font, char: string): AnimTag {\n let pt = char.codePointAt(0)\n if (pt == null || pt > 0xff) pt = 63 // ?\n return `${self.id}--${pt.toString(16).padStart(2, '0')}`\n}\n\n/** @arg rhs Undefined means end of line. */\nexport function fontKerning(\n self: Font,\n lhs: string,\n rhs: string | undefined\n): number {\n if (rhs == null) return self.endOfLineKerning\n if (/^\\s*$/.test(lhs) || /^\\s*$/.test(rhs)) return self.whitespaceKerning\n return self.kerning[lhs + rhs] ?? self.defaultKerning\n}\n\nexport function fontCharWidth(self: Font, letter: string): number {\n return self.charWidth[letter] ?? self.defaultCharWidth\n}\n", "import type {Font} from 'mem-font'\nimport type {Box, XY} from '../types/2d.js'\nimport {fontCharWidth, fontKerning} from './font.js'\n\nexport type TextLayout = {\n /** The length of this array matches the string length. */\n readonly chars: (Readonly<Box> | undefined)[]\n /** The offset in pixels. to-do: should this be passed in? */\n readonly cursor: Readonly<XY>\n}\n\nexport function layoutText(font: Font, str: string, maxW: number): TextLayout {\n const chars = []\n let cursor = {x: 0, y: 0}\n while (chars.length < str.length) {\n const i = chars.length\n const char = str[i]!\n let layout\n if (char === '\\n') layout = layoutNewline(font, cursor)\n else if (/^\\s*$/.test(char)) {\n layout = layoutSpace(font, cursor, maxW, tracking(font, char, str[i + 1]))\n } else {\n layout = layoutWord(font, cursor, maxW, str, i)\n if (cursor.x > 0 && layout.cursor.y === nextLine(font, cursor.y).y) {\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(font, cursor.y)\n layout = layoutWord(font, cursor, maxW, str, i)\n }\n }\n }\n chars.push(...layout.chars)\n cursor.x = layout.cursor.x\n cursor.y = layout.cursor.y\n }\n return {chars, cursor}\n}\n\n/** @internal */\nexport function layoutWord(\n font: Font,\n cursor: Readonly<XY>,\n maxW: number,\n word: string,\n index: number\n): TextLayout {\n const chars = []\n let {x, y} = cursor\n for (;;) {\n const char = word[index]\n if (!char || /^\\s*$/.test(char)) break\n\n const span = tracking(font, char, word[index + 1])\n if (x > 0 && x + span > maxW) ({x, y} = nextLine(font, y))\n\n // Width is not span since, with kerning, that may exceed the actual\n // width of the character's sprite. For example, if w has the maximal\n // character width of five pixels and a one pixel kerning for a given pair\n // of characters, it will have a span of six pixels which is greater than\n // the maximal five pixel sprite that can be rendered.\n chars.push({x, y, w: fontCharWidth(font, char), h: font.cellHeight})\n x += span\n\n index++\n }\n return {chars, cursor: {x, y}}\n}\n\nfunction nextLine(font: Font, y: number): XY {\n return {x: 0, y: y + font.lineHeight}\n}\n\nfunction layoutNewline(font: Font, cursor: Readonly<XY>): TextLayout {\n return {chars: [undefined], cursor: nextLine(font, cursor.y)}\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: Font,\n cursor: Readonly<XY>,\n width: number,\n span: number\n): TextLayout {\n const nextCursor =\n cursor.x > 0 && cursor.x + span >= width\n ? nextLine(font, cursor.y)\n : {x: cursor.x + span, y: cursor.y}\n return {chars: [undefined], cursor: nextCursor}\n}\n\n/** Returns the distance in pixels from the start of lhs to the start of rhs. */\nfunction tracking(font: Font, lhs: string, rhs: string | undefined): number {\n return fontCharWidth(font, lhs) + fontKerning(font, lhs, rhs)\n}\n", "// \u2500\u2500\u2500oidoid>\u00B0\u2500\u2500\nimport type {Anim, AnimTag} from './atlas/anim.js'\nimport type {Atlas} from './atlas/atlas.js'\nimport {Synth} from './audio/synth.js'\nimport {BitmapBuffer, type Bitmap} from './graphics/bitmap.js'\nimport {Cam} from './graphics/cam.js'\nimport {FrameListener} from './graphics/frame-listener.js'\nimport {Renderer} from './graphics/renderer.js'\nimport {Input, type StandardButton} from './input/input.js'\nimport {Sprite} from './sprite/sprite.js'\nimport {JSONStorage} from './storage/json-storage.js'\n\nexport type {Font} from 'mem-font'\nexport type {SpriteJSON} from './sprite/sprite.js'\nexport {fontCharToTag} from './text/font.js'\nexport {layoutText, type TextLayout} from './text/text-layout.js'\nexport type {Box, WH, XY} from './types/2d.js'\nexport {Sprite}\nexport type {Anim, AnimTag, Atlas}\n\ndeclare const atlas: Atlas\ndeclare const atlasURI: string\n\nexport class Void<\n Tag extends AnimTag = AnimTag,\n Button extends string = StandardButton\n> {\n static async new<\n Tag extends AnimTag = AnimTag,\n Button extends string = StandardButton\n >(): Promise<Void<Tag, Button>> {\n return new Void(await loadImage(atlasURI))\n }\n\n readonly atlas: Atlas<Tag> = <Atlas<Tag>>atlas\n readonly cam: Cam = new Cam()\n readonly ctrl: Input<Button>\n readonly kv = new JSONStorage()\n readonly synth = new Synth()\n\n readonly #bitmaps: BitmapBuffer = new BitmapBuffer(1_000_000)\n readonly #framer: FrameListener\n readonly #renderer: Renderer\n\n constructor(spritesheet: HTMLImageElement) {\n const meta = document.createElement('meta')\n meta.name = 'viewport'\n // Don't wait for double-tap scaling on mobile.\n meta.content = 'maximum-scale=1, minimum-scale=1, user-scalable=no'\n document.head.appendChild(meta)\n\n document.body.style.margin = '0'\n document.body.style.width = '100vw'\n document.body.style.height = '100vh'\n document.body.style.overflow = 'hidden'\n\n const canvas = document.createElement('canvas')\n canvas.style.cursor = 'none'\n canvas.style.display = 'block' // No line height spacing.\n canvas.style.imageRendering = 'pixelated'\n // Update on each pointermove *touch* Event like *mouse* Events.\n canvas.style.touchAction = 'none'\n document.body.append(canvas)\n\n this.ctrl = new Input(this.cam, canvas)\n this.#renderer = new Renderer(atlas, canvas, spritesheet)\n this.#framer = new FrameListener(canvas, this.ctrl, this.#renderer)\n this.#framer.register('add')\n this.background = 0x000000ff\n }\n\n set background(rgba: number) {\n document.body.style.background = `#${rgba.toString(16).padStart(8, '0')}`\n this.#renderer.clearColor(rgba)\n }\n\n blit(bmp: Readonly<Bitmap>): void {\n this.#bitmaps.push(bmp)\n }\n\n get frame(): number {\n return this.#framer.frame\n }\n\n render(loop?: () => void): void {\n this.cam.resize()\n this.#framer.render(this.cam, this.#bitmaps, loop)\n this.#bitmaps.size = 0\n }\n\n sprite(tag: Tag): Sprite<Tag> {\n return new Sprite<Tag>(this.atlas, tag)\n }\n\n stop(): void {\n this.#framer.cancel()\n this.#framer.register('remove')\n this.ctrl.register('remove')\n }\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => resolve(img)\n img.onerror = () => reject(img)\n img.src = src\n })\n}\n"],
5
- "mappings": "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",
6
- "names": ["Synth", "#context", "type", "startHz", "endHz", "duration", "now", "end", "oscillator", "gain", "BitmapBuffer", "capacity", "bmp", "Cam", "#clientWH", "#scale", "#w", "#h", "zoomOut", "nativeW", "nativeH", "clientXY", "GamepadPoller", "#bits", "#bitByAxis", "#bitByButton", "axis", "lessBit", "moreBit", "button", "bit", "pad", "index", "bits", "KeyboardPoller", "#bits", "#bitByKey", "key", "bit", "op", "fn", "type", "callback", "#onKey", "ev", "on", "PointerPoller", "#bitByButton", "#bits", "#cam", "#canvas", "#clientXY", "#type", "#xy", "cam", "canvas", "button", "bit", "op", "fn", "type", "#onPointEvent", "#onContextMenuEvent", "ev", "#evButtonsToBits", "buttons", "bits", "Input", "#duration", "#prevBits", "#combo", "#bitByButton", "#gamepad", "GamepadPoller", "#keyboard", "KeyboardPoller", "#pointer", "#pollBits", "#pollTick", "cam", "canvas", "PointerPoller", "combo", "i", "buttons", "bits", "#buttonsToBits", "#bits", "button", "less", "more", "axes", "axis", "#map", "indices", "index", "clicks", "click", "keys", "key", "tick", "op", "fragGLSL", "vertGLSL", "uv", "Renderer", "#bmpBuffer", "#canvas", "#cels", "#gl", "#loseContext", "#spritesheet", "#uniforms", "#vertArray", "atlas", "canvas", "spritesheet", "newCels", "rgba", "gl", "pgm", "loadProgram", "vertGLSL", "fragGLSL", "getUniformLocations", "uvBuffer", "dataTex", "spritesheetTex", "cam", "frame", "bmps", "#resize", "nativeWH", "clientW", "clientH", "diffW", "diffH", "compileShader", "type", "src", "shader", "log", "len", "locations", "i", "uniform", "vert", "frag", "cels", "anim", "cel", "FrameListener", "#canvas", "#frame", "#loop", "#time", "#input", "#renderer", "canvas", "input", "renderer", "op", "fn", "type", "#onEvent", "cam", "buffer", "loop", "#isVisible", "#onFrame", "event", "time", "Sprite", "_Sprite", "atlas", "json", "sprite", "#anim", "#atlas", "tag", "cel", "flip", "diff", "h", "box", "hitbox", "w", "x", "xy", "y", "z", "end", "JSONStorage", "key", "val", "fontCharToTag", "self", "char", "pt", "fontKerning", "lhs", "rhs", "fontCharWidth", "letter", "layoutText", "font", "str", "maxW", "chars", "cursor", "i", "char", "layout", "layoutNewline", "layoutSpace", "tracking", "layoutWord", "nextLine", "word", "index", "x", "y", "span", "fontCharWidth", "width", "nextCursor", "lhs", "rhs", "fontKerning", "Void", "_Void", "loadImage", "Cam", "JSONStorage", "Synth", "#bitmaps", "BitmapBuffer", "#framer", "#renderer", "spritesheet", "meta", "canvas", "Input", "Renderer", "FrameListener", "rgba", "bmp", "loop", "tag", "Sprite", "src", "resolve", "reject", "img"]
7
- }
@@ -1,289 +0,0 @@
1
- {
2
- "inputs": {
3
- "src/audio/synth.ts": {
4
- "bytes": 766,
5
- "imports": [],
6
- "format": "esm"
7
- },
8
- "src/graphics/bitmap.ts": {
9
- "bytes": 560,
10
- "imports": [],
11
- "format": "esm"
12
- },
13
- "src/graphics/cam.ts": {
14
- "bytes": 1507,
15
- "imports": [],
16
- "format": "esm"
17
- },
18
- "src/input/gamepad-poller.ts": {
19
- "bytes": 1073,
20
- "imports": [],
21
- "format": "esm"
22
- },
23
- "src/input/keyboard-poller.ts": {
24
- "bytes": 883,
25
- "imports": [],
26
- "format": "esm"
27
- },
28
- "src/input/pointer-poller.ts": {
29
- "bytes": 2287,
30
- "imports": [
31
- {
32
- "path": "src/graphics/cam.ts",
33
- "kind": "import-statement",
34
- "original": "../graphics/cam.js"
35
- }
36
- ],
37
- "format": "esm"
38
- },
39
- "src/input/input.ts": {
40
- "bytes": 6534,
41
- "imports": [
42
- {
43
- "path": "src/graphics/cam.ts",
44
- "kind": "import-statement",
45
- "original": "../graphics/cam.js"
46
- },
47
- {
48
- "path": "src/input/gamepad-poller.ts",
49
- "kind": "import-statement",
50
- "original": "./gamepad-poller.js"
51
- },
52
- {
53
- "path": "src/input/keyboard-poller.ts",
54
- "kind": "import-statement",
55
- "original": "./keyboard-poller.js"
56
- },
57
- {
58
- "path": "src/input/pointer-poller.ts",
59
- "kind": "import-statement",
60
- "original": "./pointer-poller.js"
61
- }
62
- ],
63
- "format": "esm"
64
- },
65
- "src/atlas/anim.js": {
66
- "bytes": 424,
67
- "imports": [],
68
- "format": "esm"
69
- },
70
- "src/graphics/frag.glsl.ts": {
71
- "bytes": 375,
72
- "imports": [],
73
- "format": "esm"
74
- },
75
- "src/graphics/vert.glsl.ts": {
76
- "bytes": 1655,
77
- "imports": [],
78
- "format": "esm"
79
- },
80
- "src/graphics/renderer.ts": {
81
- "bytes": 7899,
82
- "imports": [
83
- {
84
- "path": "src/atlas/anim.js",
85
- "kind": "import-statement",
86
- "original": "../atlas/anim.js"
87
- },
88
- {
89
- "path": "src/graphics/bitmap.ts",
90
- "kind": "import-statement",
91
- "original": "./bitmap.js"
92
- },
93
- {
94
- "path": "src/graphics/cam.ts",
95
- "kind": "import-statement",
96
- "original": "./cam.js"
97
- },
98
- {
99
- "path": "src/graphics/frag.glsl.ts",
100
- "kind": "import-statement",
101
- "original": "./frag.glsl.js"
102
- },
103
- {
104
- "path": "src/graphics/vert.glsl.ts",
105
- "kind": "import-statement",
106
- "original": "./vert.glsl.js"
107
- }
108
- ],
109
- "format": "esm"
110
- },
111
- "src/graphics/frame-listener.ts": {
112
- "bytes": 2530,
113
- "imports": [
114
- {
115
- "path": "src/input/input.ts",
116
- "kind": "import-statement",
117
- "original": "../input/input.js"
118
- },
119
- {
120
- "path": "src/graphics/bitmap.ts",
121
- "kind": "import-statement",
122
- "original": "./bitmap.js"
123
- },
124
- {
125
- "path": "src/graphics/cam.ts",
126
- "kind": "import-statement",
127
- "original": "./cam.js"
128
- },
129
- {
130
- "path": "src/graphics/renderer.ts",
131
- "kind": "import-statement",
132
- "original": "./renderer.js"
133
- }
134
- ],
135
- "format": "esm"
136
- },
137
- "src/sprite/sprite.ts": {
138
- "bytes": 4842,
139
- "imports": [],
140
- "format": "esm"
141
- },
142
- "src/storage/json-storage.ts": {
143
- "bytes": 316,
144
- "imports": [],
145
- "format": "esm"
146
- },
147
- "src/text/font.ts": {
148
- "bytes": 737,
149
- "imports": [],
150
- "format": "esm"
151
- },
152
- "src/text/text-layout.ts": {
153
- "bytes": 3127,
154
- "imports": [
155
- {
156
- "path": "src/text/font.ts",
157
- "kind": "import-statement",
158
- "original": "./font.js"
159
- }
160
- ],
161
- "format": "esm"
162
- },
163
- "src/index.ts": {
164
- "bytes": 3361,
165
- "imports": [
166
- {
167
- "path": "src/audio/synth.ts",
168
- "kind": "import-statement",
169
- "original": "./audio/synth.js"
170
- },
171
- {
172
- "path": "src/graphics/bitmap.ts",
173
- "kind": "import-statement",
174
- "original": "./graphics/bitmap.js"
175
- },
176
- {
177
- "path": "src/graphics/cam.ts",
178
- "kind": "import-statement",
179
- "original": "./graphics/cam.js"
180
- },
181
- {
182
- "path": "src/graphics/frame-listener.ts",
183
- "kind": "import-statement",
184
- "original": "./graphics/frame-listener.js"
185
- },
186
- {
187
- "path": "src/graphics/renderer.ts",
188
- "kind": "import-statement",
189
- "original": "./graphics/renderer.js"
190
- },
191
- {
192
- "path": "src/input/input.ts",
193
- "kind": "import-statement",
194
- "original": "./input/input.js"
195
- },
196
- {
197
- "path": "src/sprite/sprite.ts",
198
- "kind": "import-statement",
199
- "original": "./sprite/sprite.js"
200
- },
201
- {
202
- "path": "src/storage/json-storage.ts",
203
- "kind": "import-statement",
204
- "original": "./storage/json-storage.js"
205
- },
206
- {
207
- "path": "src/text/font.ts",
208
- "kind": "import-statement",
209
- "original": "./text/font.js"
210
- },
211
- {
212
- "path": "src/text/text-layout.ts",
213
- "kind": "import-statement",
214
- "original": "./text/text-layout.js"
215
- }
216
- ],
217
- "format": "esm"
218
- }
219
- },
220
- "outputs": {
221
- "dist/void.js.map": {
222
- "imports": [],
223
- "exports": [],
224
- "inputs": {},
225
- "bytes": 64251
226
- },
227
- "dist/void.js": {
228
- "imports": [],
229
- "exports": [
230
- "Sprite",
231
- "Void",
232
- "fontCharToTag",
233
- "layoutText"
234
- ],
235
- "entryPoint": "src/index.ts",
236
- "inputs": {
237
- "src/audio/synth.ts": {
238
- "bytesInOutput": 367
239
- },
240
- "src/graphics/bitmap.ts": {
241
- "bytesInOutput": 196
242
- },
243
- "src/graphics/cam.ts": {
244
- "bytesInOutput": 609
245
- },
246
- "src/input/gamepad-poller.ts": {
247
- "bytesInOutput": 437
248
- },
249
- "src/input/keyboard-poller.ts": {
250
- "bytesInOutput": 372
251
- },
252
- "src/input/pointer-poller.ts": {
253
- "bytesInOutput": 899
254
- },
255
- "src/input/input.ts": {
256
- "bytesInOutput": 2040
257
- },
258
- "src/graphics/frag.glsl.ts": {
259
- "bytesInOutput": 357
260
- },
261
- "src/graphics/vert.glsl.ts": {
262
- "bytesInOutput": 1637
263
- },
264
- "src/graphics/renderer.ts": {
265
- "bytesInOutput": 4131
266
- },
267
- "src/graphics/frame-listener.ts": {
268
- "bytesInOutput": 1090
269
- },
270
- "src/sprite/sprite.ts": {
271
- "bytesInOutput": 2370
272
- },
273
- "src/storage/json-storage.ts": {
274
- "bytesInOutput": 173
275
- },
276
- "src/text/font.ts": {
277
- "bytesInOutput": 311
278
- },
279
- "src/index.ts": {
280
- "bytesInOutput": 1202
281
- },
282
- "src/text/text-layout.ts": {
283
- "bytesInOutput": 784
284
- }
285
- },
286
- "bytes": 17074
287
- }
288
- }
289
- }
package/src/atlas/anim.js DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * @template {AnimTag} T
3
- * @typedef {object} Anim
4
- * @prop {readonly Readonly<import('../types/2d.js').XY>[]} cels
5
- * @prop {Readonly<import('../types/2d.js').Box>} hitbox
6
- * @prop {number} id A multiple of 16 (maxAnimCels).
7
- * @prop {number} w
8
- * @prop {number} h
9
- * @prop {T & AnimTag} tag
10
- */
11
-
12
- /**
13
- * `--tagname-format={title}--{tag}`.
14
- * @typedef {`${string}--${string}`} AnimTag
15
- */
16
-
17
- export const maxAnimCels = 16