@oidoid/void 0.1.8 → 0.1.10

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 (78) hide show
  1. package/dist/public/atlas.webp +0 -0
  2. package/dist/public/index.js +84 -21
  3. package/dist/public/index.js.map +4 -4
  4. package/dist/public/void-v0.1.10+20260107.d15e519.html +178 -0
  5. package/dist/schema/level-file.v0.json +74 -75
  6. package/dist/src/demo/assets/void.game.json +24 -21
  7. package/dist/src/demo/ents/cam.js +1 -1
  8. package/dist/src/demo/ents/cam.js.map +1 -1
  9. package/dist/src/demo/ents/ent.d.ts +3 -0
  10. package/dist/src/demo/ents/ent.d.ts.map +1 -1
  11. package/dist/src/demo/ents/render-toggle.d.ts.map +1 -1
  12. package/dist/src/demo/ents/render-toggle.js +19 -0
  13. package/dist/src/demo/ents/render-toggle.js.map +1 -1
  14. package/dist/src/demo/ents/rotate.d.ts +11 -0
  15. package/dist/src/demo/ents/rotate.d.ts.map +1 -0
  16. package/dist/src/demo/ents/rotate.js +9 -0
  17. package/dist/src/demo/ents/rotate.js.map +1 -0
  18. package/dist/src/demo/level/level-file.v0.json +74 -75
  19. package/dist/src/demo/level/level-parser.d.ts.map +1 -1
  20. package/dist/src/demo/level/level-parser.js +1 -0
  21. package/dist/src/demo/level/level-parser.js.map +1 -1
  22. package/dist/src/demo/level/level-schema.d.ts +3 -0
  23. package/dist/src/demo/level/level-schema.d.ts.map +1 -1
  24. package/dist/src/demo/level/loader.d.ts.map +1 -1
  25. package/dist/src/demo/level/loader.js +2 -0
  26. package/dist/src/demo/level/loader.js.map +1 -1
  27. package/dist/src/demo/level/schema.json +15 -0
  28. package/dist/src/demo/level/tags.json +3 -1
  29. package/dist/src/demo/types/decl.d.ts +4 -2
  30. package/dist/src/demo/types/decl.d.ts.map +1 -1
  31. package/dist/src/ents/button.d.ts.map +1 -1
  32. package/dist/src/ents/button.js +7 -6
  33. package/dist/src/ents/button.js.map +1 -1
  34. package/dist/src/ents/cursor.js +4 -4
  35. package/dist/src/ents/cursor.js.map +1 -1
  36. package/dist/src/ents/cursor.test.js +4 -4
  37. package/dist/src/ents/cursor.test.js.map +1 -1
  38. package/dist/src/graphics/sprite-frag.glsl.d.ts.map +1 -1
  39. package/dist/src/graphics/sprite-frag.glsl.js +34 -5
  40. package/dist/src/graphics/sprite-frag.glsl.js.map +1 -1
  41. package/dist/src/graphics/sprite-vert.glsl.d.ts.map +1 -1
  42. package/dist/src/graphics/sprite-vert.glsl.js +42 -8
  43. package/dist/src/graphics/sprite-vert.glsl.js.map +1 -1
  44. package/dist/src/graphics/sprite.d.ts +16 -7
  45. package/dist/src/graphics/sprite.d.ts.map +1 -1
  46. package/dist/src/graphics/sprite.js +42 -17
  47. package/dist/src/graphics/sprite.js.map +1 -1
  48. package/dist/src/graphics/sprite.test.js +60 -13
  49. package/dist/src/graphics/sprite.test.js.map +1 -1
  50. package/dist/src/input/input.js +10 -10
  51. package/dist/src/input/input.js.map +1 -1
  52. package/dist/src/level/level-parser.d.ts.map +1 -1
  53. package/dist/src/level/level-parser.js +8 -3
  54. package/dist/src/level/level-parser.js.map +1 -1
  55. package/dist/src/level/level-parser.test.js +6 -4
  56. package/dist/src/level/level-parser.test.js.map +1 -1
  57. package/dist/src/level/level-schema.d.ts +10 -8
  58. package/dist/src/level/level-schema.d.ts.map +1 -1
  59. package/dist/src/looper.d.ts.map +1 -1
  60. package/dist/src/looper.js +9 -2
  61. package/dist/src/looper.js.map +1 -1
  62. package/dist/src/types/geo.d.ts +2 -0
  63. package/dist/src/types/geo.d.ts.map +1 -1
  64. package/dist/src/types/geo.js +11 -0
  65. package/dist/src/types/geo.js.map +1 -1
  66. package/dist/src/types/geo.test.js +28 -1
  67. package/dist/src/types/geo.test.js.map +1 -1
  68. package/dist/src/utils/debug.d.ts +2 -0
  69. package/dist/src/utils/debug.d.ts.map +1 -1
  70. package/dist/src/utils/debug.js +5 -1
  71. package/dist/src/utils/debug.js.map +1 -1
  72. package/dist/src/utils/math.d.ts +1 -0
  73. package/dist/src/utils/math.d.ts.map +1 -1
  74. package/dist/src/utils/math.js +3 -0
  75. package/dist/src/utils/math.js.map +1 -1
  76. package/package.json +3 -3
  77. package/schema/level-file.v0.json +74 -75
  78. package/dist/public/void-v0.1.8+20260106.f2ce523.html +0 -115
