super-patience 1.2.4
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.
- package/dist/package-lock.json +1356 -0
- package/dist/package.json +63 -0
- package/dist/public/atlas.webp +0 -0
- package/dist/public/favicon/favicon16.webp +0 -0
- package/dist/public/favicon/favicon192.webp +0 -0
- package/dist/public/favicon/favicon32.webp +0 -0
- package/dist/public/favicon/favicon48.webp +0 -0
- package/dist/public/favicon/favicon64.webp +0 -0
- package/dist/public/index.js +101 -0
- package/dist/public/index.js.map +7 -0
- package/dist/public/super-patience-v1.2.4+20251227.9c5b3f4.html +114 -0
- package/dist/src/assets/manifest.json +41 -0
- package/dist/src/assets/void.game.json +540 -0
- package/dist/src/ents/board.d.ts +7 -0
- package/dist/src/ents/board.d.ts.map +1 -0
- package/dist/src/ents/board.js +124 -0
- package/dist/src/ents/board.js.map +1 -0
- package/dist/src/ents/cam.d.ts +7 -0
- package/dist/src/ents/cam.d.ts.map +1 -0
- package/dist/src/ents/cam.js +9 -0
- package/dist/src/ents/cam.js.map +1 -0
- package/dist/src/ents/draw.d.ts +7 -0
- package/dist/src/ents/draw.d.ts.map +1 -0
- package/dist/src/ents/draw.js +12 -0
- package/dist/src/ents/draw.js.map +1 -0
- package/dist/src/ents/ent.d.ts +32 -0
- package/dist/src/ents/ent.d.ts.map +1 -0
- package/dist/src/ents/ent.js +2 -0
- package/dist/src/ents/ent.js.map +1 -0
- package/dist/src/ents/loader.d.ts +6 -0
- package/dist/src/ents/loader.d.ts.map +1 -0
- package/dist/src/ents/loader.js +43 -0
- package/dist/src/ents/loader.js.map +1 -0
- package/dist/src/ents/patience-the-demon.d.ts +7 -0
- package/dist/src/ents/patience-the-demon.d.ts.map +1 -0
- package/dist/src/ents/patience-the-demon.js +39 -0
- package/dist/src/ents/patience-the-demon.js.map +1 -0
- package/dist/src/ents/pile-hitbox.d.ts +8 -0
- package/dist/src/ents/pile-hitbox.d.ts.map +1 -0
- package/dist/src/ents/pile-hitbox.js +29 -0
- package/dist/src/ents/pile-hitbox.js.map +1 -0
- package/dist/src/ents/tally.d.ts +7 -0
- package/dist/src/ents/tally.d.ts.map +1 -0
- package/dist/src/ents/tally.js +11 -0
- package/dist/src/ents/tally.js.map +1 -0
- package/dist/src/ents/vacant-stock.d.ts +7 -0
- package/dist/src/ents/vacant-stock.d.ts.map +1 -0
- package/dist/src/ents/vacant-stock.js +15 -0
- package/dist/src/ents/vacant-stock.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +26 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/level/ent-factory.d.ts +4 -0
- package/dist/src/level/ent-factory.d.ts.map +1 -0
- package/dist/src/level/ent-factory.js +91 -0
- package/dist/src/level/ent-factory.js.map +1 -0
- package/dist/src/level/level-file.json +58 -0
- package/dist/src/level/level-parser.d.ts +5 -0
- package/dist/src/level/level-parser.d.ts.map +1 -0
- package/dist/src/level/level-parser.js +24 -0
- package/dist/src/level/level-parser.js.map +1 -0
- package/dist/src/level/level-schema.d.ts +6 -0
- package/dist/src/level/level-schema.d.ts.map +1 -0
- package/dist/src/level/level-schema.js +2 -0
- package/dist/src/level/level-schema.js.map +1 -0
- package/dist/src/level/level.d.ts +11 -0
- package/dist/src/level/level.d.ts.map +1 -0
- package/dist/src/level/level.js +102 -0
- package/dist/src/level/level.js.map +1 -0
- package/dist/src/types/decl.d.ts +31 -0
- package/dist/src/types/decl.d.ts.map +1 -0
- package/dist/src/types/decl.js +2 -0
- package/dist/src/types/decl.js.map +1 -0
- package/dist/src/types/save.d.ts +5 -0
- package/dist/src/types/save.d.ts.map +1 -0
- package/dist/src/types/save.js +2 -0
- package/dist/src/types/save.js.map +1 -0
- package/dist/tsconfig.json +47 -0
- package/dist/void.json +13 -0
- package/license.text +661 -0
- package/package.json +63 -0
- package/readme.md +30 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"author": "Stephen Niedzielski <stephen@oidoid.com> (https://oidoid.com)",
|
|
3
|
+
"bugs": "https://github.com/oidoid/super-patience/issues",
|
|
4
|
+
"description": "Pixelated solitaire.",
|
|
5
|
+
"devDependencies": {
|
|
6
|
+
"@oidoid/void": "0.1.0",
|
|
7
|
+
"klondike-solitaire": "0.1.0-1",
|
|
8
|
+
"prettier": "3.7.4",
|
|
9
|
+
"typescript": "5.9.3"
|
|
10
|
+
},
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=24.0"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"!dist/meta.json",
|
|
17
|
+
"!dist/public/**/*.png",
|
|
18
|
+
"!dist/tsconfig.tsbuildinfo"
|
|
19
|
+
],
|
|
20
|
+
"homepage": "https://github.com/oidoid/super-patience",
|
|
21
|
+
"keywords": [
|
|
22
|
+
"solitaire",
|
|
23
|
+
"patience",
|
|
24
|
+
"canfield",
|
|
25
|
+
"game",
|
|
26
|
+
"webgl"
|
|
27
|
+
],
|
|
28
|
+
"license": "AGPL-3.0-only",
|
|
29
|
+
"name": "super-patience",
|
|
30
|
+
"prettier": {
|
|
31
|
+
"arrowParens": "avoid",
|
|
32
|
+
"bracketSpacing": false,
|
|
33
|
+
"jsxSingleQuote": true,
|
|
34
|
+
"proseWrap": "always",
|
|
35
|
+
"semi": false,
|
|
36
|
+
"singleQuote": true,
|
|
37
|
+
"trailingComma": "none"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"published": "20251227",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "git+https://github.com/oidoid/super-patience.git"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"build": "tsc --build && npm run build:favicon && void --minify --one-file && npm run format -- src/assets/void.game.json",
|
|
49
|
+
"build:favicon": "for s in 1 2 3 4 12; do f=dist/public/favicon/favicon$(($s * 16)); aseprite src/assets/favicon.aseprite --batch --color-mode=indexed --scale=$s --save-as=$f.png && cwebp -exact -lossless -mt -quiet -z 9 $f.png -o $f.webp; done",
|
|
50
|
+
"clean": "rm -rf dist",
|
|
51
|
+
"format": "npm run linter -- --write",
|
|
52
|
+
"lint": "npm run linter -- --check",
|
|
53
|
+
"linter": "prettier --cache --log-level warn './**/*.{json,md,ts,yaml}'",
|
|
54
|
+
"preversion": "[ -z \"$(git status -z)\" ]",
|
|
55
|
+
"prepublishOnly": "! git symbolic-ref --quiet HEAD || git push --follow-tags origin \"$(git branch --show-current)\"",
|
|
56
|
+
"start": "tsc --build --preserveWatchOutput --watch& npm run build:favicon && void --watch& wait",
|
|
57
|
+
"test": "npm run lint && npm run test:unit && npm run build",
|
|
58
|
+
"test:unit": "sh -c 'node --experimental-test-coverage --test ${@:-$(find src -name \\*.test.ts -printf %p\\ )}' --",
|
|
59
|
+
"version": "npm pkg set published=$(date +%Y%m%d) && npm run clean && npm test"
|
|
60
|
+
},
|
|
61
|
+
"type": "module",
|
|
62
|
+
"version": "1.2.4"
|
|
63
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
var s={hash:"9c5b3f4",published:"20251227",version:"1.2.4"};var Zt={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 V=Zt;var I=class{query="button & sprite";free(t){ri(t)}update(t,i){if(!t.invalid&&!i.input.invalid)return;t.invalid=!0;let{button:r}=t,o=r.type==="Toggle";r.pressed.x=t.sprite.x,r.pressed.y=t.sprite.y,r.pressed.w=t.sprite.w,r.pressed.h=t.sprite.h,r.selected.x=t.sprite.x,r.selected.y=t.sprite.y,r.selected.w=t.sprite.w,r.selected.h=t.sprite.h;let n=!!i.zoo.cursor&&i.zoo.cursor.sprite.hitsZ(t.sprite,i.cam),a=n&&i.input.isOnStart("A")?o?!St(t):!0:o?St(t):i.input.isOn("A")||!!i.zoo.cursor?.cursor.keyboard&&i.input.isOn("A");r.started=St(t)!==a,r.pressed.visible=a,r.selected.visible=n,i.input.handled||=n}};function ri(e){e.button.pressed.free(),e.button.selected.free(),e.invalid=!0}function St(e){return e.button.pressed.visible}var h={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 A(e){return e>=h.UIA}function Jt(e,t){e.x=t.x,e.y=t.y,e.w=t.w,e.h=t.h}function b(e,t){let i={w:t.w??1,h:t.h??1};if(!e.w||!e.h||!i.w||!i.h)return!1;let r={x:e.x??0,y:e.y??0};return r.x<t.x+i.w&&r.x+e.w>t.x&&r.y<t.y+i.h&&r.y+e.h>t.y}function Qt(e,t){return e.w===t.w&&e.h===t.h}function jt(e,t){return{x:e.x+t.x,y:e.y+t.y}}function te(e,t){return oi(Et(e,t))}function oi(e){return Math.hypot(e.x,e.y)}function ee(e,t){return{x:Math.max(e.x,t.x),y:Math.max(e.y,t.y)}}function ie(e,t){return{x:Math.min(e.x,t.x),y:Math.min(e.y,t.y)}}function Et(e,t){return{x:e.x-t.x,y:e.y-t.y}}function L(e,t){return(e%t+t)%t}var w=16,Tt=1/64,re={w:4095,h:4095},Ct=class{i;#t;constructor(t,i){this.#t=t,this.i=i}above(t){return(this.z===t.z?(this.zend?this.y+this.h:this.y)-(t.zend?t.y+t.h:t.y):this.z-t.z)>0}get cel(){return this.#t.view.getUint8(this.i+10)&31}set cel(t){let i=this.#t.view.getUint8(this.i+10);this.#t.view.setUint8(this.i+10,i&-32|t&31)}get clipbox(){return{x:this.x,y:this.y,w:this.w,h:this.h}}clips(t){return b(this,t)}clipsZ(t,i){if(this.ui===t.ui)return this.clips(t);let r={x:t.x+(t.ui?1:-1)*Math.floor(i.x),y:t.y+(t.ui?1:-1)*Math.floor(i.y),w:t.w,h:t.h};return b(this,r)}get flipX(){return!!(this.#t.view.getUint8(this.i+6)&64)}set flipX(t){let i=this.#t.view.getUint8(this.i+6);this.#t.view.setUint8(this.i+6,i&-65|-t&64)}get flipY(){return!!(this.#t.view.getUint8(this.i+6)&32)}set flipY(t){let i=this.#t.view.getUint8(this.i+6);this.#t.view.setUint8(this.i+6,i&-33|-t&32)}free(){this.#t.free(this)}get h(){return this.#t.view.getUint16(this.i+8,!0)>>>4}set h(t){let i=this.#t.view.getUint16(this.i+8,!0);this.#t.view.setUint16(this.i+8,i&-65521|(t&4095)<<4,!0)}get id(){return this.#t.view.getUint16(this.i+10,!0)>>>5&2047}set id(t){let i=this.#t.view.getUint16(this.i+10,!0);this.#t.view.setUint16(this.i+10,i&-65505|(t&2047)<<5,!0)}init(){this.cel=0,this.flipX=!1,this.flipY=!1,this.h=0,this.id=0,this.stretch=!1,this.visible=!0,this.w=0,this.x=0,this.y=0,this.z=h.Bottom,this.zend=!1}get stretch(){return!!(this.#t.view.getUint8(this.i+6)&128)}set stretch(t){let i=this.#t.view.getUint8(this.i+6);this.#t.view.setUint8(this.i+6,i&-129|-t&128)}get ui(){return A(this.z)}get visible(){return(this.#t.view.getUint8(this.i+12)&1)===1}set visible(t){let i=this.#t.view.getUint8(this.i+12);this.#t.view.setUint8(this.i+12,i&-2|(t?1:0))}get w(){return this.#t.view.getUint16(this.i+7,!0)&4095}set w(t){let i=this.#t.view.getUint16(this.i+7,!0);this.#t.view.setUint16(this.i+7,i&-4096|t&4095,!0)}get x(){return(this.#t.view.getUint32(this.i+0,!0)<<8>>8)/64}set x(t){let i=this.#t.view.getUint32(this.i+0,!0);this.#t.view.setUint32(this.i+0,i&-16777216|t*64&16777215,!0)}get y(){return(this.#t.view.getUint32(this.i+3,!0)<<8>>8)/64}set y(t){let i=this.#t.view.getUint32(this.i+3,!0);this.#t.view.setUint32(this.i+3,i&-16777216|t*64&16777215,!0)}get z(){return this.#t.view.getUint8(this.i+6)&15}set z(t){let i=this.#t.view.getUint8(this.i+6);this.#t.view.setUint8(this.i+6,i&-16|t&15)}get zend(){return!!(this.#t.view.getUint8(this.i+6)&16)}set zend(t){let i=this.#t.view.getUint8(this.i+6);this.#t.view.setUint8(this.i+6,i&-17|-t&16)}},M=class e extends Ct{#t;#i;#e;#r;constructor(t,i,r,o){super(t,i),this.#t=r,this.#r=o}get anim(){return this.#t.anim[this.tag]}diagonalize(t){_t(this,t.x*t.y)}get flipX(){return super.flipX}set flipX(t){this.flipX!==t&&(super.flipX=t,this.#i=void 0,this.#e=void 0)}get flipY(){return super.flipY}set flipY(t){this.flipY!==t&&(super.flipY=t,this.#i=void 0,this.#e=void 0)}get h(){return super.h}set h(t){this.h!==t&&(super.h=t,this.#i=void 0,this.#e=void 0)}get hitbox(){if(this.#i)return this.#i;let{hitbox:t}=this.anim;if(t)return this.#i??={x:Math.floor(this.x+(this.flipX?this.w-t.w-t.x:t.x)),y:Math.floor(this.y+(this.flipY?this.h-t.h-t.y:t.y)),w:t.w,h:t.h}}hits(t){let i=t instanceof e?t.hurtbox??t:t;return b(this.hitbox??this,i)}hitsZ(t,i){if(this.ui===t.ui)return this.hits(t);let r={...t.hurtbox??t.clipbox};return r.x+=(t.ui?1:-1)*Math.floor(i.x),r.y+=(t.ui?1:-1)*Math.floor(i.y),b(this.hitbox??this,r)}get hurtbox(){if(this.#e)return this.#e;let{hurtbox:t}=this.anim;if(t)return this.#e??={x:Math.floor(this.x+(this.flipX?this.w-t.w-t.x:t.x)),y:Math.floor(this.y+(this.flipY?this.h-t.h-t.y:t.y)),w:t.w,h:t.h}}get id(){return super.id}set id(t){this.id!==t&&(super.id=t,this.#i=void 0,this.#e=void 0)}get looped(){return L(this.looperCel-this.cel,32)>=this.anim.cels}get looperCel(){return this.#r.age/62.5%(this.anim.cels*2)}reset(){this.cel=this.looperCel}get tag(){return this.#t.tags[this.id]}set tag(t){let i=this.#t.anim[t];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(t){this.w!==t&&(super.w=t,this.#i=void 0,this.#e=void 0)}get x(){return super.x}set x(t){this.x!==t&&(super.x=t,this.#i=void 0,this.#e=void 0)}get y(){return super.y}set y(t){this.y!==t&&(super.y=t,this.#i=void 0,this.#e=void 0)}};function _t(e,t){t&&(e.x=Math.floor(e.x)+.5,e.y=Math.floor(e.y)+.5-(t>0?0:Tt))}function oe(e){return Math.trunc(e/Tt)*Tt}var q=class{query="cursor & sprite";update(t,i){i.input.point?.invalid&&si(t,i.input.point),ai(t,i),t.cursor.keyboard&&(i.input.dir.x||i.input.dir.y||!i.input.point&&i.input.isAnyStarted("A"))&&ni(t,i.input,i.tick.s),t.cursor.pick&&(t.sprite.tag=i.input.isOn("A")?t.cursor.pick:t.cursor.point)}};function ni(e,t,i){let r=oe(e.cursor.keyboard*i);t.isAnyOnStart("U","D","L","R")&&t.dir.x&&t.dir.y&&e.sprite.diagonalize(t.dir),t.dir.x&&(e.sprite.x=Math.min(e.cursor.bounds.x+e.cursor.bounds.w,Math.max(e.cursor.bounds.x,e.sprite.x+t.dir.x*r))),t.dir.y&&(e.sprite.y=Math.min(e.cursor.bounds.y+e.cursor.bounds.h,Math.max(e.cursor.bounds.y,e.sprite.y+t.dir.y*r))),e.sprite.z=h.Top,e.sprite.visible=!0,e.invalid=!0}function si(e,t){e.sprite.x=t.local.x,e.sprite.y=t.local.y,e.sprite.z=h.Top,e.sprite.visible=t.type==="Mouse",e.invalid=!0}function ai(e,t){t.cam.invalid&&(e.cursor.bounds.x=-e.sprite.w,e.cursor.bounds.y=-e.sprite.h,e.cursor.bounds.w=t.cam.w+e.sprite.w,e.cursor.bounds.h=t.cam.h+e.sprite.h)}var l=ci(globalThis.location?.href);function ci(e){if(!e)return;let t=[...new URL(e).searchParams].find(([n])=>n.toLowerCase()==="debug")?.[1];if(t==null)return;let i=Object.fromEntries(t.split(",").filter(Boolean).map(n=>n.split("="))),r={};for(let n in i)r[n.toLowerCase()]=i[n]||"true";let o={cam:"",input:"",mem:"",render:""};return new Proxy(r,{get(n,a){if(typeof a!="string"||(a=a.toLowerCase(),n[a]))return n[a];if(!t||"all"in i||a in o&&"void"in i)return"true"}})}var R=class{query="debugInput";update(t,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 o=i.input.combo;o.length>1&&r&&console.debug(`[input] combo: ${o.map(n=>n.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 zt(e){return e.split(" | ").sort(ne).map(t=>t.split(" & ").sort(ne))}function ne(e,t){return e.localeCompare(t,"en")}var H=class{query="fps & text";update(t){let i=performance.now();i-t.fps.next.created>=1e3&&(t.fps.prevFrames=t.fps.next.frames,t.fps.next={created:i,frames:0}),t.fps.next.frames++,t.text=t.fps.prevFrames.toString().padStart(3," "),t.invalid=!0}};var W=class{query="hud & sprite";update(t,i){if(!t.invalid&&!i.cam.invalid)return;let r=i.cam.follow(t.sprite,t.sprite.z,t.hud.origin,t.hud);Jt(t.sprite,r),t.invalid=!0}};var Y=class{query="ninePatch & sprite";free(t){hi(t)}update(t){if(!t.invalid)return;let i=li(t);pi(t,i),ui(t),di(t,i)}};function hi(e){e.ninePatch.patch.w?.free(),e.ninePatch.patch.nw?.free(),e.ninePatch.patch.n?.free(),e.ninePatch.patch.ne?.free(),e.ninePatch.patch.e?.free(),e.ninePatch.patch.se?.free(),e.ninePatch.patch.s?.free(),e.ninePatch.patch.sw?.free(),e.ninePatch.patch.center?.free(),e.invalid=!0}function li(e){let{sprite:t,ninePatch:i}=e;return{x:t.x+i.pad.w,y:t.y+i.pad.n}}function ui(e){let{border:t,pad:i,patch:r}=e.ninePatch,o=e.sprite.w-t.w-t.e-i.w-i.e,n=e.sprite.h-t.n-t.s-i.n-i.s;r.n&&(r.n.w=o),r.s&&(r.s.w=o),r.w&&(r.w.h=n),r.e&&(r.e.h=n),r.center&&(r.center.w=o,r.center.h=n)}function di(e,t){let{patch:i,pad:r,border:o}=e.ninePatch,n={x:e.sprite.x+e.sprite.w-o.e-r.e,y:e.sprite.y+e.sprite.h-o.s-r.s};i.ne&&(i.ne.x=n.x,i.ne.y=t.y),i.e&&(i.e.x=n.x,i.e.y=t.y+o.n),i.se&&(i.se.x=n.x,i.se.y=n.y),i.s&&(i.s.x=t.x+o.w,i.s.y=n.y),i.sw&&(i.sw.x=t.x,i.sw.y=n.y)}function pi(e,t){let{border:i,patch:r}=e.ninePatch;r.nw&&(r.nw.x=t.x,r.nw.y=t.y),r.w&&(r.w.x=t.x,r.w.y=t.y+i.n),r.n&&(r.n.x=t.x+i.w,r.n.y=t.y),r.center&&(r.center.x=t.x+i.w,r.center.y=t.y+i.n)}var U=class{query="override";update(t){t.override.invalid!=null&&(t.invalid=t.override.invalid)}};var F=class{query="sprite";free(t){t.sprite.free(),t.invalid=!0}};function se(e,t){let i=t.codePointAt(0);return(i==null||i>255)&&(i=63),`${e.id}--${i.toString(16).padStart(2,"0")}`}function kt(e,t){return e.cellH-(e.descends[t]?0:e.baseline)}function ae(e,t,i){return t===`
|
|
2
|
+
`||i==null||i===`
|
|
3
|
+
`?e.endOfLineKerning:e.kerning[t+i]!=null?e.kerning[t+i]:/^\s?$/.test(t)||/^\s?$/.test(i)?e.defaultWhitespaceKerning:e.defaultKerning}function Vt(e,t){return e.charW[t]??e.defaultCharW}function he(e){let t=[],i=e.scale??1,r=e.start??{x:0,y:0},o=e.maxW??1/0,n={x:r.x,y:r.y},a=0,c=0;for(;t.length<e.text.length;){let d=t.length,f=e.text[d],u;f===`
|
|
4
|
+
`?u=fi(e.font,n,r.x,i,a):/^\s*$/.test(f)?u=xi(e.font,n,o,le(e.font,f,e.text[d+1],i),r.x,i,c,f,a):(u=ce(e.font,n,o,e.text,d,r.x,i,c,a),n.x>0&&u.cursor.y===E(e.font,r.x,n.y,i).y&&o-n.x+u.cursor.x<=o&&(n=E(e.font,r.x,n.y,i),u=ce(e.font,n,o,e.text,d,r.x,i,c,a))),t.push(...u.chars),n.x=u.cursor.x,n.y=u.cursor.y,a=u.w,c=u.trimmedLineH}return{chars:t,cursor:n,w:a,h:E(e.font,n.x,n.y,i).y-r.y,trimmedH:n.y+c*i-r.y}}function ce(e,t,i,r,o,n,a,c,d){let f=[],{x:u,y}=t;for(;;o++){let k=r[o];if(!k||/^\s*$/.test(k))break;let Nt=kt(e,k),Gt=le(e,k,r[o+1],a),Kt=u>n&&u+Gt>n+i;Kt&&({x:u,y}=E(e,n,y,a)),c=Kt?Nt:Math.max(c,Nt),f.push({x:u,y,w:Vt(e,k),h:e.cellH}),u+=Gt,d=Math.max(d,u-n)}return{chars:f,cursor:{x:u,y},trimmedLineH:c,w:d}}function E(e,t,i,r){return{x:t,y:i+e.lineH*r}}function fi(e,t,i,r,o){let n=E(e,i,t.y,r);return{chars:[void 0],cursor:n,trimmedLineH:0,w:Math.max(o,t.x-i)}}function xi(e,t,i,r,o,n,a,c,d){let f=t.x>o&&t.x+r>=i?E(e,o,t.y,n):{x:t.x+r,y:t.y},u=kt(e,c);return{chars:[void 0],cursor:f,trimmedLineH:t.y===f.y?Math.max(a,u):u,w:Math.max(d,t.x-o)}}function le(e,t,i,r){return r*(Vt(e,t)+ae(e,t,i))}var $=class{query="sprite & text & textWH";update(t){t.invalid&&mi(t)}},X=class{query="sprite & text & textWH & textXY";free(t){for(let i of t.textXY.chars)i.free();t.textXY.chars.length=0,t.invalid=!0}update(t,i){t.invalid&&yi(t,i)}};function mi(e){let t=he({font:V,maxW:e.textWH.maxW,scale:e.textWH.scale,start:{x:0,y:0},text:e.text});e.textWH.layout=t;let i=t.w+e.textWH.pad.w+e.textWH.pad.e,r=(e.textWH.trim==="Leading"?t.h-V.leading*e.textWH.scale:e.textWH.trim==="Descender"?t.trimmedH:t.h)+e.textWH.pad.n+e.textWH.pad.s;e.ninePatch&&(i+=e.ninePatch.border.w+e.ninePatch.border.e+e.ninePatch.pad.w+e.ninePatch.pad.e,r+=e.ninePatch.border.n+e.ninePatch.border.s+e.ninePatch.pad.n+e.ninePatch.pad.s),e.sprite.w=i,e.sprite.h=r,e.invalid=!0}function yi(e,t){let i=0,r=e.textWH.layout;for(let[o,n]of r.chars.entries()){if(n==null)continue;let a=e.textXY.chars[i]??=t.alloc();a.x=e.sprite.x+n.x+e.textWH.pad.w+(e.ninePatch?e.ninePatch.border.w+e.ninePatch.pad.w:0),a.y=e.sprite.y+n.y+e.textWH.pad.n+(e.ninePatch?e.ninePatch.border.n+e.ninePatch.pad.n:0),a.z=e.textXY.z,a.tag=se(V,e.text[o]),a.stretch=!0,a.w*=e.textWH.scale,a.h*=e.textWH.scale,i++}for(;e.textXY.chars.length>i;)e.textXY.chars.pop().free();e.invalid=!0}var O=class{#t;#i;#e=new Set;#r={};#o=!1;add(...t){for(let i of t)l&&this.#s(i),this.#e.add(i),i.cursor?this.#t=i:i.loader&&(this.#i=i)}addDefaultSystems(){this.addSystem({button:new I,cursor:new q,debugInput:new R,fps:new H,hud:new W,ninePatch:new Y,override:new U,sprite:new F,textWH:new $,textXY:new X})}addSystem(t){Object.assign(this.#r,t)}clear(){this.#t=void 0,this.#e.clear(),this.#r={}}get cursor(){return this.#t}get loader(){return this.#i}get invalid(){return this.#o}*query(t){let i=zt(t);for(let r of this.#e)ue(r,i)&&(yield r)}remove(...t){for(let i of t)i!==this.#i?this.#e.delete(i):i===this.#t&&(this.#t=void 0)}findById(t){for(let i of this.#e)if(i.id===t)return i}update(t){this.#o=!1;for(let i of this.#e){for(let r in i)this.#r[r]?.update?.(i,t);i.invalid&&l?.invalid&&console.debug("[invalid] ent update invalid",i),this.#o||=!!i.invalid,i.invalid=!1}}#s(t){for(let i in t){let r=this.#r[i];if(r&&(r.querySet??=zt(r.query),!ue(t,r.querySet)))throw Error(`ent ${t.id??t.name??"?"} does not satisfy query: ${r.query}`)}}};function ue(e,t){return t.some(i=>i.every(r=>r[0]==="!"?!(r.slice(1)in e):r in e))}function de(e){return{anim:e.anim,celXYWH:wi(e),tags:Object.keys(e.anim)}}function wi(e){let t=[],i=0;for(let r of Object.values(e.anim))t.push(...bi(r,e.celXY,i)),i+=r.cels*2;return t}function bi(e,t,i){let r=[];for(let o=0;o<16;o++){let n=i+2*(o%e.cels);r.push(t[n],t[n+1],e.w,e.h)}return r}var N=class{#t=0;#i=1;#e=!0;#r=1;#o={w:1/0,h:1/0};#s="Int";#a=1;#c=1;#h={w:1,h:1};#u=0;#n=0;#d=0;center(t){this.x=Math.floor(t.x-this.w/2),this.y=Math.floor(t.y-this.h/2)}clientToXY(t){let i=this.clientToXYLocal(t);return{x:this.#u+i.x,y:this.#n+i.y}}clientToXYLocal(t){return{x:t.x/this.#h.w*this.#c,y:t.y/this.#h.h*this.#i}}diagonalize(t){_t(this,t.x*t.y)}follow(t,i,r,o){let n=A(i)?0:Math.floor(this.x);switch(r){case"SW":case"W":case"NW":n+=o?.margin?.w??0;break;case"SE":case"E":case"NE":n+=this.w-(t.w+(o?.margin?.e??0));break;case"N":case"S":case"Center":n+=Math.trunc(this.w/2)-Math.trunc(t.w/2);break}n-=n%((o?.modulo?.x??n)||1);let a=A(i)?0:Math.floor(this.y);switch(r){case"N":case"NE":case"NW":a+=o?.margin?.n??0;break;case"SE":case"S":case"SW":a+=this.h-(t.h+(o?.margin?.s??0));break;case"E":case"W":case"Center":a+=Math.trunc(this.h/2)-Math.trunc(t.h/2);break}a-=a%((o?.modulo?.y??a)||1);let c=o?.fill==="X"||o?.fill==="XY"?this.w-(o?.margin?.w??0)-(o?.margin?.e??0):t.w,d=o?.fill==="Y"||o?.fill==="XY"?this.h-(o?.margin?.n??0)-(o?.margin?.s??0):t.h;return{x:n,y:a,w:c,h:d}}get h(){return this.#i}isVisible(t){return b(this,t)}get invalid(){return this.#e}get minScale(){return this.#r}set minScale(t){this.#a!==t&&(this.#a=t,this.#l())}get minWH(){return this.#o}set minWH(t){this.#o.w===t.w&&this.#o.h===t.h||(this.#o.w=t.w,this.#o.h=t.h,this.#l())}get mode(){return this.#s}set mode(t){this.#s!==t&&(this.#s=t,this.#l())}get portrait(){return this.h>this.w}postupdate(){this.#e=!1}get scale(){return this.#a}toString(){return`Cam{(${this.x} ${this.y}) ${this.w}\xD7${this.h}}`}update(t){if(!t.parentElement)throw Error("canvas has no parent");let{clientWidth:i,clientHeight:r}=t.parentElement;this.#e||=this.#h.w!==i||this.#h.h!==r||this.#t!==devicePixelRatio,this.#e&&(this.#t=devicePixelRatio,this.#h.w=i,this.#h.h=r,this.#l(),t.width=this.#c,t.height=this.#i,t.style.width=`${this.#c*this.#a/devicePixelRatio}px`,t.style.height=`${this.#i*this.#a/devicePixelRatio}px`)}get w(){return this.#c}get whClient(){return this.#h}get x(){return this.#u}set x(t){this.#e||=this.x!==t,this.#u=t}get y(){return this.#n}set y(t){this.#e||=this.y!==t,this.#n=t}get zoomOut(){return this.#d}set zoomOut(t){t=Math.max(0,t),this.#d!==t&&(this.#d=t,this.#l())}#l(){!this.#e&&l?.invalid&&console.debug("[invalid] cam invalid"),this.#e=!0;let t={w:this.#h.w*devicePixelRatio,h:this.#h.h*devicePixelRatio},i=Math.max(this.#r,Math.min(t.w/this.#o.w,t.h/this.#o.h)-(this.#s==="Int"?Math.trunc(this.#d):this.#d));this.#a=this.#s==="Int"?Math.trunc(i):i,this.#c=Math.ceil(t.w/this.#a),this.#i=Math.ceil(t.h/this.#a)}};var G=class{enable=!1;#t;constructor(t){this.#t=t}register(t){let i=this.#t[`${t}EventListener`].bind(this.#t);return i("contextmenu",this.#i),i("touchstart",this.#i,{passive:!1}),this}[Symbol.dispose](){this.register("remove")}#i=t=>{!t.isTrusted||t.metaKey||t.altKey||t.ctrlKey||this.enable||t.preventDefault()}};var K=class{bits=0;bitByAxis={};bitByButton={};onEvent=()=>{};#t;constructor(t){this.#t=t}get connected(){return isSecureContext&&navigator.getGamepads().filter(Boolean).length>0}register(t){let i=this.#t[`${t}EventListener`].bind(this.#t);return i("gamepadconnected",this.onEvent),i("gamepaddisconnected",this.onEvent),this}reset(){this.bits=0}[Symbol.dispose](){this.register("remove")}update(){if(isSecureContext)for(let t of navigator.getGamepads()){for(let[i,r]of t?.axes.entries()??[]){let o=this.bitByAxis[i];if(!o)continue;let n=r<0?o[0]:r===0?0:o[1];this.bits|=Math.abs(r)>=.5?n:0}for(let[i,r]of t?.buttons.entries()??[]){let o=this.bitByButton[i];o!=null&&(this.bits|=r.pressed?o:0)}}}};var Z=class{bitByCode={};invalid=!1;onEvent=()=>{};#t={};#i;constructor(t){this.#i=t}get bits(){let t=0;for(let i in this.bitByCode)t|=this.#t[i]?this.bitByCode[i]:0;return t}postupdate(){this.invalid=!1}register(t){let i=this.#i[`${t}EventListener`].bind(this.#i);for(let r of["keydown","keyup"])i(r,this.#e);return this}reset(){this.invalid=!1,this.#t={}}[Symbol.dispose](){this.register("remove")}#e=t=>{!t.isTrusted||this.bitByCode[t.code]==null||t.type==="keydown"&&(t.metaKey||t.altKey||t.ctrlKey)||(this.invalid=!0,this.#t[t.code]=t.type==="keydown",t.preventDefault(),this.onEvent())}};var gi={mouse:"Mouse",pen:"Pen",touch:"Touch"},Si=["pointercancel","pointerdown","pointermove","pointerup"],J=class{bitByButton={};dragMinClient=5;invalid=!1;onEvent=()=>{};primary;secondary={};#t;#i;constructor(t){this.#i=t}get boundsClient(){if(!this.primary?.bits&&!Object.keys(this.secondary).length)return;let t={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&&(t=ie(t,r.xyClient),i=ee(i,r.xyClient));return{x:t.x,y:t.y,w:i.x-t.x,h:i.y-t.y}}get centerClient(){let t=this.boundsClient;return t?jt(t,{x:t.w/2,y:t.h/2}):this.primary?.xyClient}get locked(){return this.#i.ownerDocument.pointerLockElement===this.#i}get pinchClient(){if(!this.#t)return;let t=this.#o;return t?Et(t,this.#t):void 0}postupdate(){this.invalid=!1}register(t){let i=this.#i[`${t}EventListener`].bind(this.#i);for(let r of Si)i(r,this.#r);return this}reset(){this.invalid=!1,this.primary=void 0;for(let t in this.secondary)delete this.secondary[t];this.#t=void 0}update(){((this.primary?.bits?1:0)+Object.values(this.secondary).length<2||!this.#t)&&(this.#t=this.#o)}[Symbol.dispose](){this.register("remove")}#e(t){let i=0;for(let r=1;r<=t;r<<=1)(r&t)===r&&(i|=this.bitByButton[r]??0);return i}#r=t=>{if(!t.isTrusted)return;this.invalid=!0;let i=t.metaKey||t.altKey||t.ctrlKey?0:this.#e(t.buttons),r=this.locked;if(i&&t.type==="pointerdown"&&(t.preventDefault(),!r))try{this.#i.setPointerCapture(t.pointerId)}catch{}let o=t.isPrimary?this.primary:this.secondary[t.pointerId],n;if(r){let y=1/devicePixelRatio;n={x:Math.min(Math.max(0,(o?.xyClient.x??t.offsetX)+t.movementX*y),this.#i.clientWidth),y:Math.min(Math.max(0,(o?.xyClient.y??t.offsetY)+t.movementY*y),this.#i.clientHeight)}}else n={x:t.offsetX,y:t.offsetY};let a=t.type,c=gi[t.pointerType],d;i&&(t.type==="pointerdown"?d={x:n.x,y:n.y}:t.type==="pointermove"&&(d=o?.clickClient));let f=!!i&&(o?.drag||!!d&&te(d,n)>=this.dragMinClient),u={clickClient:d,bits:i,drag:f,ev:a,id:t.pointerId,primary:t.isPrimary,type:c,xyClient:n};t.isPrimary?this.primary=u:i?this.secondary[t.pointerId]=u:delete this.secondary[t.pointerId],this.onEvent()};get#o(){if((this.primary?.bits?1:0)+Object.values(this.secondary).length<2)return;let t=this.boundsClient;return t?{x:t.w,y:t.h}:void 0}};var Q=class{deltaClient;onEvent=()=>{};#t;constructor(t){this.#t=t}postupdate(){this.deltaClient=void 0}register(t){return this.#t[`${t}EventListener`].bind(this.#t)("wheel",this.#i,{passive:!0}),this}reset(){this.deltaClient=void 0}[Symbol.dispose](){this.register("remove")}#i=t=>{!t.isTrusted||t.metaKey||t.altKey||t.ctrlKey||(this.deltaClient={x:t.deltaX,y:t.deltaY,z:t.deltaZ},this.onEvent())}};var j=class{comboMaxIntervalMillis=300;gestured=!1;handled=!1;invalid=!1;minHeldMillis=300;#t={};#i={};#e=0;#r;#o=[];#s;#a={x:0,y:0};#c;#h=0;#u;#n;#d;#l=0;#p;#m;constructor(t,i){this.#r=t,this.#s=new G(i),this.#c=new K(globalThis),this.#u=new Z(i.ownerDocument),this.#n=new J(i),this.#p=new Q(i)}get anyOn(){return this.#e!==0}get combo(){let t=[];for(let i of this.#o){let r=[];for(let o=1;o<=i;o<<=1)(o&i)===o&&this.#i[o]&&r.push(this.#i[o]);r.sort(),t.push(r)}return t}get contextMenu(){return this.#s}get dir(){return this.#a}get gamepad(){return this.#c.connected?{}:void 0}get held(){return!this.handled&&this.#h>=this.minHeldMillis}isAnyOn(...t){return!this.handled&&!!(this.#e&this.#f(t))}isAnyOnStart(...t){return this.started&&this.isAnyOn(...t)}isAnyOnStill(...t){let i=this.#f(t);return!this.handled&&!!(this.#e&this.#l&i)}isAnyStarted(...t){let i=this.#f(t);return!this.handled&&(this.#e&i)!==(this.#l&i)}isCombo(...t){return t.length===this.#o.length&&this.isComboEndsWith(...t)}isComboEndsWith(...t){for(let[i,r]of t.entries()){let o=this.#f(r);if(this.#o.at(-t.length+i)!==o)return!1}return!this.handled&&(this.#o.at(-1)===this.#e||!this.#e)}isComboEndsWithStart(...t){return this.isOnStart(...t.at(-1))&&this.isComboEndsWith(...t)}isComboStart(...t){return this.isOnStart(...t.at(-1))&&this.isCombo(...t)}isOff(...t){return!this.handled&&!this.isOn(...t)}isOffStart(...t){let i=this.#f(t);return(this.#l&i)===i&&this.started&&this.isOff(...t)}isOn(...t){let i=this.#f(t);return!this.handled&&(this.#e&i)===i}isOnStart(...t){return this.started&&this.isOn(...t)}get key(){return{invalid:this.#u.invalid}}mapDefault(){this.mapKeyboardCode("U","ArrowUp"),this.mapKeyboardCode("D","ArrowDown"),this.mapKeyboardCode("L","ArrowLeft"),this.mapKeyboardCode("R","ArrowRight"),this.mapKeyboardCode("C","KeyC"),this.mapKeyboardCode("A","KeyX","Space"),this.mapKeyboardCode("B","KeyZ"),this.mapKeyboardCode("Menu","Enter"),this.mapKeyboardCode("Back","Escape"),this.mapGamepadAxis("U","D",1,3),this.mapGamepadAxis("L","R",0,2),this.mapGamepadButton("U",12),this.mapGamepadButton("D",13),this.mapGamepadButton("L",14),this.mapGamepadButton("R",15),this.mapGamepadButton("C",2),this.mapGamepadButton("B",0),this.mapGamepadButton("A",1),this.mapGamepadButton("Menu",9),this.mapGamepadButton("Back",8),this.mapPointerClick("A",1),this.mapPointerClick("B",2),this.mapPointerClick("C",4)}mapGamepadAxis(t,i,...r){for(let o of r)this.#c.bitByAxis[o]=[this.#x(t),this.#x(i)]}mapGamepadButton(t,...i){for(let r of i)this.#c.bitByButton[r]=this.#x(t)}mapKeyboardCode(t,...i){for(let r of i)this.#u.bitByCode[r]=this.#x(t)}mapPointerClick(t,...i){for(let r of i)this.#n.bitByButton[r]=this.#x(t)}get on(){let t=[];for(let i in this.#t)this.isOn(i)&&t.push(i);return t.sort()}set onEvent(t){this.#c.onEvent=t,this.#u.onEvent=t,this.#n.onEvent=t,this.#p.onEvent=t}get point(){return this.#d}get pointer(){return this.#n}register(t){return globalThis[`${t}EventListener`]("blur",this.reset),this.#s.register(t),this.#c.register(t),this.#u.register(t),this.#n.register(t),this.#p.register(t),this}reset=()=>{this.#e=0,this.#l=0,this.handled=!1,this.#h=0,this.#o.length=0,this.#c.reset(),this.#u.reset(),this.#n.reset(),this.#d=void 0,this.#p.reset(),this.#m=void 0};get started(){return!this.handled&&this.#e!==this.#l}update(t){if(this.handled=!1,this.#c.update(),this.#n.update(),this.#l=this.#e,this.#e=this.#c.bits|this.#u.bits|(this.#n.primary?.bits??0),this.invalid=this.#e!==this.#l||this.#n.invalid||!!this.#p.deltaClient,this.gestured||=!!this.#e,this.#a.x=this.#a.y=0,(this.#t.U&this.#e)===this.#t.U&&(this.#a.y-=1),(this.#t.D&this.#e)===this.#t.D&&(this.#a.y+=1),(this.#t.L&this.#e)===this.#t.L&&(this.#a.x-=1),(this.#t.R&this.#e)===this.#t.R&&(this.#a.x+=1),(t>this.comboMaxIntervalMillis&&this.#e!==this.#l||this.#h+t>this.comboMaxIntervalMillis&&!this.#e)&&(this.#o.length=0),this.#e===this.#l?this.#h=this.#h+t:this.#h=t,this.#e&&this.#e!==this.#l&&(this.#l&&(this.#o.length=0),this.#o.push(this.#e)),this.#n.primary){let i=this.#n.pinchClient,r=this.#n.primary.drag&&!Object.values(this.#n.secondary).length,o=[];for(let c of Object.values(this.#n.secondary))o.push({type:c.type,click:c.clickClient?{client:c.clickClient,local:this.#r.clientToXYLocal(c.clickClient),...this.#r.clientToXY(c.clickClient)}:void 0,...this.#r.clientToXY(c.xyClient),client:c.xyClient,local:this.#r.clientToXYLocal(c.xyClient)});let n=this.#n.centerClient,a={client:n,local:this.#r.clientToXYLocal(n),...this.#r.clientToXY(n)};this.#d={center:a,click:this.#n.primary.clickClient?{client:this.#n.primary.clickClient,local:this.#r.clientToXYLocal(this.#n.primary.clickClient),...this.#r.clientToXY(this.#n.primary.clickClient)}:void 0,drag:{on:r,start:!this.#d?.drag.on&&r,end:!!this.#d?.drag.on&&!r},invalid:this.#n.invalid,pinch:i?{client:i,xy:this.#r.clientToXY(i)}:void 0,secondary:o,type:this.#n.primary.type,...this.#r.clientToXY(this.#n.primary.xyClient),client:this.#n.primary.xyClient,local:this.#r.clientToXYLocal(this.#n.primary.xyClient)}}else this.#d=void 0;this.#m=this.#p.deltaClient?{delta:{client:this.#p.deltaClient,xy:this.#r.clientToXY(this.#p.deltaClient)}}:void 0,this.#u.postupdate(),this.#n.postupdate(),this.#p.postupdate()}[Symbol.dispose](){this.register("remove")}get wheel(){return this.#m}#f(t){let i=0;for(let r of t)i|=this.#t[r]??0;return i}#x(t){let i=this.#t[t]??=1<<Object.keys(this.#t).length;return this.#i[i]=t,i}};function m(e){return e!=null&&!Array.isArray(e)&&typeof e=="object"}function pe(e){return e[0]?`${e[0].toLocaleLowerCase()}${e.slice(1)}`:e}function fe(e,t,i,r){return{ents:e.ents?.map(o=>Ci(o,t,i,r))??[],keepZoo:e.keepZoo??!1,minWH:e.minWH?Pi(e.minWH):{w:1/0,h:1/0}}}function tt(e){if(!e||typeof e=="number"){let t=e??0;return{n:t,s:t,w:t,e:t}}return"x"in e||"y"in e?{n:e.y??0,s:e.y??0,w:e.x??0,e:e.x??0}:{n:e.n??0,s:e.s??0,w:e.w??0,e:e.e??0}}function Ei(e,t,i){let r=x(e.pressed,t,i);e.z&&(r.z=h[e.z]),r.visible=!1;let o=x(e.selected,t,i);return e.z&&(o.z=h[e.z]),{pressed:r,selected:o,started:!1,type:e.type??"Button"}}function Ti(e,t){if(!e.sprite)throw Error("cursor missing sprite");return e.sprite.visible=!1,{bounds:{x:0,y:0,w:0,h:0},keyboard:t.keyboard??0,pick:t.pick,point:e.sprite.tag}}function Ci(e,t,i,r){let o={};for(let n in e){let a=n;o[a]=i(o,e,a,t,r)??vi(o,e,a,t,r)}return o.invalid=!0,o}function vi(e,t,i,r,o){if(t[i]!=null)switch(i){case"button":return Ei(t[i],r,o);case"cursor":return Ti(e,t[i]);case"fps":return _i(t[i]);case"hud":return zi(t[i]);case"cam":case"draw":case"debugInput":case"id":case"name":case"text":return t[i];case"ninePatch":return ki(e,t[i],r,o);case"override":return Vi(t[i]);case"sprite":return x(t[i],r,o);case"textWH":return Ai(t[i]);case"textXY":return Di(e,t[i]);default:}}function _i(e){return{prevFrames:0,next:{created:performance.now(),frames:0}}}function zi(e){return{fill:e.fill,margin:tt(e.margin??0),modulo:Bi(e.modulo??0),origin:e.origin}}function ki(e,t,i,r){if(!e.sprite)throw Error("nine patch missing sprite");let o={center:t.patch.center==null?void 0:x(t.patch.center,i,r),n:t.patch.n==null?void 0:x(t.patch.n,i,r),s:t.patch.s==null?void 0:x(t.patch.s,i,r),w:t.patch.w==null?void 0:x(t.patch.w,i,r),e:t.patch.e==null?void 0:x(t.patch.e,i,r),nw:t.patch.nw==null?void 0:x(t.patch.nw,i,r),ne:t.patch.ne==null?void 0:x(t.patch.ne,i,r),sw:t.patch.sw==null?void 0:x(t.patch.sw,i,r),se:t.patch.se==null?void 0:x(t.patch.se,i,r)},n=tt(t.border),a={border:n,pad:tt(t.pad),patch:o};return o.center&&(o.center.z=e.sprite.z),o.n&&(o.n.h=n.n,(!m(t.patch.n)||t.patch.n.z==null)&&(o.n.z=e.sprite.z)),o.s&&(o.s.h=n.s,(!m(t.patch.s)||t.patch.s.z==null)&&(o.s.z=e.sprite.z)),o.w&&(o.w.w=n.w,(!m(t.patch.w)||t.patch.w.z==null)&&(o.w.z=e.sprite.z)),o.e&&(o.e.w=n.e,(!m(t.patch.e)||t.patch.e.z==null)&&(o.e.z=e.sprite.z)),o.nw&&(o.nw.w=n.w,o.nw.h=n.n,(!m(t.patch.nw)||t.patch.nw.z==null)&&(o.nw.z=e.sprite.z)),o.ne&&(o.ne.w=n.e,o.ne.h=n.n,(!m(t.patch.ne)||t.patch.ne.z==null)&&(o.ne.z=e.sprite.z)),o.sw&&(o.sw.w=n.w,o.sw.h=n.s,(!m(t.patch.sw)||t.patch.sw.z==null)&&(o.sw.z=e.sprite.z)),o.se&&(o.se.w=n.e,o.se.h=n.s,(!m(t.patch.se)||t.patch.se.z==null)&&(o.se.z=e.sprite.z)),a}function Vi(e){return{invalid:e.invalid}}function x(e,t,i){let r=typeof e=="string"?"default":pe(e.pool??"Default");if(!t[r])throw Error(`no ${r} sprite pool`);let o=t[r].alloc();if(typeof e=="string"){if(!(e in i.anim))throw Error(`no tag "${e}"`);return o.tag=e,o}if(e.tag!=null){if(!(e.tag in i.anim))throw Error(`no tag "${e.tag}"`);o.tag=e.tag}return o.visible=e.visible??e.tag!=null,e.flip&&(o.flipX=e.flip==="X"||e.flip==="XY",o.flipY=e.flip==="Y"||e.flip==="XY"),e.stretch!=null&&(o.stretch=e.stretch),e.w!=null&&(o.w=e.w),e.h!=null&&(o.h=e.h),e.scale!=null&&(o.w*=typeof e.scale=="number"?e.scale:e.scale.x??1,o.h*=typeof e.scale=="number"?e.scale:e.scale.y??1),e.x!=null&&(o.x=e.x),e.y!=null&&(o.y=e.y),e.z!=null&&(o.z=h[e.z]),e.zend!=null&&(o.zend=e.zend),o}function Ai(e){return{layout:{chars:[],cursor:{x:0,y:0},w:0,h:0,trimmedH:0},maxW:e.maxW??re.w,pad:tt(e.pad),scale:e.scale??1,trim:e.trim}}function Di(e,t){return{chars:[],z:t.z?h[t.z]:e.sprite?.z??h.Bottom}}function Pi(e){return typeof e=="number"?{w:e,h:e}:{w:Number(e?.w??0),h:Number(e?.h??0)}}function Bi(e){return typeof e=="number"?{x:e,y:e}:{x:e.x??0,y:e.y??0}}var et=class{#t;#i;#e=0;#r;#o;constructor(t){if(t.allocBytes<=0)throw Error("byte allocation must be > 0");if(t.pageBlocks<=0)throw Error("page blocks must be > 0");this.#i={...t,init:t.init??(()=>{}),minPages:t.minPages??1};let i=this.#i.minPages*t.pageBlocks;this.#t=new Array(i),this.#r=new Uint8Array,this.#a(i,"Init")}alloc(){this.#e>=this.#s&&this.#a(this.#s+this.#i.pageBlocks,"Call");let t=this.#t[this.#e];return t.i=this.#e*this.#i.allocBytes,this.#e++,this.#i.init(t),t}clear(){this.#e=0;let t=this.#i.minPages*this.#i.pageBlocks;this.#s>t&&this.#a(t,"Call")}free(t){if(!this.#e)throw Error("pool underflow");this.#e--;let i=this.#e*this.#i.allocBytes;this.#r.copyWithin(t.i,i,i+this.#i.allocBytes),this.#t[this.#e].i=t.i,[this.#t[t.i],this.#t[this.#e]]=[this.#t[this.#e],this.#t[t.i]];let r=Math.floor((this.#s-this.#e)/this.#i.pageBlocks);r&&this.#s/this.#i.pageBlocks-r>=this.#i.minPages&&this.#a(this.#s-r*this.#i.pageBlocks,"Call")}get size(){return this.#e}get view(){return this.#o}toDebugString(){let t="";for(let i=0;i<this.#r.buffer.byteLength;i++)i&&!(i%this.#i.allocBytes)&&(t+=" "),t+=this.#r[i].toString(16).padStart(2,"0");return t}get#s(){return this.#r.buffer.byteLength/this.#i.allocBytes}#a(t,i){i==="Call"&&l?.mem&&console.debug(`[mem] ${t<this.#s?"shrinking":"growing"} pool to ${t}`),this.#t.length=t;for(let n=this.#s;n<t;n++)this.#t[n]=this.#i.alloc(this);let r=new ArrayBuffer(t*this.#i.allocBytes),o=new Uint8Array(r);o.set(this.#r.subarray(0,t*this.#i.allocBytes)),this.#r=o,this.#o=new DataView(r)}};function xe(e){return new et({alloc:t=>new M(t,0,e.atlas,e.looper),init:t=>t.init(),allocBytes:w,...e})}var it=class{#t;constructor(t){this.#t=t*16807%2147483647,this.#t<=0&&(this.#t=(this.#t+2147483646)%2147483646+1)}get num(){return this.#t=this.#t*16807%2147483647,(this.#t-1)/2147483646}get seed(){return this.#t}};function me(e,t){t==null?localStorage.removeItem(e):localStorage.setItem(e,JSON.stringify(t))}function ye(e){let t=localStorage.getItem(e);return t==null?void 0:JSON.parse(t)}var rt=s;function At(e,t){return((t==="Sec"?0:(59-e.getSeconds()%60)*1e3)+1e3-e.getMilliseconds()%1e3)%(t==="Sec"?1e3:6e4)}function we(e){return`#${e.toString(16).padStart(8,"0")}`}function be(e){let[t,i,r,o]=e.match(/[0-9.]+/g)?.map(Number)??[];return(Math.round(t??0)<<24|Math.round(i??0)<<16|Math.round(r??0)<<8|Math.round((o??1)*255))>>>0}function ge(e){document.body.style.margin="0",document.body.style.width="100dvw",document.body.style.height="100dvh",document.body.style.overflow="hidden",document.body.style.background=we(e)}function Se(e){if(!document.querySelector('meta[name="viewport"]')){let t=document.createElement("meta");t.name="viewport",t.content="width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no",document.head.appendChild(t)}if(e&&!document.querySelector('meta[name="description"]')){let t=document.createElement("meta");t.name="description",t.content=e,document.head.appendChild(t)}}function Ee(e,t){if(e??=document.createElement("canvas"),e.width=0,e.style.cursor="none",e.style.display="block",e.style.outline="none",t==="Int"&&(e.style.imageRendering="pixelated"),e.style.touchAction="none",e.tabIndex=0,e.focus(),!e.parentNode){let i=document.createElement("main");i.style.backgroundColor=document.body.style.backgroundColor,i.style.height="100%",i.append(e),document.body.append(i)}return e}var ot=class{#t;#i;#e=0;#r;#o=0;constructor(t,i,r){this.#t=t,this.#i=i,this.#r=r}register(t){return t==="add"?this.#o=setTimeout(()=>{this.#r(),this.#e=setInterval(this.#r,this.#i)},this.#t()):(clearTimeout(this.#o),clearInterval(this.#e)),this}[Symbol.dispose](){this.register("remove")}};async function Te(e){let t=new Promise((i,r)=>{e.onload=()=>i(e),e.onerror=()=>r(Error(`image load error for ${e.src}`))});return e.complete?e:await t}var nt=class{onChange=()=>{};#t;register(t){return this.#t?.removeEventListener("change",this.#i),t==="add"?(this.#t=matchMedia(`not (resolution: ${devicePixelRatio}dppx)`),this.#t.addEventListener("change",this.#i)):this.#t=void 0,this}[Symbol.dispose](){this.register("remove")}#i=()=>{this.register("add"),this.onChange()}};function ve(e,t,i,r){let o=Li(e,t,i);return e.useProgram(o),{buffer:e.createBuffer(),program:o,textures:r,uniform:Ii(e,o),vao:e.createVertexArray()}}function Ii(e,t){let i=t?e.getProgramParameter(t,e.ACTIVE_UNIFORMS):0,r=l?.render?new Proxy({},{get(o,n){if(o[n]==null)throw Error(`no shader uniform "${n}"`);return o[n]}}):{};for(let o=0;o<i;++o){let n=e.getActiveUniform(t,o);if(!n)throw Error(`no shader uniform at index ${o}`);let a=e.getUniformLocation(t,n.name);if(!a)throw Error(`no shader uniform "${n.name}"`);let c=n.name.replace("[0]","");r[c]=a}return r}function Li(e,t,i){let r=e.createProgram();if(!r)return null;let o=Ce(e,"VERTEX_SHADER",t),n=Ce(e,"FRAGMENT_SHADER",i);if(!o||!n)return null;if(e.attachShader(r,o),e.attachShader(r,n),e.linkProgram(r),l?.render&&!e.getProgramParameter(r,e.LINK_STATUS)){let a=e.getProgramInfoLog(r)?.slice(0,-1);throw Error(`shader link failure; ${a}`)}return e.detachShader(r,n),e.detachShader(r,o),e.deleteShader(n),e.deleteShader(o),r}function Ce(e,t,i){let r=e.createShader(e[t]);if(!r)return r;if(e.shaderSource(r,i.trim()),e.compileShader(r),l?.render&&!e.getShaderParameter(r,e.COMPILE_STATUS)){let o=e.getShaderInfoLog(r)?.slice(0,-1);throw Error(`shader compile failure; ${o}`)}return r}var _e=`#version 300 es
|
|
5
|
+
#pragma debug(${l?.render?"on":"off"})
|
|
6
|
+
#pragma optimize(${l?.render?"off":"on"})
|
|
7
|
+
|
|
8
|
+
precision highp int;
|
|
9
|
+
precision highp float;
|
|
10
|
+
precision highp usampler2D;
|
|
11
|
+
|
|
12
|
+
uniform sampler2D uTex;
|
|
13
|
+
uniform uvec2 uTexWH;
|
|
14
|
+
|
|
15
|
+
flat in uint vStretch;
|
|
16
|
+
flat in ivec4 vTexXYWH;
|
|
17
|
+
flat in uint vVisible;
|
|
18
|
+
in vec2 vDstWH;
|
|
19
|
+
flat in ivec2 vDstWHFixed;
|
|
20
|
+
|
|
21
|
+
out vec4 oRGBA;
|
|
22
|
+
|
|
23
|
+
void main() {
|
|
24
|
+
if (vVisible == 0u || vDstWHFixed.x == 0 || vDstWHFixed.y == 0)
|
|
25
|
+
discard;
|
|
26
|
+
|
|
27
|
+
vec2 px = vec2(vTexXYWH.xy) + (
|
|
28
|
+
vStretch == 1u ? (vDstWH * vec2(vTexXYWH.zw) / vec2(vDstWHFixed))
|
|
29
|
+
: mod(vDstWH, vec2(vTexXYWH.zw))
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
oRGBA = texture(uTex, px / vec2(uTexWH));
|
|
33
|
+
if(oRGBA.a < .001) discard;
|
|
34
|
+
}
|
|
35
|
+
`;var ze=`#version 300 es
|
|
36
|
+
#pragma debug(${l?.render?"on":"off"})
|
|
37
|
+
#pragma optimize(${l?.render?"off":"on"})
|
|
38
|
+
|
|
39
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2
|
|
40
|
+
precision highp int;
|
|
41
|
+
precision highp float;
|
|
42
|
+
precision highp usampler2D;
|
|
43
|
+
|
|
44
|
+
uniform ivec4 uCam;
|
|
45
|
+
uniform usampler2D uCels;
|
|
46
|
+
uniform float uAge;
|
|
47
|
+
|
|
48
|
+
layout (location=0) in ivec2 iUV;
|
|
49
|
+
layout (location=1) in uint iy8_x24;
|
|
50
|
+
layout (location=2) in uint iw8_sxyz_llll_y16;
|
|
51
|
+
layout (location=3) in uint ii11_c5_h12_w4;
|
|
52
|
+
layout (location=4) in uint r31_v;
|
|
53
|
+
|
|
54
|
+
const int maxY = 0x20000;
|
|
55
|
+
const int layers = 16;
|
|
56
|
+
const int maxDepth = maxY * layers;
|
|
57
|
+
|
|
58
|
+
flat out uint vStretch;
|
|
59
|
+
flat out ivec4 vTexXYWH;
|
|
60
|
+
flat out uint vVisible;
|
|
61
|
+
out vec2 vDstWH;
|
|
62
|
+
flat out ivec2 vDstWHFixed;
|
|
63
|
+
|
|
64
|
+
void main() {
|
|
65
|
+
int x = int(floor(float(int((iy8_x24 & 0xffffffu) << 8) >> 8) / 64.));
|
|
66
|
+
int y = int(floor(float(int(iy8_x24 >> 24) | (int(iw8_sxyz_llll_y16 & 0xffffu) << 16 >> 8)) / 64.));
|
|
67
|
+
int z = int((iw8_sxyz_llll_y16 >> 16) & 0xfu);
|
|
68
|
+
bool zend = bool(iw8_sxyz_llll_y16 & 0x100000u);
|
|
69
|
+
bool flipY = bool(iw8_sxyz_llll_y16 & 0x200000u);
|
|
70
|
+
bool flipX = bool(iw8_sxyz_llll_y16 & 0x400000u);
|
|
71
|
+
bool stretch = bool(iw8_sxyz_llll_y16 & 0x800000u);
|
|
72
|
+
int id = int((ii11_c5_h12_w4 >> 17) & 0x7ff0u); // ignore cel.
|
|
73
|
+
int cel = int((ii11_c5_h12_w4 >> 16) & 0xfu); // ignore the MSB.
|
|
74
|
+
int w = int(((ii11_c5_h12_w4 & 0xfu) << 8) | (iw8_sxyz_llll_y16 >> 24));
|
|
75
|
+
int h = int((ii11_c5_h12_w4 >> 4) & 0xfffu);
|
|
76
|
+
bool visible = bool(r31_v & 0x1u);
|
|
77
|
+
|
|
78
|
+
// https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel
|
|
79
|
+
float depth = float((${h.Top} - z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);
|
|
80
|
+
|
|
81
|
+
ivec2 targetWH = iUV * ivec2(w, h);
|
|
82
|
+
|
|
83
|
+
vec2 end = vec2(x + targetWH.x, y + targetWH.y);
|
|
84
|
+
// UI layers are always given in screen coordinates.
|
|
85
|
+
// to-do: how to handle non-int mode?
|
|
86
|
+
vec2 camXY = z >= ${h.UIA} ? vec2(0, 0) : vec2(uCam.xy);
|
|
87
|
+
vec2 clip = ((-2. * camXY + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);
|
|
88
|
+
gl_Position = vec4(clip, depth, 1);
|
|
89
|
+
|
|
90
|
+
int frame = (((int(uAge / ${62.5}) & 0x1f) - cel) + ${16}) & 0xf;
|
|
91
|
+
uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);
|
|
92
|
+
vTexXYWH = ivec4(texXYWH);
|
|
93
|
+
vVisible = uint(visible);
|
|
94
|
+
|
|
95
|
+
vDstWH = vec2(targetWH * ivec2(flipX ? -1 : 1, flipY ? -1 : 1));
|
|
96
|
+
vDstWHFixed = ivec2(w, h) * ivec2(flipX ? -1 : 1, flipY ? -1 : 1);
|
|
97
|
+
|
|
98
|
+
vStretch = stretch ? 1u : 0u;
|
|
99
|
+
}
|
|
100
|
+
`;var ke=new Int8Array([1,1,0,1,1,0,0,0]),st=class{always=l?.render==="always";clears=0;loseContext;#t;#i=0;#e=!0;#r;#o=!1;#s;#a;#c;constructor(t,i,r){this.#a=t,this.#t=i,this.#s=r}clear(t){if(!this.#r)return;let{gl:i}=this.#r;this.#i!==t&&(this.#i=t,i.clearColor((t>>>24&255)/255,(t>>>16&255)/255,(t>>>8&255)/255,(t>>>0&255)/255)),i.clear(i.COLOR_BUFFER_BIT|i.DEPTH_BUFFER_BIT),this.clears++}draw(t){if(!this.#c||!this.#r)return;let{gl:i,spriteShader:r}=this.#r;if(i.bindBuffer(i.ARRAY_BUFFER,r.buffer),i.bufferData(i.ARRAY_BUFFER,t.view,i.DYNAMIC_DRAW,0,t.size*w),i.bindBuffer(i.ARRAY_BUFFER,null),i.bindVertexArray(r.vao),i.drawArraysInstanced(i.TRIANGLE_STRIP,0,ke.length/2,t.size),i.bindVertexArray(null),l?.render){let o=i.getError();o!==i.NO_ERROR&&console.error(`[render] GL error x${o.toString(16)}`)}this.#o=!1}get hasContext(){return this.#r!=null}get invalid(){return this.#o||this.always}load(t){this.#c=t,this.#r=this._Context()}predraw(t){if(!this.#r)return;let{gl:i,spriteShader:r,viewport:o}=this.#r;Qt(o,t)||(i.viewport(0,0,t.w,t.h),o.w=t.w,o.h=t.h),i.useProgram(r.program),i.uniform4i(r.uniform.uCam,Math.floor(t.x),Math.floor(t.y),t.w,t.h),i.uniform1f(r.uniform.uAge,this.#s.age);for(let[n,a]of r.textures.entries())i.activeTexture(i.TEXTURE0+n),i.bindTexture(i.TEXTURE_2D,a)}register(t){return this.#t[`${t}EventListener`]("webglcontextlost",this.#h),this.#t[`${t}EventListener`]("webglcontextrestored",this.#u),this}setDepth(t){this.#e=t,this.#r&&(t?this.#r.gl.enable(this.#r.gl.DEPTH_TEST):this.#r.gl.disable(this.#r.gl.DEPTH_TEST))}[Symbol.dispose](){this.register("remove")}_Context(){let t=this.#r?.gl??Mi(this.#t,this.always);if(!t)return;let i=ve(t,ze,_e,[t.createTexture(),t.createTexture()]);return t.enable(t.BLEND),t.blendFuncSeparate(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA,t.ONE,t.ONE_MINUS_SRC_ALPHA),this.setDepth(this.#e),t.depthRange(0,1),t.clearDepth(1),t.depthFunc(t.LESS),t.pixelStorei(t.UNPACK_COLORSPACE_CONVERSION_WEBGL,!1),t.bindVertexArray(i.vao),t.bindBuffer(t.ARRAY_BUFFER,t.createBuffer()),t.bufferData(t.ARRAY_BUFFER,ke,t.STATIC_DRAW),t.enableVertexAttribArray(0),t.vertexAttribIPointer(0,2,t.BYTE,0,0),t.bindBuffer(t.ARRAY_BUFFER,null),t.bindBuffer(t.ARRAY_BUFFER,i.buffer),t.enableVertexAttribArray(1),t.vertexAttribIPointer(1,1,t.UNSIGNED_INT,w,0),t.vertexAttribDivisor(1,1),t.enableVertexAttribArray(2),t.vertexAttribIPointer(2,1,t.UNSIGNED_INT,w,4),t.vertexAttribDivisor(2,1),t.enableVertexAttribArray(3),t.vertexAttribIPointer(3,1,t.UNSIGNED_INT,w,8),t.vertexAttribDivisor(3,1),t.enableVertexAttribArray(4),t.vertexAttribIPointer(4,1,t.UNSIGNED_INT,w,12),t.vertexAttribDivisor(4,1),t.bindBuffer(t.ARRAY_BUFFER,null),t.bindTexture(t.TEXTURE_2D,i.textures[0]),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),this.#c&&t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,this.#c),t.bindTexture(t.TEXTURE_2D,null),t.bindTexture(t.TEXTURE_2D,i.textures[1]),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.#a.celXYWH.length/4,0,t.RGBA_INTEGER,t.UNSIGNED_SHORT,new Uint16Array(this.#a.celXYWH)),t.bindTexture(t.TEXTURE_2D,null),t.bindVertexArray(null),t.uniform1i(i.uniform.uTex,0),t.uniform1i(i.uniform.uCels,1),this.#c&&t.uniform2ui(i.uniform.uTexWH,this.#c.naturalWidth,this.#c.naturalHeight),!this.#o&&l?.invalid&&console.debug("[invalid] renderer invalid"),this.#o=!0,this.loseContext=t.getExtension("WEBGL_lose_context")??void 0,this.#r={gl:t,spriteShader:i,viewport:{w:0,h:0}}}#h=t=>{t.preventDefault(),console.debug("[render] GL context lost"),this.#r=void 0};#u=()=>{console.debug("[render] GL context restored"),this.#r=this._Context()}};function Mi(e,t){let i=e.getContext("webgl2",{antialias:!1,powerPreference:"low-power",preserveDrawingBuffer:!0,...!l?.render&&{desynchronized:t}});if(!i){console.debug("[render] no GL context");return}return l?.render&&!i.getContextAttributes()?.desynchronized&&console.debug("[render] no GL DOM desynchronization"),i}var at=class{age=0;onFrame;#t=0;#i=!1;#e=0;register(t){let i=`${t}EventListener`;return document[i]("visibilitychange",this.#s),t==="remove"&&this.#r(),this.#i=t==="add",this}requestFrame(){this.#t||document.hidden||!this.#i||(this.#e=performance.now(),this.#t=requestAnimationFrame(this.#o))}[Symbol.dispose](){this.register("remove")}#r(){this.#t&&cancelAnimationFrame(this.#t),this.#t=0}#o=()=>{let t=performance.now(),i=t-this.#e;this.age=t,this.#t=0,this.onFrame?.(i)};#s=t=>{t.isTrusted&&(document.hidden?this.#r():this.requestFrame())}};var ct=class{cam=new N;canvas;input;looper=new at;pool;preload;random;renderer;tick={ms:0,s:0};zoo=new O;#t;#i=!1;#e=new nt;#r;#o;#s=!1;#a=new ResizeObserver(()=>this.onResize());constructor(t){if(Se(t.description),this.canvas=Ee(t.canvas,t.config.init.mode),!this.canvas.parentElement)throw Error("no canvas parent");if(this.#t=t.config.init.background??be(getComputedStyle(this.canvas.parentElement).backgroundColor),t.canvas||ge(this.#t),this.cam.minWH=t.config.init.minWH,this.cam.mode=t.config.init.mode,this.cam.update(this.canvas),this.random=t.random??new it(Date.now()),this.input=new j(this.cam,this.canvas),t.config.init.input!=="Custom"&&this.input.mapDefault(),this.input.onEvent=()=>this.onEvent(),this.#e.onChange=()=>this.onResize(),this.#o=t.preloadAtlas??void 0,!!this.#o!=!!t.config.atlas)throw Error("atlas misconfigured");this.preload=t.config.atlas?de(t.config.atlas):{anim:{},celXYWH:[],tags:[]},this.renderer=new st(this.preload??{},this.canvas,this.looper),this.pool={default:xe({atlas:this.preload,looper:this.looper,minPages:t.sprites?.minPages??3,pageBlocks:t.sprites?.pageBlocks??1e3})},this.looper.onFrame=i=>this.onFrame(i),this.zoo.addSystem({loader:t.loaderSys}),this.zoo.add(t.loader)}alloc(t="default"){return this.pool[t].alloc()}get backgroundRGBA(){return this.#t}get invalid(){return this.zoo.invalid||this.cam.invalid||this.renderer.invalid||this.#i}set invalid(t){this.#i=t}onEvent(){this.requestFrame("Force")}onFrame(t){this.tick.ms=t,this.tick.s=t/1e3,!document.hidden&&(this.input.update(t),this.requestFrame(),this.#i=!1,this.zoo.update(this),this.cam.postupdate())}onPoll(){this.requestFrame("Force")}onResize(){this.requestFrame("Force")}setPoller(t,i){this.#r&&this.#r.register("remove"),this.#r=new ot(i??(()=>0),t,()=>this.onPoll()),this.#s&&this.#r.register("add")}async register(t){this.input.register(t),this.renderer.register(t),this.looper.register(t),t==="add"?this.#a.observe(this.canvas.parentElement):this.#a.unobserve(this.canvas.parentElement),this.#e.register(t),t==="add"&&this.looper.requestFrame(),this.#r?.register(t),this.#o&&await Te(this.#o),this.renderer.load(this.#o),this.#s=t==="add"}requestFrame(t){(t||this.renderer.always||this.input.anyOn||this.input.gamepad)&&this.looper.requestFrame()}async[Symbol.asyncDispose](){await this.register("remove")}};function ht(e){return Object.entries(e).reduce((t,[i,r])=>({...t,[r]:i}),{})}var Dt=new Set(["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"]),C=[...Dt].reduce((e,t,i)=>({...e,[t]:i}),{}),Pt={Ace:1,Two:2,Three:3,Four:4,Five:5,Six:6,Seven:7,Eight:8,Nine:9,Ten:10,Jack:11,Queen:13,King:14},qi=ht(Pt),Ve={Ace:"A",Two:"2",Three:"3",Four:"4",Five:"5",Six:"6",Seven:"7",Eight:"8",Nine:"9",Ten:"10",Jack:"J",Queen:"Q",King:"K"};var P=new Set(["Clubs","Diamonds","Hearts","Spades"]),Bt=[...P].reduce((e,t,i)=>({...e,[t]:i}),{}),Ri=ht(Bt),It={Clubs:"Black",Diamonds:"Red",Hearts:"Red",Spades:"Black"},Ae={Clubs:"C",Diamonds:"D",Hearts:"H",Spades:"S"};var Lt={rangeStart:127136,rankSize:16,suitMax:3};function lt(e,...t){if(t.length===0)return e(void 0,void 0);for(let i=0;i<=t.length-1;i++)if(!e(t[i],t[i+1]))return!1;return!0}function De(e){return`${Ae[e.suit]}${Ve[e.rank]}`}function Mt(e,...t){return t.reduce((i,r)=>i+Hi(e,r),"")}function Hi(e,t){if(e==="Directed"&&t.direction==="Down")return"\u{1F0A0}";let i=Lt.rangeStart+(Lt.suitMax-Bt[t.suit])*Lt.rankSize+Pt[t.rank];return String.fromCodePoint(i)}function Pe(e="Down"){let t=[];for(let i of P)for(let r of Dt)t.push({suit:i,rank:r,direction:e});return t}function Ie(){return[[],[],[],[]]}var Be=(e,t)=>e?.direction==="Down"||t?.direction==="Down"?!1:t==null?e!=null:e==null?t.rank==="Ace":e.suit!==t.suit?!1:C[e.rank]+1===C[t.rank],Yi={Clubs:0,Diamonds:1,Hearts:2,Spades:3};function Le(e,t){let i=t[0];i==null||!qt(e,t)||Me(e,i.suit).push(...t.splice(0))}function Me(e,t){return e[Yi[t]]}function qt(e,t){let i=t[0];return i==null||!lt(Be,...t)?!1:Be(Me(e,i.suit).at(-1),i)}function qe(e,t){for(let[i,r]of e.entries()){let o=r.indexOf(t);if(o!==-1)return{cards:r.splice(o),pile:"Foundation",xy:{x:i,y:o}}}}function Re(e){return Ui(...Object.values(e))}function Ui(...e){return e.every(t=>t.at(-1)?.rank==="King")}function We(e){if(e<=0)throw Error(`tableau size must be greater than zero but was ${e}`);let t=[];for(let i=0;i<e;i++)t.push([]);return t}var He=(e,t)=>e?.direction==="Down"||t?.direction==="Down"?!1:t==null?e!=null:e==null?t.rank==="King":It[e.suit]!==It[t.suit]&&C[e.rank]===C[t.rank]+1;function Rt(e,t){for(let[i,r]of e.entries()){if(r.length!==0)throw Error("tableau must be reset before dealt");let o=t.splice(-i-1);for(let n of o)n.direction="Down";r.push(...o)}}function Ye(e,t){Ht(e,t)&&e.push(...t.splice(0))}function Ue(e,t){for(let[i,r]of e.entries()){let o=r.indexOf(t);if(o!==-1)return{cards:r.splice(o),pile:"Tableau",xy:{x:i,y:o}}}}function Ht(e,t){return lt(He,...t)?He(e.at(-1),t[0]):!1}function Fe(e,t,i,r){i??=3,e??=Math.random,r??=7;let o=Pe();Ge(o,e);let n={drawSize:i,foundation:Ie(),stock:o,tableau:We(r),waste:[],random:e,tableauSize:r,wins:t??0};return Rt(n.tableau,o),n}function $e(e){Fi(e)&&e.wins++;for(let t of e.foundation)e.stock.push(...t.splice(0));for(let t of e.tableau)e.stock.push(...t.splice(0));e.stock.push(...e.waste.splice(0));for(let t of e.stock)t.direction="Down";Ge(e.stock,e.random),Rt(e.tableau,e.stock)}function Wt(e,t){v(e);let i=e.stock.indexOf(t);if(i!==-1){if(i!==e.stock.length-1)return;let a=Math.max(0,i-(e.drawSize-1)),c=e.stock.splice(a).reverse();for(let d of c)d.direction="Up";e.waste.push(...c);return}let r=e.waste.indexOf(t);if(r!==-1)return e.selected={cards:e.waste.splice(r),pile:"Waste",xy:{x:0,y:r}},e.selected;let o=qe(e.foundation,t)??Ue(e.tableau,t);if(o==null)throw Error(`missing card ${Mt("Undirected",t)}`);e.selected=o;let{cards:n}=e.selected;return n.length===1&&n[0]?.direction==="Down"&&(n[0].direction="Up",v(e)),e.selected}function Xe(e){if(v(e),e.stock.length>0)return;let t=e.waste.splice(0).reverse();for(let i of t)i.direction="Down";e.stock.push(...t)}function Oe(e,t){if(e.selected==null)return!1;if(t.type==="Foundation")return qt(e.foundation,e.selected.cards);let i=e.tableau[t.x];if(i==null)throw Error(`missing lane at index ${t.x}`);return Ht(i,e.selected.cards)}function Fi(e){return Re(e.foundation)}function Ne(e,t){if(e.selected!=null){if(t.type==="Foundation")Le(e.foundation,e.selected.cards);else{let i=e.tableau[t.x];if(i==null)throw Error(`missing lane at index ${t.x}`);Ye(i,e.selected.cards)}e.selected.cards.length===0&&delete e.selected}}function v(e){if(e.selected==null)return;(e.selected.pile==="Waste"?e.waste:e[Xi(e.selected.pile)][e.selected.xy.x]).push(...e.selected.cards),delete e.selected}function Ge(e,t){for(let i=e.length-1;i>=0;i--)$i(e,i,Math.trunc(t()*(i+1)))}function $i(e,t,i){[e[t],e[i]]=[e[i],e[t]]}function Xi(e){return e[0]==null?e:`${e[0].toLocaleLowerCase()}${e.slice(1)}`}var Ke="Pixelated solitaire.";var Ze={atlas:{anim:{"background--Grid":{cels:1,h:8,id:0,w:8},"background--Corner":{cels:1,h:8,id:1,w:8},"background--Checkerboard":{cels:1,h:8,id:2,w:8},"card--CA":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:3,w:24},"card--C2":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:4,w:24},"card--C3":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:5,w:24},"card--C4":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:6,w:24},"card--C5":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:7,w:24},"card--C6":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:8,w:24},"card--C7":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:9,w:24},"card--C8":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:10,w:24},"card--C9":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:11,w:24},"card--C10":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:12,w:24},"card--CJ":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:13,w:24},"card--CQ":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:14,w:24},"card--CK":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:15,w:24},"card--DA":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:16,w:24},"card--D2":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:17,w:24},"card--D3":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:18,w:24},"card--D4":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:19,w:24},"card--D5":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:20,w:24},"card--D6":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:21,w:24},"card--D7":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:22,w:24},"card--D8":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:23,w:24},"card--D9":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:24,w:24},"card--D10":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:25,w:24},"card--DJ":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:26,w:24},"card--DQ":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:27,w:24},"card--DK":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:28,w:24},"card--HA":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:29,w:24},"card--H2":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:30,w:24},"card--H3":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:31,w:24},"card--H4":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:32,w:24},"card--H5":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:33,w:24},"card--H6":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:34,w:24},"card--H7":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:35,w:24},"card--H8":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:36,w:24},"card--H9":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:37,w:24},"card--H10":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:38,w:24},"card--HJ":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:39,w:24},"card--HQ":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:40,w:24},"card--HK":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:41,w:24},"card--SA":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:42,w:24},"card--S2":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:43,w:24},"card--S3":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:44,w:24},"card--S4":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:45,w:24},"card--S5":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:46,w:24},"card--S6":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:47,w:24},"card--S7":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:48,w:24},"card--S8":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:49,w:24},"card--S9":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:50,w:24},"card--S10":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:51,w:24},"card--SJ":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:52,w:24},"card--SQ":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:53,w:24},"card--SK":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:54,w:24},"card--Down":{cels:1,h:32,hitbox:{x:0,y:0,w:24,h:32},hurtbox:{x:0,y:0,w:24,h:32},id:55,w:24},"card--VacantPile":{cels:1,h:32,id:56,w:24},"card--VacantStock":{cels:1,h:32,hitbox:{x:4,y:7,w:16,h:16},hurtbox:{x:4,y:7,w:16,h:16},id:57,w:24},"card--VacantClubs":{cels:1,h:32,id:58,w:24},"card--VacantDiamonds":{cels:1,h:32,id:59,w:24},"card--VacantHearts":{cels:1,h:32,id:60,w:24},"card--VacantSpades":{cels:1,h:32,id:61,w:24},"card--OutlineFocus":{cels:1,h:32,id:62,w:24},"card--OutlineChecked":{cels:1,h:32,id:63,w:24},"cursor--Point":{cels:1,h:16,hitbox:{x:0,y:0,w:3,h:3},hurtbox:{x:0,y:0,w:3,h:3},id:64,w:16},"cursor--Pick":{cels:1,h:16,hitbox:{x:0,y:0,w:3,h:3},hurtbox:{x:0,y:0,w:3,h:3},id:65,w:16},"palette--Alpha":{cels:1,h:8,id:66,w:8},"palette--Dark":{cels:1,h:8,id:67,w:8},"palette--Mid":{cels:1,h:8,id:68,w:8},"palette--Light":{cels:1,h:8,id:69,w:8},"patience-the-demon--Good":{cels:1,h:24,hitbox:{x:0,y:0,w:24,h:24},hurtbox:{x:0,y:0,w:7,h:10},id:70,w:24},"patience-the-demon--GoodBlink":{cels:1,h:24,hitbox:{x:0,y:0,w:24,h:24},id:71,w:24},"patience-the-demon--Evil":{cels:1,h:24,hitbox:{x:0,y:0,w:24,h:24},hurtbox:{x:0,y:0,w:7,h:10},id:72,w:24},"patience-the-demon--EvilBlink":{cels:1,h:24,hitbox:{x:0,y:0,w:24,h:24},id:73,w:24},"tally--0":{cels:1,h:8,id:74,w:16},"tally--1":{cels:1,h:8,id:75,w:16},"tally--2":{cels:1,h:8,id:76,w:16},"tally--3":{cels:1,h:8,id:77,w:16},"tally--4":{cels:1,h:8,id:78,w:16},"tally--5":{cels:1,h:8,id:79,w:16},"tally--6":{cels:1,h:8,id:80,w:16},"tally--7":{cels:1,h:8,id:81,w:16},"tally--8":{cels:1,h:8,id:82,w:16},"tally--9":{cels:1,h:8,id:83,w:16},"tally--10":{cels:1,h:8,id:84,w:16},"tally--11":{cels:1,h:8,id:85,w:16},"tally--12":{cels:1,h:8,id:86,w:16},"tally--13":{cels:1,h:8,id:87,w:16},"tally--14":{cels:1,h:8,id:88,w:16},"tally--15":{cels:1,h:8,id:89,w:16},"tally--16":{cels:1,h:8,id:90,w:16},"tally--17":{cels:1,h:8,id:91,w:16},"tally--18":{cels:1,h:8,id:92,w:16},"tally--19":{cels:1,h:8,id:93,w:16},"tally--20":{cels:1,h:8,id:94,w:16}},celXY:[112,240,104,240,96,240,168,96,192,96,0,128,24,128,48,128,72,128,96,128,120,128,144,128,168,128,192,128,0,160,24,160,48,160,72,160,96,160,120,160,144,160,168,160,192,160,0,192,24,192,48,192,72,192,96,192,120,192,144,192,120,96,168,32,24,0,48,0,72,0,96,0,120,0,144,0,168,0,192,0,0,32,24,32,48,32,72,32,96,32,120,32,144,32,0,0,192,32,0,64,24,64,48,64,72,64,96,64,120,64,144,64,168,64,192,64,0,96,24,96,48,96,72,96,96,96,144,96,16,224,0,224,88,240,80,240,160,232,160,224,168,192,168,216,192,216,192,192,64,240,48,240,32,240,16,240,0,240,144,232,128,232,128,224,96,224,32,224,48,224,64,224,80,224,144,224,32,232,48,232,64,232,80,232,96,232,112,232,112,224]},init:{input:"Default",minWH:{w:256,h:214},minScale:1,mode:"Int",zoomOut:0}};var Je={$schema:"../level/level-file.json",ents:[{name:"Cam",cam:{}},{id:"Cursor",sprite:{tag:"cursor--Point"},cursor:{keyboard:128,pick:"cursor--Pick"}},{name:"Border",sprite:{tag:"palette--Dark",z:"A"},hud:{origin:"NW",fill:"XY"},ninePatch:{patch:{nw:{tag:"background--Corner",z:"B"},ne:{tag:"background--Corner",flip:"X",z:"B"},sw:{tag:"background--Corner",flip:"Y",z:"B"},se:{tag:"background--Corner",flip:"XY",z:"B"}},border:8}},{sprite:{tag:"background--Grid",z:"B",zend:!0},hud:{origin:"NW",fill:"XY",margin:1}},{board:{}},{name:"Stock Background",sprite:{tag:"palette--Light",x:169,y:9,z:"B",w:39,h:47}},{name:"Waste Pile",sprite:{tag:"palette--Light",x:201,y:9,z:"B"},pile:{type:"Waste"}},{name:"Waste Vacancy",sprite:{tag:"card--VacantPile",x:208,y:16,z:"C"}},{name:"Patience the Demon",sprite:{tag:"patience-the-demon--Good",z:"C"},hud:{modulo:{x:8,y:8},origin:"NW",margin:{x:16,y:16}},patienceTheDemon:{}}]};var p=8,Yt={w:24,h:32},Ki=72,Ut=2*p,Ft=16,Zi=-1024;function g(e){for(let[t,i]of e.solitaire.tableau.entries())for(let[r,o]of i.entries()){let n=e.spriteByCard.get(o);if(!n)throw Error("no sprite");let a=z(e.preload,t,r);n.x=a.x,n.y=a.y,n.z=o.direction==="Up"?h.F:h.E,n.tag=_(o)}for(let t of e.solitaire.foundation)for(let[i,r]of t.entries()){let o=e.spriteByCard.get(r);if(!o)throw Error("no sprite");let n=B(e.preload,r.suit);o.x=n.x,o.y=n.y;let a=i===t.length-1?_(r):"card--Down";o.z=a==="card--Down"?h.E:h.F,o.tag=a}for(let[t,i]of e.solitaire.stock.entries()){let r=e.spriteByCard.get(i);if(!r)throw Error("no sprite");let o=ut(e.solitaire,t);r.x=o.x,r.y=o.y,r.z=i.direction==="Up"?h.F:h.E,r.tag=_(i)}for(let[t,i]of e.solitaire.waste.entries()){let r=e.spriteByCard.get(i);if(!r)throw Error("no sprite");let o=$t(e.solitaire,t);r.x=o.x,r.y=o.y;let n,a=e.solitaire.selected?.pile==="Waste"?e.solitaire.selected?.cards.length??0:0,c=Math.max(e.solitaire.waste.length+a-e.solitaire.drawSize,0);t>=c?n=_(i):n="card--Down",r.z=n==="card--Down"?h.E:h.F,r.tag=n}e.invalid=!0}function ut(e,t){return{x:Ut+160,y:Ft+(e.stock.length-1===t?0:Zi)}}function $t(e,t){let i=e.selected?.pile==="Waste"?e.selected?.cards.length??0:0,r=Math.max(e.waste.length+i-e.drawSize,0),o=Math.max(t-r,0);return{x:208,y:Ft+o*p}}function B(e,t){let i=e.anim[`card--Vacant${t}`],r={Clubs:0,Diamonds:1,Hearts:2,Spades:3}[t];return{x:Ut+p*4+r*(i.w+p),y:Ft}}function z(e,t,i){let r=e.anim["card--VacantPile"];return{x:Ut+t*(r.w+p),y:Ki+i*p}}function _(e){return e.direction==="Up"?`card--${De(e)}`:"card--Down"}var Xt=26;function*Qe(e){yield*tr(e),yield*Ji(e),yield*Qi(e),yield*ji(e),yield*er(e)}function Ot(e,t,i){let r=e.pool.default.alloc();return r.tag=_(t),r.x=i.x,r.y=i.y,r.z=t.direction==="Up"?h.F:h.E,{sprite:r,card:t}}function*Ji(e){for(let t of P){let i=e.pool.default.alloc();i.tag=`card--Vacant${t}`;let r=B(e.preload,t);i.x=r.x,i.y=r.y,i.z=h.D,yield{sprite:i};let o=e.pool.default.alloc();o.tag="palette--Light",o.x=r.x,o.y=r.y,o.z=h.C,yield{sprite:o,pile:{type:"Foundation",suit:t}}}}function*Qi(e){let t=e.pool.default.alloc();t.tag="card--VacantStock",t.z=h.C;let i=ut(e.solitaire,e.solitaire.stock.length-1);t.x=i.x,t.y=i.y,yield{id:"VacantStock",sprite:t,vacantStock:{}};for(let[r,o]of e.solitaire.stock.entries())yield Ot(e,o,ut(e.solitaire,r))}function*ji(e){for(let[t,i]of e.solitaire.tableau.entries()){let r=t,o=e.pool.default.alloc();o.tag="palette--Light",o.z=h.C;let n=z(e.preload,r,0);o.x=n.x,o.y=n.y,yield{sprite:o,pile:{type:"Tableau",x:r}};let a=e.pool.default.alloc();a.tag="card--VacantPile",a.z=h.D,a.x=n.x,a.y=n.y,yield{sprite:a};for(let[c,d]of i.entries())yield Ot(e,d,z(e.preload,r,c))}}function*tr(e){for(let t=0;t<Xt;t++){let i=e.pool.default.alloc();i.tag="tally--0",i.z=h.D,yield{sprite:i,tally:{tens:t},hud:{modulo:{x:p,y:p},origin:"NE",margin:{n:8+t*8,s:8+t*8,w:0,e:0}}}}}function*er(e){for(let[t,i]of e.solitaire.waste.entries())yield Ot(e,i,$t(e.solitaire,t))}function je(e,t,i){return fe(e,t,ir,i)}var ir=(e,t,i)=>{if(t[i]==null)throw Error("no component val");switch(i){case"cam":case"draw":case"patienceTheDemon":case"pile":return t[i];case"board":return{cards:void 0,piles:void 0,selected:[],vacantStock:void 0}}};var dt=class{query="cam";update(t,i){i.cam.update(i.canvas);let r=Math.trunc((i.cam.w-i.cam.minWH.w)/2);i.cam.x=-r+r%8}};var pt=class{query="board";update(t,i){if(i.input.handled)return;t.board.cards??=[...i.zoo.query("card & sprite")],t.board.piles??=[...i.zoo.query("pile & sprite")],t.board.vacantStock||(t.board.vacantStock=i.zoo.findById("VacantStock"));let r=ti(t,i),o=r?.sprite.hitsZ(t.board.vacantStock.sprite,i.cam);if(r!=null&&!t.board.selected.length&&(!o&&i.input.isOnStart("A")||o&&i.input.isOffStart("A"))&&(i.input.handled=!0,sr(t,i,r.card)),i.input.isOn("A")&&t.board.selected.length>0?(i.input.handled=!0,nr(i,t.board.selected)):g(i),i.solitaire.selected!=null&&i.input.isOffStart("A")){if(i.input.handled=!0,t.board.selected.length){let n=rr(t,i);n!=null&&i.solitaire.selected!=null&&n.pile.type!=="Waste"&&Ne(i.solitaire,n.pile),v(i.solitaire),t.board.selected.length=0}else{let n=ti(t,i);n==null?v(i.solitaire):Wt(i.solitaire,n.card)}g(i)}}};function rr(e,t){let i=e.board.selected[0];if(i==null)return;let r;for(let o of e.board.piles){let n=or(i.sprite,o.sprite);if(n.w<=0||n.h<=0||o.pile.type==="Waste"||!Oe(t.solitaire,o.pile))continue;let a=n.w*n.h;(r==null||a>r.area)&&(r={area:a,ent:o})}return r?.ent}function or(e,t){let i=Math.max(e.x,t.x),r=Math.max(e.y,t.y);return{x:i,y:r,w:Math.min(e.x+e.w,t.x+t.w)-i,h:Math.min(e.y+e.h,t.y+t.h)-r}}function ti(e,t){let i;for(let r of e.board.cards)t.zoo.cursor?.sprite.hitsZ(r.sprite,t.cam)&&(i==null||r.sprite.above(i.sprite))&&(i=r);return i}function nr(e,t){if(e.zoo.cursor)for(let i of t)i.sprite.x=Math.trunc(e.zoo.cursor.sprite.x)-i.offset.x,i.sprite.y=Math.trunc(e.zoo.cursor.sprite.y)-i.offset.y}function sr(e,t,i){let r=Wt(t.solitaire,i);if(r==null)return;let o=r.cards.map(n=>{let a=t.spriteByCard.get(n);if(!a)throw Error("no sprite");if(!t.zoo.cursor)throw Error("no cursor");return{sprite:a,offset:{x:Math.trunc(t.zoo.cursor.sprite.x)-a.x,y:Math.trunc(t.zoo.cursor.sprite.y)-a.y}}});for(let n of o)n.sprite.z=h.G;e.board.selected.length=0,e.board.selected.push(...o)}var ft=class{query="draw";update(t,i){i.invalid&&(i.renderer.clear(i.backgroundRGBA),i.renderer.predraw(i.cam),i.renderer.setDepth(!0),i.renderer.draw(i.pool.default))}};var xt="save";var mt=class{query="patienceTheDemon & sprite";update(t,i){let o=Date.now()%6e4<59700?"":"Blink",n=t.sprite.tag.includes("Good"),c=`patience-the-demon--${i.input.isOffStart("A")?n?"Evil":"Good":n?"Good":"Evil"}${o}`;t.sprite.tag!==c&&(t.sprite.tag=c,t.invalid=!0),i.input.isOffStart("A")&&(i.zoo.cursor?.sprite.hitsZ(t.sprite,i.cam)?(i.input.handled=!0,t.invalid=!0):i.zoo.cursor&&t.sprite.hitsZ(i.zoo.cursor.sprite,i.cam)&&(i.input.handled=!0,$e(i.solitaire),me(xt,{wins:i.solitaire.wins}),g(i)))}};var yt=class{query="pile & sprite";update(t,i){let{pile:r,sprite:o}=t,n=r.type==="Waste"?{x:o.x+p-1,y:o.y+p-1}:r.type==="Tableau"?z(i.preload,r.x,0):B(i.preload,r.suit);o.x=n.x-p+1,o.y=n.y-p+1,o.w=Yt.w+p*2-1,o.h=Yt.h+(r.type==="Waste"?(i.solitaire.waste.length>0?i.solitaire.drawSize-1:0)*p:r.type==="Tableau"?((i.solitaire.tableau[r.x]?.length??1)-1)*p:0)+p*2-1}};var wt=class{query="sprite & tally";update(t,i){let r=Xt*10,o=Math.min(10,Math.max(0,i.solitaire.wins-t.tally.tens*10))+Math.min(10,Math.max(0,i.solitaire.wins-r-t.tally.tens*10));t.sprite.tag=`tally--${o}`}};var bt=class{query="sprite & vacantStock";update(t,i){i.input.isOffStart("A")&&i.zoo.cursor?.sprite.hitsZ(t.sprite,i.cam)&&(i.input.handled=!0,Xe(i.solitaire),g(i))}};var gt=class{query="loader";update(t,i){switch(t.loader.level){case void 0:{ar(t,i);return}case"Init":return;default:t.loader.level}}};function ar(e,t){t.zoo.addDefaultSystems();let i=je(Je,t.pool,t.preload);t.zoo.add(...i.ents,...Qe(t),{draw:{}}),t.spriteByCard=new Map([...t.zoo.query("card & sprite")].map(r=>[r.card,r.sprite])),t.zoo.addSystem({board:new pt,cam:new dt,draw:new ft,patienceTheDemon:new mt,pile:new yt,tally:new wt,vacantStock:new bt}),e.loader.level="Init"}console.debug(`Super Patience v${rt.version}+${rt.published}.${rt.hash} \u2500\u2500\u2500oidoid>\xB0\u2500\u2500`);var S=new ct({config:Ze,description:Ke,preloadAtlas:document.querySelector("#atlas"),loader:{loader:{level:void 0}},loaderSys:new gt});S.setPoller(6e4,()=>At(new Date,"Min"));setTimeout(()=>{S.requestFrame("Force"),setInterval(()=>S.requestFrame("Force"),6e4)},L(At(new Date,"Min")+59700,6e4));var cr=ye(xt)??{wins:0};S.solitaire=Fe(()=>S.random.num,cr.wins);await S.register("add");l&&(globalThis.v=S);
|
|
101
|
+
//# sourceMappingURL=index.js.map
|