@@ -0,0 +1,178 @@
1
+ <!doctype html>
2
+ <html lang="en"><head>
3
+ <meta charset="utf-8">
4
+ <title>void</title>
5
+ <link href="data:image/webp;base64,UklGRmYAAABXRUJQVlA4TFoAAAAvD8ADEA4HbRsJEqYD+jSfyMzuUohaKRIIJDRh7G8yh0AgUUp5uTn6PwEc/5/kIwBZf6VNA+lu1ZBea67ULpla6waQpPYGYn2ofbA+1G5H63JpH6whNzVArgE=" rel="icon" sizes="16x16" type="image/webp">
6
+ <link rel="manifest" href="data:application/json,%7B%22author%22%3A%22oidoid%22%2C%22background_color%22%3A%22%23e6e6e6%22%2C%22description%22%3A%22void%202D%20game%20library%20demo.%22%2C%22display%22%3A%22standalone%22%2C%22homepage_url%22%3A%22https%3A%2F%2Foidoid.com%2F%22%2C%22icons%22%3A%5B%7B%22src%22%3A%22data%3Aimage%2Fwebp%3Bbase64%2CUklGRmYAAABXRUJQVlA4TFoAAAAvD8ADEA4HbRsJEqYD%2BjSfyMzuUohaKRIIJDRh7G8yh0AgUUp5uTn6PwEc%2F5%2FkIwBZf6VNA%2Blu1ZBea67ULpla6waQpPYGYn2ofbA%2B1G5H63JpH6whNzVArgE%3D%22%2C%22sizes%22%3A%2216x16%22%2C%22type%22%3A%22image%2Fwebp%22%7D%2C%7B%22src%22%3A%22data%3Aimage%2Fwebp%3Bbase64%2CUklGRoIAAABXRUJQVlA4THYAAAAvH8AHEA4HbSNJEqYFejSPyHy7PQRaFSkSCCQ0YexvModAIFFKebk5%2Bj8Bffz%2F5QNJv%2FpOtn81hQSSGgmHCk5rJLyumtziFCplUxUUtFYvMwWFO8ZEQW8ChZsU9CZQqHWqoJXeVLhJQSt0J%2B%2BAJt0VuvN6L78B%22%2C%22sizes%22%3A%2232x32%22%2C%22type%22%3A%22image%2Fwebp%22%7D%2C%7B%22src%22%3A%22data%3Aimage%2Fwebp%3Bbase64%2CUklGRowAAABXRUJQVlA4TIAAAAAvL8ALEFUwbttGUk1T6LY5hVya04N9OoBAIMmfZrgBBAJJEPur3n9Gbts4km6asn0f4WkzaPqITIQbVYgJv%2BotBYIK9TTmbAucsARd2SKEB8APVI7JV4sfqBZLHxcEXYZLIb8Bznfy75bNyVmLpb8T5GcAWQLbGwIXCWzHFm0rYA%3D%3D%22%2C%22sizes%22%3A%2248x48%22%2C%22type%22%3A%22image%2Fwebp%22%7D%2C%7B%22src%22%3A%22data%3Aimage%2Fwebp%3Bbase64%2CUklGRnYAAABXRUJQVlA4TGkAAAAvP8APEB8gECD8WdCvSSBAyHDjf0SHQIDQ58a0jvkPwN%2BUgYM2khypSTbJIlmXPjaBiP5PQF62Lc2b%2F9RHldKF8izqQnlbO6Uy0rsiriRJW2QpqTiGjIljyMpLceRNGRMH0newGUjfzgAA%22%2C%22sizes%22%3A%2264x64%22%2C%22type%22%3A%22image%2Fwebp%22%7D%2C%7B%22src%22%3A%22data%3Aimage%2Fwebp%3Bbase64%2CUklGRp4AAABXRUJQVlA4TJEAAAAvv8AvEB8gECD8WdCvSSBAyHDjf0SHQIDQ58a0jvkPwN%2BUAZNIkiSNyTJZJovcz25QRP8nYB7nsgrMy38fD3auAiqwFQCfrdTOtwLgJzvkcFt0rq4H7naoVmq1IeYy52qlbotjoFKrtaFW6tqo1GptqJW6IR6u1Go9vFqpa6NSq5UwM8BbagXM4T6YGT45lzcBAA%3D%3D%22%2C%22sizes%22%3A%22192x192%22%2C%22type%22%3A%22image%2Fwebp%22%7D%5D%2C%22manifest_version%22%3A3%2C%22name%22%3A%22void%22%2C%22orientation%22%3A%22any%22%2C%22short_name%22%3A%22void%22%2C%22start_url%22%3A%22https%3A%2F%2Foidoid.com%2F%22%2C%22theme_color%22%3A%22%23e6e6e6%22%2C%22version%22%3A%220.1.10%22%7D">
7
+ </head>
8
+ <body style="background-color: #e6e6e6">
9
+ <img alt="" id="atlas" style="display: none" src="data:image/webp;base64,UklGRmwEAABXRUJQVlA4TF8EAAAvXwAUELVQjgBJkqTMb9+rwmowAmBIOH/kwBAGATA0uL5UhXt4Zpfxjk/YBGdw30QpiWyrOu6FIwcF6EAQGtwaeBySAr9rmVEV2za17yPCCaeKDuJo4VMeziH+IUiSGrFZJHxEDuwicPKFZ/uyhWcv0o4lO7JsIZVFa38vrO5+tn8KO6gSH80+MVcAUfirfSb1bP8SNs1xB9wtLK+Kx4FXXG/iPexqOH/Yr7jeVr63/7p3QNndLkhWz/bTv8J6kd6nXQM0idOZdSDvO3fA2bh0GGeXdQ/DsjP9OnXf9SLdAG13r7nuV/axh2HJdRDExAaIu3vFBWLOKXY1mA3L5rYB6u4W58bhLMjcuxqs2zz3yNaXt1Ev+NgFQHi4em2ce/rudnj4euHcezyQh6/XxrkHW1/AQ9AL3AWAPAS9ouu+azbA7oWFPAS9YvKweDCoE/SKyNgDs5cWzH9XL5h7VwC9TxAlJgzOrGYL1gwQGaDXED5wH68B4JHmVQQ5MRPXcEYrG2CC8InpT9b52WdfAqT/+tQL+GzFJlP0intX3z2OT/RkTsfy/wXrcOvA+ERXZkHMPbLz9xGKXsgHo1DeMUN1lt7v/t4JEBN+HZCPma9VOairG0DkkRiA5SPUAfg0zCfk7UPicd8ziQEwH6EOdO5lOHrenKfC476zewYDYD6Uj9GL8YmOEO4BCSDwKIMwAXKAJ6kv+d5kfKpMCjG8biSAxiOR58xgPrwO6fAJzOHUU3CcR4LLTuCZ1s1YnaDOHp9w/u7AuiFPziNzbIKTttMSozg69ZmD25+opxPlJMJ5ZJIATiKTSXSyWgn9yfXMjObfH1WgC+Ed0RRt3BM8vLWqCL+fiJ5egDbA3xQ0AZsBqYMB/uyA30/0DlQJGneT7xbnslSxBJ5gHahA+P1EGVcFpuAkEBXMgITl8QTi4z7/hI8A6BcWgJCBXN1lVKHnCIz/x4C8KONOuYYEKMohBCsuFNMf4Zp1nZkkwH44jqbBHmKwbSzIKl+HxReHEbjCpF2JA9Y9YVXYYyrMe3jXjSjqOTBfxSgqqAboobaN45RSrSw9SkHSIGQL0IH2fuMEXggHpd2cCHo3Viv3ruzfRpWBfD4cwDHPrdwFgzjxPNZBoeh5RfOFt8PXF/BBHn9H7Libq0ktoYT5JnOQO99xZaFkX1WO4HqH0LlErwZmxaroVtIvcoV4zvtkLZRLGlP83Aokp1zHKid7Wgg4vvQdUNKYdbmGook6SWv1JtPmpjVwEgq8TE5Ba218+nOJXkX1LhT/tpTgZuXQwGKRs9yhCD5qQXlynn9oRWXC1ccGp36hutegispBUvB/WOLb3AkgKpQ2h2rfwFvJDx2+YGmV16XuOb8HKqqWqiiNyuJZCfOknAxABsEJuQggx5laHjCZEoe8QIEo47tac0x64be7PacPunKEKkdQnpbaJtQ91lBayZWg6IfpjkdzJE5QFDrw14u4pSn/GGz72/VKprqvdQsA">
10
+ <script type="module" async="">var s={hash:"d15e519",published:"20260107",version:"0.1.10"};var ve={id:"mem-prop-5x6",name:"mem 5x6",cellW:5,cellH:6,leading:1,lineH:7,baseline:1,kerning:{" ":0," 0":0," 1":0," 2":0," 3":0," 4":0," 5":0," 6":0," 7":0," 8":0," 9":0,"##":-1,"#_":0,"',":0,"'.":0,"'/":0,"'J":0,"'S":0,"'_":0,"'j":0,"'s":0,"(+":0,"(-":0,"(<":0,"(f":0,"({":0,"(~":0,")_":0,"*,":0,"*.":0,"*/":0,"*S":0,"*_":0,"*j":0,"*s":0,"+)":0,"+,":0,"+.":0,"+/":0,"+>":0,"+?":0,"+I":0,"+S":0,"+T":0,"+Z":0,"+]":0,"+_":0,"+`":0,"+j":0,"+s":0,"+}":0,",'":0,",*":0,",+":0,",-":0,",<":0,",?":0,",T":0,",Y":0,",Z":0,',"':0,",\\":0,",^":0,",`":0,",f":0,",t":0,",z":0,",{":0,",~":0,"-)":0,"-,":0,"--":0,"-.":0,"-/":0,"->":0,"-?":0,"-I":0,"-S":0,"-T":0,"-Z":0,"-]":0,"-_":0,"-`":0,"-j":0,"-s":0,"-}":0,".'":0,".*":0,".+":0,".-":0,".<":0,".?":0,".T":0,".Y":0,".Z":0,'."':0,".\\":0,".^":0,".`":0,".f":0,".t":0,".z":0,".{":0,".~":0,"/,":0,"/.":0,"//":0,"/J":0,"/S":0,"/_":0,"/j":0,"/s":0,"0 ":0,"1 ":0,"1T":0,"1Y":0,"1Z":0,"1f":0,"1t":0,"1z":0,"2 ":0,"3 ":0,"4 ":0,"5 ":0,"6 ":0,"7 ":0,"8 ":0,"9 ":0,":?":0,":T":0,":Z":0,":`":0,";?":0,";T":0,";Z":0,"<+":0,"<-":0,"<<":0,"<f":0,"<{":0,"<~":0,"==":0,"=_":0,">)":0,">,":0,">.":0,">/":0,">>":0,">?":0,">I":0,">S":0,">T":0,">Z":0,">]":0,">_":0,">`":0,">j":0,">s":0,">}":0,"?,":0,"?.":0,"?/":0,"?S":0,"?_":0,"?j":0,"?s":0,"@_":0,"C+":0,"C-":0,"C<":0,Cf:0,"C{":0,"C~":0,D_:0,"E+":0,"E-":0,"E<":0,Ef:0,"E{":0,"E~":0,"F&":0,"F+":0,"F,":0,"F-":0,"F.":0,"F/":0,"F:":0,"F;":0,"F<":0,FJ:0,FS:0,F_:0,Fa:0,Fe:0,Ff:0,Fg:0,Fj:0,Fq:0,Fs:0,"F{":0,"F~":0,"I+":0,"I-":0,"I<":0,If:0,"I{":0,"I~":0,"L'":0,"L*":0,"L+":0,"L-":0,L4:0,L7:0,"L<":0,"L?":0,LT:0,LY:0,LZ:0,'L"':0,"L\\":0,"L^":0,"L`":0,Lf:0,Lt:0,Lz:0,"L{":0,"L~":0,"P,":0,"P.":0,"P/":0,PS:0,P_:0,Pj:0,Ps:0,"S&":0,"S+":0,"S,":0,"S-":0,"S.":0,"S/":0,"S:":0,"S;":0,"S<":0,SJ:0,SS:0,S_:0,Sa:0,Se:0,Sf:0,Sg:0,Sj:0,Sq:0,Ss:0,"S{":0,"S~":0,"T&":0,"T+":0,"T,":0,"T-":0,"T.":0,"T/":0,"T:":0,"T;":0,"T<":0,TJ:0,TS:0,T_:0,Ta:0,Te:0,Tf:0,Tg:0,Tj:0,Tq:0,Ts:0,"T{":0,"T~":0,V_:0,"Y,":0,"Y.":0,"Y/":0,YS:0,Y_:0,Yj:0,Ys:0,"Z'":0,"Z*":0,"Z+":0,"Z-":0,Z4:0,Z7:0,"Z<":0,"Z?":0,ZT:0,ZY:0,ZZ:0,'Z"':0,"Z\\":0,"Z^":0,"Z`":0,Zf:0,Zt:0,Zz:0,"Z{":0,"Z~":0,"[+":0,"[-":0,"[<":0,"[f":0,"[{":0,"[~":0,'",':0,'".':0,'"/':0,'"J':0,'"S':0,'"_':0,'"j':0,'"s':0,"\\'":0,"\\*":0,"\\+":0,"\\-":0,"\\<":0,"\\?":0,"\\T":0,"\\Y":0,"\\Z":0,'\\"':0,"\\\\":0,"\\^":0,"\\`":0,"\\f":0,"\\t":0,"\\z":0,"\\{":0,"\\~":0,"^,":0,"^.":0,"^/":0,"^J":0,"^S":0,"^_":0,"^j":0,"^s":0,"_#":0,"_%":0,"_'":0,"_(":0,"_*":0,"_+":0,"_-":0,"_<":0,"_=":0,"_?":0,"_@":0,_T:0,_V:0,_Y:0,_Z:0,'_"':0,"_\\":0,"_^":0,__:0,"_`":0,_a:0,_e:0,_f:0,_t:0,_v:0,_z:0,"_{":0,"_~":0,"`,":0,"`.":0,"`/":0,"`J":0,"`S":0,"`_":0,"`j":0,"`s":0,"f,":0,"f.":0,"f/":0,fS:0,f_:0,fj:0,fs:0,"q#":0,q$:0,"q%":0,"q&":0,"q'":0,"q(":0,"q*":0,"q+":0,"q-":0,q0:0,q1:0,q2:0,q3:0,q4:0,q5:0,q6:0,q7:0,q8:0,q9:0,"q<":0,"q=":0,"q?":0,"q@":0,qA:0,qB:0,qC:0,qD:0,qE:0,qF:0,qG:0,qH:0,qI:0,qJ:0,qK:0,qL:0,qM:0,qN:0,qO:0,qP:0,qQ:0,qR:0,qS:0,qT:0,qU:0,qV:0,qW:0,qX:0,qY:0,qZ:0,"q[":0,'q"':0,"q\\":0,"q]":0,"q^":0,"q`":0,qa:0,qb:0,qc:0,qd:0,qe:0,qf:0,qh:0,qk:0,qm:0,qn:0,qo:0,qq:0,qr:0,qs:0,qt:0,qu:0,qv:0,qw:0,qx:0,qz:0,"q{":0,"q}":0,"q~":0,"r,":0,"r.":0,"r/":0,rS:0,r_:0,rj:-1,rs:0,"s,":0,"s.":0,"s/":0,sJ:0,sS:0,s_:0,sj:0,ss:0,"z'":0,"z*":0,"z+":0,"z-":0,z4:0,z7:0,"z<":0,"z?":0,zT:0,zY:0,zZ:0,'z"':0,"z\\":0,"z^":0,"z`":0,zf:0,zt:0,zz:0,"z{":0,"z~":0,"{+":0,"{-":0,"{<":0,"{f":0,"{{":0,"{~":0,"})":0,"},":0,"}.":0,"}/":0,"}>":0,"}?":0,"}I":0,"}S":0,"}T":0,"}Z":0,"}]":0,"}_":0,"}`":0,"}j":0,"}s":0,"}}":0,"~'":0,"~?":0,"~T":0,"~Z":0,'~"':0,"~\\":0,"~^":0,"~_":0,"~`":0,"~t":0,"~z":0},defaultKerning:1,defaultWhitespaceKerning:-1,endOfLineKerning:0,charW:{" ":4,"!":1,"#":5,"&":4,"'":1,"(":2,")":2,",":1,".":1,":":1,";":1,"@":5,M:5,W:5,"[":2,"\n":0,"]":2,"`":2,i:1,l:1,m:5,q:4,w:5,"|":1},defaultCharW:3,descends:{$:!0,",":!0,"/":!0,";":!0,Q:!0,"\\":!0,_:!0,g:!0,j:!0,p:!0,q:!0,y:!0}};var E=ve;var P=class{query="button & sprite";free(e){st(e)}update(e,i){let{button:r}=e;if(r.started=!1,!e.invalid&&!i.input.invalid)return;e.invalid=!0;let n=r.type==="Toggle";r.pressed.x=e.sprite.x,r.pressed.y=e.sprite.y,r.pressed.w=e.sprite.w,r.pressed.h=e.sprite.h,r.selected.x=e.sprite.x,r.selected.y=e.sprite.y,r.selected.w=e.sprite.w,r.selected.h=e.sprite.h;let o=!!i.loader.cursor&&i.loader.cursor.sprite.hitsZ(e.sprite,i.cam),a=o&&i.input.isOnStart("A")?n?!T(e):!0:n?T(e):i.input.isOn("A")||!!i.loader.cursor?.cursor.keyboard&&i.input.isOn("A");r.started=T(e)!==a,r.pressed.hidden=!a,r.selected.hidden=!o,i.input.handled||=o}};function st(t){t.button.pressed.free(),t.button.selected.free(),t.invalid=!0}function Se(t,e){t.button.pressed.hidden=!e,t.invalid=!0}function T(t){return!t.button.pressed.hidden}var u={Bottom:0,A:1,B:2,C:3,D:4,E:5,F:6,G:7,UIA:8,UIB:9,UIC:10,UID:11,UIE:12,UIF:13,UIG:14,Top:15};function R(t){return t>=u.UIA}function Ee(t,e){t.x=e.x,t.y=e.y,t.w=e.w,t.h=e.h}function b(t,e){let i={w:e.w??1,h:e.h??1};if(!t.w||!t.h||!i.w||!i.h)return!1;let r={x:t.x??0,y:t.y??0};return r.x<e.x+i.w&&r.x+t.w>e.x&&r.y<e.y+i.h&&r.y+t.h>e.y}function Te(t,e){let i=Math.max(t.x,e.x),r=Math.max(t.y,e.y);return{x:i,y:r,w:Math.min(t.x+t.w,e.x+e.w)-i,h:Math.min(t.y+t.h,e.y+e.h)-r}}function Re(t,e){return t.w===e.w&&t.h===e.h}function Ce(t,e){return{x:t.x+e.x,y:t.y+e.y}}function Pe(t,e){return at(pe(t,e))}function at(t){return Math.hypot(t.x,t.y)}function Be(t,e){return{x:Math.max(t.x,e.x),y:Math.max(t.y,e.y)}}function Le(t,e){return{x:Math.min(t.x,e.x),y:Math.min(t.y,e.y)}}function pe(t,e){return{x:t.x-e.x,y:t.y-e.y}}function Ae(t,e){return(t%e+e)%e}var x=16,ce=1/64,He={w:4095,h:4095},ue=class{i;#e;constructor(e,i){this.#e=e,this.i=i}above(e){return(this.z===e.z?(this.zend?this.y+this.h:this.y)-(e.zend?e.y+e.h:e.y):this.z-e.z)>0}get angle(){return(this.#e.view.getUint16(this.i+13,!0)&4095)*360/4096}set angle(e){let i=this.#e.view.getUint16(this.i+13,!0),r=Math.round(e*4096/360)&4095;this.#e.view.setUint16(this.i+13,i&-4096|r,!0)}get cel(){return this.#e.view.getUint8(this.i+10)&31}set cel(e){let i=this.#e.view.getUint8(this.i+10);this.#e.view.setUint8(this.i+10,i&-32|e&31)}get clipbox(){return{x:this.x,y:this.y,w:this.w,h:this.h}}clips(e){return b(this,e)}clipsZ(e,i){if(this.ui===e.ui)return this.clips(e);let r={x:e.x+(e.ui?1:-1)*Math.floor(i.x),y:e.y+(e.ui?1:-1)*Math.floor(i.y),w:e.w,h:e.h};return b(this,r)}get flipX(){return!!(this.#e.view.getUint8(this.i+6)&64)}set flipX(e){let i=this.#e.view.getUint8(this.i+6);this.#e.view.setUint8(this.i+6,i&-65|-e&64)}get flipY(){return!!(this.#e.view.getUint8(this.i+6)&32)}set flipY(e){let i=this.#e.view.getUint8(this.i+6);this.#e.view.setUint8(this.i+6,i&-33|-e&32)}free(){this.#e.free(this)}get h(){return this.#e.view.getUint16(this.i+8,!0)>>>4}set h(e){let i=this.#e.view.getUint16(this.i+8,!0);this.#e.view.setUint16(this.i+8,i&-65521|(e&4095)<<4,!0)}get hidden(){return(this.#e.view.getUint8(this.i+12)&1)===1}set hidden(e){let i=this.#e.view.getUint8(this.i+12);this.#e.view.setUint8(this.i+12,i&-2|(e?1:0))}get id(){return this.#e.view.getUint16(this.i+10,!0)>>>5&2047}set id(e){let i=this.#e.view.getUint16(this.i+10,!0);this.#e.view.setUint16(this.i+10,i&-65505|(e&2047)<<5,!0)}init(){this.angle=0,this.cel=0,this.flipX=!1,this.flipY=!1,this.h=0,this.id=0,this.stretch=!1,this.hidden=!1,this.w=0,this.x=0,this.y=0,this.z=u.Bottom,this.zend=!1}get stretch(){return!!(this.#e.view.getUint8(this.i+6)&128)}set stretch(e){let i=this.#e.view.getUint8(this.i+6);this.#e.view.setUint8(this.i+6,i&-129|-e&128)}get ui(){return R(this.z)}get w(){return this.#e.view.getUint16(this.i+7,!0)&4095}set w(e){let i=this.#e.view.getUint16(this.i+7,!0);this.#e.view.setUint16(this.i+7,i&-4096|e&4095,!0)}get x(){return(this.#e.view.getUint32(this.i+0,!0)<<8>>8)/64}set x(e){let i=this.#e.view.getUint32(this.i+0,!0);this.#e.view.setUint32(this.i+0,i&-16777216|e*64&16777215,!0)}get y(){return(this.#e.view.getUint32(this.i+3,!0)<<8>>8)/64}set y(e){let i=this.#e.view.getUint32(this.i+3,!0);this.#e.view.setUint32(this.i+3,i&-16777216|e*64&16777215,!0)}get z(){return this.#e.view.getUint8(this.i+6)&15}set z(e){let i=this.#e.view.getUint8(this.i+6);this.#e.view.setUint8(this.i+6,i&-16|e&15)}get zend(){return!!(this.#e.view.getUint8(this.i+6)&16)}set zend(e){let i=this.#e.view.getUint8(this.i+6);this.#e.view.setUint8(this.i+6,i&-17|-e&16)}},B=class t extends ue{#e;#t;#i;#r;constructor(e,i,r,n){super(e,i),this.#e=r,this.#r=n}get anim(){return this.#e.anim[this.tag]}diagonalize(e){me(this,e.x*e.y)}get flipX(){return super.flipX}set flipX(e){this.flipX!==e&&(super.flipX=e,this.#t=void 0,this.#i=void 0)}get flipY(){return super.flipY}set flipY(e){this.flipY!==e&&(super.flipY=e,this.#t=void 0,this.#i=void 0)}get h(){return super.h}set h(e){this.h!==e&&(super.h=e,this.#t=void 0,this.#i=void 0)}hit(e){return Te(this.hitbox??this,e instanceof t?e.hurtbox??e:e)}get hitbox(){if(this.#t)return this.#t;let{hitbox:e}=this.anim;if(e)return this.#t??={x:Math.floor(this.x+(this.flipX?this.w-e.w-e.x:e.x)),y:Math.floor(this.y+(this.flipY?this.h-e.h-e.y:e.y)),w:e.w,h:e.h}}hits(e){let i=e instanceof t?e.hurtbox??e:e;return b(this.hitbox??this,i)}hitsZ(e,i){if(this.ui===e.ui)return this.hits(e);let r=e.hurtbox?{...e.hurtbox}:e.clipbox;return r.x+=(e.ui?1:-1)*Math.floor(i.x),r.y+=(e.ui?1:-1)*Math.floor(i.y),b(this.hitbox??this,r)}get hurtbox(){if(this.#i)return this.#i;let{hurtbox:e}=this.anim;if(e)return this.#i??={x:Math.floor(this.x+(this.flipX?this.w-e.w-e.x:e.x)),y:Math.floor(this.y+(this.flipY?this.h-e.h-e.y:e.y)),w:e.w,h:e.h}}get id(){return super.id}set id(e){this.id!==e&&(super.id=e,this.#t=void 0,this.#i=void 0)}get looped(){return Ae(this.looperCel-this.cel,32)>=this.anim.cels}get looperCel(){return this.#r.age/62.5%(this.anim.cels*2)}get midHit(){let e=this.hitbox??this;return{x:e.x+e.w/2,y:e.y+e.h/2}}get midHurt(){let e=this.hurtbox??this;return{x:e.x+e.w/2,y:e.y+e.h/2}}reset(){this.cel=this.looperCel}get tag(){return this.#e.tags[this.id]}set tag(e){let i=this.#e.anim[e];this.w=i.w,this.h=i.h,this.id=i.id,this.reset()}toString(){return`Sprite{${this.tag} (${this.x} ${this.y} ${this.z}) ${this.w}\xD7${this.h}}`}get w(){return super.w}set w(e){this.w!==e&&(super.w=e,this.#t=void 0,this.#i=void 0)}get x(){return super.x}set x(e){this.x!==e&&(super.x=e,this.#t=void 0,this.#i=void 0)}get y(){return super.y}set y(e){this.y!==e&&(super.y=e,this.#t=void 0,this.#i=void 0)}};function me(t,e){e&&(t.x=Math.floor(t.x)+.5,t.y=Math.floor(t.y)+.5-(e>0?0:ce))}function L(t){return Math.floor(t/ce)*ce}var A=class{query="cursor & sprite";update(e,i){if(i.input.point?.invalid&&dt(e,i.input.point),pt(e,i),e.cursor.keyboard&&(i.input.dir.x||i.input.dir.y||!i.input.point&&i.input.isAnyStarted("A"))&&lt(e,i.input,i.tick.s),e.cursor.pick){let r=i.input.isOn("A")?e.cursor.pick:e.cursor.point;r!==e.sprite.tag&&(e.sprite.tag=r,e.invalid=!0)}}};function lt(t,e,i){let r=L(t.cursor.keyboard*i);e.isAnyOnStart("U","D","L","R")&&e.dir.x&&e.dir.y&&t.sprite.diagonalize(e.dir),e.dir.x&&(t.sprite.x=Math.min(t.cursor.bounds.x+t.cursor.bounds.w,Math.max(t.cursor.bounds.x,t.sprite.x+e.dir.x*r))),e.dir.y&&(t.sprite.y=Math.min(t.cursor.bounds.y+t.cursor.bounds.h,Math.max(t.cursor.bounds.y,t.sprite.y+e.dir.y*r))),t.sprite.z=u.Top,t.sprite.hidden=!1,t.invalid=!0}function dt(t,e){t.sprite.x=e.local.x,t.sprite.y=e.local.y,t.sprite.z=u.Top,t.sprite.hidden=e.type!=="Mouse",t.invalid=!0}function pt(t,e){e.cam.invalid&&(t.cursor.bounds.x=-t.sprite.w,t.cursor.bounds.y=-t.sprite.h,t.cursor.bounds.w=e.cam.w+t.sprite.w,t.cursor.bounds.h=e.cam.h+t.sprite.h)}var l=ct(globalThis.location?.href);function fe(t){return[...new URL(t).searchParams].find(([e])=>e.toLowerCase()==="debug")?.[1]}function ct(t){if(!t)return;let e=fe(t);if(e==null)return;let i=Object.fromEntries(e.split(",").filter(Boolean).map(o=>o.split("="))),r={};for(let o in i)r[o.toLowerCase()]=i[o]||"true";let n={cam:"",input:"",looper:"",mem:"",render:""};return new Proxy(r,{get(o,a){if(typeof a!="string"||(a=a.toLowerCase(),o[a]))return o[a];if(!e||"all"in i||a in n&&"void"in i)return"true"}})}var H=class{query="debugInput";update(e,i){if(l?.input){if(i.input.started){let r=!!i.input.on.length;console.debug(r?`[input] buttons on: ${i.input.on.join(" ")}.`:"[input] buttons off.");let n=i.input.combo;n.length>1&&r&&console.debug(`[input] combo: ${n.map(o=>o.join("+")).join(" ")}.`)}i.input.point?.invalid&&i.input.point?.click&&!i.input.point.pinch&&console.debug(`[input] ${i.input.point.drag.on?"drag":"click"} xy: ${i.input.point.x} ${i.input.point.y}.`),i.input.point?.pinch&&console.debug(`[input] pinch xy: ${i.input.point.pinch.xy.x} ${i.input.point.pinch.xy.y}.`),i.input.wheel&&console.debug(`[input] wheel xy: ${i.input.wheel.delta.xy.x} ${i.input.wheel.delta.xy.y}.`)}}};function Me(t,e){let i=e.codePointAt(0);return(i==null||i>255)&&(i=63),`${t.id}--${i.toString(16).padStart(2,"0")}`}function ye(t,e){return t.cellH-(t.descends[e]?0:t.baseline)}function _e(t,e,i){return e===`
11
+ `||i==null||i===`
12
+ `?t.endOfLineKerning:t.kerning[e+i]!=null?t.kerning[e+i]:/^\s?$/.test(e)||/^\s?$/.test(i)?t.defaultWhitespaceKerning:t.defaultKerning}function xe(t,e){return t.charW[e]??t.defaultCharW}function We(t){let e=[],i=t.scale??1,r=t.start??{x:0,y:0},n=t.maxW??1/0,o={x:r.x,y:r.y},a=0,d=0;for(;e.length<t.text.length;){let c=e.length,h=t.text[c],p;h===`
13
+ `?p=ut(t.font,o,r.x,i,a):/^\s*$/.test(h)?p=ht(t.font,o,n,ke(t.font,h,t.text[c+1],i),r.x,i,d,h,a):(p=Ye(t.font,o,n,t.text,c,r.x,i,d,a),o.x>0&&p.cursor.y===w(t.font,r.x,o.y,i).y&&n-o.x+p.cursor.x<=n&&(o=w(t.font,r.x,o.y,i),p=Ye(t.font,o,n,t.text,c,r.x,i,d,a))),e.push(...p.chars),o.x=p.cursor.x,o.y=p.cursor.y,a=p.w,d=p.trimmedLineH}return{chars:e,cursor:o,w:a,h:w(t.font,o.x,o.y,i).y-r.y,trimmedH:o.y+d*i-r.y}}function Ye(t,e,i,r,n,o,a,d,c){let h=[],{x:p,y}=e;for(;;n++){let S=r[n];if(!S||/^\s*$/.test(S))break;let be=ye(t,S),ge=ke(t,S,r[n+1],a),we=p>o&&p+ge>o+i;we&&({x:p,y}=w(t,o,y,a)),d=we?be:Math.max(d,be),h.push({x:p,y,w:xe(t,S),h:t.cellH}),p+=ge,c=Math.max(c,p-o)}return{chars:h,cursor:{x:p,y},trimmedLineH:d,w:c}}function w(t,e,i,r){return{x:e,y:i+t.lineH*r}}function ut(t,e,i,r,n){let o=w(t,i,e.y,r);return{chars:[void 0],cursor:o,trimmedLineH:0,w:Math.max(n,e.x-i)}}function ht(t,e,i,r,n,o,a,d,c){let h=e.x>n&&e.x+r>=i?w(t,n,e.y,o):{x:e.x+r,y:e.y},p=ye(t,d);return{chars:[void 0],cursor:h,trimmedLineH:e.y===h.y?Math.max(a,p):p,w:Math.max(c,e.x-n)}}function ke(t,e,i,r){return r*(xe(t,e)+_e(t,e,i))}var M=class{query="sprite & text & textWH";update(e){e.invalid&&mt(e)}},_=class{query="sprite & text & textWH & textXY";free(e){for(let i of e.textXY.chars)i.free();e.textXY.chars.length=0,e.invalid=!0}update(e,i){e.invalid&&ft(e,i)}};function mt(t){let e=We({font:E,maxW:t.textWH.maxW,scale:t.textWH.scale,start:{x:0,y:0},text:t.text});t.textWH.layout=e;let i=e.w+t.textWH.pad.w+t.textWH.pad.e,r=(t.textWH.trim==="Leading"?e.h-E.leading*t.textWH.scale:t.textWH.trim==="Descender"?e.trimmedH:e.h)+t.textWH.pad.n+t.textWH.pad.s;t.ninePatch&&(i+=t.ninePatch.border.w+t.ninePatch.border.e+t.ninePatch.pad.w+t.ninePatch.pad.e,r+=t.ninePatch.border.n+t.ninePatch.border.s+t.ninePatch.pad.n+t.ninePatch.pad.s),t.sprite.w=i,t.sprite.h=r,t.invalid=!0}function ft(t,e){let i=0,r=t.textWH.layout;for(let[n,o]of r.chars.entries()){if(o==null)continue;let a=t.textXY.chars[i]??=e.alloc();a.x=t.sprite.x+o.x+t.textWH.pad.w+(t.ninePatch?t.ninePatch.border.w+t.ninePatch.pad.w:0),a.y=t.sprite.y+o.y+t.textWH.pad.n+(t.ninePatch?t.ninePatch.border.n+t.ninePatch.pad.n:0),a.z=t.textXY.z,a.tag=Me(E,t.text[n]),a.stretch=!0,a.w*=t.textWH.scale,a.h*=t.textWH.scale,i++}for(;t.textXY.chars.length>i;)t.textXY.chars.pop().free();t.invalid=!0}function v(t,e){e!==t.text&&(t.text=e,t.invalid=!0)}var Y=class{query="fps & text";update(e,i){let r=performance.now();r-e.fps.next.created>=1e3&&(e.fps.prevFrames=i.renderer.clears+1-e.fps.next.startClears,e.fps.next={created:r,startClears:i.renderer.clears+1}),v(e,e.fps.prevFrames.toString().padStart(3," "))}};var W=class{query="hud & sprite";update(e,i){if(!e.invalid&&!i.cam.invalid)return;let r=i.cam.follow(e.sprite,e.sprite.z,e.hud.origin,e.hud);Ee(e.sprite,r),e.invalid=!0}};var k=class{query="ninePatch & sprite";free(e){yt(e)}update(e){if(!e.invalid)return;let i=xt(e);wt(e,i),bt(e),gt(e,i)}};function yt(t){t.ninePatch.patch.w?.free(),t.ninePatch.patch.nw?.free(),t.ninePatch.patch.n?.free(),t.ninePatch.patch.ne?.free(),t.ninePatch.patch.e?.free(),t.ninePatch.patch.se?.free(),t.ninePatch.patch.s?.free(),t.ninePatch.patch.sw?.free(),t.ninePatch.patch.center?.free(),t.invalid=!0}function xt(t){let{sprite:e,ninePatch:i}=t;return{x:e.x+i.pad.w,y:e.y+i.pad.n}}function bt(t){let{border:e,pad:i,patch:r}=t.ninePatch,n=t.sprite.w-e.w-e.e-i.w-i.e,o=t.sprite.h-e.n-e.s-i.n-i.s;r.n&&(r.n.w=n),r.s&&(r.s.w=n),r.w&&(r.w.h=o),r.e&&(r.e.h=o),r.center&&(r.center.w=n,r.center.h=o)}function gt(t,e){let{patch:i,pad:r,border:n}=t.ninePatch,o={x:t.sprite.x+t.sprite.w-n.e-r.e,y:t.sprite.y+t.sprite.h-n.s-r.s};i.ne&&(i.ne.x=o.x,i.ne.y=e.y),i.e&&(i.e.x=o.x,i.e.y=e.y+n.n),i.se&&(i.se.x=o.x,i.se.y=o.y),i.s&&(i.s.x=e.x+n.w,i.s.y=o.y),i.sw&&(i.sw.x=e.x,i.sw.y=o.y)}function wt(t,e){let{border:i,patch:r}=t.ninePatch;r.nw&&(r.nw.x=e.x,r.nw.y=e.y),r.w&&(r.w.x=e.x,r.w.y=e.y+i.n),r.n&&(r.n.x=e.x+i.w,r.n.y=e.y),r.center&&(r.center.x=e.x+i.w,r.center.y=e.y+i.n)}var X=class{query="override";update(e){e.override.invalid!=null&&(e.invalid=e.override.invalid)}};var z=class{query="sprite";free(e){e.sprite.free(),e.invalid=!0}};function Xe(t,e){for(let i of t)if(i.id===e)return i}function ze(t,e,i){for(let r of t){for(let n in r)e[n]?.update?.(r,i);r.invalid&&l?.invalid&&console.debug("[invalid] ent update invalid",r),i.invalid||=!!r.invalid,r.invalid=!1}}function De(t){return{anim:t.anim,celXYWH:vt(t),tags:Object.keys(t.anim)}}function vt(t){let e=[],i=0;for(let r of Object.values(t.anim))e.push(...St(r,t.celXY,i)),i+=r.cels*2;return e}function St(t,e,i){let r=[];for(let n=0;n<16;n++){let o=i+2*(n%t.cels);r.push(e[o],e[o+1],t.w,t.h)}return r}var D=class{#e=0;#t=1;#i=!0;#r=1;#o={w:1/0,h:1/0};#n="Int";#s=1;#l=1;#d={w:1,h:1};#c=0;#a=0;#u=0;center(e){this.x=Math.floor(e.x-this.w/2),this.y=Math.floor(e.y-this.h/2)}clientToXY(e){let i=this.clientToXYLocal(e);return{x:this.#c+i.x,y:this.#a+i.y}}clientToXYLocal(e){return{x:e.x/this.#d.w*this.#l,y:e.y/this.#d.h*this.#t}}diagonalize(e){me(this,e.x*e.y)}follow(e,i,r,n){let o=R(i)?0:Math.floor(this.x);switch(r){case"SW":case"W":case"NW":o+=n?.margin?.w??0;break;case"SE":case"E":case"NE":o+=this.w-(e.w+(n?.margin?.e??0));break;case"N":case"S":case"Center":o+=Math.trunc(this.w/2)-Math.trunc(e.w/2);break}o-=o%((n?.modulo?.x??o)||1);let a=R(i)?0:Math.floor(this.y);switch(r){case"N":case"NE":case"NW":a+=n?.margin?.n??0;break;case"SE":case"S":case"SW":a+=this.h-(e.h+(n?.margin?.s??0));break;case"E":case"W":case"Center":a+=Math.trunc(this.h/2)-Math.trunc(e.h/2);break}a-=a%((n?.modulo?.y??a)||1);let d=n?.fill==="X"||n?.fill==="XY"?this.w-(n?.margin?.w??0)-(n?.margin?.e??0):e.w,c=n?.fill==="Y"||n?.fill==="XY"?this.h-(n?.margin?.n??0)-(n?.margin?.s??0):e.h;return{x:o,y:a,w:d,h:c}}get h(){return this.#t}isVisible(e){return b(this,e)}get invalid(){return this.#i}get minScale(){return this.#r}set minScale(e){this.#s!==e&&(this.#s=e,this.#p())}get minWH(){return this.#o}set minWH(e){this.#o.w===e.w&&this.#o.h===e.h||(this.#o.w=e.w,this.#o.h=e.h,this.#p())}get mode(){return this.#n}set mode(e){this.#n!==e&&(this.#n=e,this.#p())}get portrait(){return this.h>this.w}postupdate(){this.#i=!1}get scale(){return this.#s}toString(){return`Cam{(${this.x} ${this.y}) ${this.w}\xD7${this.h}}`}update(e){if(!e.parentElement)throw Error("canvas has no parent");let{clientWidth:i,clientHeight:r}=e.parentElement;this.#i||=this.#d.w!==i||this.#d.h!==r||this.#e!==devicePixelRatio,this.#i&&(this.#e=devicePixelRatio,this.#d.w=i,this.#d.h=r,this.#p(),e.width=this.#l,e.height=this.#t,e.style.width=`${this.#l*this.#s/devicePixelRatio}px`,e.style.height=`${this.#t*this.#s/devicePixelRatio}px`)}get w(){return this.#l}get whClient(){return this.#d}get x(){return this.#c}set x(e){this.#i||=this.x!==e,this.#c=e}get y(){return this.#a}set y(e){this.#i||=this.y!==e,this.#a=e}get zoomOut(){return this.#u}set zoomOut(e){e=Math.max(0,e),this.#u!==e&&(this.#u=e,this.#p())}#p(){!this.#i&&l?.invalid&&console.debug("[invalid] cam invalid"),this.#i=!0;let e={w:this.#d.w*devicePixelRatio,h:this.#d.h*devicePixelRatio},i=Math.max(this.#r,Math.min(e.w/this.#o.w,e.h/this.#o.h)-(this.#n==="Int"?Math.trunc(this.#u):this.#u));this.#s=this.#n==="Int"?Math.trunc(i):i,this.#l=Math.ceil(e.w/this.#s),this.#t=Math.ceil(e.h/this.#s)}};var U=class{enable=!1;#e;constructor(e){this.#e=e}register(e){let i=this.#e[`${e}EventListener`].bind(this.#e);return i("contextmenu",this.#t),i("touchstart",this.#t,{passive:!1}),this}[Symbol.dispose](){this.register("remove")}#t=e=>{!e.isTrusted||e.metaKey||e.altKey||e.ctrlKey||this.enable||e.preventDefault()}};var I=class{bits=0;bitByAxis={};bitByButton={};onEvent=()=>{};#e;constructor(e){this.#e=e}get connected(){return isSecureContext&&navigator.getGamepads().filter(Boolean).length>0}register(e){let i=this.#e[`${e}EventListener`].bind(this.#e);return i("gamepadconnected",this.onEvent),i("gamepaddisconnected",this.onEvent),this}reset(){this.bits=0}[Symbol.dispose](){this.register("remove")}update(){if(this.bits=0,!!isSecureContext){for(let e of navigator.getGamepads())if(e){for(let[i,r]of e.axes.entries()??[]){let n=this.bitByAxis[i];if(!n)continue;let o=r<0?n[0]:r===0?0:n[1];this.bits|=Math.abs(r)>=.5?o:0}for(let[i,r]of e.buttons.entries()??[]){let n=this.bitByButton[i];n!=null&&(this.bits|=r.pressed?n:0)}}}}};var O=class{bitByCode={};invalid=!1;onEvent=()=>{};#e={};#t;constructor(e){this.#t=e}get bits(){let e=0;for(let i in this.bitByCode)e|=this.#e[i]?this.bitByCode[i]:0;return e}postupdate(){this.invalid=!1}register(e){let i=this.#t[`${e}EventListener`].bind(this.#t);for(let r of["keydown","keyup"])i(r,this.#i);return this}reset(){this.invalid=!1,this.#e={}}[Symbol.dispose](){this.register("remove")}#i=e=>{!e.isTrusted||this.bitByCode[e.code]==null||e.type==="keydown"&&(e.metaKey||e.altKey||e.ctrlKey)||(this.invalid=!0,this.#e[e.code]=e.type==="keydown",e.preventDefault(),this.onEvent())}};var Et={mouse:"Mouse",pen:"Pen",touch:"Touch"},Tt=["pointercancel","pointerdown","pointermove","pointerup"],q=class{bitByButton={};dragMinClient=5;invalid=!1;onEvent=()=>{};primary;secondary={};#e;#t;constructor(e){this.#t=e}get boundsClient(){if(!this.primary?.bits&&!Object.keys(this.secondary).length)return;let e={x:1/0,y:1/0},i={x:-1/0,y:-1/0};for(let r of[this.primary,...Object.values(this.secondary)])r?.bits&&(e=Le(e,r.xyClient),i=Be(i,r.xyClient));return{x:e.x,y:e.y,w:i.x-e.x,h:i.y-e.y}}get centerClient(){let e=this.boundsClient;return e?Ce(e,{x:e.w/2,y:e.h/2}):this.primary?.xyClient}get locked(){return this.#t.ownerDocument.pointerLockElement===this.#t}get pinchClient(){if(!this.#e)return;let e=this.#o;return e?pe(e,this.#e):void 0}postupdate(){this.invalid=!1}register(e){let i=this.#t[`${e}EventListener`].bind(this.#t);for(let r of Tt)i(r,this.#r);return this}reset(){this.invalid=!1,this.primary=void 0;for(let e in this.secondary)delete this.secondary[e];this.#e=void 0}update(){((this.primary?.bits?1:0)+Object.values(this.secondary).length<2||!this.#e)&&(this.#e=this.#o)}[Symbol.dispose](){this.register("remove")}#i(e){let i=0;for(let r=1;r<=e;r<<=1)(r&e)===r&&(i|=this.bitByButton[r]??0);return i}#r=e=>{if(!e.isTrusted)return;this.invalid=!0;let i=e.metaKey||e.altKey||e.ctrlKey?0:this.#i(e.buttons),r=this.locked;if(i&&e.type==="pointerdown"&&(e.preventDefault(),!r))try{this.#t.setPointerCapture(e.pointerId)}catch{}let n=e.isPrimary?this.primary:this.secondary[e.pointerId],o;if(r){let y=1/devicePixelRatio;o={x:Math.min(Math.max(0,(n?.xyClient.x??e.offsetX)+e.movementX*y),this.#t.clientWidth),y:Math.min(Math.max(0,(n?.xyClient.y??e.offsetY)+e.movementY*y),this.#t.clientHeight)}}else o={x:e.offsetX,y:e.offsetY};let a=e.type,d=Et[e.pointerType],c;i&&(e.type==="pointerdown"?c={x:o.x,y:o.y}:e.type==="pointermove"&&(c=n?.clickClient));let h=!!i&&(n?.drag||!!c&&Pe(c,o)>=this.dragMinClient),p={clickClient:c,bits:i,drag:h,ev:a,id:e.pointerId,primary:e.isPrimary,type:d,xyClient:o};e.isPrimary?this.primary=p:i?this.secondary[e.pointerId]=p:delete this.secondary[e.pointerId],this.onEvent()};get#o(){if((this.primary?.bits?1:0)+Object.values(this.secondary).length<2)return;let e=this.boundsClient;return e?{x:e.w,y:e.h}:void 0}};var V=class{deltaClient;onEvent=()=>{};#e;constructor(e){this.#e=e}postupdate(){this.deltaClient=void 0}register(e){return this.#e[`${e}EventListener`].bind(this.#e)("wheel",this.#t,{passive:!0}),this}reset(){this.deltaClient=void 0}[Symbol.dispose](){this.register("remove")}#t=e=>{!e.isTrusted||e.metaKey||e.altKey||e.ctrlKey||(this.deltaClient={x:e.deltaX,y:e.deltaY,z:e.deltaZ},this.onEvent())}};var F=class{comboMaxIntervalMillis=300;gestured=!1;handled=!1;invalid=!1;minHeldMillis=300;#e={};#t={};#i=0;#r;#o=[];#n;#s={x:0,y:0};#l;#d=0;#c;#a;#u;#p=0;#h;#y;constructor(e,i){this.#r=e,this.#n=new U(i),this.#l=new I(globalThis),this.#c=new O(i.ownerDocument),this.#a=new q(i),this.#h=new V(i)}get anyOn(){return this.#i!==0}get combo(){let e=[];for(let i of this.#o){let r=[];for(let n=1;n<=i;n<<=1)(n&i)===n&&this.#t[n]&&r.push(this.#t[n]);r.sort(),e.push(r)}return e}get contextMenu(){return this.#n}get dir(){return this.#s}get gamepad(){return this.#l.connected?{}:void 0}get held(){return!this.handled&&this.#d>=this.minHeldMillis}isAnyOn(...e){return!this.handled&&!!(this.#i&this.#m(e))}isAnyOnStart(...e){return this.started&&this.isAnyOn(...e)}isAnyOnStill(...e){let i=this.#m(e);return!this.handled&&!!(this.#i&this.#p&i)}isAnyStarted(...e){let i=this.#m(e);return!this.handled&&(this.#i&i)!==(this.#p&i)}isCombo(...e){return e.length===this.#o.length&&this.isComboEndsWith(...e)}isComboEndsWith(...e){for(let[i,r]of e.entries()){let n=this.#m(r);if(this.#o.at(-e.length+i)!==n)return!1}return!this.handled&&(this.#o.at(-1)===this.#i||!this.#i)}isComboEndsWithStart(...e){return this.isOnStart(...e.at(-1))&&this.isComboEndsWith(...e)}isComboStart(...e){return this.isOnStart(...e.at(-1))&&this.isCombo(...e)}isOff(...e){return!this.handled&&!this.isOn(...e)}isOffStart(...e){let i=this.#m(e);return(this.#p&i)===i&&this.started&&this.isOff(...e)}isOn(...e){let i=this.#m(e);return!this.handled&&(this.#i&i)===i}isOnStart(...e){let i=this.#m(e);return!((this.#p&i)===i)&&this.started&&this.isOn(...e)}get key(){return{invalid:this.#c.invalid}}mapDefault(){this.mapKeyboardCode("U","ArrowUp","KeyW"),this.mapKeyboardCode("D","ArrowDown","KeyS"),this.mapKeyboardCode("L","ArrowLeft","KeyA"),this.mapKeyboardCode("R","ArrowRight","KeyD"),this.mapKeyboardCode("A","KeyX","Space","Comma"),this.mapKeyboardCode("B","KeyZ","Period"),this.mapKeyboardCode("C","KeyC","Slash"),this.mapKeyboardCode("Menu","Enter"),this.mapKeyboardCode("Back","Escape"),this.mapGamepadAxis("U","D",1,3,7),this.mapGamepadAxis("L","R",0,2,6),this.mapGamepadButton("U",12),this.mapGamepadButton("D",13),this.mapGamepadButton("L",14),this.mapGamepadButton("R",15),this.mapGamepadButton("A",0),this.mapGamepadButton("B",2),this.mapGamepadButton("C",1),this.mapGamepadButton("Menu",9),this.mapGamepadButton("Back",8),this.mapPointerClick("A",1),this.mapPointerClick("B",2),this.mapPointerClick("C",4)}mapGamepadAxis(e,i,...r){for(let n of r)this.#l.bitByAxis[n]=[this.#f(e),this.#f(i)]}mapGamepadButton(e,...i){for(let r of i)this.#l.bitByButton[r]=this.#f(e)}mapKeyboardCode(e,...i){for(let r of i)this.#c.bitByCode[r]=this.#f(e)}mapPointerClick(e,...i){for(let r of i)this.#a.bitByButton[r]=this.#f(e)}get on(){let e=[];for(let i in this.#e)this.isOn(i)&&e.push(i);return e.sort()}set onEvent(e){this.#l.onEvent=e,this.#c.onEvent=e,this.#a.onEvent=e,this.#h.onEvent=e}get point(){return this.#u}get pointer(){return this.#a}register(e){return globalThis[`${e}EventListener`]("blur",this.reset),this.#n.register(e),this.#l.register(e),this.#c.register(e),this.#a.register(e),this.#h.register(e),this}reset=()=>{this.#i=0,this.#p=0,this.handled=!1,this.#d=0,this.#o.length=0,this.#l.reset(),this.#c.reset(),this.#a.reset(),this.#u=void 0,this.#h.reset(),this.#y=void 0};get started(){return!this.handled&&this.#i!==this.#p}update(e){if(this.handled=!1,this.#l.update(),this.#a.update(),this.#p=this.#i,this.#i=this.#l.bits|this.#c.bits|(this.#a.primary?.bits??0),this.invalid=this.#i!==this.#p||this.#a.invalid||!!this.#h.deltaClient,this.gestured||=!!this.#i,this.#s.x=this.#s.y=0,(this.#e.U&this.#i)===this.#e.U&&(this.#s.y-=1),(this.#e.D&this.#i)===this.#e.D&&(this.#s.y+=1),(this.#e.L&this.#i)===this.#e.L&&(this.#s.x-=1),(this.#e.R&this.#i)===this.#e.R&&(this.#s.x+=1),(e>this.comboMaxIntervalMillis&&this.#i!==this.#p||this.#d+e>this.comboMaxIntervalMillis&&!this.#i)&&(this.#o.length=0),this.#i===this.#p?this.#d=this.#d+e:this.#d=e,this.#i&&this.#i!==this.#p&&(this.#p&&(this.#o.length=0),this.#o.push(this.#i)),this.#a.primary){let i=this.#a.pinchClient,r=this.#a.primary.drag&&!Object.values(this.#a.secondary).length,n=[];for(let d of Object.values(this.#a.secondary))n.push({type:d.type,click:d.clickClient?{client:d.clickClient,local:this.#r.clientToXYLocal(d.clickClient),...this.#r.clientToXY(d.clickClient)}:void 0,...this.#r.clientToXY(d.xyClient),client:d.xyClient,local:this.#r.clientToXYLocal(d.xyClient)});let o=this.#a.centerClient,a={client:o,local:this.#r.clientToXYLocal(o),...this.#r.clientToXY(o)};this.#u={center:a,click:this.#a.primary.clickClient?{client:this.#a.primary.clickClient,local:this.#r.clientToXYLocal(this.#a.primary.clickClient),...this.#r.clientToXY(this.#a.primary.clickClient)}:void 0,drag:{on:r,start:!this.#u?.drag.on&&r,end:!!this.#u?.drag.on&&!r},invalid:this.#a.invalid,pinch:i?{client:i,xy:this.#r.clientToXY(i)}:void 0,secondary:n,type:this.#a.primary.type,...this.#r.clientToXY(this.#a.primary.xyClient),client:this.#a.primary.xyClient,local:this.#r.clientToXYLocal(this.#a.primary.xyClient)}}else this.#u=void 0;this.#y=this.#h.deltaClient?{delta:{client:this.#h.deltaClient,xy:this.#r.clientToXY(this.#h.deltaClient)}}:void 0,this.#c.postupdate(),this.#a.postupdate(),this.#h.postupdate()}[Symbol.dispose](){this.register("remove")}get wheel(){return this.#y}#m(e){let i=0;for(let r of e)i|=this.#e[r]??0;return i}#f(e){let i=this.#e[e]??=1<<Object.keys(this.#e).length;return this.#t[i]=e,i}};function f(t){return t!=null&&!Array.isArray(t)&&typeof t=="object"}function Ue(t){return t[0]?`${t[0].toLocaleLowerCase()}${t.slice(1)}`:t}function Ie(t,e,i,r){let n={default:new Set};for(let[o,a]of Object.entries(t.zoo))n[o]=new Set(a.map(d=>Pt(d,e,i,r)));return{background:t.background?parseInt(t.background,16):void 0,minScale:t.minScale,minWH:t.minWH?Wt(t.minWH):void 0,zoo:n,zoomOut:t.zoomOut}}function $(t){if(!t||typeof t=="number"){let e=t??0;return{n:e,s:e,w:e,e}}return"x"in t||"y"in t?{n:t.y??0,s:t.y??0,w:t.x??0,e:t.x??0}:{n:t.n??0,s:t.s??0,w:t.w??0,e:t.e??0}}function Rt(t,e,i){let r=m(t.pressed,e,i);t.z&&(r.z=u[t.z]),r.hidden=!0;let n=m(t.selected,e,i);return t.z&&(n.z=u[t.z]),{pressed:r,selected:n,started:!1,type:t.type??"Button"}}function Ct(t,e){if(!t.sprite)throw Error("cursor missing sprite");return t.sprite.hidden=!0,{bounds:{x:0,y:0,w:0,h:0},keyboard:e.keyboard??0,pick:e.pick,point:t.sprite.tag}}function Pt(t,e,i,r){let n={};for(let o in t){let a=o;n[a]=i(n,t,a,e,r)??Bt(n,t,a,e,r)}return n.invalid=!0,n}function Bt(t,e,i,r,n){if(e[i]!=null)switch(i){case"button":return Rt(e[i],r,n);case"cursor":return Ct(t,e[i]);case"fps":return Lt(e[i]);case"hud":return At(e[i]);case"cam":case"draw":case"debugInput":case"id":case"name":case"text":return e[i];case"ninePatch":return Ht(t,e[i],r,n);case"override":return Mt(e[i]);case"sprite":return m(e[i],r,n);case"textWH":return _t(e[i]);case"textXY":return Yt(t,e[i]);default:}}function Lt(t){return{prevFrames:0,next:{created:performance.now(),startClears:0}}}function At(t){return{fill:t.fill,margin:$(t.margin??0),modulo:kt(t.modulo??0),origin:t.origin}}function Ht(t,e,i,r){if(!t.sprite)throw Error("nine patch missing sprite");let n={center:e.patch.center==null?void 0:m(e.patch.center,i,r),n:e.patch.n==null?void 0:m(e.patch.n,i,r),s:e.patch.s==null?void 0:m(e.patch.s,i,r),w:e.patch.w==null?void 0:m(e.patch.w,i,r),e:e.patch.e==null?void 0:m(e.patch.e,i,r),nw:e.patch.nw==null?void 0:m(e.patch.nw,i,r),ne:e.patch.ne==null?void 0:m(e.patch.ne,i,r),sw:e.patch.sw==null?void 0:m(e.patch.sw,i,r),se:e.patch.se==null?void 0:m(e.patch.se,i,r)},o=$(e.border),a={border:o,pad:$(e.pad),patch:n};return n.center&&(n.center.z=t.sprite.z),n.n&&(n.n.h=o.n,(!f(e.patch.n)||e.patch.n.z==null)&&(n.n.z=t.sprite.z)),n.s&&(n.s.h=o.s,(!f(e.patch.s)||e.patch.s.z==null)&&(n.s.z=t.sprite.z)),n.w&&(n.w.w=o.w,(!f(e.patch.w)||e.patch.w.z==null)&&(n.w.z=t.sprite.z)),n.e&&(n.e.w=o.e,(!f(e.patch.e)||e.patch.e.z==null)&&(n.e.z=t.sprite.z)),n.nw&&(n.nw.w=o.w,n.nw.h=o.n,(!f(e.patch.nw)||e.patch.nw.z==null)&&(n.nw.z=t.sprite.z)),n.ne&&(n.ne.w=o.e,n.ne.h=o.n,(!f(e.patch.ne)||e.patch.ne.z==null)&&(n.ne.z=t.sprite.z)),n.sw&&(n.sw.w=o.w,n.sw.h=o.s,(!f(e.patch.sw)||e.patch.sw.z==null)&&(n.sw.z=t.sprite.z)),n.se&&(n.se.w=o.e,n.se.h=o.s,(!f(e.patch.se)||e.patch.se.z==null)&&(n.se.z=t.sprite.z)),a}function Mt(t){return{invalid:t.invalid}}function m(t,e,i){let r=typeof t=="string"?"default":Ue(t.pool??"Default");if(!e[r])throw Error(`no ${r} sprite pool`);let n=e[r].alloc();if(typeof t=="string"){if(!(t in i.anim))throw Error(`no tag "${t}"`);return n.tag=t,n}if(t.tag!=null){if(!(t.tag in i.anim))throw Error(`no tag "${t.tag}"`);n.tag=t.tag}return t.hidden!=null?n.hidden=t.hidden:n.hidden=!t.tag,t.flip&&(n.flipX=t.flip==="X"||t.flip==="XY",n.flipY=t.flip==="Y"||t.flip==="XY"),t.angle!=null&&(n.angle=t.angle),t.stretch!=null&&(n.stretch=t.stretch),t.w!=null&&(n.w=t.w),t.h!=null&&(n.h=t.h),t.scale!=null&&(n.w*=typeof t.scale=="number"?t.scale:t.scale.x??1,n.h*=typeof t.scale=="number"?t.scale:t.scale.y??1),t.x!=null&&(n.x=t.x),t.y!=null&&(n.y=t.y),t.z!=null&&(n.z=u[t.z]),t.zend!=null&&(n.zend=t.zend),n}function _t(t){return{layout:{chars:[],cursor:{x:0,y:0},w:0,h:0,trimmedH:0},maxW:t.maxW??He.w,pad:$(t.pad),scale:t.scale??1,trim:t.trim}}function Yt(t,e){return{chars:[],z:e.z?u[e.z]:t.sprite?.z??u.Bottom}}function Wt(t){return typeof t=="number"?{w:t,h:t}:{w:Number(t?.w??0),h:Number(t?.h??0)}}function kt(t){return typeof t=="number"?{x:t,y:t}:{x:t.x??0,y:t.y??0}}var N=class{#e;#t;#i=0;#r;#o;constructor(e){if(e.allocBytes<=0)throw Error("byte allocation must be > 0");if(e.pageBlocks<=0)throw Error("page blocks must be > 0");this.#t={...e,init:e.init??(()=>{}),minPages:e.minPages??1};let i=this.#t.minPages*e.pageBlocks;this.#e=new Array(i),this.#r=new Uint8Array,this.#s(i,"Init")}alloc(){this.#i>=this.#n&&this.#s(this.#n+this.#t.pageBlocks,"Call");let e=this.#e[this.#i];return e.i=this.#i*this.#t.allocBytes,this.#i++,this.#t.init(e),e}clear(){this.#i=0;let e=this.#t.minPages*this.#t.pageBlocks;this.#n>e&&this.#s(e,"Call")}free(e){if(!this.#i)throw Error("pool underflow");this.#i--;let i=this.#i*this.#t.allocBytes;this.#r.copyWithin(e.i,i,i+this.#t.allocBytes),this.#e[this.#i].i=e.i,[this.#e[e.i],this.#e[this.#i]]=[this.#e[this.#i],this.#e[e.i]];let r=Math.floor((this.#n-this.#i)/this.#t.pageBlocks);r&&this.#n/this.#t.pageBlocks-r>=this.#t.minPages&&this.#s(this.#n-r*this.#t.pageBlocks,"Call")}get size(){return this.#i}get view(){return this.#o}toDebugString(){let e="";for(let i=0;i<this.#r.buffer.byteLength;i++)i&&!(i%this.#t.allocBytes)&&(e+=" "),e+=this.#r[i].toString(16).padStart(2,"0");return e}get#n(){return this.#r.buffer.byteLength/this.#t.allocBytes}#s(e,i){i==="Call"&&l?.mem&&console.debug(`[mem] ${e<this.#n?"shrinking":"growing"} pool to ${e}`),this.#e.length=e;for(let o=this.#n;o<e;o++)this.#e[o]=this.#t.alloc(this);let r=new ArrayBuffer(e*this.#t.allocBytes),n=new Uint8Array(r);n.set(this.#r.subarray(0,e*this.#t.allocBytes)),this.#r=n,this.#o=new DataView(r)}};function G(t){return new N({alloc:e=>new B(e,0,t.atlas,t.looper),init:e=>e.init(),allocBytes:x,...t})}var K=class{#e;constructor(e){this.#e=e*16807%2147483647,this.#e<=0&&(this.#e=(this.#e+2147483646)%2147483646+1)}get num(){return this.#e=this.#e*16807%2147483647,(this.#e-1)/2147483646}get seed(){return this.#e}};var Q=s;function Z(t,e){return((e==="Sec"?0:(59-t.getSeconds()%60)*1e3)+1e3-t.getMilliseconds()%1e3)%(e==="Sec"?1e3:6e4)}function Oe(){document.body.style.margin="0",document.body.style.width="100dvw",document.body.style.height="100dvh",document.body.style.overflow="hidden"}function qe(t){if(!document.querySelector('meta[name="viewport"]')){let e=document.createElement("meta");e.name="viewport",e.content="width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no",document.head.appendChild(e)}if(t&&!document.querySelector('meta[name="description"]')){let e=document.createElement("meta");e.name="description",e.content=t,document.head.appendChild(e)}}function Ve(t,e){if(t??=document.createElement("canvas"),t.width=0,t.style.cursor="none",t.style.display="block",t.style.outline="none",e==="Int"&&(t.style.imageRendering="pixelated"),t.style.touchAction="none",t.tabIndex=0,t.focus(),!t.parentNode){let i=document.createElement("main");i.style.backgroundColor=document.body.style.backgroundColor,i.style.height="100%",i.append(t),document.body.append(i)}return t}function Fe(t){return`#${t.toString(16).padStart(8,"0")}`}function $e(t){let[e,i,r,n]=t.match(/[0-9.]+/g)?.map(Number)??[];return(Math.round(e??0)<<24|Math.round(i??0)<<16|Math.round(r??0)<<8|Math.round((n??1)*255))>>>0}var J=class{#e;#t;#i=0;#r;#o=0;constructor(e,i,r){this.#e=e,this.#t=i,this.#r=r}register(e){return e==="add"?this.#o=setTimeout(()=>{this.#r(),this.#i=setInterval(this.#r,this.#t)},this.#e()):(clearTimeout(this.#o),clearInterval(this.#i)),this}[Symbol.dispose](){this.register("remove")}};async function Ne(t){let e=new Promise((i,r)=>{t.onload=()=>i(t),t.onerror=()=>r(Error(`image load error for ${t.src}`))});return t.complete?t:await e}var j=class{onChange=()=>{};#e;register(e){return this.#e?.removeEventListener("change",this.#t),e==="add"?(this.#e=matchMedia(`not (resolution: ${devicePixelRatio}dppx)`),this.#e.addEventListener("change",this.#t)):this.#e=void 0,this}[Symbol.dispose](){this.register("remove")}#t=()=>{this.register("add"),this.onChange()}};function Ke(t,e,i,r){let n=zt(t,e,i);return t.useProgram(n),{buffer:t.createBuffer(),program:n,textures:r,uniform:Xt(t,n),vao:t.createVertexArray()}}function Xt(t,e){let i=e?t.getProgramParameter(e,t.ACTIVE_UNIFORMS):0,r=l?.render?new Proxy({},{get(n,o){if(n[o]==null)throw Error(`no shader uniform "${o}"`);return n[o]}}):{};for(let n=0;n<i;++n){let o=t.getActiveUniform(e,n);if(!o)throw Error(`no shader uniform at index ${n}`);let a=t.getUniformLocation(e,o.name);if(!a)throw Error(`no shader uniform "${o.name}"`);let d=o.name.replace("[0]","");r[d]=a}return r}function zt(t,e,i){let r=t.createProgram();if(!r)return null;let n=Ge(t,"VERTEX_SHADER",e),o=Ge(t,"FRAGMENT_SHADER",i);if(!n||!o)return null;if(t.attachShader(r,n),t.attachShader(r,o),t.linkProgram(r),l?.render&&!t.getProgramParameter(r,t.LINK_STATUS)){let a=t.getProgramInfoLog(r)?.slice(0,-1);throw Error(`shader link failure; ${a}`)}return t.detachShader(r,o),t.detachShader(r,n),t.deleteShader(o),t.deleteShader(n),r}function Ge(t,e,i){let r=t.createShader(t[e]);if(!r)return r;if(t.shaderSource(r,i.trim()),t.compileShader(r),l?.render&&!t.getShaderParameter(r,t.COMPILE_STATUS)){let n=t.getShaderInfoLog(r)?.slice(0,-1);throw Error(`shader compile failure; ${n}`)}return r}var Qe=`#version 300 es
14
+ #pragma debug(${l?.render?"on":"off"})
15
+ #pragma optimize(${l?.render?"off":"on"})
16
+
17
+ precision highp int;
18
+ precision highp float;
19
+ precision highp usampler2D;
20
+
21
+ uniform sampler2D uTex;
22
+ uniform uvec2 uTexWH;
23
+
24
+ flat in float vAngle;
25
+ flat in vec2 vAABBWH;
26
+ flat in vec2 vSpriteWH;
27
+ flat in uint vStretch;
28
+ flat in ivec4 vTexXYWH;
29
+ flat in uint vHidden;
30
+ in vec2 vDstWH;
31
+ flat in ivec2 vDstWHFixed;
32
+
33
+ out vec4 oRGBA;
34
+
35
+ void main() {
36
+ if (vHidden == 1u || vDstWHFixed.x == 0 || vDstWHFixed.y == 0)
37
+ discard;
38
+
39
+ // map from AABB-local coordinate -> sprite-local coordinate by unrotating
40
+ // around the rect center. this avoids clipping from the unrotated quad.
41
+ vec2 aabbCenter = vAABBWH * .5;
42
+ vec2 spriteCenter = vSpriteWH * .5;
43
+ float cosA = cos(vAngle);
44
+ float sinA = sin(vAngle);
45
+ vec2 aabbLocal = vec2(
46
+ float(sign(vDstWHFixed.x)) * vDstWH.x,
47
+ float(sign(vDstWHFixed.y)) * vDstWH.y
48
+ );
49
+ // p is centered AABB coordinate. apply inverse rotation (-angle).
50
+ vec2 p = aabbLocal - aabbCenter;
51
+ vec2 q = vec2(cosA * p.x + sinA * p.y, -sinA * p.x + cosA * p.y);
52
+ vec2 spriteLocal = q + spriteCenter;
53
+
54
+ // vDstWHFixed uses sign to encode flips.
55
+ if (vDstWHFixed.x < 0) spriteLocal.x = (vSpriteWH.x - 1.0) - spriteLocal.x;
56
+ if (vDstWHFixed.y < 0) spriteLocal.y = (vSpriteWH.y - 1.0) - spriteLocal.y;
57
+
58
+ // discard pixels falling outside rotated rectangle.
59
+ if (spriteLocal.x < 0. || spriteLocal.y < 0. ||
60
+ spriteLocal.x >= vSpriteWH.x || spriteLocal.y >= vSpriteWH.y)
61
+ discard;
62
+
63
+ // sample from spritesheet.
64
+ vec2 srcWH = vec2(vTexXYWH.zw);
65
+ vec2 uv = vStretch == 1u
66
+ ? (spriteLocal * srcWH / vSpriteWH)
67
+ : mod(spriteLocal, srcWH);
68
+ vec2 px = vec2(vTexXYWH.xy) + uv;
69
+
70
+ oRGBA = texture(uTex, px / vec2(uTexWH));
71
+ if(oRGBA.a < .001) discard;
72
+ }
73
+ `;var Ze=`#version 300 es
74
+ #pragma debug(${l?.render?"on":"off"})
75
+ #pragma optimize(${l?.render?"off":"on"})
76
+
77
+ // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2
78
+ precision highp int;
79
+ precision highp float;
80
+ precision highp usampler2D;
81
+
82
+ uniform ivec4 uCam;
83
+ uniform usampler2D uCels;
84
+ uniform float uAge;
85
+
86
+ layout (location=0) in ivec2 iUV;
87
+ layout (location=1) in uint iy8_x24;
88
+ layout (location=2) in uint iw8_sxyz_llll_y16;
89
+ layout (location=3) in uint ii11_c5_h12_w4;
90
+ layout (location=4) in uint ia12_r19_v;
91
+
92
+ const int maxY = 0x20000;
93
+ const int layers = 16;
94
+ const int maxDepth = maxY * layers;
95
+ const float pi = 3.1415926535897932384626433832795;
96
+
97
+ flat out float vAngle; // in radians.
98
+ flat out vec2 vAABBWH;
99
+ flat out vec2 vSpriteWH;
100
+ flat out uint vStretch;
101
+ flat out ivec4 vTexXYWH;
102
+ flat out uint vHidden;
103
+ out vec2 vDstWH;
104
+ flat out ivec2 vDstWHFixed;
105
+
106
+ void main() {
107
+ int x = int(floor(float(int((iy8_x24 & 0xffffffu) << 8) >> 8) / 64.));
108
+ int y = int(floor(float(int(iy8_x24 >> 24) | (int(iw8_sxyz_llll_y16 & 0xffffu) << 16 >> 8)) / 64.));
109
+ int z = int((iw8_sxyz_llll_y16 >> 16) & 0xfu);
110
+ bool zend = bool(iw8_sxyz_llll_y16 & 0x100000u);
111
+ bool flipY = bool(iw8_sxyz_llll_y16 & 0x200000u);
112
+ bool flipX = bool(iw8_sxyz_llll_y16 & 0x400000u);
113
+ bool stretch = bool(iw8_sxyz_llll_y16 & 0x800000u);
114
+ int id = int((ii11_c5_h12_w4 >> 17) & 0x7ff0u); // ignore cel.
115
+ int cel = int((ii11_c5_h12_w4 >> 16) & 0xfu); // ignore the MSB.
116
+ int w = int(((ii11_c5_h12_w4 & 0xfu) << 8) | (iw8_sxyz_llll_y16 >> 24));
117
+ int h = int((ii11_c5_h12_w4 >> 4) & 0xfffu);
118
+ bool hidden = bool(ia12_r19_v & 0x1u);
119
+ int angle = int((ia12_r19_v >> 8) & 0xfffu);
120
+
121
+ // https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel
122
+ float depth = float((${u.Top} - z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);
123
+
124
+ vSpriteWH = vec2(float(w), float(h));
125
+
126
+ vec2 end;
127
+ vec2 targetWH;
128
+ if (angle == 0) {
129
+ vAngle = 0.;
130
+ targetWH = vec2(iUV * ivec2(w, h));
131
+ end = vec2(x + int(targetWH.x), y + int(targetWH.y));
132
+
133
+ vAABBWH = vec2(float(w), float(h));
134
+ vDstWHFixed = ivec2(w, h) * ivec2(flipX ? -1 : 1, flipY ? -1 : 1);
135
+ } else {
136
+ vAngle = float(angle) * 2. * pi / 4096.;
137
+ float cosAngle = cos(vAngle);
138
+ float sinAngle = sin(vAngle);
139
+
140
+ vec2 halfWH = vSpriteWH / 2.;
141
+
142
+ vec2 center = vec2(floor(float(x) + halfWH.x), floor(float(y) + halfWH.y));
143
+
144
+ vec2 aabbHalf = vec2(abs(cosAngle) * halfWH.x + abs(sinAngle) * halfWH.y,
145
+ abs(sinAngle) * halfWH.x + abs(cosAngle) * halfWH.y);
146
+ vec2 aabbWH = aabbHalf * 2.;
147
+
148
+ vec2 aabbOrigin = center - aabbHalf;
149
+
150
+ targetWH = vec2(iUV) * aabbWH;
151
+ end = aabbOrigin + targetWH;
152
+
153
+ vAABBWH = aabbWH;
154
+ vDstWHFixed = ivec2(floor(aabbWH)) * ivec2(flipX ? -1 : 1, flipY ? -1 : 1);
155
+ }
156
+ // UI layers are always given in screen coordinates.
157
+ // to-do: how to handle non-int mode?
158
+ vec2 camXY = z >= ${u.UIA} ? vec2(0, 0) : vec2(uCam.xy);
159
+ vec2 clip = ((-2. * camXY + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);
160
+ gl_Position = vec4(clip, depth, 1);
161
+
162
+ int frame = (((int(uAge / ${62.5}) & 0x1f) - cel) + ${16}) & 0xf;
163
+ uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);
164
+ vTexXYWH = ivec4(texXYWH);
165
+ vHidden = uint(hidden);
166
+
167
+ vec2 flipSign = vec2(flipX ? -1. : 1., flipY ? -1. : 1.);
168
+ vDstWH = targetWH * flipSign;
169
+
170
+ vStretch = stretch ? 1u : 0u;
171
+ }
172
+ `;var Je=new Int8Array([1,1,0,1,1,0,0,0]),ee=class{always=l?.render==="always";clears=0;loseContext;#e;#t;#i;#r=0;#o=!0;#n;#s=!1;#l;constructor(e,i,r){this.#e=e,this.#i=i,this.#l=r}clear(e){if(!this.#n)return;let{gl:i}=this.#n;this.#r!==e&&(this.#r=e,i.clearColor((e>>>24&255)/255,(e>>>16&255)/255,(e>>>8&255)/255,(e>>>0&255)/255)),i.clear(i.COLOR_BUFFER_BIT|i.DEPTH_BUFFER_BIT),this.clears++}draw(e){if(!this.#t||!this.#n)return;let{gl:i,spriteShader:r}=this.#n;if(i.bindBuffer(i.ARRAY_BUFFER,r.buffer),i.bufferData(i.ARRAY_BUFFER,e.view,i.DYNAMIC_DRAW,0,e.size*x),i.bindBuffer(i.ARRAY_BUFFER,null),i.bindVertexArray(r.vao),i.drawArraysInstanced(i.TRIANGLE_STRIP,0,Je.length/2,e.size),i.bindVertexArray(null),l?.render){let n=i.getError();n!==i.NO_ERROR&&console.error(`[render] GL error x${n.toString(16)}`)}this.#s=!1}get hasContext(){return this.#n!=null}get invalid(){return this.#s||this.always}load(e){this.#t=e,this.#n=this._Context()}predraw(e){if(!this.#n)return;let{gl:i,spriteShader:r,viewport:n}=this.#n;Re(n,e)||(i.viewport(0,0,e.w,e.h),n.w=e.w,n.h=e.h),i.useProgram(r.program),i.uniform4i(r.uniform.uCam,Math.floor(e.x),Math.floor(e.y),e.w,e.h),i.uniform1f(r.uniform.uAge,this.#l.age);for(let[o,a]of r.textures.entries())i.activeTexture(i.TEXTURE0+o),i.bindTexture(i.TEXTURE_2D,a)}register(e){return this.#i[`${e}EventListener`]("webglcontextlost",this.#d),this.#i[`${e}EventListener`]("webglcontextrestored",this.#c),this}setDepth(e){this.#o=e,this.#n&&(e?this.#n.gl.enable(this.#n.gl.DEPTH_TEST):this.#n.gl.disable(this.#n.gl.DEPTH_TEST))}[Symbol.dispose](){this.register("remove")}_Context(){let e=this.#n?.gl??Dt(this.#i,this.always);if(!e)return;let i=Ke(e,Ze,Qe,[e.createTexture(),e.createTexture()]);return e.enable(e.BLEND),e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA),this.setDepth(this.#o),e.depthRange(0,1),e.clearDepth(1),e.depthFunc(e.LESS),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,!1),e.bindVertexArray(i.vao),e.bindBuffer(e.ARRAY_BUFFER,e.createBuffer()),e.bufferData(e.ARRAY_BUFFER,Je,e.STATIC_DRAW),e.enableVertexAttribArray(0),e.vertexAttribIPointer(0,2,e.BYTE,0,0),e.bindBuffer(e.ARRAY_BUFFER,null),e.bindBuffer(e.ARRAY_BUFFER,i.buffer),e.enableVertexAttribArray(1),e.vertexAttribIPointer(1,1,e.UNSIGNED_INT,x,0),e.vertexAttribDivisor(1,1),e.enableVertexAttribArray(2),e.vertexAttribIPointer(2,1,e.UNSIGNED_INT,x,4),e.vertexAttribDivisor(2,1),e.enableVertexAttribArray(3),e.vertexAttribIPointer(3,1,e.UNSIGNED_INT,x,8),e.vertexAttribDivisor(3,1),e.enableVertexAttribArray(4),e.vertexAttribIPointer(4,1,e.UNSIGNED_INT,x,12),e.vertexAttribDivisor(4,1),e.bindBuffer(e.ARRAY_BUFFER,null),e.bindTexture(e.TEXTURE_2D,i.textures[0]),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),this.#t&&e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,this.#t),e.bindTexture(e.TEXTURE_2D,null),e.bindTexture(e.TEXTURE_2D,i.textures[1]),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,e.RGBA16UI,1,this.#e.celXYWH.length/4,0,e.RGBA_INTEGER,e.UNSIGNED_SHORT,new Uint16Array(this.#e.celXYWH)),e.bindTexture(e.TEXTURE_2D,null),e.bindVertexArray(null),e.uniform1i(i.uniform.uTex,0),e.uniform1i(i.uniform.uCels,1),this.#t&&e.uniform2ui(i.uniform.uTexWH,this.#t.naturalWidth,this.#t.naturalHeight),!this.#s&&l?.invalid&&console.debug("[invalid] renderer invalid"),this.#s=!0,this.loseContext=e.getExtension("WEBGL_lose_context")??void 0,this.#n={gl:e,spriteShader:i,viewport:{w:0,h:0}}}#d=e=>{e.preventDefault(),console.debug("[render] GL context lost"),this.#n=void 0};#c=()=>{console.debug("[render] GL context restored"),this.#n=this._Context()}};function Dt(t,e){let i=t.getContext("webgl2",{antialias:!1,powerPreference:"low-power",preserveDrawingBuffer:!0,...!l?.render&&{desynchronized:e}});if(!i){console.debug("[render] no GL context");return}return i}var te=class{age=0;onFrame;#e=0;#t=!1;#i=0;register(e){let i=`${e}EventListener`;return document[i]("visibilitychange",this.#n),e==="remove"&&this.#r(),this.#t=e==="add",this}requestFrame(){this.#e||document.hidden||!this.#t||(this.#i=performance.now(),this.#e=requestAnimationFrame(this.#o))}[Symbol.dispose](){this.register("remove")}#r(){this.#e&&cancelAnimationFrame(this.#e),this.#e=0}#o=()=>{let e=performance.now(),i=e-this.#i;this.age=e,this.#e=0,this.onFrame?.(i)};#n=e=>{e.isTrusted&&(document.hidden?(this.#r(),l?.looper&&console.debug("[looper] paused")):(this.requestFrame(),l?.looper&&console.debug("[looper] resumed")))}};var ie=class{atlas;cam=new D;canvas;input;loader;looper=new te;pool;random;renderer;tick={ms:0,s:0};#e;#t;#i=!1;#r=new j;#o;#n=!1;#s=new ResizeObserver(()=>this.onResize());constructor(e){if(qe(e.description),this.canvas=Ve(e.canvas,e.config.mode),!this.canvas.parentElement)throw Error("no canvas parent");if(this.#t=$e(getComputedStyle(this.canvas.parentElement).backgroundColor),e.canvas||Oe(),this.cam.mode=e.config.mode,this.cam.update(this.canvas),this.random=e.random??new K(Date.now()),this.input=new F(this.cam,this.canvas),e.config.input!=="Custom"&&this.input.mapDefault(),this.input.onEvent=()=>this.onEvent(),this.#r.onChange=()=>this.onResize(),!e.atlas)throw Error("no atlas image");this.#e=e.atlas,this.atlas={default:e.config.atlas?De(e.config.atlas):{anim:{},celXYWH:[],tags:[]}},this.renderer=new ee(this.atlas.default,this.canvas,this.looper),this.pool={default:G({atlas:this.atlas.default,looper:this.looper,minPages:e.sprites?.minPages??3,pageBlocks:e.sprites?.pageBlocks??1e3})},this.looper.onFrame=i=>this.onFrame(i),this.loader=e.loader,l&&(globalThis.v=this)}alloc(e="default"){return this.pool[e].alloc()}get backgroundRGBA(){return this.#t}set backgroundRGBA(e){if(!this.canvas.parentElement)throw Error("no canvas parent");this.canvas.parentElement.style.backgroundColor=Fe(e),this.#t=e}get invalid(){return this.cam.invalid||this.renderer.invalid||this.#i}set invalid(e){this.#i=e}loadLevel(e,i,r){let n=Ie(e,this.pool,r,this.atlas[i]);return n.background!=null&&(this.backgroundRGBA=n.background),n.minScale!=null&&(this.cam.minScale=n.minScale),n.minWH!=null&&(this.cam.minWH=n.minWH),n.zoomOut!=null&&(this.cam.zoomOut=n.zoomOut),n.zoo}onEvent(){this.requestFrame("Force")}onFrame(e){this.tick.ms=e,this.tick.s=e/1e3,!document.hidden&&(this.input.update(e),this.requestFrame(),this.#i=!1,this.loader.update(this),this.cam.postupdate())}onPoll(){this.requestFrame("Force")}onResize(){this.requestFrame("Force")}setPoller(e,i){this.#o&&this.#o.register("remove"),this.#o=new J(i??(()=>0),e,()=>this.onPoll()),this.#n&&this.#o.register("add")}async register(e){this.input.register(e),this.renderer.register(e),this.looper.register(e),e==="add"?this.#s.observe(this.canvas.parentElement):this.#s.unobserve(this.canvas.parentElement),this.#r.register(e),e==="add"&&this.looper.requestFrame(),this.#o?.register(e),await Ne(this.#e),this.renderer.load(this.#e),this.#n=e==="add"}requestFrame(e){(e||this.renderer.always||this.input.anyOn||this.input.gamepad)&&this.looper.requestFrame()}async[Symbol.asyncDispose](){await this.register("remove")}};var je="void 2D game library demo.";var et={atlas:{anim:{"background--OrangeCheckerboard":{cels:1,h:2,id:0,w:2},"background--GreyCheckerboard":{cels:1,h:2,id:1,w:2},"background--Kiwi":{cels:1,h:2,id:2,w:2},"background--Strawberry":{cels:1,h:2,id:3,w:2},"background--Grape":{cels:1,h:2,id:4,w:2},"background--Blueberry":{cels:1,h:2,id:5,w:2},"background--Bubblegum":{cels:1,h:2,id:6,w:2},"background--Transparent":{cels:1,h:2,id:7,w:2},"background--Black":{cels:1,h:2,id:8,w:2},"backpacker--WalkRight":{cels:16,h:13,hitbox:{x:2,y:0,w:4,h:4},id:9,w:8},"backpacker--WalkDown":{cels:16,h:13,hitbox:{x:2,y:0,w:4,h:4},id:10,w:8},"backpacker--WalkUp":{cels:16,h:13,hitbox:{x:2,y:0,w:4,h:4},id:11,w:8},"cursor--Pointer":{cels:1,h:14,hitbox:{x:0,y:0,w:2,h:2},hurtbox:{x:0,y:0,w:2,h:2},id:12,w:8},"mem-prop-5x6--00":{cels:1,h:6,id:13,w:5},"mem-prop-5x6--01":{cels:1,h:6,id:14,w:5},"mem-prop-5x6--02":{cels:1,h:6,id:15,w:5},"mem-prop-5x6--03":{cels:1,h:6,id:16,w:5},"mem-prop-5x6--04":{cels:1,h:6,id:17,w:5},"mem-prop-5x6--05":{cels:1,h:6,id:18,w:5},"mem-prop-5x6--06":{cels:1,h:6,id:19,w:5},"mem-prop-5x6--07":{cels:1,h:6,id:20,w:5},"mem-prop-5x6--08":{cels:1,h:6,id:21,w:5},"mem-prop-5x6--09":{cels:1,h:6,id:22,w:5},"mem-prop-5x6--0a":{cels:1,h:6,id:23,w:5},"mem-prop-5x6--0b":{cels:1,h:6,id:24,w:5},"mem-prop-5x6--0c":{cels:1,h:6,id:25,w:5},"mem-prop-5x6--0d":{cels:1,h:6,id:26,w:5},"mem-prop-5x6--0e":{cels:1,h:6,id:27,w:5},"mem-prop-5x6--0f":{cels:1,h:6,id:28,w:5},"mem-prop-5x6--10":{cels:1,h:6,id:29,w:5},"mem-prop-5x6--11":{cels:1,h:6,id:30,w:5},"mem-prop-5x6--12":{cels:1,h:6,id:31,w:5},"mem-prop-5x6--13":{cels:1,h:6,id:32,w:5},"mem-prop-5x6--14":{cels:1,h:6,id:33,w:5},"mem-prop-5x6--15":{cels:1,h:6,id:34,w:5},"mem-prop-5x6--16":{cels:1,h:6,id:35,w:5},"mem-prop-5x6--17":{cels:1,h:6,id:36,w:5},"mem-prop-5x6--18":{cels:1,h:6,id:37,w:5},"mem-prop-5x6--19":{cels:1,h:6,id:38,w:5},"mem-prop-5x6--1a":{cels:1,h:6,id:39,w:5},"mem-prop-5x6--1b":{cels:1,h:6,id:40,w:5},"mem-prop-5x6--1c":{cels:1,h:6,id:41,w:5},"mem-prop-5x6--1d":{cels:1,h:6,id:42,w:5},"mem-prop-5x6--1e":{cels:1,h:6,id:43,w:5},"mem-prop-5x6--1f":{cels:1,h:6,id:44,w:5},"mem-prop-5x6--20":{cels:1,h:6,id:45,w:5},"mem-prop-5x6--21":{cels:1,h:6,id:46,w:5},"mem-prop-5x6--22":{cels:1,h:6,id:47,w:5},"mem-prop-5x6--23":{cels:1,h:6,id:48,w:5},"mem-prop-5x6--24":{cels:1,h:6,id:49,w:5},"mem-prop-5x6--25":{cels:1,h:6,id:50,w:5},"mem-prop-5x6--26":{cels:1,h:6,id:51,w:5},"mem-prop-5x6--27":{cels:1,h:6,id:52,w:5},"mem-prop-5x6--28":{cels:1,h:6,id:53,w:5},"mem-prop-5x6--29":{cels:1,h:6,id:54,w:5},"mem-prop-5x6--2a":{cels:1,h:6,id:55,w:5},"mem-prop-5x6--2b":{cels:1,h:6,id:56,w:5},"mem-prop-5x6--2c":{cels:1,h:6,id:57,w:5},"mem-prop-5x6--2d":{cels:1,h:6,id:58,w:5},"mem-prop-5x6--2e":{cels:1,h:6,id:59,w:5},"mem-prop-5x6--2f":{cels:1,h:6,id:60,w:5},"mem-prop-5x6--30":{cels:1,h:6,id:61,w:5},"mem-prop-5x6--31":{cels:1,h:6,id:62,w:5},"mem-prop-5x6--32":{cels:1,h:6,id:63,w:5},"mem-prop-5x6--33":{cels:1,h:6,id:64,w:5},"mem-prop-5x6--34":{cels:1,h:6,id:65,w:5},"mem-prop-5x6--35":{cels:1,h:6,id:66,w:5},"mem-prop-5x6--36":{cels:1,h:6,id:67,w:5},"mem-prop-5x6--37":{cels:1,h:6,id:68,w:5},"mem-prop-5x6--38":{cels:1,h:6,id:69,w:5},"mem-prop-5x6--39":{cels:1,h:6,id:70,w:5},"mem-prop-5x6--3a":{cels:1,h:6,id:71,w:5},"mem-prop-5x6--3b":{cels:1,h:6,id:72,w:5},"mem-prop-5x6--3c":{cels:1,h:6,id:73,w:5},"mem-prop-5x6--3d":{cels:1,h:6,id:74,w:5},"mem-prop-5x6--3e":{cels:1,h:6,id:75,w:5},"mem-prop-5x6--3f":{cels:1,h:6,id:76,w:5},"mem-prop-5x6--40":{cels:1,h:6,id:77,w:5},"mem-prop-5x6--41":{cels:1,h:6,id:78,w:5},"mem-prop-5x6--42":{cels:1,h:6,id:79,w:5},"mem-prop-5x6--43":{cels:1,h:6,id:80,w:5},"mem-prop-5x6--44":{cels:1,h:6,id:81,w:5},"mem-prop-5x6--45":{cels:1,h:6,id:82,w:5},"mem-prop-5x6--46":{cels:1,h:6,id:83,w:5},"mem-prop-5x6--47":{cels:1,h:6,id:84,w:5},"mem-prop-5x6--48":{cels:1,h:6,id:85,w:5},"mem-prop-5x6--49":{cels:1,h:6,id:86,w:5},"mem-prop-5x6--4a":{cels:1,h:6,id:87,w:5},"mem-prop-5x6--4b":{cels:1,h:6,id:88,w:5},"mem-prop-5x6--4c":{cels:1,h:6,id:89,w:5},"mem-prop-5x6--4d":{cels:1,h:6,id:90,w:5},"mem-prop-5x6--4e":{cels:1,h:6,id:91,w:5},"mem-prop-5x6--4f":{cels:1,h:6,id:92,w:5},"mem-prop-5x6--50":{cels:1,h:6,id:93,w:5},"mem-prop-5x6--51":{cels:1,h:6,id:94,w:5},"mem-prop-5x6--52":{cels:1,h:6,id:95,w:5},"mem-prop-5x6--53":{cels:1,h:6,id:96,w:5},"mem-prop-5x6--54":{cels:1,h:6,id:97,w:5},"mem-prop-5x6--55":{cels:1,h:6,id:98,w:5},"mem-prop-5x6--56":{cels:1,h:6,id:99,w:5},"mem-prop-5x6--57":{cels:1,h:6,id:100,w:5},"mem-prop-5x6--58":{cels:1,h:6,id:101,w:5},"mem-prop-5x6--59":{cels:1,h:6,id:102,w:5},"mem-prop-5x6--5a":{cels:1,h:6,id:103,w:5},"mem-prop-5x6--5b":{cels:1,h:6,id:104,w:5},"mem-prop-5x6--5c":{cels:1,h:6,id:105,w:5},"mem-prop-5x6--5d":{cels:1,h:6,id:106,w:5},"mem-prop-5x6--5e":{cels:1,h:6,id:107,w:5},"mem-prop-5x6--5f":{cels:1,h:6,id:108,w:5},"mem-prop-5x6--60":{cels:1,h:6,id:109,w:5},"mem-prop-5x6--61":{cels:1,h:6,id:110,w:5},"mem-prop-5x6--62":{cels:1,h:6,id:111,w:5},"mem-prop-5x6--63":{cels:1,h:6,id:112,w:5},"mem-prop-5x6--64":{cels:1,h:6,id:113,w:5},"mem-prop-5x6--65":{cels:1,h:6,id:114,w:5},"mem-prop-5x6--66":{cels:1,h:6,id:115,w:5},"mem-prop-5x6--67":{cels:1,h:6,id:116,w:5},"mem-prop-5x6--68":{cels:1,h:6,id:117,w:5},"mem-prop-5x6--69":{cels:1,h:6,id:118,w:5},"mem-prop-5x6--6a":{cels:1,h:6,id:119,w:5},"mem-prop-5x6--6b":{cels:1,h:6,id:120,w:5},"mem-prop-5x6--6c":{cels:1,h:6,id:121,w:5},"mem-prop-5x6--6d":{cels:1,h:6,id:122,w:5},"mem-prop-5x6--6e":{cels:1,h:6,id:123,w:5},"mem-prop-5x6--6f":{cels:1,h:6,id:124,w:5},"mem-prop-5x6--70":{cels:1,h:6,id:125,w:5},"mem-prop-5x6--71":{cels:1,h:6,id:126,w:5},"mem-prop-5x6--72":{cels:1,h:6,id:127,w:5},"mem-prop-5x6--73":{cels:1,h:6,id:128,w:5},"mem-prop-5x6--74":{cels:1,h:6,id:129,w:5},"mem-prop-5x6--75":{cels:1,h:6,id:130,w:5},"mem-prop-5x6--76":{cels:1,h:6,id:131,w:5},"mem-prop-5x6--77":{cels:1,h:6,id:132,w:5},"mem-prop-5x6--78":{cels:1,h:6,id:133,w:5},"mem-prop-5x6--79":{cels:1,h:6,id:134,w:5},"mem-prop-5x6--7a":{cels:1,h:6,id:135,w:5},"mem-prop-5x6--7b":{cels:1,h:6,id:136,w:5},"mem-prop-5x6--7c":{cels:1,h:6,id:137,w:5},"mem-prop-5x6--7d":{cels:1,h:6,id:138,w:5},"mem-prop-5x6--7e":{cels:1,h:6,id:139,w:5},"mem-prop-5x6--7f":{cels:1,h:6,id:140,w:5},"oidoid--Default":{cels:1,h:16,id:141,w:16},"poly--Triangle":{cels:1,h:32,id:142,w:32},"poly--Square":{cels:1,h:32,id:143,w:32}},celXY:[7,75,60,45,62,45,93,52,85,53,93,54,85,55,93,56,5,75,88,39,88,39,56,32,56,32,48,32,48,32,40,32,40,32,32,32,32,32,24,32,24,32,48,32,48,32,80,40,80,40,16,32,16,32,8,32,8,32,0,32,0,32,72,29,72,29,16,32,16,32,64,29,64,29,80,27,80,27,88,26,88,26,72,16,72,16,88,0,88,0,64,16,64,16,64,16,64,16,72,16,72,16,80,14,80,14,88,13,88,13,88,13,88,13,80,0,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,70,66,65,66,60,66,80,65,90,64,85,64,55,63,50,63,45,63,40,63,80,59,30,63,25,63,20,63,15,63,10,63,5,63,0,63,75,60,70,60,65,60,60,60,0,75,75,66,75,72,70,72,65,72,60,72,80,71,90,70,85,70,55,69,50,69,45,69,5,51,40,69,35,69,30,69,25,69,20,69,15,69,10,69,5,69,35,63,0,69,25,51,10,51,15,51,20,51,30,51,0,51,75,48,70,48,65,48,60,48,55,45,50,45,64,42,74,42,0,45,5,45,10,45,15,45,20,45,25,45,30,45,35,45,40,45,45,45,69,42,10,57,90,58,85,58,55,57,50,57,45,57,40,57,35,57,30,57,25,57,20,57,15,57,35,51,5,57,0,57,75,54,70,54,65,54,60,54,80,53,88,52,55,51,50,51,45,51,40,51,70,66,64,0,32,0,0,0]},input:"Default",mode:"Int"};var tt={$schema:"../level/level-file.v0.json",minWH:{w:320,h:240},zoo:{default:[{name:"Debug",debugInput:{}},{name:"Cam",cam:{}},{id:"Cursor",sprite:"cursor--Pointer",cursor:{}},{name:"FPS",fps:{},text:"",sprite:{z:"UIA"},textWH:{trim:"Descender"},hud:{origin:"SE",margin:4},textXY:{},override:{invalid:!1}},{name:"Overlay",sprite:{pool:"Overlay",tag:"background--GreyCheckerboard",w:4095,h:4095,z:"Top"}},{id:"RenderToggle",name:"RenderToggle",text:"render",sprite:{z:"UID"},textWH:{pad:2,scale:2,trim:"Leading"},hud:{origin:"NE",margin:{n:2,e:2}},ninePatch:{border:1,pad:2,patch:{center:"background--Grape",n:"background--Bubblegum",s:"background--Kiwi",w:"background--Strawberry",e:"background--Blueberry"}},button:{pressed:"background--Bubblegum",selected:"background--OrangeCheckerboard",type:"Toggle",z:"UIC"},renderToggle:{},textXY:{z:"UIE"}},{name:"Clock",text:"",sprite:{z:"UIF"},clock:{},textWH:{scale:2,trim:"Descender"},hud:{margin:{y:4},origin:"S"},textXY:{}},{name:"Logo",sprite:{tag:"oidoid--Default",z:"UIF"},hud:{origin:"SW",margin:4},rotate:{speed:-45}},{name:"Border",sprite:{z:"UIG"},hud:{origin:"NW",fill:"XY"},ninePatch:{patch:{n:"background--Black",s:"background--Black",w:"background--Black",e:"background--Black",nw:"background--Black",ne:"background--Black",sw:"background--Black",se:"background--Black"},border:1}},{name:"Backpacker",sprite:{tag:"backpacker--WalkRight",x:7,y:7,z:"C",stretch:!0,scale:5}},{name:"Triangle",sprite:{tag:"poly--Triangle",x:64,y:64,z:"C"},rotate:{speed:90}},{name:"Square",sprite:{tag:"poly--Square",x:64,y:64,z:"C"}},{name:"Tally",text:"",sprite:{z:"UIA"},tally:{},textWH:{},hud:{origin:"NE",margin:{n:4,e:60}},textXY:{},override:{invalid:!1}},{name:"Draw",draw:{}}]}};var re=class{query="cam";update(e,i){i.input.isAnyOnStart("U","D","L","R")&&i.cam.diagonalize(i.input.dir);let r=L(25*i.tick.s);i.cam.x+=i.input.dir.x*r,i.cam.y+=i.input.dir.y*r,i.input.wheel?.delta.xy.y&&(i.cam.zoomOut-=i.input.wheel.delta.client.y*.01),i.cam.update(i.canvas)}};var ne=class{query="clock & text";update(e){v(e,qt(new Date))}};function qt(t){let e=`${t.getHours()%12||12}`.padStart(2," "),i=`${t.getMinutes()}`.padStart(2,"0"),r=`${t.getSeconds()}`.padStart(2,"0");return`${e}:${i}:${r}`}var oe=class{query="draw";update(e,i){i.invalid&&(i.renderer.clear(i.backgroundRGBA),i.renderer.predraw(i.cam),i.renderer.setDepth(!0),i.renderer.draw(i.pool.default),i.renderer.setDepth(!1),i.renderer.draw(i.pool.overlay))}};var se=class{query="button & renderToggle & sprite";update(e,i){if(!e.button.started)return;i.renderer.always=T(e);let r=fe(location.href)?.split(",").filter(d=>d&&d!=="render=always")??[];i.renderer.always&&r.push("render=always");let n=new URL(location.href);n.searchParams.delete("debug");let o=[];n.searchParams.size&&o.push(`${n.searchParams}`),r.length&&o.push(`debug=${r.join(",")}`);let a=n.origin+n.pathname+(o.length?`?${o.join("&")}`:"")+n.hash;history.replaceState(history.state,"",a)}};var ae=class{query="rotate & sprite";update(e,i){e.sprite.angle+=e.rotate.speed*i.tick.s,e.invalid=!0}};var le=class{query="tally & text";update(e,i){e.tally.updates++;let r=[`${`${e.tally.updates}`.padStart(8," ")} updates`,`${`${i.renderer.clears+1}`.padStart(8," ")} renders`].join(`
173
+ `);v(e,r)}};var it=(t,e,i)=>{if(e[i]==null)throw Error("no component val");switch(i){case"clock":case"rotate":return e[i];case"renderToggle":if(!t.button)throw Error("no button in render toggle");return Se(t,l?.render==="always"),e[i];case"tally":return{updates:0}}};var de=class{cursor;#e;#t={button:new P,cursor:new A,debugInput:new H,fps:new Y,hud:new W,ninePatch:new k,override:new X,rotate:new ae,sprite:new z,textWH:new M,textXY:new _,cam:new re,clock:new ne,draw:new oe,renderToggle:new se,tally:new le};#i={default:new Set};update(e){switch(this.#e){case void 0:this.#r(e);break;case"Init":break;default:this.#e}for(let i of Object.values(this.#i))ze(i,this.#t,e)}#r(e){e.pool.overlay=G({atlas:e.atlas.default,looper:e.looper,pageBlocks:10}),e.setPoller((l?.seconds?1:60)*1e3,()=>Z(new Date,l?.seconds?"Sec":"Min")),this.#i=e.loadLevel(tt,"default",it),this.cursor=Xe(this.#i.default,"Cursor"),this.#e="Init"}};console.debug(`void v${Q.version}+${Q.published}.${Q.hash} \u2500\u2500\u2500oidoid>\xB0\u2500\u2500`);var rt=new ie({atlas:document.querySelector("#atlas"),config:et,description:je,loader:new de});rt.setPoller((l?.seconds?1:60)*1e3,()=>Z(new Date,l?.seconds?"Sec":"Min"));await rt.register("add");
174
+ //# sourceMappingURL=index.js.map
175
+ </script>
176
+
177
+
178
+ </body></html>
@@ -44,12 +44,12 @@
44
44
  "required": ["pressed", "selected"],
45
45
  "properties": {
46
46
  "pressed": {
47
- "$ref": "#/$defs/SpriteProps",
47
+ "$ref": "#/$defs/SpritePropsOrTag",
48
48
  "description": "pressed config.",
49
49
  "unevaluatedProperties": false
50
50
  },
51
51
  "selected": {
52
- "$ref": "#/$defs/SpriteProps",
52
+ "$ref": "#/$defs/SpritePropsOrTag",
53
53
  "description": "selected config.",
54
54
  "unevaluatedProperties": false
55
55
  },
@@ -57,7 +57,7 @@
57
57
  "description": "whether to operate as push to engage or push to toggle.",
58
58
  "enum": ["Button", "Toggle"]
59
59
  },
60
- "z": { "$ref": "#/$defs/Layer" }
60
+ "z": { "$ref": "#/$defs/Layer", "unevaluatedProperties": false }
61
61
  }
62
62
  },
63
63
  "Cam": {
@@ -74,7 +74,8 @@
74
74
  "properties": {
75
75
  "keyboard": {
76
76
  "$ref": "#/$defs/Speed",
77
- "description": "if greater than zero, follow keyboard movement in pixels per second."
77
+ "description": "if greater than zero, follow keyboard movement in pixels per second.",
78
+ "unevaluatedProperties": false
78
79
  },
79
80
  "pick": {
80
81
  "$ref": "tags.json",
@@ -82,6 +83,12 @@
82
83
  }
83
84
  }
84
85
  },
86
+ "SpritePropsOrTag": {
87
+ "oneOf": [
88
+ { "$ref": "tags.json" },
89
+ { "$ref": "#/$defs/SpriteProps", "unevaluatedProperties": false }
90
+ ]
91
+ },
85
92
  "DebugInput": { "type": "object", "description": "debug input config." },
86
93
  "Draw": { "type": "object", "description": "draw config." },
87
94
  "Ent": {
@@ -108,8 +115,13 @@
108
115
  "$ref": "#/$defs/Override",
109
116
  "unevaluatedProperties": false
110
117
  },
111
- "sprite": { "$ref": "#/$defs/Sprite", "unevaluatedProperties": false },
112
- "text": { "$ref": "#/$defs/Text" },
118
+ "sprite": {
119
+ "oneOf": [
120
+ { "$ref": "tags.json" },
121
+ { "$ref": "#/$defs/Sprite", "unevaluatedProperties": false }
122
+ ]
123
+ },
124
+ "text": { "$ref": "#/$defs/Text", "unevaluatedProperties": false },
113
125
  "textWH": { "$ref": "#/$defs/TextWH", "unevaluatedProperties": false },
114
126
  "textXY": { "$ref": "#/$defs/TextXY", "unevaluatedProperties": false }
115
127
  }
@@ -132,7 +144,8 @@
132
144
  "properties": {
133
145
  "fill": {
134
146
  "$ref": "#/$defs/XYFlag",
135
- "description": "whether to adjust the width or height to fill empty space."
147
+ "description": "whether to adjust the width or height to fill empty space.",
148
+ "unevaluatedProperties": false
136
149
  },
137
150
  "margin": {
138
151
  "$ref": "#/$defs/Border",
@@ -148,7 +161,8 @@
148
161
  },
149
162
  "origin": {
150
163
  "$ref": "#/$defs/CompassDir",
151
- "description": "position relative to."
164
+ "description": "position relative to.",
165
+ "unevaluatedProperties": false
152
166
  }
153
167
  }
154
168
  },
@@ -197,47 +211,47 @@
197
211
  "unevaluatedProperties": false,
198
212
  "properties": {
199
213
  "center": {
200
- "$ref": "#/$defs/SpriteProps",
214
+ "$ref": "#/$defs/SpritePropsOrTag",
201
215
  "description": "center patch config.",
202
216
  "unevaluatedProperties": false
203
217
  },
204
218
  "n": {
205
- "$ref": "#/$defs/SpriteProps",
219
+ "$ref": "#/$defs/SpritePropsOrTag",
206
220
  "description": "north patch config.",
207
221
  "unevaluatedProperties": false
208
222
  },
209
223
  "s": {
210
- "$ref": "#/$defs/SpriteProps",
224
+ "$ref": "#/$defs/SpritePropsOrTag",
211
225
  "description": "south patch config.",
212
226
  "unevaluatedProperties": false
213
227
  },
214
228
  "w": {
215
- "$ref": "#/$defs/SpriteProps",
229
+ "$ref": "#/$defs/SpritePropsOrTag",
216
230
  "description": "west patch config.",
217
231
  "unevaluatedProperties": false
218
232
  },
219
233
  "e": {
220
- "$ref": "#/$defs/SpriteProps",
234
+ "$ref": "#/$defs/SpritePropsOrTag",
221
235
  "description": "east patch config.",
222
236
  "unevaluatedProperties": false
223
237
  },
224
238
  "nw": {
225
- "$ref": "#/$defs/SpriteProps",
239
+ "$ref": "#/$defs/SpritePropsOrTag",
226
240
  "description": "northwest patch config.",
227
241
  "unevaluatedProperties": false
228
242
  },
229
243
  "ne": {
230
- "$ref": "#/$defs/SpriteProps",
244
+ "$ref": "#/$defs/SpritePropsOrTag",
231
245
  "description": "northeast patch config.",
232
246
  "unevaluatedProperties": false
233
247
  },
234
248
  "sw": {
235
- "$ref": "#/$defs/SpriteProps",
249
+ "$ref": "#/$defs/SpritePropsOrTag",
236
250
  "description": "southwest patch config.",
237
251
  "unevaluatedProperties": false
238
252
  },
239
253
  "se": {
240
- "$ref": "#/$defs/SpriteProps",
254
+ "$ref": "#/$defs/SpritePropsOrTag",
241
255
  "description": "southeast patch config.",
242
256
  "unevaluatedProperties": false
243
257
  }
@@ -274,6 +288,10 @@
274
288
  { "$ref": "#/$defs/XY" }
275
289
  ],
276
290
  "properties": {
291
+ "angle": {
292
+ "type": "number",
293
+ "description": "sprite rotation in degrees."
294
+ },
277
295
  "scale": {
278
296
  "oneOf": [
279
297
  { "type": "integer", "minimum": 1 },
@@ -289,30 +307,25 @@
289
307
  "SpritePool": { "type": "string", "description": "allocator pool." },
290
308
  "SpriteProps": {
291
309
  "description": "sprite config except box-related.",
292
- "oneOf": [
293
- { "$ref": "tags.json" },
294
- {
295
- "type": "object",
296
- "properties": {
297
- "flip": { "$ref": "#/$defs/XYFlag" },
298
- "pool": { "$ref": "#/$defs/SpritePool" },
299
- "stretch": {
300
- "type": "boolean",
301
- "description": "wrap texture (default) or stretch to width and height."
302
- },
303
- "tag": { "$ref": "tags.json" },
304
- "visible": {
305
- "type": "boolean",
306
- "description": "whether sprite is rendered. defaults to true when tag is specified."
307
- },
308
- "z": { "$ref": "#/$defs/Layer" },
309
- "zend": {
310
- "type": "boolean",
311
- "description": "z-order by top (default) or bottom of box."
312
- }
313
- }
310
+ "type": "object",
311
+ "properties": {
312
+ "flip": { "$ref": "#/$defs/XYFlag", "unevaluatedProperties": false },
313
+ "hidden": {
314
+ "type": "boolean",
315
+ "description": "whether sprite is not rendered. defaults to true when tag is unspecified."
316
+ },
317
+ "pool": { "$ref": "#/$defs/SpritePool", "unevaluatedProperties": false },
318
+ "stretch": {
319
+ "type": "boolean",
320
+ "description": "wrap texture (default) or stretch to width and height."
321
+ },
322
+ "tag": { "$ref": "tags.json" },
323
+ "z": { "$ref": "#/$defs/Layer", "unevaluatedProperties": false },
324
+ "zend": {
325
+ "type": "boolean",
326
+ "description": "z-order by top (default) or bottom of box."
314
327
  }
315
- ]
328
+ }
316
329
  },
317
330
  "Text": { "type": "string", "description": "string." },
318
331
  "TextWH": {
@@ -327,7 +340,8 @@
327
340
  },
328
341
  "origin": {
329
342
  "$ref": "#/$defs/CompassDir",
330
- "description": "position relative to."
343
+ "description": "position relative to.",
344
+ "unevaluatedProperties": false
331
345
  },
332
346
  "pad": {
333
347
  "$ref": "#/$defs/Border",
@@ -348,7 +362,9 @@
348
362
  "TextXY": {
349
363
  "type": "object",
350
364
  "description": "text XY config.",
351
- "properties": { "z": { "$ref": "#/$defs/Layer" } }
365
+ "properties": {
366
+ "z": { "$ref": "#/$defs/Layer", "unevaluatedProperties": false }
367
+ }
352
368
  },
353
369
  "UIntXY": {
354
370
  "$ref": "#/$defs/IntXY",
@@ -359,40 +375,18 @@
359
375
  },
360
376
  "WH": {
361
377
  "type": "object",
362
- "description": "area.",
378
+ "description": "area. sprite dimensions have an integral range of [0, 4095].",
363
379
  "properties": {
364
- "w": {
365
- "type": "integer",
366
- "description": "width.",
367
- "minimum": 0,
368
- "maximum": 4095
369
- },
370
- "h": {
371
- "type": "integer",
372
- "description": "height.",
373
- "minimum": 0,
374
- "maximum": 4095
375
- }
380
+ "w": { "type": "number", "description": "width." },
381
+ "h": { "type": "number", "description": "height." }
376
382
  }
377
383
  },
378
384
  "XY": {
379
385
  "type": "object",
380
- "description": "horizontal and vertical dimensions.",
386
+ "description": "horizontal and vertical dimensions. sprite coordinates have a range of [-131072, 131071.984375] with a granularity of .015625.",
381
387
  "properties": {
382
- "x": {
383
- "type": "number",
384
- "description": "horizontal dimension.",
385
- "minimum": -131072,
386
- "maximum": 131071.984375,
387
- "multipleOf": 0.015625
388
- },
389
- "y": {
390
- "type": "number",
391
- "description": "vertical dimension.",
392
- "minimum": -131072,
393
- "maximum": 131071.984375,
394
- "multipleOf": 0.015625
395
- }
388
+ "x": { "type": "number", "description": "horizontal dimension." },
389
+ "y": { "type": "number", "description": "vertical dimension." }
396
390
  }
397
391
  },
398
392
  "XYFlag": {
@@ -410,7 +404,8 @@
410
404
  },
411
405
  "background": {
412
406
  "$ref": "#/$defs/RGBA",
413
- "description": "render clear color."
407
+ "description": "render clear color.",
408
+ "unevaluatedProperties": false
414
409
  },
415
410
  "minScale": {
416
411
  "type": "number",
@@ -422,8 +417,8 @@
422
417
  "description": "min cam dimensions. infinity always uses min scale. defaults to infinity.",
423
418
  "unevaluatedProperties": false,
424
419
  "properties": {
425
- "w": { "$ref": "#/$defs/UnboundedUInt" },
426
- "h": { "$ref": "#/$defs/UnboundedUInt" }
420
+ "w": { "$ref": "#/$defs/UnboundedUInt", "unevaluatedProperties": false },
421
+ "h": { "$ref": "#/$defs/UnboundedUInt", "unevaluatedProperties": false }
427
422
  }
428
423
  },
429
424
  "zoo": {
@@ -431,8 +426,12 @@
431
426
  "description": "zoo config.",
432
427
  "required": ["default"],
433
428
  "unevaluatedProperties": false,
434
- "properties": { "default": { "$ref": "#/$defs/EntList" } },
435
- "patternProperties": { ".+": { "$ref": "#/$defs/EntList" } }
429
+ "properties": {
430
+ "default": { "$ref": "#/$defs/EntList", "unevaluatedProperties": false }
431
+ },
432
+ "patternProperties": {
433
+ ".+": { "$ref": "#/$defs/EntList", "unevaluatedProperties": false }
434
+ }
436
435
  },
437
436
  "zoomOut": {
438
437
  "type": "number",