@oidoid/void 0.1.0-7 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/public/index.js +19 -15
- package/dist/public/index.js.map +4 -4
- package/dist/public/preload-atlas.webp +0 -0
- package/dist/public/void-v0.1.0+20251227.1060661.html +115 -0
- package/dist/schema/config-file.v0.json +86 -15
- package/dist/schema/level-file.v0.json +423 -0
- package/dist/src/audio.d.ts +1 -0
- package/dist/src/audio.d.ts.map +1 -0
- package/dist/src/demo/assets/manifest.json +2 -2
- package/dist/src/demo/assets/void.game.json +202 -0
- package/dist/src/demo/ents/cam.d.ts +6 -0
- package/dist/src/demo/ents/cam.d.ts.map +1 -0
- package/dist/src/demo/ents/cam.js +21 -0
- package/dist/src/demo/ents/cam.js.map +1 -0
- package/dist/src/demo/ents/clock.d.ts +10 -0
- package/dist/src/demo/ents/clock.d.ts.map +1 -0
- package/dist/src/demo/ents/clock.js +16 -0
- package/dist/src/demo/ents/clock.js.map +1 -0
- package/dist/src/demo/ents/draw.d.ts +6 -0
- package/dist/src/demo/ents/draw.d.ts.map +1 -0
- package/dist/src/demo/ents/draw.js +14 -0
- package/dist/src/demo/ents/draw.js.map +1 -0
- package/dist/src/demo/ents/ent.d.ts +6 -0
- package/dist/src/demo/ents/ent.d.ts.map +1 -0
- package/dist/src/demo/ents/ent.js +2 -0
- package/dist/src/demo/ents/ent.js.map +1 -0
- package/dist/src/demo/ents/loader.d.ts +6 -0
- package/dist/src/demo/ents/loader.d.ts.map +1 -0
- package/dist/src/demo/ents/loader.js +45 -0
- package/dist/src/demo/ents/loader.js.map +1 -0
- package/dist/src/demo/ents/render-toggle.d.ts +7 -0
- package/dist/src/demo/ents/render-toggle.d.ts.map +1 -0
- package/dist/src/demo/ents/render-toggle.js +8 -0
- package/dist/src/demo/ents/render-toggle.js.map +1 -0
- package/dist/src/demo/ents/tally.d.ts +8 -0
- package/dist/src/demo/ents/tally.d.ts.map +1 -0
- package/dist/src/demo/ents/tally.js +14 -0
- package/dist/src/demo/ents/tally.js.map +1 -0
- package/dist/src/demo/index.d.ts +1 -0
- package/dist/src/demo/index.d.ts.map +1 -0
- package/dist/src/demo/index.js +12 -3
- package/dist/src/demo/index.js.map +1 -1
- package/dist/src/demo/level/level-file.json +50 -0
- package/dist/src/demo/level/level-parser.d.ts +5 -0
- package/dist/src/demo/level/level-parser.d.ts.map +1 -0
- package/dist/src/demo/level/level-parser.js +21 -0
- package/dist/src/demo/level/level-parser.js.map +1 -0
- package/dist/src/demo/level/level-schema.d.ts +4 -0
- package/dist/src/demo/level/level-schema.d.ts.map +1 -0
- package/dist/src/demo/level/level-schema.js +2 -0
- package/dist/src/demo/level/level-schema.js.map +1 -0
- package/dist/src/demo/types/decl.d.ts +30 -0
- package/dist/src/demo/types/decl.d.ts.map +1 -0
- package/dist/src/demo/types/decl.js +2 -0
- package/dist/src/demo/types/decl.js.map +1 -0
- package/dist/src/demo/void.json +8 -4
- package/dist/src/ents/button.d.ts +14 -0
- package/dist/src/ents/button.d.ts.map +1 -0
- package/dist/src/ents/button.js +59 -0
- package/dist/src/ents/button.js.map +1 -0
- package/dist/src/ents/cam.d.ts +3 -0
- package/dist/src/ents/cam.d.ts.map +1 -0
- package/dist/src/ents/cam.js +2 -0
- package/dist/src/ents/cam.js.map +1 -0
- package/dist/src/ents/cursor.d.ts +20 -0
- package/dist/src/ents/cursor.d.ts.map +1 -0
- package/dist/src/ents/cursor.js +49 -0
- package/dist/src/ents/cursor.js.map +1 -0
- package/dist/src/ents/debug-input.d.ts +8 -0
- package/dist/src/ents/debug-input.d.ts.map +1 -0
- package/dist/src/ents/debug-input.js +25 -0
- package/dist/src/ents/debug-input.js.map +1 -0
- package/dist/src/ents/draw.d.ts +3 -0
- package/dist/src/ents/draw.d.ts.map +1 -0
- package/dist/src/ents/draw.js +2 -0
- package/dist/src/ents/draw.js.map +1 -0
- package/dist/src/ents/ent-query.d.ts +26 -0
- package/dist/src/ents/ent-query.d.ts.map +1 -0
- package/dist/src/ents/ent-query.js +10 -0
- package/dist/src/ents/ent-query.js.map +1 -0
- package/dist/src/ents/ent.d.ts +92 -6
- package/dist/src/ents/ent.d.ts.map +1 -0
- package/dist/src/ents/fps.d.ts +7 -0
- package/dist/src/ents/fps.d.ts.map +1 -0
- package/dist/src/ents/fps.js +14 -0
- package/dist/src/ents/fps.js.map +1 -0
- package/dist/src/ents/hud.d.ts +14 -0
- package/dist/src/ents/hud.d.ts.map +1 -0
- package/dist/src/ents/hud.js +38 -0
- package/dist/src/ents/hud.js.map +1 -0
- package/dist/src/ents/loader.d.ts +3 -0
- package/dist/src/ents/loader.d.ts.map +1 -0
- package/dist/src/ents/loader.js +2 -0
- package/dist/src/ents/loader.js.map +1 -0
- package/dist/src/ents/nine-patch.d.ts +17 -0
- package/dist/src/ents/nine-patch.d.ts.map +1 -0
- package/dist/src/ents/nine-patch.js +99 -0
- package/dist/src/ents/nine-patch.js.map +1 -0
- package/dist/src/ents/override.d.ts +8 -0
- package/dist/src/ents/override.d.ts.map +1 -0
- package/dist/src/ents/override.js +8 -0
- package/dist/src/ents/override.js.map +1 -0
- package/dist/src/ents/sprite.d.ts +8 -0
- package/dist/src/ents/sprite.d.ts.map +1 -0
- package/dist/src/ents/sprite.js +10 -0
- package/dist/src/ents/sprite.js.map +1 -0
- package/dist/src/ents/sys.d.ts +14 -0
- package/dist/src/ents/sys.d.ts.map +1 -0
- package/dist/src/ents/sys.js +2 -0
- package/dist/src/ents/sys.js.map +1 -0
- package/dist/src/ents/text.d.ts +21 -0
- package/dist/src/ents/text.d.ts.map +1 -0
- package/dist/src/ents/text.js +118 -0
- package/dist/src/ents/text.js.map +1 -0
- package/dist/src/ents/zoo.d.ts +18 -11
- package/dist/src/ents/zoo.d.ts.map +1 -0
- package/dist/src/ents/zoo.js +75 -15
- package/dist/src/ents/zoo.js.map +1 -1
- package/dist/src/graphics/atlas-parser.d.ts +3 -1
- package/dist/src/graphics/atlas-parser.d.ts.map +1 -0
- package/dist/src/graphics/atlas-parser.js.map +1 -1
- package/dist/src/graphics/atlas.d.ts +9 -15
- package/dist/src/graphics/atlas.d.ts.map +1 -0
- package/dist/src/graphics/cam.d.ts +13 -10
- package/dist/src/graphics/cam.d.ts.map +1 -0
- package/dist/src/graphics/cam.js +23 -17
- package/dist/src/graphics/cam.js.map +1 -1
- package/dist/src/graphics/gl.d.ts +1 -8
- package/dist/src/graphics/gl.d.ts.map +1 -0
- package/dist/src/graphics/gl.js +0 -1
- package/dist/src/graphics/gl.js.map +1 -1
- package/dist/src/graphics/layer.d.ts +21 -17
- package/dist/src/graphics/layer.d.ts.map +1 -0
- package/dist/src/graphics/layer.js +23 -18
- package/dist/src/graphics/layer.js.map +1 -1
- package/dist/src/graphics/pixel-ratio-observer.d.ts +8 -0
- package/dist/src/graphics/pixel-ratio-observer.d.ts.map +1 -0
- package/dist/src/graphics/pixel-ratio-observer.js +23 -0
- package/dist/src/graphics/pixel-ratio-observer.js.map +1 -0
- package/dist/src/graphics/render-mode.d.ts +2 -0
- package/dist/src/graphics/render-mode.d.ts.map +1 -0
- package/dist/src/graphics/render-mode.js +2 -0
- package/dist/src/graphics/render-mode.js.map +1 -0
- package/dist/src/graphics/renderer.d.ts +9 -4
- package/dist/src/graphics/renderer.d.ts.map +1 -0
- package/dist/src/graphics/renderer.js +30 -13
- package/dist/src/graphics/renderer.js.map +1 -1
- package/dist/src/graphics/sprite-frag.glsl.d.ts +1 -0
- package/dist/src/graphics/sprite-frag.glsl.d.ts.map +1 -0
- package/dist/src/graphics/sprite-frag.glsl.js +3 -4
- package/dist/src/graphics/sprite-frag.glsl.js.map +1 -1
- package/dist/src/graphics/sprite-vert.glsl.d.ts +1 -0
- package/dist/src/graphics/sprite-vert.glsl.d.ts.map +1 -0
- package/dist/src/graphics/sprite-vert.glsl.js +9 -7
- package/dist/src/graphics/sprite-vert.glsl.js.map +1 -1
- package/dist/src/graphics/sprite.d.ts +54 -16
- package/dist/src/graphics/sprite.d.ts.map +1 -0
- package/dist/src/graphics/sprite.js +109 -32
- package/dist/src/graphics/sprite.js.map +1 -1
- package/dist/src/index.d.ts +31 -6
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +33 -9
- package/dist/src/index.js.map +1 -1
- package/dist/src/input/context-menu.d.ts +1 -1
- package/dist/src/input/context-menu.d.ts.map +1 -0
- package/dist/src/input/context-menu.js +0 -1
- package/dist/src/input/context-menu.js.map +1 -1
- package/dist/src/input/gamepad.d.ts +1 -1
- package/dist/src/input/gamepad.d.ts.map +1 -0
- package/dist/src/input/gamepad.js +0 -1
- package/dist/src/input/gamepad.js.map +1 -1
- package/dist/src/input/input.d.ts +30 -23
- package/dist/src/input/input.d.ts.map +1 -0
- package/dist/src/input/input.js +53 -31
- package/dist/src/input/input.js.map +1 -1
- package/dist/src/input/keyboard.d.ts +1 -0
- package/dist/src/input/keyboard.d.ts.map +1 -0
- package/dist/src/input/pointer.d.ts +1 -0
- package/dist/src/input/pointer.d.ts.map +1 -0
- package/dist/src/input/pointer.js +11 -8
- package/dist/src/input/pointer.js.map +1 -1
- package/dist/src/input/wheel.d.ts +6 -1
- package/dist/src/input/wheel.d.ts.map +1 -0
- package/dist/src/input/wheel.js +5 -1
- package/dist/src/input/wheel.js.map +1 -1
- package/dist/src/level/level-parser.d.ts +26 -0
- package/dist/src/level/level-parser.d.ts.map +1 -0
- package/dist/src/level/level-parser.js +258 -0
- package/dist/src/level/level-parser.js.map +1 -0
- package/dist/src/level/level-schema-json.d.ts +5 -0
- package/dist/src/level/level-schema-json.d.ts.map +1 -0
- package/dist/src/level/level-schema-json.js +2 -0
- package/dist/src/level/level-schema-json.js.map +1 -0
- package/dist/src/level/level-schema.d.ts +87 -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 +8 -0
- package/dist/src/level/level.d.ts.map +1 -0
- package/dist/src/level/level.js +2 -0
- package/dist/src/level/level.js.map +1 -0
- package/dist/src/looper.d.ts +1 -0
- package/dist/src/looper.d.ts.map +1 -0
- package/dist/src/looper.js +5 -2
- package/dist/src/looper.js.map +1 -1
- package/dist/src/mem/pool-map.d.ts +6 -0
- package/dist/src/mem/pool-map.d.ts.map +1 -0
- package/dist/src/mem/pool-map.js +2 -0
- package/dist/src/mem/pool-map.js.map +1 -0
- package/dist/src/mem/pool.d.ts +5 -1
- package/dist/src/mem/pool.d.ts.map +1 -0
- package/dist/src/mem/pool.js +22 -21
- package/dist/src/mem/pool.js.map +1 -1
- package/dist/src/mem/sprite-pool.d.ts +12 -0
- package/dist/src/mem/sprite-pool.d.ts.map +1 -0
- package/dist/src/mem/sprite-pool.js +11 -0
- package/dist/src/mem/sprite-pool.js.map +1 -0
- package/dist/src/random/random.d.ts +1 -0
- package/dist/src/random/random.d.ts.map +1 -0
- package/dist/src/storage/local-storage.d.ts +2 -1
- package/dist/src/storage/local-storage.d.ts.map +1 -0
- package/dist/src/storage/local-storage.js.map +1 -1
- package/dist/src/text/font.d.ts +5 -3
- package/dist/src/text/font.d.ts.map +1 -0
- package/dist/src/text/font.js +8 -5
- package/dist/src/text/font.js.map +1 -1
- package/dist/src/text/mem-prop-5x6.json +20 -5
- package/dist/src/text/text-layout.d.ts +16 -5
- package/dist/src/text/text-layout.d.ts.map +1 -0
- package/dist/src/text/text-layout.js +46 -28
- package/dist/src/text/text-layout.js.map +1 -1
- package/dist/src/types/bundle.d.ts +10 -0
- package/dist/src/types/bundle.d.ts.map +1 -0
- package/dist/src/types/bundle.js +2 -0
- package/dist/src/types/bundle.js.map +1 -0
- package/dist/src/types/game-config.d.ts +27 -0
- package/dist/src/types/game-config.d.ts.map +1 -0
- package/dist/src/types/game-config.js +2 -0
- package/dist/src/types/game-config.js.map +1 -0
- package/dist/src/types/geo.d.ts +9 -2
- package/dist/src/types/geo.d.ts.map +1 -0
- package/dist/src/types/geo.js +16 -0
- package/dist/src/types/geo.js.map +1 -1
- package/dist/src/types/json.d.ts +1 -0
- package/dist/src/types/json.d.ts.map +1 -0
- package/dist/src/types/time.d.ts +13 -2
- package/dist/src/types/time.d.ts.map +1 -0
- package/dist/src/types/time.js +10 -0
- package/dist/src/types/time.js.map +1 -1
- package/dist/src/utils/async-util.d.ts +1 -0
- package/dist/src/utils/async-util.d.ts.map +1 -0
- package/dist/src/utils/async-util.js +2 -0
- package/dist/src/utils/async-util.js.map +1 -1
- package/dist/src/utils/canvas-util.d.ts +3 -1
- package/dist/src/utils/canvas-util.d.ts.map +1 -0
- package/dist/src/utils/canvas-util.js +7 -3
- package/dist/src/utils/canvas-util.js.map +1 -1
- package/dist/src/utils/color-util.d.ts +6 -0
- package/dist/src/utils/color-util.d.ts.map +1 -0
- package/dist/src/utils/color-util.js +12 -0
- package/dist/src/utils/color-util.js.map +1 -1
- package/dist/src/utils/debug.d.ts +1 -0
- package/dist/src/utils/debug.d.ts.map +1 -0
- package/dist/src/utils/debug.js +4 -4
- package/dist/src/utils/debug.js.map +1 -1
- package/dist/src/utils/delay-interval.d.ts +1 -0
- package/dist/src/utils/delay-interval.d.ts.map +1 -0
- package/dist/src/utils/dom-util.d.ts +3 -2
- package/dist/src/utils/dom-util.d.ts.map +1 -0
- package/dist/src/utils/dom-util.js +16 -12
- package/dist/src/utils/dom-util.js.map +1 -1
- package/dist/src/utils/fetch-util.d.ts +2 -1
- package/dist/src/utils/fetch-util.d.ts.map +1 -0
- package/dist/src/utils/fetch-util.js +2 -2
- package/dist/src/utils/math.d.ts +1 -0
- package/dist/src/utils/math.d.ts.map +1 -0
- package/dist/src/utils/math.js +1 -1
- package/dist/src/utils/math.js.map +1 -1
- package/dist/src/utils/obj-util.d.ts +7 -0
- package/dist/src/utils/obj-util.d.ts.map +1 -0
- package/dist/src/utils/obj-util.js +8 -0
- package/dist/src/utils/obj-util.js.map +1 -0
- package/dist/src/utils/str-util.d.ts +2 -0
- package/dist/src/utils/str-util.d.ts.map +1 -0
- package/dist/src/utils/str-util.js +6 -0
- package/dist/src/utils/str-util.js.map +1 -0
- package/dist/src/utils/vibrate.d.ts +1 -0
- package/dist/src/utils/vibrate.d.ts.map +1 -0
- package/dist/src/void.d.ts +42 -30
- package/dist/src/void.d.ts.map +1 -0
- package/dist/src/void.js +78 -34
- package/dist/src/void.js.map +1 -1
- package/dist/tools/atlas-pack/aseprite-json.d.ts +5 -0
- package/dist/tools/atlas-pack/aseprite-json.d.ts.map +1 -0
- package/dist/tools/atlas-pack/aseprite-json.js +2 -0
- package/dist/tools/atlas-pack/aseprite-json.js.map +1 -0
- package/dist/tools/atlas-pack/aseprite.d.ts +58 -31
- package/dist/tools/atlas-pack/aseprite.d.ts.map +1 -0
- package/dist/tools/atlas-pack/aseprite.js +1 -1
- package/dist/tools/atlas-pack/aseprite.js.map +1 -1
- package/dist/tools/atlas-pack/atlas-json-parser.d.ts +11 -10
- package/dist/tools/atlas-pack/atlas-json-parser.d.ts.map +1 -0
- package/dist/tools/atlas-pack/atlas-json-parser.js +14 -14
- package/dist/tools/atlas-pack/atlas-json-parser.js.map +1 -1
- package/dist/tools/atlas-pack/atlas-pack.d.ts +4 -2
- package/dist/tools/atlas-pack/atlas-pack.d.ts.map +1 -0
- package/dist/tools/atlas-pack/atlas-pack.js +1 -6
- package/dist/tools/atlas-pack/atlas-pack.js.map +1 -1
- package/dist/tools/bundle/bundle.d.ts +3 -3
- package/dist/tools/bundle/bundle.d.ts.map +1 -0
- package/dist/tools/bundle/bundle.js +32 -7
- package/dist/tools/bundle/bundle.js.map +1 -1
- package/dist/tools/bundle/html-plugin.d.ts +1 -0
- package/dist/tools/bundle/html-plugin.d.ts.map +1 -0
- package/dist/tools/bundle/html-plugin.js +5 -20
- package/dist/tools/bundle/html-plugin.js.map +1 -1
- package/dist/tools/tsconfig-base.json +1 -1
- package/dist/tools/tsconfig.json +1 -2
- package/dist/{schema → tools/types}/config-file.d.ts +21 -9
- package/dist/tools/types/config-file.d.ts.map +1 -0
- package/dist/{schema → tools/types}/config-file.js +18 -5
- package/dist/tools/types/config-file.js.map +1 -0
- package/dist/tools/types/config.d.ts +10 -9
- package/dist/tools/types/config.d.ts.map +1 -0
- package/dist/tools/types/config.js +23 -5
- package/dist/tools/types/config.js.map +1 -1
- package/dist/tools/types/package-json.d.ts +3 -2
- package/dist/tools/types/package-json.d.ts.map +1 -0
- package/dist/tools/utils/argv.d.ts +3 -0
- package/dist/tools/utils/argv.d.ts.map +1 -0
- package/dist/tools/utils/argv.js +1 -1
- package/dist/tools/utils/argv.js.map +1 -1
- package/dist/tools/utils/exec.d.ts +2 -1
- package/dist/tools/utils/exec.d.ts.map +1 -0
- package/dist/tools/utils/exec.js.map +1 -1
- package/dist/tools/utils/file-util.d.ts +1 -0
- package/dist/tools/utils/file-util.d.ts.map +1 -0
- package/dist/tools/utils/html-parser.d.ts +1 -0
- package/dist/tools/utils/html-parser.d.ts.map +1 -0
- package/dist/tools/void.d.ts +1 -0
- package/dist/tools/void.d.ts.map +1 -0
- package/dist/tools/void.js +3 -16
- package/dist/tools/void.js.map +1 -1
- package/package.json +18 -20
- package/readme.md +63 -1
- package/dist/meta.json +0 -1
- package/dist/package.json +0 -66
- package/dist/public/favicon/favicon16.png +0 -0
- package/dist/public/favicon/favicon192.png +0 -0
- package/dist/public/favicon/favicon32.png +0 -0
- package/dist/public/favicon/favicon48.png +0 -0
- package/dist/public/favicon/favicon64.png +0 -0
- package/dist/public/preload-atlas.png +0 -0
- package/dist/public/void-v0.1.0-6+20251020.7cdf98d.html +0 -111
- package/dist/public/void-v0.1.0-6+20251020.e4e9eef.html +0 -111
- package/dist/public/void-v0.1.0-7+20251021.7cdf98d.html +0 -111
- package/dist/schema/config-file.js.map +0 -1
- package/dist/src/demo/assets/preload-atlas.json +0 -193
- package/dist/src/demo/ents/clock-ent.d.ts +0 -11
- package/dist/src/demo/ents/clock-ent.js +0 -26
- package/dist/src/demo/ents/clock-ent.js.map +0 -1
- package/dist/src/demo/ents/render-toggle-ent.d.ts +0 -12
- package/dist/src/demo/ents/render-toggle-ent.js +0 -41
- package/dist/src/demo/ents/render-toggle-ent.js.map +0 -1
- package/dist/src/demo/ents/work-counter-ent.d.ts +0 -10
- package/dist/src/demo/ents/work-counter-ent.js +0 -20
- package/dist/src/demo/ents/work-counter-ent.js.map +0 -1
- package/dist/src/demo/game.d.ts +0 -12
- package/dist/src/demo/game.js +0 -135
- package/dist/src/demo/game.js.map +0 -1
- package/dist/src/demo/types/tag.d.ts +0 -2
- package/dist/src/demo/types/tag.js +0 -2
- package/dist/src/demo/types/tag.js.map +0 -1
- package/dist/src/ents/button-ent.d.ts +0 -39
- package/dist/src/ents/button-ent.js +0 -128
- package/dist/src/ents/button-ent.js.map +0 -1
- package/dist/src/ents/cursor-ent.d.ts +0 -18
- package/dist/src/ents/cursor-ent.js +0 -63
- package/dist/src/ents/cursor-ent.js.map +0 -1
- package/dist/src/ents/follow-cam-ent.d.ts +0 -25
- package/dist/src/ents/follow-cam-ent.js +0 -87
- package/dist/src/ents/follow-cam-ent.js.map +0 -1
- package/dist/src/ents/nine-patch-ent.d.ts +0 -43
- package/dist/src/ents/nine-patch-ent.js +0 -143
- package/dist/src/ents/nine-patch-ent.js.map +0 -1
- package/dist/src/ents/text-ent.d.ts +0 -23
- package/dist/src/ents/text-ent.js +0 -109
- package/dist/src/ents/text-ent.js.map +0 -1
- package/dist/src/types/void-version.d.ts +0 -7
- package/dist/src/types/void-version.js +0 -2
- package/dist/src/types/void-version.js.map +0 -1
- package/schema/config-file.test.ts +0 -55
- package/schema/config-file.ts +0 -69
- package/schema/config-file.v0.json +0 -68
- package/tools/atlas-pack/aseprite.ts +0 -60
- package/tools/atlas-pack/atlas-json-parser.test.ts +0 -780
- package/tools/atlas-pack/atlas-json-parser.ts +0 -159
- package/tools/atlas-pack/atlas-pack.ts +0 -51
- package/tools/bundle/bundle.ts +0 -64
- package/tools/bundle/html-plugin.ts +0 -135
- package/tools/types/config.ts +0 -65
- package/tools/types/package-json.ts +0 -4
- package/tools/utils/argv.test.ts +0 -41
- package/tools/utils/argv.ts +0 -29
- package/tools/utils/exec.ts +0 -22
- package/tools/utils/file-util.ts +0 -11
- package/tools/utils/html-parser.ts +0 -9
- package/tools/void.ts +0 -55
package/dist/public/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["<define:globalThis.
|
|
4
|
-
"sourcesContent": ["{\"published\":\"20251021\",\"version\":\"0.1.0-7\"}", "export type VoidVersion = {\n /** package.json `published` YYYYMMDD. */\n published: string\n /** package.json semantic `version`. */\n version: string\n}\n\ndeclare namespace globalThis {\n var voidVersion: VoidVersion // set by esbuild.\n}\n\nexport const voidVersion: VoidVersion = globalThis.voidVersion\n", "{\n \"id\": \"mem-prop-5x6\",\n \"name\": \"mem 5x6\",\n \"cellWidth\": 5,\n \"cellHeight\": 6,\n \"leading\": 1,\n \"lineHeight\": 7,\n \"baseline\": 1,\n \"kerning\": {\n \" 0\": 0,\n \" 1\": 0,\n \" 2\": 0,\n \" 3\": 0,\n \" 4\": 0,\n \" 5\": 0,\n \" 6\": 0,\n \" 7\": 0,\n \" 8\": 0,\n \" 9\": 0,\n \"##\": -1,\n \"#_\": 0,\n \"',\": 0,\n \"'.\": 0,\n \"'/\": 0,\n \"'J\": 0,\n \"'S\": 0,\n \"'_\": 0,\n \"'j\": 0,\n \"'s\": 0,\n \"(+\": 0,\n \"(-\": 0,\n \"(<\": 0,\n \"(f\": 0,\n \"({\": 0,\n \"(~\": 0,\n \")_\": 0,\n \"*,\": 0,\n \"*.\": 0,\n \"*/\": 0,\n \"*S\": 0,\n \"*_\": 0,\n \"*j\": 0,\n \"*s\": 0,\n \"+)\": 0,\n \"+,\": 0,\n \"+.\": 0,\n \"+/\": 0,\n \"+>\": 0,\n \"+?\": 0,\n \"+I\": 0,\n \"+S\": 0,\n \"+T\": 0,\n \"+Z\": 0,\n \"+]\": 0,\n \"+_\": 0,\n \"+`\": 0,\n \"+j\": 0,\n \"+s\": 0,\n \"+}\": 0,\n \",'\": 0,\n \",*\": 0,\n \",+\": 0,\n \",-\": 0,\n \",<\": 0,\n \",?\": 0,\n \",T\": 0,\n \",Y\": 0,\n \",Z\": 0,\n \",\\\"\": 0,\n \",\\\\\": 0,\n \",^\": 0,\n \",`\": 0,\n \",f\": 0,\n \",t\": 0,\n \",z\": 0,\n \",{\": 0,\n \",~\": 0,\n \"-)\": 0,\n \"-,\": 0,\n \"--\": 0,\n \"-.\": 0,\n \"-/\": 0,\n \"->\": 0,\n \"-?\": 0,\n \"-I\": 0,\n \"-S\": 0,\n \"-T\": 0,\n \"-Z\": 0,\n \"-]\": 0,\n \"-_\": 0,\n \"-`\": 0,\n \"-j\": 0,\n \"-s\": 0,\n \"-}\": 0,\n \".'\": 0,\n \".*\": 0,\n \".+\": 0,\n \".-\": 0,\n \".<\": 0,\n \".?\": 0,\n \".T\": 0,\n \".Y\": 0,\n \".Z\": 0,\n \".\\\"\": 0,\n \".\\\\\": 0,\n \".^\": 0,\n \".`\": 0,\n \".f\": 0,\n \".t\": 0,\n \".z\": 0,\n \".{\": 0,\n \".~\": 0,\n \"/,\": 0,\n \"/.\": 0,\n \"//\": 0,\n \"/J\": 0,\n \"/S\": 0,\n \"/_\": 0,\n \"/j\": 0,\n \"/s\": 0,\n \"0 \": 0,\n \"1 \": 0,\n \"1T\": 0,\n \"1Y\": 0,\n \"1Z\": 0,\n \"1f\": 0,\n \"1t\": 0,\n \"1z\": 0,\n \"2 \": 0,\n \"3 \": 0,\n \"4 \": 0,\n \"5 \": 0,\n \"6 \": 0,\n \"7 \": 0,\n \"8 \": 0,\n \"9 \": 0,\n \":?\": 0,\n \":T\": 0,\n \":Z\": 0,\n \":`\": 0,\n \";?\": 0,\n \";T\": 0,\n \";Z\": 0,\n \"<+\": 0,\n \"<-\": 0,\n \"<<\": 0,\n \"<f\": 0,\n \"<{\": 0,\n \"<~\": 0,\n \"==\": 0,\n \"=_\": 0,\n \">)\": 0,\n \">,\": 0,\n \">.\": 0,\n \">/\": 0,\n \">>\": 0,\n \">?\": 0,\n \">I\": 0,\n \">S\": 0,\n \">T\": 0,\n \">Z\": 0,\n \">]\": 0,\n \">_\": 0,\n \">`\": 0,\n \">j\": 0,\n \">s\": 0,\n \">}\": 0,\n \"?,\": 0,\n \"?.\": 0,\n \"?/\": 0,\n \"?S\": 0,\n \"?_\": 0,\n \"?j\": 0,\n \"?s\": 0,\n \"@_\": 0,\n \"C+\": 0,\n \"C-\": 0,\n \"C<\": 0,\n \"Cf\": 0,\n \"C{\": 0,\n \"C~\": 0,\n \"D_\": 0,\n \"E+\": 0,\n \"E-\": 0,\n \"E<\": 0,\n \"Ef\": 0,\n \"E{\": 0,\n \"E~\": 0,\n \"F&\": 0,\n \"F+\": 0,\n \"F,\": 0,\n \"F-\": 0,\n \"F.\": 0,\n \"F/\": 0,\n \"F:\": 0,\n \"F;\": 0,\n \"F<\": 0,\n \"FJ\": 0,\n \"FS\": 0,\n \"F_\": 0,\n \"Fa\": 0,\n \"Fe\": 0,\n \"Ff\": 0,\n \"Fg\": 0,\n \"Fj\": 0,\n \"Fq\": 0,\n \"Fs\": 0,\n \"F{\": 0,\n \"F~\": 0,\n \"I+\": 0,\n \"I-\": 0,\n \"I<\": 0,\n \"If\": 0,\n \"I{\": 0,\n \"I~\": 0,\n \"L'\": 0,\n \"L*\": 0,\n \"L+\": 0,\n \"L-\": 0,\n \"L4\": 0,\n \"L7\": 0,\n \"L<\": 0,\n \"L?\": 0,\n \"LT\": 0,\n \"LY\": 0,\n \"LZ\": 0,\n \"L\\\"\": 0,\n \"L\\\\\": 0,\n \"L^\": 0,\n \"L`\": 0,\n \"Lf\": 0,\n \"Lt\": 0,\n \"Lz\": 0,\n \"L{\": 0,\n \"L~\": 0,\n \"P,\": 0,\n \"P.\": 0,\n \"P/\": 0,\n \"PS\": 0,\n \"P_\": 0,\n \"Pj\": 0,\n \"Ps\": 0,\n \"S&\": 0,\n \"S+\": 0,\n \"S,\": 0,\n \"S-\": 0,\n \"S.\": 0,\n \"S/\": 0,\n \"S:\": 0,\n \"S;\": 0,\n \"S<\": 0,\n \"SJ\": 0,\n \"SS\": 0,\n \"S_\": 0,\n \"Sa\": 0,\n \"Se\": 0,\n \"Sf\": 0,\n \"Sg\": 0,\n \"Sj\": 0,\n \"Sq\": 0,\n \"Ss\": 0,\n \"S{\": 0,\n \"S~\": 0,\n \"T&\": 0,\n \"T+\": 0,\n \"T,\": 0,\n \"T-\": 0,\n \"T.\": 0,\n \"T/\": 0,\n \"T:\": 0,\n \"T;\": 0,\n \"T<\": 0,\n \"TJ\": 0,\n \"TS\": 0,\n \"T_\": 0,\n \"Ta\": 0,\n \"Te\": 0,\n \"Tf\": 0,\n \"Tg\": 0,\n \"Tj\": 0,\n \"Tq\": 0,\n \"Ts\": 0,\n \"T{\": 0,\n \"T~\": 0,\n \"V_\": 0,\n \"Y,\": 0,\n \"Y.\": 0,\n \"Y/\": 0,\n \"YS\": 0,\n \"Y_\": 0,\n \"Yj\": 0,\n \"Ys\": 0,\n \"Z'\": 0,\n \"Z*\": 0,\n \"Z+\": 0,\n \"Z-\": 0,\n \"Z4\": 0,\n \"Z7\": 0,\n \"Z<\": 0,\n \"Z?\": 0,\n \"ZT\": 0,\n \"ZY\": 0,\n \"ZZ\": 0,\n \"Z\\\"\": 0,\n \"Z\\\\\": 0,\n \"Z^\": 0,\n \"Z`\": 0,\n \"Zf\": 0,\n \"Zt\": 0,\n \"Zz\": 0,\n \"Z{\": 0,\n \"Z~\": 0,\n \"[+\": 0,\n \"[-\": 0,\n \"[<\": 0,\n \"[f\": 0,\n \"[{\": 0,\n \"[~\": 0,\n \"\\\",\": 0,\n \"\\\".\": 0,\n \"\\\"/\": 0,\n \"\\\"J\": 0,\n \"\\\"S\": 0,\n \"\\\"_\": 0,\n \"\\\"j\": 0,\n \"\\\"s\": 0,\n \"\\\\'\": 0,\n \"\\\\*\": 0,\n \"\\\\+\": 0,\n \"\\\\-\": 0,\n \"\\\\<\": 0,\n \"\\\\?\": 0,\n \"\\\\T\": 0,\n \"\\\\Y\": 0,\n \"\\\\Z\": 0,\n \"\\\\\\\"\": 0,\n \"\\\\\\\\\": 0,\n \"\\\\^\": 0,\n \"\\\\`\": 0,\n \"\\\\f\": 0,\n \"\\\\t\": 0,\n \"\\\\z\": 0,\n \"\\\\{\": 0,\n \"\\\\~\": 0,\n \"^,\": 0,\n \"^.\": 0,\n \"^/\": 0,\n \"^J\": 0,\n \"^S\": 0,\n \"^_\": 0,\n \"^j\": 0,\n \"^s\": 0,\n \"_#\": 0,\n \"_%\": 0,\n \"_'\": 0,\n \"_(\": 0,\n \"_*\": 0,\n \"_+\": 0,\n \"_-\": 0,\n \"_<\": 0,\n \"_=\": 0,\n \"_?\": 0,\n \"_@\": 0,\n \"_T\": 0,\n \"_V\": 0,\n \"_Y\": 0,\n \"_Z\": 0,\n \"_\\\"\": 0,\n \"_\\\\\": 0,\n \"_^\": 0,\n \"__\": 0,\n \"_`\": 0,\n \"_a\": 0,\n \"_e\": 0,\n \"_f\": 0,\n \"_t\": 0,\n \"_v\": 0,\n \"_z\": 0,\n \"_{\": 0,\n \"_~\": 0,\n \"`,\": 0,\n \"`.\": 0,\n \"`/\": 0,\n \"`J\": 0,\n \"`S\": 0,\n \"`_\": 0,\n \"`j\": 0,\n \"`s\": 0,\n \"f,\": 0,\n \"f.\": 0,\n \"f/\": 0,\n \"fS\": 0,\n \"f_\": 0,\n \"fj\": 0,\n \"fs\": 0,\n \"q#\": 0,\n \"q$\": 0,\n \"q%\": 0,\n \"q&\": 0,\n \"q'\": 0,\n \"q(\": 0,\n \"q*\": 0,\n \"q+\": 0,\n \"q-\": 0,\n \"q0\": 0,\n \"q1\": 0,\n \"q2\": 0,\n \"q3\": 0,\n \"q4\": 0,\n \"q5\": 0,\n \"q6\": 0,\n \"q7\": 0,\n \"q8\": 0,\n \"q9\": 0,\n \"q<\": 0,\n \"q=\": 0,\n \"q?\": 0,\n \"q@\": 0,\n \"qA\": 0,\n \"qB\": 0,\n \"qC\": 0,\n \"qD\": 0,\n \"qE\": 0,\n \"qF\": 0,\n \"qG\": 0,\n \"qH\": 0,\n \"qI\": 0,\n \"qJ\": 0,\n \"qK\": 0,\n \"qL\": 0,\n \"qM\": 0,\n \"qN\": 0,\n \"qO\": 0,\n \"qP\": 0,\n \"qQ\": 0,\n \"qR\": 0,\n \"qS\": 0,\n \"qT\": 0,\n \"qU\": 0,\n \"qV\": 0,\n \"qW\": 0,\n \"qX\": 0,\n \"qY\": 0,\n \"qZ\": 0,\n \"q[\": 0,\n \"q\\\"\": 0,\n \"q\\\\\": 0,\n \"q]\": 0,\n \"q^\": 0,\n \"q`\": 0,\n \"qa\": 0,\n \"qb\": 0,\n \"qc\": 0,\n \"qd\": 0,\n \"qe\": 0,\n \"qf\": 0,\n \"qh\": 0,\n \"qk\": 0,\n \"qm\": 0,\n \"qn\": 0,\n \"qo\": 0,\n \"qq\": 0,\n \"qr\": 0,\n \"qs\": 0,\n \"qt\": 0,\n \"qu\": 0,\n \"qv\": 0,\n \"qw\": 0,\n \"qx\": 0,\n \"qz\": 0,\n \"q{\": 0,\n \"q}\": 0,\n \"q~\": 0,\n \"r,\": 0,\n \"r.\": 0,\n \"r/\": 0,\n \"rS\": 0,\n \"r_\": 0,\n \"rj\": -1,\n \"rs\": 0,\n \"s,\": 0,\n \"s.\": 0,\n \"s/\": 0,\n \"sJ\": 0,\n \"sS\": 0,\n \"s_\": 0,\n \"sj\": 0,\n \"ss\": 0,\n \"z'\": 0,\n \"z*\": 0,\n \"z+\": 0,\n \"z-\": 0,\n \"z4\": 0,\n \"z7\": 0,\n \"z<\": 0,\n \"z?\": 0,\n \"zT\": 0,\n \"zY\": 0,\n \"zZ\": 0,\n \"z\\\"\": 0,\n \"z\\\\\": 0,\n \"z^\": 0,\n \"z`\": 0,\n \"zf\": 0,\n \"zt\": 0,\n \"zz\": 0,\n \"z{\": 0,\n \"z~\": 0,\n \"{+\": 0,\n \"{-\": 0,\n \"{<\": 0,\n \"{f\": 0,\n \"{{\": 0,\n \"{~\": 0,\n \"})\": 0,\n \"},\": 0,\n \"}.\": 0,\n \"}/\": 0,\n \"}>\": 0,\n \"}?\": 0,\n \"}I\": 0,\n \"}S\": 0,\n \"}T\": 0,\n \"}Z\": 0,\n \"}]\": 0,\n \"}_\": 0,\n \"}`\": 0,\n \"}j\": 0,\n \"}s\": 0,\n \"}}\": 0,\n \"~'\": 0,\n \"~?\": 0,\n \"~T\": 0,\n \"~Z\": 0,\n \"~\\\"\": 0,\n \"~\\\\\": 0,\n \"~^\": 0,\n \"~_\": 0,\n \"~`\": 0,\n \"~t\": 0,\n \"~z\": 0\n },\n \"defaultKerning\": 1,\n \"defaultWhitespaceKerning\": -1,\n \"endOfLineKerning\": 0,\n \"charWidth\": {\n \" \": 4,\n \"!\": 1,\n \"#\": 5,\n \"&\": 4,\n \"'\": 1,\n \"(\": 2,\n \")\": 2,\n \",\": 1,\n \".\": 1,\n \":\": 1,\n \";\": 1,\n \"@\": 5,\n \"M\": 5,\n \"W\": 5,\n \"[\": 2,\n \"\\n\": 0,\n \"]\": 2,\n \"`\": 2,\n \"i\": 1,\n \"l\": 1,\n \"m\": 5,\n \"q\": 4,\n \"w\": 5,\n \"|\": 1\n },\n \"defaultCharWidth\": 3\n}\n", null, "export const Layer = {\n Top: 0,\n UIA: 1,\n UIB: 2,\n UIC: 3,\n UID: 4,\n UIE: 5,\n UIF: 6,\n UIG: 7,\n A: 8,\n B: 9,\n C: 10,\n D: 11,\n E: 12,\n F: 13,\n Bottom: 14,\n Hidden: 15\n} as const\nexport type Layer = (typeof Layer)[keyof typeof Layer]\n\n/** negative is above. returns [top, bottom]; hidden is out of domain. */\nexport function layerOffset(layer: Layer, offset: number): Layer {\n return Math.max(Layer.Top, Math.min(Layer.Bottom, layer + offset)) as Layer\n}\n", "export type Box = XY & WH\nexport type WH = {w: number; h: number}\nexport type XY = {x: number; y: number}\nexport type XYZ = {x: number; y: number; z: number}\n\nexport type CardinalDir = 'W' | 'N' | 'E' | 'S'\nexport type CompassDir = CardinalDir | 'NE' | 'SE' | 'SW' | 'NW' | 'Origin'\n\nexport function boxEq(l: Readonly<Box>, r: Readonly<Box>): boolean {\n return xyEq(l, r) && whEq(l, r)\n}\n\nexport function boxHits(\n l: Readonly<Partial<XY> & WH>,\n r: Readonly<XY & Partial<WH>>\n): boolean {\n const rWH = {w: r.w ?? 1, h: r.h ?? 1} // point? an empty box has no w/h.\n if (!l.w || !l.h || !rWH.w || !rWH.h) return false // noncommutative.\n const lXY = {x: l.x ?? 0, y: l.y ?? 0}\n return (\n lXY.x < r.x + rWH.w &&\n lXY.x + l.w > r.x &&\n lXY.y < r.y + rWH.h &&\n lXY.y + l.h > r.y\n )\n}\n\nexport function whAssign(l: WH, r: Readonly<WH>): void {\n l.w = r.w\n l.h = r.h\n}\n\nexport function whEq(l: Readonly<WH>, r: Readonly<WH>): boolean {\n return l.w === r.w && l.h === r.h\n}\n\n/** l + r. */\nexport function xyAdd(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: l.x + r.x, y: l.y + r.y}\n}\n\n/** l += r. */\nexport function xyAddTo(l: XY, r: Readonly<XY>): void {\n l.x += r.x\n l.y += r.y\n}\n\nexport function xyAssign(l: XY, r: Readonly<XY>): void {\n l.x = r.x\n l.y = r.y\n}\n\n/** nonnegative. */\nexport function xyDistance(from: Readonly<XY>, to: Readonly<XY>): number {\n return xyMagnitude(xySub(from, to))\n}\n\n/** l / r. */\nexport function xyDiv(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: l.x / r.x, y: l.y / r.y}\n}\n\nexport function xyEq(l: Readonly<XY>, r: Readonly<XY>): boolean {\n return l.x === r.x && l.y === r.y\n}\n\n/** nonnegative. */\nexport function xyMagnitude(xy: Readonly<XY>): number {\n return Math.hypot(xy.x, xy.y)\n}\n\n/** the greater of each component. */\nexport function xyMax(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: Math.max(l.x, r.x), y: Math.max(l.y, r.y)}\n}\n\n/** the lesser of each component. */\nexport function xyMin(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: Math.min(l.x, r.x), y: Math.min(l.y, r.y)}\n}\n\n/** l - r. */\nexport function xySub(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: l.x - r.x, y: l.y - r.y}\n}\n", "import type {TagFormat} from '../graphics/atlas.ts'\nimport type {Layer} from '../graphics/layer.ts'\nimport type {Sprite} from '../graphics/sprite.ts'\nimport {\n type CardinalDir,\n type CompassDir,\n type WH,\n whEq,\n type XY,\n xyEq\n} from '../types/geo.ts'\nimport type {Void} from '../void.ts'\nimport type {Ent} from './ent.ts'\n\nexport type NinePatchOpts<Tag extends TagFormat> = {\n margin?: {w?: number | undefined; h?: number | undefined} | undefined\n n: NinePatchDirOpts<Tag>\n origin: NinePatchDirOpts<Tag>\n border?: {[dir in Lowercase<CardinalDir>]?: number | undefined}\n wh?: {w?: number | undefined; h?: number | undefined} | undefined\n x?: number | undefined\n y?: number | undefined\n z?: Layer | undefined\n} & {\n [dir in 'w' | 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw']?:\n | NinePatchDirOpts<Tag>\n | undefined\n}\nexport type NinePatchDirOpts<Tag extends TagFormat> = {\n flip?: {x?: boolean; y?: boolean} | undefined\n tag: Tag\n stretch?: boolean | undefined\n}\n\nexport class NinePatchEnt<Tag extends TagFormat> implements Ent<Tag> {\n readonly #dir: {readonly [dir in Lowercase<CompassDir>]: Sprite<Tag>}\n readonly #margin: Readonly<WH>\n #invalid: boolean = true\n\n constructor(v: Void<Tag, string>, opts: Readonly<NinePatchOpts<Tag>>) {\n this.#dir = {\n w: v.sprites.alloc(),\n nw: v.sprites.alloc(),\n n: v.sprites.alloc(),\n ne: v.sprites.alloc(),\n e: v.sprites.alloc(),\n se: v.sprites.alloc(),\n s: v.sprites.alloc(),\n sw: v.sprites.alloc(),\n origin: v.sprites.alloc()\n }\n this.#dir.w.tag = opts.w?.tag ?? opts.e?.tag ?? opts.n.tag\n this.#dir.n.tag = opts.n.tag\n this.#dir.e.tag = opts.e?.tag ?? this.#dir.w.tag\n this.#dir.s.tag = opts.s?.tag ?? this.#dir.n.tag\n\n this.#dir.nw.tag = opts.nw?.tag ?? opts.se?.tag ?? opts.n.tag\n this.#dir.ne.tag =\n opts.ne?.tag ?? opts.sw?.tag ?? opts.nw?.tag ?? opts.n.tag\n this.#dir.se.tag = opts.se?.tag ?? this.#dir.nw.tag\n this.#dir.sw.tag = opts.sw?.tag ?? this.#dir.ne.tag\n\n this.#dir.origin.tag = opts.origin.tag\n\n this.#dir.w.z =\n this.#dir.nw.z =\n this.#dir.n.z =\n this.#dir.ne.z =\n this.#dir.e.z =\n this.#dir.se.z =\n this.#dir.s.z =\n this.#dir.sw.z =\n this.#dir.origin.z =\n opts.z ?? 0\n\n this.#dir.w.stretch = opts.w?.stretch ?? opts.e?.stretch ?? false\n this.#dir.n.stretch = opts.n.stretch ?? opts.s?.stretch ?? false\n this.#dir.e.stretch = opts.e?.stretch ?? this.#dir.w.stretch\n this.#dir.s.stretch = opts.s?.stretch ?? this.#dir.n.stretch\n\n this.#dir.nw.stretch = opts.nw?.stretch ?? opts.se?.stretch ?? false\n this.#dir.ne.stretch = opts.ne?.stretch ?? opts.sw?.stretch ?? false\n this.#dir.se.stretch = opts.se?.stretch ?? this.#dir.nw.stretch\n this.#dir.sw.stretch = opts.sw?.stretch ?? this.#dir.ne.stretch\n\n this.#dir.origin.stretch = opts.origin.stretch ?? false\n\n this.#dir.w.flipX = opts.w?.flip?.x ?? !opts.e?.flip?.x\n this.#dir.w.flipY = opts.w?.flip?.y ?? !!opts.e?.flip?.y\n this.#dir.n.flipX = opts.n.flip?.x ?? !!opts.s?.flip?.x\n this.#dir.n.flipY = opts.n.flip?.y ?? !opts.s?.flip?.y\n this.#dir.e.flipX = opts.e?.flip?.x ?? !this.#dir.w.flipX\n this.#dir.e.flipY = opts.e?.flip?.y ?? this.#dir.w.flipY\n this.#dir.s.flipX = opts.s?.flip?.x ?? this.#dir.n.flipX\n this.#dir.s.flipY = opts.s?.flip?.y ?? !this.#dir.n.flipY\n this.#dir.origin.flipX = !!opts.origin.flip?.x\n this.#dir.origin.flipY = !!opts.origin.flip?.y\n\n this.#dir.n.h = opts.border?.n ?? opts.border?.s ?? this.#dir.n.h\n this.#dir.w.w = opts.border?.w ?? opts.border?.e ?? this.#dir.n.h\n this.#dir.e.w = opts.border?.e ?? this.#dir.w.w\n this.#dir.s.h = opts.border?.s ?? this.#dir.n.h\n\n this.#dir.nw.w = this.#dir.w.w\n this.#dir.nw.h = this.#dir.n.h\n this.#dir.ne.w = this.#dir.e.w\n this.#dir.ne.h = this.#dir.n.h\n this.#dir.se.w = this.#dir.e.w\n this.#dir.se.h = this.#dir.s.h\n this.#dir.sw.w = this.#dir.w.w\n this.#dir.sw.h = this.#dir.s.h\n\n this.#margin = {w: opts.margin?.w ?? 0, h: opts.margin?.h ?? 0}\n\n const w =\n opts.wh?.w == null\n ? this.#dir.w.w + this.#dir.n.w + this.#dir.e.w\n : opts.wh.w\n this.#dir.n.w = w - 1 // force resize\n this.wh = {\n w,\n h:\n opts.wh?.h == null\n ? this.#dir.n.h + this.#dir.e.h + this.#dir.s.h\n : opts.wh.h\n }\n\n this.#dir.nw.x = (opts.x ?? 0) - 1 // force move.\n this.xy = {x: opts.x ?? 0, y: opts.y ?? 0}\n }\n\n free(v: Void<Tag, string>): void {\n v.sprites.free(\n this.#dir.w,\n this.#dir.nw,\n this.#dir.n,\n this.#dir.ne,\n this.#dir.e,\n this.#dir.se,\n this.#dir.s,\n this.#dir.sw,\n this.#dir.origin\n )\n }\n\n update(): boolean | undefined {\n if (!this.#invalid) return\n this.#invalid = false\n return true\n }\n\n get wh(): WH {\n return {\n w: this.#dir.w.w + this.#dir.n.w + this.#dir.e.w + this.#margin.w,\n h: this.#dir.n.h + this.#dir.w.h + this.#dir.s.h + this.#margin.h\n }\n }\n\n set wh(wh: Readonly<WH>) {\n if (whEq(wh, this.wh)) return\n\n this.#dir.w.h = wh.h - this.#dir.n.h - this.#dir.s.h - this.#margin.h\n this.#dir.n.w = wh.w - this.#dir.w.w - this.#dir.e.w - this.#margin.w\n this.#dir.s.w = this.#dir.n.w\n this.#dir.e.h = this.#dir.w.h\n\n this.#dir.origin.w = this.#dir.n.w\n this.#dir.origin.h = this.#dir.e.h\n\n this.#setXYRight()\n\n this.#invalid = true\n }\n\n get xy(): XY {\n return {\n x: this.#dir.nw.x - this.#margin.w / 2,\n y: this.#dir.nw.y - this.#margin.h / 2\n }\n }\n\n set xy(xy: Readonly<XY>) {\n if (xyEq(xy, this.xy)) return\n\n this.#dir.nw.x = xy.x + this.#margin.w / 2\n this.#dir.nw.y = xy.y + this.#margin.h / 2\n this.#dir.w.x = this.#dir.nw.x\n this.#dir.w.y = this.#dir.nw.y + this.#dir.nw.h\n this.#dir.n.x = this.#dir.nw.x + this.#dir.nw.w\n this.#dir.n.y = this.#dir.nw.y\n\n this.#dir.origin.x = this.#dir.n.x\n this.#dir.origin.y = this.#dir.nw.y + this.#dir.ne.h\n\n this.#setXYRight()\n\n this.#invalid = true\n }\n\n #setXYRight() {\n this.#dir.ne.x = this.#dir.n.x + this.#dir.n.w\n this.#dir.ne.y = this.#dir.nw.y\n this.#dir.e.x = this.#dir.ne.x\n this.#dir.e.y = this.#dir.nw.y + this.#dir.ne.h\n this.#dir.se.x = this.#dir.e.x\n this.#dir.se.y = this.#dir.e.y + this.#dir.e.h\n this.#dir.s.x = this.#dir.n.x\n this.#dir.s.y = this.#dir.se.y\n this.#dir.sw.x = this.#dir.nw.x\n this.#dir.sw.y = this.#dir.se.y\n }\n}\n", "import type {Font} from 'mem-font'\nimport type {TagFormat} from '../graphics/atlas.ts'\n\nexport function fontCharToTag(font: Readonly<Font>, char: string): TagFormat {\n let pt = char.codePointAt(0)\n if (pt == null || pt > 0xff) pt = 63 // ?\n return `${font.id}--${pt.toString(16).padStart(2, '0')}`\n}\n\n/** @arg r undefined means end of line. */\nexport function fontKerning(\n font: Readonly<Font>,\n l: string,\n r: string | undefined\n): number {\n if (r == null) return font.endOfLineKerning\n if (font.kerning[l + r] != null) return font.kerning[l + r]!\n if (/^\\s?$/.test(l) || /^\\s?$/.test(r)) return font.defaultWhitespaceKerning\n return font.defaultKerning\n}\n\nexport function fontCharWidth(font: Readonly<Font>, letter: string): number {\n return font.charWidth[letter] ?? font.defaultCharWidth\n}\n", "import type {Font} from 'mem-font'\nimport type {Box, WH, XY} from '../types/geo.ts'\nimport {fontCharWidth, fontKerning} from './font.ts'\n\nexport type TextLayout = {\n /** the length of this array matches the string length. */\n chars: (Box | undefined)[]\n /** the offset in pixels. */\n cursor: XY\n wh: WH\n}\n\nexport type TextLayoutOpts = {\n font: Font\n maxW?: number\n scale?: number\n start?: XY\n str: string\n}\n\nexport function layoutText(opts: Readonly<TextLayoutOpts>): TextLayout {\n const chars = []\n const scale = opts.scale ?? 1\n const start = opts.start ?? {x: 0, y: 0}\n const maxW = opts.maxW ?? Infinity\n let cursor = {x: start.x, y: start.y}\n let w = 0\n while (chars.length < opts.str.length) {\n const i = chars.length\n const char = opts.str[i]!\n let layout\n if (char === '\\n') layout = layoutNewline(opts.font, cursor, start.x, scale)\n else if (/^\\s*$/.test(char)) {\n layout = layoutSpace(\n opts.font,\n cursor,\n maxW,\n tracking(opts.font, char, opts.str[i + 1], scale),\n start.x,\n scale\n )\n } else {\n layout = layoutWord(opts.font, cursor, maxW, opts.str, i, start.x, scale)\n if (\n cursor.x > 0 &&\n layout.cursor.y === nextLine(opts.font, start.x, cursor.y, scale).y\n ) {\n const wordW = maxW - cursor.x + layout.cursor.x\n if (wordW <= maxW) {\n // word can fit on one line if cursor is reset to the start of line.\n cursor = nextLine(opts.font, start.x, cursor.y, scale)\n layout = layoutWord(\n opts.font,\n cursor,\n maxW,\n opts.str,\n i,\n start.x,\n scale\n )\n }\n }\n }\n chars.push(...layout.chars)\n cursor.x = layout.cursor.x\n cursor.y = layout.cursor.y\n w = Math.max(w, layout.cursor.x - start.x)\n }\n return {\n chars,\n cursor,\n wh: {w, h: nextLine(opts.font, start.x, cursor.y, scale).y - start.y}\n }\n}\n\n/** @internal */\nexport function layoutWord(\n font: Readonly<Font>,\n cursor: Readonly<XY>,\n maxW: number,\n word: string,\n index: number,\n startX: number,\n scale: number\n): Omit<TextLayout, 'wh'> {\n const chars = []\n let {x, y} = cursor\n for (; ; index++) {\n const char = word[index]\n if (!char || /^\\s*$/.test(char)) break\n\n const span = tracking(font, char, word[index + 1], scale)\n if (x > startX && x + span > startX + maxW)\n ({x, y} = nextLine(font, startX, y, scale))\n\n // width is not span since, with kerning, that may exceed the actual\n // width of the character's sprite. eg, if w has the maximal character width\n // of five pixels and a one pixel kerning for a given pair of characters, it\n // will have a span of six pixels which is greater than the maximal five\n // pixel sprite that can be rendered.\n chars.push({x, y, w: fontCharWidth(font, char), h: font.cellHeight})\n x += span\n }\n return {chars, cursor: {x, y}}\n}\n\nfunction nextLine(\n font: Readonly<Font>,\n startX: number,\n curY: number,\n scale: number\n): XY {\n return {x: startX, y: curY + font.lineHeight * scale}\n}\n\nfunction layoutNewline(\n font: Readonly<Font>,\n cursor: Readonly<XY>,\n startX: number,\n scale: number\n): Omit<TextLayout, 'wh'> {\n return {chars: [undefined], cursor: nextLine(font, startX, cursor.y, scale)}\n}\n\n/**\n * @arg span the distance in pixels from the start of the current character to\n * the start of the next including scale.\n */\nfunction layoutSpace(\n font: Readonly<Font>,\n cursor: Readonly<XY>,\n w: number,\n span: number,\n startX: number,\n scale: number\n): Omit<TextLayout, 'wh'> {\n const nextCursor =\n cursor.x > 0 && cursor.x + span >= w\n ? nextLine(font, startX, cursor.y, scale)\n : {x: cursor.x + span, y: cursor.y}\n return {chars: [undefined], cursor: nextCursor}\n}\n\n/**\n * the distance in pixels from the start of lhs to the start of rhs including\n * scale.\n */\nfunction tracking(\n font: Readonly<Font>,\n l: string,\n r: string | undefined,\n scale: number\n): number {\n return scale * (fontCharWidth(font, l) + fontKerning(font, l, r))\n}\n", "import {memProp5x6} from 'mem-font'\nimport type {TagFormat} from '../graphics/atlas.ts'\nimport {Layer} from '../graphics/layer.ts'\nimport type {Sprite} from '../graphics/sprite.ts'\nimport {fontCharToTag} from '../text/font.ts'\nimport {layoutText} from '../text/text-layout.ts'\nimport {type WH, type XY, xyEq} from '../types/geo.ts'\nimport type {Void} from '../void.ts'\nimport type {Ent} from './ent.ts'\n\nexport class TextEnt implements Ent<TagFormat> {\n #maxW: number = Infinity\n #layout: 'Rendered' | 'Updated' | 'Outdated' = 'Outdated'\n #z: Layer = Layer.UIA\n #scale: number = 1\n readonly #sprites: Sprite<TagFormat>[] = []\n #str: string = ''\n #wh: WH = {w: 0, h: 0}\n readonly #xy: XY = {x: 0, y: 0}\n\n free(v: Void<TagFormat, string>): void {\n v.sprites.free(...this.#sprites)\n }\n\n layout(v: Void<TagFormat, string>): boolean {\n if (this.#layout !== 'Outdated') return false\n let len = 0\n const layout = layoutText({\n font: memProp5x6,\n maxW: this.#maxW,\n scale: this.#scale,\n start: this.#xy,\n str: this.#str\n })\n this.#wh = {w: layout.wh.w, h: layout.wh.h}\n for (const [i, char] of layout.chars.entries()) {\n if (char == null) continue\n const sprite = (this.#sprites[len] ??= v.sprites.alloc())\n sprite.x = char.x\n sprite.y = char.y\n sprite.tag = fontCharToTag(memProp5x6, this.#str[i]!)\n sprite.stretch = true\n sprite.w *= this.#scale\n sprite.h *= this.#scale\n sprite.z = this.#z\n len++\n }\n while (this.#sprites.length > len) v.sprites.free(this.#sprites.pop()!)\n this.#layout = 'Updated'\n return true\n }\n\n get maxW(): number {\n return this.#maxW\n }\n\n set maxW(w: number) {\n if (w === this.#maxW) return\n this.#maxW = w\n this.#layout = 'Outdated'\n }\n\n get scale() {\n return this.#scale\n }\n\n set scale(scale: number) {\n if (scale === this.#scale) return\n this.#scale = scale\n this.#layout = 'Outdated'\n }\n\n get text(): string {\n return this.#str\n }\n\n set text(str: string) {\n if (str === this.#str) return\n this.#str = str\n this.#layout = 'Outdated'\n }\n\n update(v: Void<TagFormat, string>): boolean | undefined {\n if (this.#layout === 'Rendered') return\n if (this.#layout === 'Outdated') this.layout(v)\n this.#layout = 'Rendered'\n return true\n }\n\n get scaledLeading(): number {\n return memProp5x6.leading * this.#scale\n }\n\n get wh(): Readonly<WH> {\n return this.#wh\n }\n\n get xy(): Readonly<XY> {\n return this.#xy\n }\n\n set xy(xy: Readonly<XY>) {\n if (xyEq(xy, this.#xy)) return\n this.#xy.x = xy.x\n this.#xy.y = xy.y\n this.#layout = 'Outdated'\n }\n\n get z(): Layer {\n return this.#z\n }\n\n set z(layer: Layer) {\n if (layer === this.#z) return\n this.#z = layer\n this.#layout = 'Outdated'\n }\n}\n", "import type {TagFormat} from '../graphics/atlas.ts'\nimport {Layer, layerOffset} from '../graphics/layer.ts'\nimport type {Sprite} from '../graphics/sprite.ts'\nimport {type XY, xyEq} from '../types/geo.ts'\nimport type {Void} from '../void.ts'\nimport type {Ent} from './ent.ts'\nimport {NinePatchEnt, type NinePatchOpts} from './nine-patch-ent.ts'\nimport {TextEnt} from './text-ent.ts'\n\nexport type ButtonOpts<Tag extends TagFormat> = {\n button: Omit<NinePatchOpts<Tag>, 'x' | 'y' | 'wh'>\n pressed: {tag: Tag; z?: Layer | undefined}\n selected: {tag: Tag; z?: Layer | undefined}\n toggle?: boolean | undefined\n text?:\n | {\n text?: string | undefined\n scale?: number | undefined\n z?: Layer | undefined\n }\n | undefined\n w?: number | undefined\n h?: number | undefined\n x?: number | undefined\n y?: number | undefined\n}\n\nexport class ButtonEnt<Tag extends TagFormat, Button extends string>\n implements Ent<Tag>\n{\n readonly #button: NinePatchEnt<Tag>\n #invalid: boolean = true\n readonly #pressed: {sprite: Sprite<Tag>; z: Layer}\n readonly #selected: {sprite: Sprite<Tag>; z: Layer}\n #started: boolean = false\n readonly #toggle: boolean = false\n readonly #text: TextEnt = new TextEnt()\n readonly #xy: XY = {x: 0, y: 0}\n\n constructor(v: Void<Tag, string>, opts: Readonly<ButtonOpts<Tag>>) {\n const buttonZ = opts.button.z ?? Layer.UID\n this.#button = new NinePatchEnt(v, {\n ...opts.button,\n x: opts.x,\n y: opts.y,\n z: buttonZ,\n wh: {w: opts.w, h: opts.h}\n })\n this.#pressed = {\n sprite: v.sprites.alloc(),\n z: opts.pressed.z ?? layerOffset(buttonZ, 2)\n }\n this.#selected = {\n sprite: v.sprites.alloc(),\n z: opts.selected.z ?? layerOffset(this.#pressed.z, -1)\n }\n\n this.#pressed.sprite.tag = opts.pressed.tag\n this.#pressed.sprite.x = opts.x ?? 0\n this.#pressed.sprite.y = opts.y ?? 0\n this.#pressed.sprite.w = opts.w ?? this.#button.wh.w\n this.#pressed.sprite.h = opts.h ?? this.#button.wh.h\n this.#pressed.sprite.z = Layer.Hidden\n\n this.#selected.sprite.tag = opts.selected.tag\n this.#selected.sprite.x = opts.x ?? 0\n this.#selected.sprite.y = opts.y ?? 0\n this.#selected.sprite.w = opts.w ?? this.#button.wh.w\n this.#selected.sprite.h = opts.h ?? this.#button.wh.h\n this.#selected.sprite.z = Layer.Hidden\n\n this.#text.text = opts.text?.text ?? ''\n this.#text.scale = opts.text?.scale ?? 1\n this.#text.layout(v)\n this.#moveText(v)\n this.#text.maxW = opts.w ?? this.#button.wh.w\n this.#text.z = opts.text?.z ?? layerOffset(buttonZ, -1)\n\n this.#toggle = opts.toggle ?? false\n }\n\n get selected(): boolean {\n return this.#selected.z !== Layer.Hidden\n }\n\n free(v: Void<Tag, string>): void {\n this.#button.free(v)\n this.#text.free(v)\n v.sprites.free(this.#selected.sprite, this.#pressed.sprite)\n }\n\n get on(): boolean {\n return this.#pressed.sprite.z !== Layer.Hidden\n }\n\n set on(on: boolean) {\n this.#pressed.sprite.z = on ? this.#pressed.z : Layer.Hidden\n }\n\n // to-do: offStart() for pointer up listen? would need a boundary check too.\n get onStart(): boolean {\n return this.on && this.#started\n }\n\n set text(str: string) {\n this.#text.text = str\n }\n\n update(v: Void<Tag, 'A' | 'Click' | Button>): boolean | undefined {\n let invalid = this.#invalid\n if (this.#button.update()) invalid = true\n if (this.#text.update(v)) invalid = true\n\n const hitsCursor =\n !v.input.handled && !!v.zoo.cursor?.hits(v, this.#selected.sprite, 'UI')\n const clickStarted =\n (hitsCursor && v.input.isOnStart('Click')) ||\n (v.zoo.cursor?.keyboard && v.input.isOnStart('A'))\n\n const on = clickStarted\n ? this.#toggle\n ? !this.on\n : true\n : this.#toggle\n ? this.on\n : v.input.isOn('Click') ||\n (!!v.zoo.cursor?.keyboard && v.input.isOn('A'))\n this.#started = this.on !== on\n if (this.#started) {\n this.on = on\n invalid = true\n }\n\n if (\n hitsCursor &&\n (v.input.point?.click || v.input.point?.type === 'Mouse')\n ) {\n invalid ||= this.#selected.sprite.z !== this.#selected.z\n this.#selected.sprite.z = this.#selected.z\n } else {\n invalid ||= this.#selected.sprite.z !== Layer.Hidden\n this.#selected.sprite.z = Layer.Hidden\n }\n\n v.input.handled ||= hitsCursor\n this.#invalid = false\n return invalid\n }\n\n setXY(v: Void<Tag, string>, xy: Readonly<XY>): void {\n if (xyEq(xy, this.#xy)) return\n this.#xy.x = xy.x\n this.#xy.y = xy.y\n this.#button.xy = xy\n this.#moveText(v)\n this.#pressed.sprite.xy = xy\n this.#selected.sprite.xy = xy\n this.#invalid = true\n }\n\n #moveText(v: Void<Tag, string>): void {\n this.#text.layout(v)\n this.#text.xy = {\n x: this.#button.xy.x + this.#button.wh.w / 2 - this.#text.wh.w / 2,\n y:\n this.#button.xy.y +\n this.#button.wh.h / 2 -\n (this.#text.wh.h - this.#text.scaledLeading) / 2\n }\n }\n}\n", "import type {TagFormat} from '../graphics/atlas.ts'\nimport {Layer} from '../graphics/layer.ts'\nimport type {Sprite} from '../graphics/sprite.ts'\nimport {type Box, boxHits, type WH, type XY} from '../types/geo.ts'\nimport type {Void} from '../void.ts'\nimport type {Ent} from './ent.ts'\n\n/**\n * update this ent first. always prefer testing against cursor, not input, in\n * other ents. the cursor may be moved by keyboard and has a hitbox.\n */\nexport class CursorEnt<out Tag extends TagFormat> implements Ent<Tag> {\n keyboard: boolean = false\n readonly #sprite: Sprite<Tag>\n #pick: Tag\n #point: Tag\n\n constructor(v: Void<Tag, string>, point: Tag, pick?: Tag | undefined) {\n this.#point = point\n this.#pick = pick ?? this.#point\n this.#sprite = v.sprites.alloc()\n this.#sprite.tag = point\n this.#sprite.z = Layer.Hidden\n }\n\n free(v: Void<Tag, string>): void {\n v.sprites.free(this.#sprite)\n }\n\n hitbox(v: Readonly<Void<Tag, string>>, coords: 'Level' | 'UI'): Box {\n const lvl = coords === 'Level'\n const hitbox = this.#sprite.hitbox\n if (!hitbox) throw Error('cursor has no hitbox')\n return {\n x: (lvl ? v.cam.x : 0) + hitbox.x,\n y: (lvl ? v.cam.y : 0) + hitbox.y,\n w: hitbox.w,\n h: hitbox.h\n }\n }\n\n hits(\n v: Readonly<Void<Tag, string>>,\n box: Readonly<XY & Partial<WH>>,\n coords: 'Level' | 'UI'\n ): boolean {\n return this.visible && boxHits(this.hitbox(v, coords), box)\n }\n\n update(v: Void<Tag, 'L' | 'R' | 'U' | 'D'>): boolean | undefined {\n if (v.input.point?.invalid) {\n this.#sprite.tag = v.input.point.click ? this.#pick : this.#point\n this.#sprite.xy = v.input.point.local\n this.#sprite.z =\n v.input.point?.type === 'Mouse' ? Layer.Top : Layer.Hidden\n return true\n }\n\n if (this.keyboard && v.input.isAnyOn('L', 'R', 'U', 'D')) {\n const epsilon = 1\n if (v.input.isOn('L')) this.#sprite.x -= epsilon\n if (v.input.isOn('R')) this.#sprite.x += epsilon\n if (v.input.isOn('U')) this.#sprite.y -= epsilon\n if (v.input.isOn('D')) this.#sprite.y += epsilon\n this.#sprite.z = Layer.Top\n\n return true\n }\n }\n\n get visible(): boolean {\n return this.#sprite.z !== Layer.Hidden\n }\n}\n", "import type {TagFormat} from '../graphics/atlas.ts'\nimport type {Layer} from '../graphics/layer.ts'\nimport type {Sprite} from '../graphics/sprite.ts'\nimport {\n type CompassDir,\n type WH,\n whAssign,\n whEq,\n type XY,\n xyAssign,\n xyEq\n} from '../types/geo.ts'\nimport type {Void} from '../void.ts'\nimport type {Ent} from './ent.ts'\n\nexport class FollowCamEnt<Tag extends TagFormat> implements Ent<Tag> {\n #fill: 'X' | 'Y' | 'XY' | undefined\n #invalid: boolean = true\n readonly #margin: WH = {w: 0, h: 0}\n readonly #modulo: XY = {x: 0, y: 0}\n #pivot: CompassDir\n readonly #sprite: Sprite<Tag>\n\n constructor(v: Void<Tag, string>, tag: Tag, pivot: CompassDir) {\n this.#sprite = v.sprites.alloc()\n this.#sprite.tag = tag\n this.#pivot = pivot\n }\n\n get fill(): 'X' | 'Y' | 'XY' | undefined {\n return this.#fill\n }\n\n set fill(fill: 'X' | 'Y' | 'XY' | undefined) {\n if (this.#fill === fill) return\n this.#fill = fill\n this.#invalid = true\n }\n\n free(v: Void<Tag, string>): void {\n v.sprites.free(this.#sprite)\n }\n\n get h(): number {\n return this.#sprite.h\n }\n\n set h(h: number) {\n if (this.#sprite.h === h) return\n this.#sprite.h = h\n this.#invalid = true\n }\n\n get margin(): Readonly<WH> {\n return this.#margin\n }\n\n set margin(margin: Readonly<WH>) {\n if (whEq(margin, this.#margin)) return\n whAssign(this.#margin, margin)\n this.#invalid = true\n }\n\n get modulo(): Readonly<XY> {\n return this.#modulo\n }\n\n set modulo(modulo: Readonly<XY>) {\n if (xyEq(modulo, this.#modulo)) return\n xyAssign(this.#modulo, modulo)\n this.#invalid = true\n }\n\n get pivot(): CompassDir {\n return this.#pivot\n }\n\n set pivot(pivot: CompassDir) {\n if (this.#pivot === pivot) return\n this.#pivot = pivot\n this.#invalid = true\n }\n\n update(v: Void<Tag, string>): boolean | undefined {\n if (!this.#invalid && !v.cam.invalid) return\n const follow = v.cam.follow(\n {w: this.#sprite.w, h: this.#sprite.h},\n this.#sprite.z,\n this.#pivot,\n {fill: this.#fill, modulo: this.#modulo, margin: this.#margin}\n )\n this.#sprite.x = follow.x\n this.#sprite.y = follow.y\n this.#invalid = false\n return true\n }\n\n get w(): number {\n return this.#sprite.w\n }\n\n set w(w: number) {\n if (this.#sprite.w === w) return\n this.#sprite.w = w\n this.#invalid = true\n }\n\n get z(): Layer {\n return this.#sprite.z\n }\n\n set z(z: Layer) {\n this.#sprite.z = z\n }\n}\n", "/**\n * proxy for debug CSV query param with case-insensitive keys. when a key\n * exists, the value is as specified or `'true'` if no value. most void values\n * default to `'true'` when the `debug` param is empty or `'void'` is set (eg,\n * `localhost:1234?debug` or `localhost:1234?debug=void,foo=bar`). all values\n * default to true when `'all'` is set. extend interface for additional types.\n * doesn't handle multiple values like `localhost:1234?debug=a=1,b=2&debug=b=3`.\n */\nexport interface Debug {\n cam?: string\n input?: string\n /** debug render invalidations. */\n invalid?: string\n mem?: string\n render?: 'always' | string\n}\n\nexport const debug: Readonly<Debug> | undefined = Debug(\n globalThis.location?.href\n)\n\n/** @internal */\nexport function Debug(url: string | undefined): Debug | undefined {\n if (!url) return\n const csv = [...new URL(url).searchParams].find(\n ([k]) => k.toLowerCase() === 'debug'\n )?.[1]\n if (csv == null) return\n const map = Object.fromEntries(\n csv\n .split(',') // split KV pairs.\n .filter(Boolean) // drop empties.\n .map(kv => kv.split('=')) // split each pair.\n )\n\n const target: {[k: string]: string} = {}\n for (const k in map) target[k.toLowerCase()] = map[k] || 'true'\n\n const voidKeyset: {[_ in keyof Omit<Debug, 'invalid'>]-?: undefined} = {\n cam: undefined,\n input: undefined,\n mem: undefined,\n render: undefined\n }\n\n return new Proxy<{[k: string]: string}>(target, {\n get(target, k): string | undefined {\n if (typeof k !== 'string') return target[k as unknown as string]\n k = k.toLowerCase()\n if (target[k]) return target[k]\n if (!csv || 'all' in map || (k in voidKeyset && 'void' in map))\n return 'true'\n }\n })\n}\n", "import type {TagFormat} from '../graphics/atlas.ts'\nimport {debug} from '../utils/debug.ts'\nimport type {Void} from '../void.ts'\nimport {CursorEnt} from './cursor-ent.ts'\nimport type {Ent} from './ent.ts'\n\n/**\n * ents are updated in insertion order. composed ents are updated by their\n * owning ents.\n */\nexport class Zoo<out Tag extends TagFormat> {\n #cursor: CursorEnt<Tag> | undefined\n readonly #ents: Set<Ent<Tag>> = new Set()\n #invalid: boolean = false\n\n add(...ents: readonly Ent<Tag>[]): void {\n for (const ent of ents) {\n this.#ents.add(ent)\n if (ent instanceof CursorEnt) this.#cursor = ent\n }\n }\n\n clear(): void {\n this.#cursor = undefined\n this.#ents.clear()\n }\n\n get cursor(): CursorEnt<Tag> | undefined {\n return this.#cursor\n }\n\n get invalid(): boolean {\n return this.#invalid\n }\n\n remove(...ents: readonly Readonly<Ent<Tag>>[]): void {\n for (const ent of ents) {\n this.#ents.delete(ent)\n if (ent === this.#cursor) this.#cursor = undefined\n }\n }\n\n update(v: Void<Tag, string>): void {\n this.#invalid = false\n for (const ent of this.#ents)\n if (ent.update?.(v)) {\n if (!this.#invalid && debug?.invalid)\n console.debug('ent update invalid', ent)\n this.#invalid = true\n }\n }\n}\n", "import {type Anim, type Atlas, type AtlasJSON, animCels} from './atlas.ts'\n\nexport function parseAtlas(json: Readonly<AtlasJSON>): Atlas {\n return {\n anim: json.anim,\n celXYWH: parseCelXYWH(json),\n tags: Object.keys(json.anim)\n }\n}\n\nfunction parseCelXYWH(json: Readonly<AtlasJSON>): number[] {\n const cels = []\n let i = 0\n for (const anim of Object.values(json.anim)) {\n cels.push(...parseXYWH(anim, json.celXY, i))\n i += anim.cels * 2\n }\n return cels\n}\n\n/** @internal */\nexport function parseXYWH(\n anim: Readonly<Anim>,\n celXY: readonly number[],\n i: number\n): number[] {\n const xywh = []\n for (let ii = 0; ii < animCels; ii++) {\n const iii = i + 2 * (ii % anim.cels)\n xywh.push(celXY[iii]!, celXY[iii + 1]!, anim.w, anim.h)\n }\n return xywh\n}\n", "import {\n type Box,\n boxHits,\n type CompassDir,\n type WH,\n type XY\n} from '../types/geo.ts'\nimport {debug} from '../utils/debug.ts'\nimport {Layer} from './layer.ts'\n\nexport type LevelClientLocalXY = {\n /** position relative canvas top-left (in DPI scale). */\n client: XY\n /**\n * position relative canvas top-left in level scale (like level xy but no cam\n * offset) within cam.\n */\n local: XY\n /** level x-coord within cam. */\n x: number\n /** level y-coord within cam. */\n y: number\n}\n\ntype Canvas = {\n width: number\n height: number\n style: {width: string; height: string}\n parentElement: {clientWidth: number; clientHeight: number} | null\n}\n\n/** given a min WH and scale, size the camera to the max WH. */\nexport class Cam {\n #devicePixelRatio: number = 0\n #h: number = 1\n #invalid: boolean = true\n #minScale: number = 1\n readonly #minWH: WH = {w: Infinity, h: Infinity}\n #mode: 'Int' | 'Fraction' = 'Int'\n #scale: number = 1\n #w: number = 1\n readonly #whClient: WH = {w: 1, h: 1}\n #x: number = 0\n #y: number = 0\n #zoomOut: number = 0\n\n center(xy: Readonly<XY>): void {\n this.x = Math.floor(xy.x - this.w / 2)\n this.y = Math.floor(xy.y - this.h / 2)\n }\n\n /** position in fractional level coordinates. */\n clientToXY(client: Readonly<XY>): XY {\n const local = this.clientToXYLocal(client)\n return {x: this.#x + local.x, y: this.#y + local.y}\n }\n\n /**\n * position relative canvas top-left in level scale (like level xy but no cam\n * offset). often used for UI that is fixed within the cam.\n */\n clientToXYLocal(client: Readonly<XY>): XY {\n return {\n x: (client.x / this.#whClient.w) * this.#w,\n y: (client.y / this.#whClient.h) * this.#h\n }\n }\n\n follow(\n wh: Readonly<WH>,\n z: Layer,\n pivot: CompassDir,\n opts?: {\n readonly fill?: 'X' | 'Y' | 'XY' | undefined\n readonly margin?: Partial<Readonly<WH>> | undefined\n readonly modulo?: Partial<Readonly<XY>> | undefined\n }\n ): Box {\n const marginW = opts?.margin?.w ?? 0\n let x = z > Layer.UIG ? Math.trunc(this.x) : 0\n switch (pivot) {\n case 'SW':\n case 'W':\n case 'NW':\n x += marginW\n break\n case 'SE':\n case 'E':\n case 'NE':\n x += this.w - (wh.w + marginW)\n break\n case 'N':\n case 'S':\n case 'Origin':\n x += Math.trunc(this.w / 2) - Math.trunc(wh.w / 2)\n break\n }\n x -= x % ((opts?.modulo?.x ?? x) || 1)\n\n const marginH = opts?.margin?.h ?? 0\n let y = z > Layer.UIG ? Math.trunc(this.y) : 0\n switch (pivot) {\n case 'N':\n case 'NE':\n case 'NW':\n y += marginH\n break\n case 'SE':\n case 'S':\n case 'SW':\n y += this.h - (wh.h + marginH)\n break\n case 'E':\n case 'W':\n case 'Origin':\n y += Math.trunc(this.h / 2) - Math.trunc(wh.h / 2)\n break\n }\n y -= y % ((opts?.modulo?.y ?? y) || 1)\n\n const w =\n opts?.fill === 'X' || opts?.fill === 'XY' ? this.w - 2 * marginW : wh.w\n const h =\n opts?.fill === 'Y' || opts?.fill === 'XY' ? this.h - 2 * marginH : wh.h\n\n return {x, y, w, h}\n }\n\n /** positive int in level px. */\n get h(): number {\n return this.#h\n }\n\n isVisible(box: Readonly<XY & Partial<WH>>): boolean {\n return boxHits(this, box)\n }\n\n /** true if cam moved or resized since last update. */\n get invalid(): boolean {\n return this.#invalid\n }\n\n /** positive int or fraction depending on mode. */\n get minScale(): number {\n return this.#minScale\n }\n\n set minScale(scale: number) {\n if (this.#scale === scale) return\n this.#scale = scale\n this.#invalidateWH()\n }\n\n /**\n * positive int or infinite min dimensions. set to\n * `{w: Infinity, h: Infinity}` to always use min scale.\n */\n get minWH(): Readonly<WH> {\n return this.#minWH\n }\n\n set minWH(wh: Readonly<WH>) {\n if (this.#minWH.w === wh.w && this.#minWH.h === wh.h) return\n this.#minWH.w = wh.w\n this.#minWH.h = wh.h\n this.#invalidateWH()\n }\n\n get mode(): 'Int' | 'Fraction' {\n return this.#mode\n }\n\n set mode(mode: 'Int' | 'Fraction') {\n if (this.#mode === mode) return\n this.#mode = mode\n this.#invalidateWH()\n }\n\n get portrait(): boolean {\n return this.h > this.w\n }\n\n postupdate(): void {\n this.#invalid = false\n }\n\n /** positive int or fraction depending on mode. */\n get scale(): number {\n return this.#scale\n }\n\n toString(): string {\n return `Cam{(${this.x} ${this.y}) ${this.w}\u00D7${this.h}}`\n }\n\n /**\n * call after input processing but before ent processing. ents that move the\n * camera should be called immediately after update so that the invalid state\n * can be considered.\n */\n update(canvas: Canvas): void {\n if (!canvas.parentElement) throw Error('canvas has no parent')\n const {clientWidth, clientHeight} = canvas.parentElement\n\n this.#invalid ||=\n this.#whClient.w !== clientWidth ||\n this.#whClient.h !== clientHeight ||\n // doesn't seem like this should be necessary but it is when moving across\n // monitors.\n this.#devicePixelRatio !== devicePixelRatio\n if (!this.#invalid) return\n this.#devicePixelRatio = devicePixelRatio\n this.#whClient.w = clientWidth\n this.#whClient.h = clientHeight\n this.#invalidateWH()\n\n canvas.width = this.#w\n canvas.height = this.#h\n // ~parentW / parentH.\n canvas.style.width = `${(this.#w * this.#scale) / devicePixelRatio}px`\n canvas.style.height = `${(this.#h * this.#scale) / devicePixelRatio}px`\n }\n\n /** positive int in level px. */\n get w(): number {\n return this.#w\n }\n\n /**\n * positive int dimensions in client px of canvas (often\n * `canvas.parentElement.clientWidth/Height` since the canvas is resized)\n * which is assumed to be max WH.\n */\n get whClient(): Readonly<WH> {\n return this.#whClient\n }\n\n /** fractional. */\n get x(): number {\n return this.#x\n }\n\n set x(x: number) {\n this.#invalid ||= this.x !== x\n this.#x = x\n }\n\n /** fractional. */\n get y(): number {\n return this.#y\n }\n\n set y(y: number) {\n this.#invalid ||= this.y !== y\n this.#y = y\n }\n\n /** nonnegative int or fraction depending on mode. */\n get zoomOut(): number {\n return this.#zoomOut\n }\n\n set zoomOut(out: number) {\n out = Math.max(0, out)\n if (this.#zoomOut === out) return\n this.#zoomOut = out\n this.#invalidateWH()\n }\n\n #invalidateWH(): void {\n if (!this.#invalid && debug?.invalid) console.debug('cam invalid')\n this.#invalid = true\n\n const phy = {\n w: this.#whClient.w * devicePixelRatio,\n h: this.#whClient.h * devicePixelRatio\n }\n\n const scale = Math.max(\n this.#minScale,\n Math.min(phy.w / this.#minWH.w, phy.h / this.#minWH.h) -\n (this.#mode === 'Int' ? Math.trunc(this.#zoomOut) : this.#zoomOut)\n )\n this.#scale = this.#mode === 'Int' ? Math.trunc(scale) : scale\n\n this.#w = Math.ceil(phy.w / this.#scale)\n this.#h = Math.ceil(phy.h / this.#scale)\n }\n}\n", "// to-do: port tests.\nexport function clamp(val: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, val))\n}\n\nexport function closeTo(lhs: number, rhs: number, tolerance: number): boolean {\n return Math.abs(lhs - rhs) <= tolerance\n}\n\n// to-do: port tests.\n/** ratio is [0, 1] to return [start, end]. */\nexport function lerp(start: number, end: number, ratio: number): number {\n return start + (end - start) * ratio\n}\n\n// to-do: test.\n/** returns positive modulo. */\nexport function mod(dividend: number, divisor: number): number {\n return ((dividend % divisor) + divisor) % divisor\n}\n", "import {\n type Anim,\n type Atlas,\n animCels,\n celMillis,\n type TagFormat\n} from '../graphics/atlas.ts'\nimport type {Block} from '../mem/pool.ts'\nimport {type Box, boxHits, type WH, type XY} from '../types/geo.ts'\nimport type {Millis} from '../types/time.ts'\nimport {mod} from '../utils/math.ts'\nimport type {Layer} from './layer.ts'\n\nexport const drawableBytes: number = 12\n/** granularity (0.015625) of `Drawable` coords. */\nexport const drawableEpsilon: number = 1 / 64\nexport const drawableMaxWH: WH = {w: 4095, h: 4095}\n\n/**\n * everything not requiring an atlas. the box is the drawn region. assume little\n * endian.\n *\n * 0 xxxx xxxx x [-131072, 131071.984375] (1/64th fixed-point). 1b sign, 17b\n * 1 xxxx xxxx int, 6b fraction.\n * 2 xxxx xxxx\n * 3 yyyy yyyy y.\n * 4 yyyy yyyy\n * 5 yyyy yyyy\n * 6 sxyz llll stretch, flip x, flip y, zend, z layer (4b).\n * 7 wwww wwww width [0, 4095]. zero means discard.\n * 8 hhhh wwww height. zero means discard.\n * 9 hhhh hhhh\n * a iiic cccc animation ID [0, 2047], animation cel [0, 31].\n * b iiii iiii\n *\n * animations default to looping without CPU interaction.\n * @internal\n */\nexport abstract class Drawable implements Block, Box {\n i: number\n readonly #pool: {readonly view: DataView<ArrayBuffer>}\n\n constructor(pool: {readonly view: DataView<ArrayBuffer>}, i: number) {\n this.#pool = pool\n this.i = i\n }\n\n above(draw: Readonly<Drawable>): boolean {\n const compare =\n this.z === draw.z\n ? (draw.zend ? draw.y + draw.h : draw.y) -\n (this.zend ? this.y + this.h : this.y)\n : this.z - draw.z\n return compare < 0\n }\n\n get cel(): number {\n const iiic_cccc = this.#pool.view.getUint8(this.i + 10)\n return iiic_cccc & 0x1f\n }\n\n /**\n * [0, 31]. rendered cel offset. call reset() to play animation from start.\n */\n set cel(cel: number) {\n const iiic_cccc = this.#pool.view.getUint8(this.i + 10)\n this.#pool.view.setUint8(this.i + 10, (iiic_cccc & ~0x1f) | (cel & 0x1f))\n }\n\n /** test if render area overlaps box or sprite render area. */\n clips(box: Readonly<XY & Partial<WH>>): boolean {\n return boxHits(this, box)\n }\n\n get flipX(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x40)\n }\n\n set flipX(flip: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0x40) | (-flip & 0x40))\n }\n\n get flipY(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x20)\n }\n\n set flipY(flip: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0x20) | (-flip & 0x20))\n }\n\n get h(): number {\n const h12_wwww = this.#pool.view.getUint16(this.i + 8, true)\n return h12_wwww >>> 4\n }\n\n /** [0, 4095]. */\n set h(h: number) {\n const h12_wwww = this.#pool.view.getUint16(this.i + 8, true)\n this.#pool.view.setUint16(\n this.i + 8,\n (h12_wwww & ~(0xfff << 4)) | ((h & 0xfff) << 4),\n true\n )\n }\n\n get id(): number {\n const i11_c5 = this.#pool.view.getUint16(this.i + 10, true)\n return (i11_c5 >>> 5) & 0x7ff\n }\n\n /** [0, 2047]. */\n set id(id: number) {\n const i11_c5 = this.#pool.view.getUint16(this.i + 10, true)\n this.#pool.view.setUint16(\n this.i + 10,\n (i11_c5 & ~(0x7ff << 5)) | ((id & 0x7ff) << 5),\n true\n )\n }\n\n get stretch(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x80)\n }\n\n /** wrap texture (default) or stretch to width and height. */\n set stretch(stretch: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(\n this.i + 6,\n (sxyz_llll & ~0x80) | (-stretch & 0x80)\n )\n }\n\n get w(): number {\n const hhhh_w12 = this.#pool.view.getUint16(this.i + 7, true)\n return hhhh_w12 & 0xfff\n }\n\n /** [0, 4095]. */\n set w(w: number) {\n const hhhh_w12 = this.#pool.view.getUint16(this.i + 7, true)\n this.#pool.view.setUint16(\n this.i + 7,\n (hhhh_w12 & ~0xfff) | (w & 0xfff),\n true\n )\n }\n\n get x(): number {\n const y8_x24 = this.#pool.view.getUint32(this.i + 0, true)\n return ((y8_x24 << 8) >> 8) / 64 // signed shift.\n }\n\n /** [-131072, 131071.984375] with 1/64th (0.015625) granularity. */\n set x(x: number) {\n const y8_x24 = this.#pool.view.getUint32(this.i + 0, true)\n this.#pool.view.setUint32(\n this.i + 0,\n (y8_x24 & ~0xff_ffff) | ((x * 64) & 0xff_ffff),\n true\n )\n }\n\n get xy(): XY {\n return {x: this.x, y: this.y}\n }\n\n set xy(xy: Readonly<XY>) {\n this.x = xy.x\n this.y = xy.y\n }\n\n get y(): number {\n const sxyz_llll_y24 = this.#pool.view.getUint32(this.i + 3, true)\n return ((sxyz_llll_y24 << 8) >> 8) / 64 // signed shift.\n }\n\n /** [-131072, 131071.984375] with 1/64th (0.015625) granularity. */\n set y(y: number) {\n const sxyz_llll_y24 = this.#pool.view.getUint32(this.i + 3, true)\n this.#pool.view.setUint32(\n this.i + 3,\n (sxyz_llll_y24 & ~0xff_ffff) | ((y * 64) & 0xff_ffff),\n true\n )\n }\n\n get z(): Layer {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return (sxyz_llll & 0xf) as Layer\n }\n\n /** layer [0 (closest), 14 (furthest)]; 15 is hidden. */\n set z(z: Layer) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0xf) | (z & 0xf))\n }\n\n get zend(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x10)\n }\n\n /** z-order by top (default) or bottom of box. */\n set zend(end: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0x10) | (-end & 0x10))\n }\n}\n\n// to-do: can I declaration merge or namespace merge away from the tag type?\nexport class Sprite<out Tag extends TagFormat> extends Drawable {\n readonly #atlas: Readonly<Atlas>\n #hitbox: Box | undefined\n #hurtbox: Box | undefined\n readonly #looper: {readonly age: Millis}\n\n constructor(\n pool: {readonly view: DataView<ArrayBuffer>},\n i: number,\n atlas: Readonly<Atlas>,\n looper: {readonly age: Millis}\n ) {\n super(pool, i)\n this.#atlas = atlas\n this.#looper = looper\n }\n\n get anim(): Anim {\n return this.#atlas.anim[this.tag]!\n }\n\n override get flipX(): boolean {\n return super.flipX\n }\n\n override set flipX(flip: boolean) {\n if (this.flipX === flip) return\n super.flipX = flip\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get flipY(): boolean {\n return super.flipY\n }\n\n override set flipY(flip: boolean) {\n if (this.flipY === flip) return\n super.flipY = flip\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get h(): number {\n return super.h\n }\n\n override set h(h: number) {\n if (this.h === h) return\n super.h = h\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n get hitbox(): Box | undefined {\n if (this.#hitbox) return this.#hitbox\n const {hitbox} = this.anim\n if (!hitbox) return\n return (this.#hitbox ??= {\n x: this.x + (this.flipX ? this.w - hitbox.w - hitbox.x : hitbox.x),\n y: this.y + (this.flipY ? this.h - hitbox.h - hitbox.y : hitbox.y),\n w: hitbox.w,\n h: hitbox.h\n })\n }\n\n hits(box: Readonly<XY | Box>): boolean {\n const hitbox = this.hitbox\n if (!hitbox) return false\n const hurtbox = box instanceof Sprite ? box.hurtbox : box\n return !!hurtbox && boxHits(hitbox, hurtbox)\n }\n\n get hurtbox(): Box | undefined {\n if (this.#hurtbox) return this.#hurtbox\n const {hurtbox} = this.anim\n if (!hurtbox) return\n return (this.#hurtbox ??= {\n x: this.x + (this.flipX ? this.w - hurtbox.w - hurtbox.x : hurtbox.x),\n y: this.y + (this.flipY ? this.h - hurtbox.h - hurtbox.y : hurtbox.y),\n w: hurtbox.w,\n h: hurtbox.h\n })\n }\n\n override get id(): number {\n return super.id\n }\n\n override set id(id: number) {\n if (this.id === id) return\n super.id = id\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n /** true if animation has played once. */\n get looped(): boolean {\n // this comparison resets after the second loop since cel can only count to\n // 2 * anim.cels.\n return mod(this.#currentCel - this.cel, animCels * 2) >= this.anim.cels\n }\n\n /** sets cel to animation start. */\n reset(): void {\n this.cel = this.#currentCel // setter truncates.\n }\n\n // to-do: unit test and catch up on unit tests elsewhere.\n\n get tag(): Tag {\n return this.#atlas.tags[this.id] as Tag\n }\n\n /** sets animation, resets cel, dimensions, hitbox, and hurtbox. */\n set tag(tag: Tag) {\n const anim = this.#atlas.anim[tag]!\n this.w = anim.w\n this.h = anim.h\n this.id = anim.id\n this.reset()\n }\n\n override toString(): string {\n return `Sprite{${this.tag} (${this.x} ${this.y} ${this.z}) ${this.w}\u00D7${this.h}}`\n }\n\n override get w(): number {\n return super.w\n }\n\n override set w(w: number) {\n if (this.w === w) return\n super.w = w\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get x(): number {\n return super.x\n }\n\n override set x(x: number) {\n if (this.x === x) return\n super.x = x\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get y(): number {\n return super.y\n }\n\n override set y(y: number) {\n if (this.y === y) return\n super.y = y\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n /** current fractional cel in [0, 2 * anim.cels). */\n get #currentCel(): number {\n const cel = this.#looper.age / celMillis\n return cel % (this.anim.cels * 2)\n }\n}\n", "/** @internal */\nexport class ContextMenu {\n enable: boolean = false\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n fn('contextmenu', this.#onContextMenu as EventListener)\n // disable long press vibration. nonpassive must be explicit.\n fn('touchstart', this.#onContextMenu as EventListener, {passive: false})\n return this\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #onContextMenu = (ev: PointerEvent | TouchEvent): void => {\n if (!ev.isTrusted || ev.metaKey || ev.altKey || ev.ctrlKey) return\n if (!this.enable) ev.preventDefault()\n }\n}\n", "/** @internal */\nexport class Gamepad {\n bits: number = 0\n // to-do: support analog button values, expose connected status and vibration,\n // and distinct devices. would be nice if vibration could merge with\n // navigator.vibrate().\n readonly bitByAxis: {[axis: number]: [less: number, more: number]} = {}\n readonly bitByButton: {[btn: number]: number} = {}\n onEvent: () => void = () => {}\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n get connected(): boolean {\n return isSecureContext && navigator.getGamepads().filter(Boolean).length > 0\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n fn('gamepadconnected', this.onEvent)\n fn('gamepaddisconnected', this.onEvent)\n return this\n }\n\n reset(): void {\n this.bits = 0\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n update(): void {\n if (!isSecureContext) return\n for (const pad of navigator.getGamepads()) {\n for (const [index, axis] of pad?.axes.entries() ?? []) {\n const lessMore = this.bitByAxis[index]\n if (!lessMore) continue\n const bit = axis < 0 ? lessMore[0] : axis === 0 ? 0 : lessMore[1]\n this.bits |= Math.abs(axis) >= 0.5 ? bit : 0\n }\n for (const [index, btn] of pad?.buttons.entries() ?? []) {\n const bit = this.bitByButton[index]\n if (bit == null) continue\n this.bits |= btn.pressed ? bit : 0\n }\n }\n }\n}\n", "/** @internal */\nexport class Keyboard {\n /** KeyboardEvent.code to bit. */\n readonly bitByCode: {[code: string]: number} = {}\n invalid: boolean = false\n /** KeyboardEvent.code to state. Multiple keys may map to the same bit. */\n onEvent: () => void = () => {}\n #on: {[code: string]: boolean} = {}\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n get bits(): number {\n let bits = 0\n for (const k in this.bitByCode) bits |= this.#on[k] ? this.bitByCode[k]! : 0\n return bits\n }\n\n postupdate(): void {\n this.invalid = false\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n for (const ev of ['keydown', 'keyup']) fn(ev, this.#onKey as EventListener)\n return this\n }\n\n reset(): void {\n this.invalid = false\n this.#on = {}\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #onKey = (ev: KeyboardEvent): void => {\n if (!ev.isTrusted || this.bitByCode[ev.code] == null) return\n if (ev.type === 'keydown' && (ev.metaKey || ev.altKey || ev.ctrlKey)) return\n this.invalid = true\n this.#on[ev.code] = ev.type === 'keydown'\n ev.preventDefault()\n this.onEvent()\n }\n}\n", "import {\n type Box,\n type XY,\n xyAdd,\n xyDistance,\n xyMax,\n xyMin,\n xySub\n} from '../types/geo.ts'\n\nexport type PointType =\n (typeof pointTypeByPointerType)[keyof typeof pointTypeByPointerType]\n\nexport type PointEvent = {\n bits: number\n /** most recent click. */\n clickClient: XY | undefined\n drag: boolean\n ev: (typeof pointEvents)[number]\n id: number\n /**\n * cursors should only use the primary inputs to avoid flickering between\n * distant points. inputs may be only secondaries.\n */\n primary: boolean\n type: PointType | undefined\n xyClient: XY\n}\n\nconst pointTypeByPointerType = {\n mouse: 'Mouse',\n pen: 'Pen',\n touch: 'Touch'\n} as const\nconst pointEvents = [\n 'pointercancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup'\n] as const\n\n/** @internal */\nexport class Pointer {\n readonly bitByButton: {[btn: number]: number} = {}\n dragMinClient: number = 5\n invalid: boolean = false\n onEvent: () => void = () => {}\n /** primary may be on or off. */\n primary: Readonly<PointEvent> | undefined\n /**\n * secondaries are deleted when buttons are off. secondaries are only present\n * when primary is defined.\n */\n readonly secondary: {[id: number]: Readonly<PointEvent>} = {}\n /** nonnegative. */\n #pinchStartClient: XY | undefined\n readonly #target: Element\n\n constructor(target: Element) {\n this.#target = target\n }\n\n get boundsClient(): Box | undefined {\n if (!this.primary?.bits && !Object.keys(this.secondary).length) return\n let min = {x: Infinity, y: Infinity}\n let max = {x: -Infinity, y: -Infinity}\n for (const pt of [this.primary, ...Object.values(this.secondary)]) {\n if (!pt?.bits) continue\n min = xyMin(min, pt.xyClient)\n max = xyMax(max, pt.xyClient)\n }\n return {x: min.x, y: min.y, w: max.x - min.x, h: max.y - min.y}\n }\n\n get centerClient(): XY | undefined {\n const bounds = this.boundsClient\n if (!bounds) return this.primary?.xyClient\n return xyAdd(bounds, {x: bounds.w / 2, y: bounds.h / 2})\n }\n\n get locked(): boolean {\n return this.#target.ownerDocument.pointerLockElement === this.#target\n }\n\n get pinchClient(): XY | undefined {\n if (!this.#pinchStartClient) return\n const end = this.#newPinchClient\n return end ? xySub(end, this.#pinchStartClient) : undefined\n }\n\n postupdate(): void {\n this.invalid = false\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n for (const ev of pointEvents) fn(ev, this.#onInput as EventListener)\n return this\n }\n\n reset(): void {\n this.invalid = false\n this.primary = undefined\n for (const pt in this.secondary) delete this.secondary[pt]\n this.#pinchStartClient = undefined\n }\n\n update(): void {\n const on =\n (this.primary?.bits ? 1 : 0) + Object.values(this.secondary).length\n if (on < 2 || !this.#pinchStartClient)\n this.#pinchStartClient = this.#newPinchClient\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #evButtonsToBits(btns: number): number {\n let bits = 0\n for (let btn = 1; btn <= btns; btn <<= 1)\n if ((btn & btns) === btn) bits |= this.bitByButton[btn] ?? 0\n return bits\n }\n\n #onInput = (ev: PointerEvent): void => {\n if (!ev.isTrusted) return\n\n this.invalid = true\n const bits =\n ev.metaKey || ev.altKey || ev.ctrlKey\n ? 0\n : this.#evButtonsToBits(ev.buttons)\n if (bits) ev.preventDefault() // only prevent mapped buttons.\n const locked = this.locked\n if (ev.type === 'pointerdown' && !locked)\n try {\n this.#target.setPointerCapture(ev.pointerId)\n } catch {}\n\n const prevPt = ev.isPrimary ? this.primary : this.secondary[ev.pointerId]\n\n let xyClient\n if (locked) {\n // `devicePixelRatio` seems to be incorrect. when zoom is 500%, DPR is 10.\n // in full screen, this would give the actual zoom allowing `movementX`\n // to match the `offsetX` delta:\n // const scale = document.documentElement.clientWidth / screen.availWidth\n // console.log(\n // `screenDelta=${ev.screenX - prevScreen.x} movementX=${ev.movementX} movementXScaled=${ev.movementX * scale} offsetDelta=${ev.offsetX - prevOffset.x} clientDelta=${ev.clientX - prevClient.x}`\n // )\n // probably wouldn't work across devices though.\n const scale = 1 / devicePixelRatio\n\n // to-do: this should allow offscreen.\n xyClient = {\n x: Math.min(\n Math.max(\n 0,\n (prevPt?.xyClient.x ?? ev.offsetX) + ev.movementX * scale\n ),\n this.#target.clientWidth\n ),\n y: Math.min(\n Math.max(\n 0,\n (prevPt?.xyClient.y ?? ev.offsetY) + ev.movementY * scale\n ),\n this.#target.clientHeight\n )\n }\n } else xyClient = {x: ev.offsetX, y: ev.offsetY}\n\n const evType = ev.type as (typeof pointEvents)[number]\n const type =\n pointTypeByPointerType[\n ev.pointerType as keyof typeof pointTypeByPointerType\n ]\n let clickClient\n if (ev.type === 'pointerdown') clickClient = {x: xyClient.x, y: xyClient.y}\n else if (ev.type === 'pointermove') clickClient = prevPt?.clickClient\n const drag =\n !!bits &&\n (prevPt?.drag ||\n (!!clickClient &&\n xyDistance(clickClient, xyClient) >= this.dragMinClient))\n\n const pt = {\n clickClient,\n bits,\n drag,\n ev: evType,\n id: ev.pointerId,\n primary: ev.isPrimary,\n type,\n xyClient\n }\n if (ev.isPrimary) this.primary = pt\n else if (!bits) delete this.secondary[ev.pointerId]\n else this.secondary[ev.pointerId] = pt\n\n this.onEvent()\n }\n\n get #newPinchClient(): XY | undefined {\n if ((this.primary?.bits ? 1 : 0) + Object.values(this.secondary).length < 2)\n return\n const bounds = this.boundsClient\n return bounds ? {x: bounds.w, y: bounds.h} : undefined\n }\n}\n", "import type {XYZ} from '../types/geo.ts'\n\n/** @internal */\nexport class Wheel {\n deltaClient: Readonly<XYZ> | undefined\n onEvent: () => void = () => {}\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n postupdate(): void {\n this.deltaClient = undefined\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n fn('wheel', this.#onInput as EventListener, {passive: true})\n return this\n }\n\n reset(): void {\n this.deltaClient = undefined\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #onInput = (ev: WheelEvent): void => {\n if (!ev.isTrusted || ev.metaKey || ev.altKey || ev.ctrlKey) return\n this.deltaClient = {x: ev.deltaX, y: ev.deltaY, z: ev.deltaZ}\n this.onEvent()\n }\n}\n", "import type {Cam, LevelClientLocalXY} from '../graphics/cam.ts'\nimport type {XY, XYZ} from '../types/geo.ts'\nimport type {Millis} from '../types/time.ts'\nimport {ContextMenu} from './context-menu.ts'\nimport {Gamepad} from './gamepad.ts'\nimport {Keyboard} from './keyboard.ts'\nimport type {PointType} from './pointer.ts'\nimport {Pointer} from './pointer.ts'\nimport {Wheel} from './wheel.ts'\n\nexport type Chord<Button> = [Button, ...Button[]]\nexport type Combo<Button> = [Chord<Button>, ...Chord<Button>[]]\n\n// biome-ignore format:;\nexport type DefaultButton =\n | 'L' | 'R' | 'U' | 'D' // dpad.\n | 'A' | 'B' | 'C' // primary, secondary, tertiary.\n | 'Click' | 'Click2' | 'ClickMiddle'\n | 'Menu' | 'Back'\n\nexport type Point = LevelClientLocalXY & {\n click: LevelClientLocalXY | undefined\n type: PointType | undefined\n}\n\n/**\n * doesn't consider handled. local and level positions are reevaluated each\n * frame.\n */\ntype PointerState = Point & {\n center: LevelClientLocalXY\n /** false when pinched. */\n drag: {on: boolean; start: boolean; end: boolean}\n /** true if changed since last update. */\n invalid: boolean\n /** may be negative. */\n pinch:\n | {\n client: XY\n /** level / local. */\n xy: XY\n }\n | undefined\n /** secondary points. */\n secondary: Point[]\n}\n\n/** triggered. */\ntype WheelState = {\n delta: {\n client: Readonly<XYZ>\n /** level / local. */\n xy: XY\n }\n}\n\n/**\n * input device abstraction. aggregates devices, records history, and provides\n * a convenient API.\n *\n * devices own as much device-specific detail and as little coordination (time\n * and device) as practical. devices avoid caching state which is the\n * responsibility of Input. devices strive to provide the current state and\n * nothing else.\n *\n * if you miss reporting on a event between long updates, you just miss it.\n * that's the nature of polling. there's no queue.\n *\n * to-do: expose analog state of gamepad. offer direction as a number instead of\n * bool.\n * to-do: multiplayer. possible if devices were requested instead of sought.\n * to-do: expose input source device.\n */\nexport class Input<Button extends string> {\n /** time allowed between combo inputs. */\n comboMaxIntervalMillis: Millis = 300 as Millis\n /**\n * true if any button, key, or click was _ever_ on. doesn't consider handled.\n */\n gestured: boolean = false\n /** clear buttonish inputs for rest of frame. */\n handled: boolean = false\n /** true if _any_ input has changed since previous update. */\n invalid: boolean = false\n /**\n * minimum duration for an input to be considered held. durations are\n * calculated at frame boundaries, not on actual press. devices are treated\n * strictly as polled aggregates.\n */\n minHeldMillis: Millis = 300 as Millis\n readonly #bitByButton: {[btn in Button]?: number} = {}\n readonly #buttonByBit: {[bit: number]: Button} = {}\n #bits: number = 0\n readonly #cam: Readonly<Cam>\n /**\n * sequence of nonzero bits ordered from oldest to latest. combos end only by\n * expiration.\n */\n readonly #combo: number[] = []\n readonly #contextMenu: ContextMenu\n readonly #gamepad: Gamepad\n /** time since buttons changed. */\n #heldMillis: Millis = 0 as Millis\n readonly #keyboard: Keyboard\n readonly #pointer: Pointer\n #pointerState: PointerState | undefined\n /** bits last update. may not be equal to `#combo.at(-1)`. */\n #prevBits: number = 0\n readonly #wheel: Wheel\n #wheelState: Readonly<WheelState> | undefined\n\n constructor(cam: Readonly<Cam>, target: Element) {\n this.#cam = cam\n this.#contextMenu = new ContextMenu(target)\n this.#gamepad = new Gamepad(globalThis)\n this.#keyboard = new Keyboard(target.ownerDocument)\n this.#pointer = new Pointer(target)\n this.#wheel = new Wheel(target)\n }\n\n get anyOn(): boolean {\n return this.#bits !== 0\n }\n\n /** for debugging. */\n get combo(): Button[][] {\n const chords: Button[][] = []\n for (const bits of this.#combo) {\n const chord: Button[] = []\n for (let bit = 1; bit <= bits; bit <<= 1) {\n if ((bit & bits) === bit && this.#buttonByBit[bit])\n chord.push(this.#buttonByBit[bit]!)\n }\n chord.sort()\n chords.push(chord)\n }\n return chords\n }\n\n /**\n * enable when game is paused or in photo mode to allow right clicks and long\n * presses to save canvas.\n */\n get contextMenu(): {enable: boolean} {\n return this.#contextMenu\n }\n\n /** doesn't consider handled. gamepads must be polled. */\n get gamepad(): Readonly<object | undefined> {\n return this.#gamepad.connected ? {} : undefined\n }\n\n /** true if bits hasn't changed for a while. */\n get held(): boolean {\n return !this.handled && this.#heldMillis >= this.minHeldMillis\n }\n\n isAnyOn(...btns: Readonly<Chord<Button>>): boolean {\n return !this.handled && !!(this.#bits & this.#mapBits(btns))\n }\n\n isAnyOnStart(...btns: Readonly<Chord<Button>>): boolean {\n return this.started && this.isAnyOn(...btns)\n }\n\n /**\n * buttons are exact. eg, up won't match up AND down like `isOn('U')` will.\n * combo is exact too. `['A'], ['A']` will match `['A'], ['A']` but not\n * `['A'], ['A'], ['A']`.\n */\n isCombo(...combo: Readonly<Combo<Button>>): boolean {\n return combo.length === this.#combo.length && this.isComboEndsWith(...combo)\n }\n\n /**\n * `['A'], ['A']` will match `['A'], ['A']` and `['B'], ['A'], ['A']`. eg,\n * double-clicks often don't care about any preceding buttons.\n */\n isComboEndsWith(...combo: Readonly<Combo<Button>>): boolean {\n for (const [i, btns] of combo.entries()) {\n const bits = this.#mapBits(btns)\n if (this.#combo.at(-combo.length + i) !== bits) return false\n }\n // #combo is a historical record of buttons. whenever buttons changes, a new\n // entry is pushed. make sure the current entry is the current state.\n return !this.handled && (this.#combo.at(-1) === this.#bits || !this.#bits)\n }\n\n /** like isComboEndsWith() but test if the last button is triggered. */\n isComboEndsWithStart(...combo: Readonly<Combo<Button>>): boolean {\n // isOnStart() can handle zero-length.\n return this.isOnStart(...combo.at(-1)!) && this.isComboEndsWith(...combo)\n }\n\n /** like isCombo() but test if the last button is triggered. */\n isComboStart(...combo: Readonly<Combo<Button>>): boolean {\n return this.isOnStart(...combo.at(-1)!) && this.isCombo(...combo)\n }\n\n /*:\n * true if any button in chord is not on. this is usually what's wanted. eg:\n * ```ts\n * if (isOn('A', 'B')) console.log('on')\n * if (isOff('A', 'B')) console.log('not A+B; A and/or B is off')\n * ```\n */\n isOff(...btns: Readonly<Chord<Button>>): boolean {\n return !this.handled && !this.isOn(...btns)\n }\n\n isOffStart(...btns: Readonly<Chord<Button>>): boolean {\n const bits = this.#mapBits(btns)\n const wasOn = (this.#prevBits & bits) === bits\n // don't test this.#bits === 0 since it might forever miss the off event for\n // the specific bits.\n return wasOn && this.started && this.isOff(...btns)\n }\n\n /**\n * true if all buttons are on inclusively. eg, `isOn('U')` is true when up is\n * pressed or when up and down are pressed.\n */\n isOn(...btns: Readonly<Chord<Button>>): boolean {\n const bits = this.#mapBits(btns)\n return !this.handled && (this.#bits & bits) === bits\n }\n\n isOnStart(...btns: Readonly<Chord<Button>>): boolean {\n return this.started && this.isOn(...btns)\n }\n\n get key(): {invalid: boolean} {\n return {invalid: this.#keyboard.invalid}\n }\n\n mapDefault(): Input<Button | DefaultButton> {\n const input = this as Input<Button | DefaultButton>\n input.mapKeyboardCode('L', 'ArrowLeft')\n input.mapKeyboardCode('R', 'ArrowRight')\n input.mapKeyboardCode('U', 'ArrowUp')\n input.mapKeyboardCode('D', 'ArrowDown')\n input.mapKeyboardCode('C', 'KeyC')\n input.mapKeyboardCode('A', 'KeyX')\n input.mapKeyboardCode('B', 'KeyZ')\n input.mapKeyboardCode('Menu', 'Enter')\n input.mapKeyboardCode('Back', 'Escape')\n\n // https://w3c.github.io/gamepad/#remapping\n input.mapGamepadAxis('L', 'R', 0, 2)\n input.mapGamepadAxis('U', 'D', 1, 3)\n input.mapGamepadButton('L', 14)\n input.mapGamepadButton('R', 15)\n input.mapGamepadButton('U', 12)\n input.mapGamepadButton('D', 13)\n input.mapGamepadButton('C', 2)\n input.mapGamepadButton('B', 0) // to-do: not good from PS perspective.\n input.mapGamepadButton('A', 1) // to-do: not good from PS perspective.\n input.mapGamepadButton('Menu', 9)\n input.mapGamepadButton('Back', 8)\n\n input.mapPointerClick('Click', 1)\n input.mapPointerClick('Click2', 2)\n input.mapPointerClick('ClickMiddle', 4)\n return input\n }\n\n // to-do: support analog values.\n mapGamepadAxis(less: Button, more: Button, ...axes: readonly number[]): void {\n for (const axis of axes) {\n this.#gamepad.bitByAxis[axis] = [\n this.#mapButton(less),\n this.#mapButton(more)\n ]\n }\n }\n\n mapGamepadButton(btn: Button, ...indices: readonly number[]): void {\n for (const index of indices)\n this.#gamepad.bitByButton[index] = this.#mapButton(btn)\n }\n\n /** @arg codes union of KeyboardEvent.code. */\n mapKeyboardCode(btn: Button, ...codes: readonly string[]): void {\n for (const code of codes)\n this.#keyboard.bitByCode[code] = this.#mapButton(btn)\n }\n\n mapPointerClick(btn: Button, ...clicks: readonly number[]): void {\n for (const click of clicks)\n this.#pointer.bitByButton[click] = this.#mapButton(btn)\n }\n\n get on(): Button[] {\n const on: Button[] = []\n for (const btn in this.#bitByButton) if (this.isOn(btn)) on.push(btn)\n return on.sort()\n }\n\n set onEvent(cb: () => void) {\n this.#gamepad.onEvent = cb\n this.#keyboard.onEvent = cb\n this.#pointer.onEvent = cb\n this.#wheel.onEvent = cb\n }\n\n /** doesn't consider handled. */\n get point(): PointerState | undefined {\n return this.#pointerState\n }\n\n get pointer(): {dragMinClient: number} {\n return this.#pointer\n }\n\n register(op: 'add' | 'remove'): this {\n globalThis[`${op}EventListener`]('blur', this.reset) // keyup is lost if window loses focus.\n this.#contextMenu.register(op)\n this.#gamepad.register(op)\n this.#keyboard.register(op)\n this.#pointer.register(op)\n this.#wheel.register(op)\n return this\n }\n\n reset = (): void => {\n this.#bits = 0\n this.#prevBits = 0\n this.handled = false\n this.#heldMillis = 0 as Millis\n this.#combo.length = 0\n this.#gamepad.reset()\n this.#keyboard.reset()\n this.#pointer.reset()\n this.#pointerState = undefined\n this.#wheel.reset()\n this.#wheelState = undefined\n }\n\n /** true if bits has changed. */\n get started(): boolean {\n return !this.handled && this.#bits !== this.#prevBits\n }\n\n /**\n * call on new frame before altering cam. dispatches always occur before an\n * update.\n * @arg millis duration since last update.\n */\n update(millis: Millis): void {\n this.handled = false\n this.#gamepad.update()\n this.#pointer.update()\n\n this.#prevBits = this.#bits\n this.#bits =\n this.#gamepad.bits |\n this.#keyboard.bits |\n (this.#pointer.primary?.bits ?? 0)\n this.invalid =\n this.#bits !== this.#prevBits ||\n this.#pointer.invalid ||\n !!this.#wheel.deltaClient\n this.gestured ||= !!this.#bits\n\n if (\n (millis > this.comboMaxIntervalMillis && this.#bits !== this.#prevBits) ||\n (this.#heldMillis + millis > this.comboMaxIntervalMillis && !this.#bits)\n )\n this.#combo.length = 0\n\n if (this.#bits === this.#prevBits)\n this.#heldMillis = (this.#heldMillis + millis) as Millis\n else this.#heldMillis = millis\n\n if (this.#bits && this.#bits !== this.#prevBits) {\n if (this.#prevBits) this.#combo.length = 0 // new button without release.\n this.#combo.push(this.#bits)\n }\n\n if (this.#pointer.primary) {\n const pinchClient = this.#pointer.pinchClient\n const dragOn =\n this.#pointer.primary.drag &&\n !Object.values(this.#pointer.secondary).length\n const secondary: Point[] = []\n for (const pt of Object.values(this.#pointer.secondary)) {\n secondary.push({\n type: pt.type,\n click: pt.clickClient\n ? {\n client: pt.clickClient,\n local: this.#cam.clientToXYLocal(pt.clickClient),\n ...this.#cam.clientToXY(pt.clickClient)\n }\n : undefined,\n ...this.#cam.clientToXY(pt.xyClient),\n client: pt.xyClient,\n local: this.#cam.clientToXYLocal(pt.xyClient)\n })\n }\n const centerClient = this.#pointer.centerClient!\n const center = {\n client: centerClient,\n local: this.#cam.clientToXYLocal(centerClient),\n ...this.#cam.clientToXY(centerClient)\n }\n this.#pointerState = {\n center,\n click: this.#pointer.primary.clickClient\n ? {\n client: this.#pointer.primary.clickClient,\n local: this.#cam.clientToXYLocal(\n this.#pointer.primary.clickClient\n ),\n ...this.#cam.clientToXY(this.#pointer.primary.clickClient)\n }\n : undefined,\n drag: {\n on: dragOn,\n start: !this.#pointerState?.drag.on && dragOn,\n end: !!this.#pointerState?.drag.on && !dragOn\n },\n invalid: this.#pointer.invalid,\n pinch: pinchClient\n ? {client: pinchClient, xy: this.#cam.clientToXY(pinchClient)}\n : undefined,\n secondary,\n type: this.#pointer.primary.type,\n ...this.#cam.clientToXY(this.#pointer.primary.xyClient),\n client: this.#pointer.primary.xyClient,\n local: this.#cam.clientToXYLocal(this.#pointer.primary.xyClient)\n }\n }\n // secondary should never be set when primary isn't.\n else this.#pointerState = undefined\n\n this.#wheelState = this.#wheel.deltaClient\n ? {\n delta: {\n client: this.#wheel.deltaClient,\n xy: this.#cam.clientToXY(this.#wheel.deltaClient)\n }\n }\n : undefined\n this.#keyboard.postupdate()\n this.#pointer.postupdate()\n this.#wheel.postupdate()\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n /** doesn't consider handled. */\n get wheel(): Readonly<WheelState | undefined> {\n return this.#wheelState\n }\n\n /** get bits for buttons. */\n #mapBits(btns: Readonly<Chord<Button>>): number {\n let bits = 0\n for (const btn of btns) bits |= this.#bitByButton[btn] ?? 0\n return bits\n }\n\n /** assign button to bit. */\n #mapButton(btn: Button): number {\n const bit = (this.#bitByButton[btn] ??=\n 1 << Object.keys(this.#bitByButton).length)\n this.#buttonByBit[bit] = btn\n return bit\n }\n}\n", "import {debug} from '../utils/debug.ts'\n\nexport type PoolOpts<out T extends Block> = {\n alloc(pool: Pool<T>): T\n allocBytes: number\n minPages?: number\n pageBlocks: number\n}\n\nexport type Block = {/** variable pool byte offset. */ i: number}\n\n/**\n * a contiguous resizable TypedArray associated with an array of objects.\n *\n * alternatives:\n * - operating on the array without classes would probably be faster but the DX\n * sucks:\n * this.#sprite = this.#pool.alloc()\n * this.#pool.setX(this.#sprite, this.#pool.getX(this.#sprite) + 1)\n * - sprite classes owning all the data is nice DX but requires a copy on every\n * frame.\n * - ArrayBuffer.resize() is incompatible with WebGL.\n */\nexport class Pool<out T extends Block> {\n /** the next free block is always at size. */\n readonly #blocks: T[]\n readonly #opts: Readonly<Required<PoolOpts<T>>>\n #size: number = 0\n #u8: Uint8Array<ArrayBuffer>\n #view!: DataView<ArrayBuffer>\n\n constructor(opts: Readonly<PoolOpts<T>>) {\n if (opts.allocBytes <= 0) throw Error('byte allocation must be > 0')\n if (opts.pageBlocks <= 0) throw Error('page blocks must be > 0')\n this.#opts = {...opts, minPages: opts.minPages ?? 1}\n const initSize = this.#opts.minPages * opts.pageBlocks\n this.#blocks = new Array(initSize)\n this.#u8 = new Uint8Array()\n this.#resize(initSize, 'Init')\n }\n\n alloc(): T {\n if (this.#size >= this.#currentCapacity)\n this.#resize(this.#currentCapacity + this.#opts.pageBlocks, 'Call')\n const block = this.#blocks[this.#size]!\n block.i = this.#size * this.#opts.allocBytes\n this.#size++\n return block\n }\n\n clear(): void {\n this.#size = 0\n const minCapacity = this.#opts.minPages * this.#opts.pageBlocks\n if (this.#currentCapacity > minCapacity) this.#resize(minCapacity, 'Call')\n }\n\n free(...blocks: readonly T[]): void {\n for (const block of blocks) this.#freeBlock(block)\n }\n\n get size(): number {\n return this.#size\n }\n\n get view(): DataView<ArrayBuffer> {\n return this.#view\n }\n\n toDebugString(): string {\n let str = ''\n for (let i = 0; i < this.#u8.buffer.byteLength; i++) {\n if (i && !(i % this.#opts.allocBytes)) str += ' '\n str += this.#u8[i]!.toString(16).padStart(2, '0')\n }\n return str\n }\n\n get #currentCapacity(): number {\n return this.#u8.buffer.byteLength / this.#opts.allocBytes\n }\n\n #freeBlock(block: T): void {\n if (!this.#size) throw Error('pool underflow')\n\n this.#size--\n const start = this.#size * this.#opts.allocBytes\n this.#u8.copyWithin(block.i, start, start + this.#opts.allocBytes)\n this.#blocks[this.#size]!.i = block.i\n ;[this.#blocks[block.i], this.#blocks[this.#size]] = [\n this.#blocks[this.#size]!,\n this.#blocks[block.i]!\n ]\n\n const free = Math.floor(\n (this.#currentCapacity - this.#size) / this.#opts.pageBlocks\n )\n if (\n free &&\n this.#currentCapacity / this.#opts.pageBlocks - free >=\n this.#opts.minPages\n )\n this.#resize(this.#currentCapacity - free * this.#opts.pageBlocks, 'Call')\n }\n\n #resize(capacity: number, origin: 'Init' | 'Call'): void {\n if (origin === 'Call' && debug?.mem)\n console.debug(\n `[mem] ${capacity < this.#currentCapacity ? 'shrinking' : 'growing'} pool to ${capacity}`\n )\n\n this.#blocks.length = capacity\n for (let i = this.#currentCapacity; i < capacity; i++)\n this.#blocks[i] = this.#opts.alloc(this)\n\n const buffer = new ArrayBuffer(capacity * this.#opts.allocBytes)\n const u8 = new Uint8Array(buffer)\n u8.set(this.#u8.subarray(0, capacity * this.#opts.allocBytes))\n this.#u8 = u8\n this.#view = new DataView(buffer)\n }\n}\n", "export function rgbaHex(rgba: number): `#${string}` {\n return `#${rgba.toString(16).padStart(8, '0')}`\n}\n", "import {rgbaHex} from './color-util.ts'\n\nexport function download(uri: string, filename: string): void {\n const a = document.createElement('a')\n a.href = uri\n a.download = filename\n a.click()\n a.remove()\n}\n\nexport function initBody(\n canvas: Readonly<HTMLCanvasElement>,\n rgba: number\n): void {\n if (canvas.parentNode !== document.body) return\n document.body.style.margin = '0'\n // fill the screen except for UI chrome.\n document.body.style.width = '100dvw'\n document.body.style.height = '100dvh'\n document.body.style.overflow = 'hidden'\n document.body.style.background = rgbaHex(rgba)\n}\n\nexport function initMetaViewport(): void {\n if (document.querySelector('meta[name=\"viewport\"]')) return\n const meta = document.createElement('meta')\n meta.name = 'viewport'\n // don't wait for double-tap scaling on mobile.\n meta.content =\n 'width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no'\n document.head.appendChild(meta)\n}\n", "import {dateToTimestamp} from '../types/time.ts'\nimport {download} from './dom-util.ts'\n\nexport async function downloadScreenshot(\n canvas: HTMLCanvasElement,\n name: string\n): Promise<void> {\n using img = await screenshot(canvas)\n download(img.uri, `${name}-screenshot-${dateToTimestamp(new Date())}.webp`)\n}\n\nexport function initCanvas(\n canvas: HTMLCanvasElement | undefined,\n mode: 'Int' | 'Fraction'\n): HTMLCanvasElement {\n canvas ??= document.createElement('canvas')\n canvas.width = 0 // guarantee Renderer.#resize().\n canvas.style.cursor = 'none'\n canvas.style.display = 'block' // no line height spacing.\n canvas.style.outline = 'none' // disable focus outline.\n canvas.style.cursor = 'none'\n if (mode === 'Int') canvas.style.imageRendering = 'pixelated' // to-do: why doesn't cam mode set this?\n // update on each pointermove *touch* Event like *mouse* Events.\n canvas.style.touchAction = 'none'\n canvas.tabIndex = 0\n canvas.focus()\n if (!canvas.parentNode) document.body.append(canvas)\n return canvas\n}\n\nexport async function requestFullscreen(\n canvas: HTMLCanvasElement\n): Promise<boolean> {\n if (!document.fullscreenEnabled) return false\n\n if (document.fullscreenElement !== canvas)\n try {\n await canvas.requestFullscreen({navigationUI: 'hide'})\n } catch {\n return false\n }\n\n if (!document.pointerLockElement) {\n try {\n await canvas.requestPointerLock({unadjustedMovement: true})\n } catch (err) {\n if (err instanceof Error && err.name === 'NotSupportedError')\n try {\n await canvas.requestPointerLock()\n } catch {}\n }\n }\n\n return true\n}\n\n/** draws a canvas to a blob URI. */\nexport function screenshot(\n canvas: HTMLCanvasElement\n): Promise<Disposable & {uri: string}> {\n return new Promise((fulfil, reject) => {\n canvas.toBlob(blob => {\n if (blob) {\n const img = {\n [Symbol.dispose]() {\n URL.revokeObjectURL(this.uri)\n },\n uri: URL.createObjectURL(blob)\n }\n fulfil(img)\n } else reject(Error('no blob'))\n }, 'image/webp')\n })\n}\n", "export async function fetchAudio(url: string): Promise<ArrayBuffer> {\n const rsp = await fetch(url, {headers: {accept: 'audio/mpeg'}})\n if (!rsp.ok)\n throw Error(`fetch error ${rsp.status}: ${rsp.statusText} for ${url}`)\n const type = rsp.headers.get('Content-Type')\n // to-do: ogg\n if (!type?.startsWith('audio/mpeg'))\n throw Error(`bad fetch response type ${type} for ${url}`)\n return await rsp.arrayBuffer()\n}\n\nexport function fetchImage(url: string): Promise<HTMLImageElement> {\n const img = new Image()\n const promise = loadImage(img)\n img.src = url\n return promise\n}\n\nexport async function loadImage(\n img: HTMLImageElement\n): Promise<HTMLImageElement> {\n const promise = new Promise<HTMLImageElement>((fulfil, reject) => {\n img.onload = () => fulfil(img)\n img.onerror = () => reject(Error(`image load error for ${img.src}`))\n })\n return img.complete ? img : await promise\n}\n", "import {debug} from '../utils/debug.ts'\n\n/** @internal */\nexport type GL2 = WebGL2RenderingContext\n/** @internal */\nexport type GLProgram = WebGLProgram\n/** @internal */\nexport type GLShader = WebGLShader\n/** @internal */\nexport type GLTexture = WebGLTexture\n/** @internal */\nexport type GLUniformLocation = WebGLUniformLocation\n/** @internal */\nexport type GLUniformMap = {[name: string]: GLUniformLocation}\n\n/** @internal */\nexport type Shader = {\n program: GLProgram | null\n buffer: WebGLBuffer | null\n uniform: GLUniformMap\n vao: WebGLVertexArrayObject | null\n textures: GLTexture[]\n}\n\n/** @internal */\nexport function Shader(\n gl: GL2,\n vertGLSL: string,\n fragGLSL: string,\n textures: GLTexture[]\n): Shader {\n const program = loadProgram(gl, vertGLSL, fragGLSL)\n gl.useProgram(program)\n return {\n buffer: gl.createBuffer(),\n program,\n textures,\n uniform: GLUniformMap(gl, program),\n vao: gl.createVertexArray()\n }\n}\n\nfunction GLUniformMap(gl: GL2, pgm: GLProgram | null): GLUniformMap {\n const len = pgm ? gl.getProgramParameter(pgm, gl.ACTIVE_UNIFORMS) : 0\n const map = debug?.render\n ? new Proxy<GLUniformMap>(\n {},\n {\n get(target, k: string): GLUniformLocation {\n if (target[k] == null) throw Error(`no shader uniform \"${k}\"`)\n return target[k]\n }\n }\n )\n : {}\n for (let i = 0; i < len; ++i) {\n const uniform = gl.getActiveUniform(pgm!, i)\n if (!uniform) throw Error(`no shader uniform at index ${i}`)\n const location = gl.getUniformLocation(pgm!, uniform.name)\n if (!location) throw Error(`no shader uniform \"${uniform.name}\"`)\n const name = uniform.name.replace('[0]', '') // arrays.\n map[name] = location\n }\n return map\n}\n\nfunction loadProgram(\n gl: GL2,\n vertGLSL: string,\n fragGLSL: string\n): GLProgram | null {\n const pgm = gl.createProgram()\n if (!pgm) return null\n\n const vert = compileShader(gl, 'VERTEX_SHADER', vertGLSL)\n const frag = compileShader(gl, 'FRAGMENT_SHADER', fragGLSL)\n if (!vert || !frag) return null\n gl.attachShader(pgm, vert)\n gl.attachShader(pgm, frag)\n gl.linkProgram(pgm)\n\n if (debug?.render && !gl.getProgramParameter(pgm, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(pgm)?.slice(0, -1)\n throw Error(`shader link failure; ${log}`)\n }\n\n gl.detachShader(pgm, frag)\n gl.detachShader(pgm, vert)\n gl.deleteShader(frag)\n gl.deleteShader(vert)\n\n return pgm\n}\n\nfunction compileShader(\n gl: GL2,\n type: 'FRAGMENT_SHADER' | 'VERTEX_SHADER',\n glsl: string\n): GLShader | null {\n const shader = gl.createShader(gl[type])\n if (!shader) return shader\n gl.shaderSource(shader, glsl.trim())\n gl.compileShader(shader)\n\n if (debug?.render && !gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader)?.slice(0, -1)\n throw Error(`shader compile failure; ${log}`)\n }\n\n return shader\n}\n", "export const spriteFragGLSL: string = `#version 300 es\n#pragma debug(${debug?.render ? 'on' : 'off'}) \n#pragma optimize(${debug?.render ? 'off' : 'on'})\n\nprecision highp int;\nprecision highp float;\nprecision highp usampler2D;\n\nuniform sampler2D uTex;\nuniform uvec2 uTexWH;\n\nflat in uint vStretch;\nflat in ivec4 vTexXYWH;\nflat in int vZ;\nin vec2 vDstWH;\nflat in ivec2 vDstWHFixed;\n\nout vec4 oRGBA;\n\nvoid main() {\n if (vZ == ${Layer.Hidden} || vDstWHFixed.x == 0 || vDstWHFixed.y == 0)\n discard;\n\n vec2 px = vec2(vTexXYWH.xy) + (\n vStretch == 1u ? (vDstWH * vec2(vTexXYWH.zw) / vec2(vDstWHFixed))\n : mod(vDstWH, vec2(vTexXYWH.zw))\n );\n\n oRGBA = texture(uTex, px / vec2(uTexWH));\n if(oRGBA.a < .001) discard;\n}\n`\n\nimport {debug} from '../utils/debug.ts'\nimport {Layer} from './layer.ts'\n", "export const spriteVertGLSL: string = `#version 300 es\n#pragma debug(${debug?.render ? 'on' : 'off'}) \n#pragma optimize(${debug?.render ? 'off' : 'on'})\n\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2\nprecision highp int;\nprecision highp float;\nprecision highp usampler2D;\n\nuniform ivec4 uCam;\nuniform usampler2D uCels;\nuniform float uAge;\n\nlayout (location=0) in ivec2 iUV;\nlayout (location=1) in uint iy8_x24;\nlayout (location=2) in uint iw8_sxyz_llll_y16;\nlayout (location=3) in uint ii11_c5_h12_w4;\n\nconst int maxY = 0x20000;\nconst int layers = 16;\nconst int maxDepth = maxY * layers;\n\nflat out uint vStretch;\nflat out ivec4 vTexXYWH;\nflat out int vZ;\nout vec2 vDstWH;\nflat out ivec2 vDstWHFixed;\n\nvoid main() {\n int x = (int((iy8_x24 & 0xffffffu) << 8) >> 8) / 64;\n int y = (int(iy8_x24 >> 24) | (int(iw8_sxyz_llll_y16 & 0xffffu) << 16 >> 8)) / 64;\n int z = int((iw8_sxyz_llll_y16 >> 16) & 0xfu);\n bool zend = bool(iw8_sxyz_llll_y16 & 0x100000u);\n bool flipY = bool(iw8_sxyz_llll_y16 & 0x200000u);\n bool flipX = bool(iw8_sxyz_llll_y16 & 0x400000u);\n bool stretch = bool(iw8_sxyz_llll_y16 & 0x800000u);\n int id = int((ii11_c5_h12_w4 >> 17) & 0x7ff0u); // ignore cel.\n int cel = int((ii11_c5_h12_w4 >> 16) & 0xfu); // ignore the MSB.\n int w = int(((ii11_c5_h12_w4 & 0xfu) << 8) | (iw8_sxyz_llll_y16 >> 24));\n int h = int((ii11_c5_h12_w4 >> 4) & 0xfffu);\n\n // https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel\n float depth = float((z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);\n\n ivec2 targetWH = iUV * ivec2(w, h);\n\n vec2 end = vec2(x + targetWH.x, y + targetWH.y);\n // UI layers are always given in screen coordinates.\n // to-do: how to handle non-int mode?\n vec2 camXY = z < ${Layer.A} ? vec2(0, 0) : vec2(uCam.xy);\n vec2 clip = ((-2. * camXY + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);\n gl_Position = vec4(clip, depth, 1);\n\n int frame = (((int(uAge / ${celMillis}) & 0x1f) - cel) + ${animCels}) & 0xf;\n uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);\n vTexXYWH = ivec4(texXYWH);\n vZ = z;\n\n vDstWH = vec2(targetWH * ivec2(flipX ? -1 : 1, flipY ? -1 : 1));\n vDstWHFixed = ivec2(w, h) * ivec2(flipX ? -1 : 1, flipY ? -1 : 1);\n\n vStretch = stretch ? 1u : 0u;\n}\n`\n\nimport {debug} from '../utils/debug.ts'\nimport {animCels, celMillis} from './atlas.ts'\nimport {Layer} from './layer.ts'\n", "import type {Pool} from '../mem/pool.ts'\nimport {type WH, whEq} from '../types/geo.ts'\nimport type {Millis} from '../types/time.ts'\nimport {debug} from '../utils/debug.ts'\nimport type {Atlas, TagFormat} from './atlas.ts'\nimport type {Cam} from './cam.ts'\nimport {type GL2, Shader} from './gl.ts'\nimport {drawableBytes, type Sprite} from './sprite.ts'\nimport {spriteFragGLSL} from './sprite-frag.glsl.ts'\nimport {spriteVertGLSL} from './sprite-vert.glsl.ts'\n\n/** @internal */\nexport type Context = {gl: GL2; spriteShader: Shader; viewport: WH}\n\nconst uv: Readonly<Int8Array> = new Int8Array([1, 1, 0, 1, 1, 0, 0, 0])\n\nexport class Renderer {\n /** when off, ents should avoid requesting renders. */\n always: boolean = debug?.render === 'always'\n clears: number = 0\n invalid: boolean = false\n loseContext: WEBGL_lose_context | undefined\n readonly #canvas: HTMLCanvasElement\n #clearRGBA: number = 0\n #depth: boolean = true\n #ctx: Context | undefined\n readonly #looper: {readonly age: Millis}\n readonly #preloadAtlas: Readonly<Atlas>\n #preloadAtlasImage: Readonly<HTMLImageElement> | undefined\n\n constructor(\n preloadAtlas: Readonly<Atlas>,\n canvas: HTMLCanvasElement,\n looper: {readonly age: Millis}\n ) {\n this.#preloadAtlas = preloadAtlas\n this.#canvas = canvas\n this.#looper = looper\n }\n\n clear(rgba: number): void {\n if (!this.#ctx) return\n const {gl} = this.#ctx\n if (this.#clearRGBA !== rgba) {\n this.#clearRGBA = rgba\n gl.clearColor(\n ((rgba >>> 24) & 0xff) / 0xff,\n ((rgba >>> 16) & 0xff) / 0xff,\n ((rgba >>> 8) & 0xff) / 0xff,\n ((rgba >>> 0) & 0xff) / 0xff\n )\n }\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)\n this.clears++\n }\n\n draw(pool: Readonly<Pool<Sprite<TagFormat>>>): void {\n if (!this.#preloadAtlasImage || !this.#ctx) return\n const {gl, spriteShader} = this.#ctx\n\n gl.bindBuffer(gl.ARRAY_BUFFER, spriteShader.buffer)\n gl.bufferData(\n gl.ARRAY_BUFFER,\n pool.view,\n gl.DYNAMIC_DRAW,\n 0,\n pool.size * drawableBytes\n )\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n gl.bindVertexArray(spriteShader.vao)\n gl.drawArraysInstanced(\n gl.TRIANGLE_STRIP,\n 0,\n uv.length / 2, // d\n pool.size\n )\n gl.bindVertexArray(null)\n\n this.invalid = false\n }\n\n get hasContext(): boolean {\n return this.#ctx != null\n }\n\n load(preloadAtlas: Readonly<HTMLImageElement> | undefined): void {\n this.#preloadAtlasImage = preloadAtlas\n this.#ctx = this._Context()\n }\n\n predraw(cam: Readonly<Cam>): void {\n if (!this.#ctx) return\n const {gl, spriteShader, viewport} = this.#ctx\n\n if (!whEq(viewport, cam)) {\n gl.viewport(0, 0, cam.w, cam.h)\n viewport.w = cam.w\n viewport.h = cam.h\n }\n\n gl.useProgram(spriteShader.program)\n\n gl.uniform4i(spriteShader.uniform.uCam!, cam.x, cam.y, cam.w, cam.h)\n gl.uniform1f(spriteShader.uniform.uAge!, this.#looper.age)\n\n for (const [i, tex] of spriteShader.textures.entries()) {\n gl.activeTexture(gl.TEXTURE0 + i)\n gl.bindTexture(gl.TEXTURE_2D, tex)\n }\n }\n\n register(op: 'add' | 'remove'): this {\n this.#canvas[`${op}EventListener`]('webglcontextlost', this.#onContextLost)\n this.#canvas[`${op}EventListener`](\n 'webglcontextrestored',\n this.#onContextRestored\n )\n return this\n }\n\n setDepth(enable: boolean): void {\n this.#depth = enable\n if (!this.#ctx) return\n if (enable) this.#ctx.gl.enable(this.#ctx.gl.DEPTH_TEST)\n else this.#ctx.gl.disable(this.#ctx.gl.DEPTH_TEST)\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n /** @internal */\n _Context(): Context | undefined {\n const gl = this.#ctx?.gl ?? GL2(this.#canvas)\n if (!gl) return\n\n const shader = Shader(gl, spriteVertGLSL, spriteFragGLSL, [\n gl.createTexture(),\n gl.createTexture()\n ])\n\n // allow translucent textures to be layered.\n gl.enable(gl.BLEND)\n gl.blendFuncSeparate(\n gl.SRC_ALPHA,\n gl.ONE_MINUS_SRC_ALPHA,\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA\n )\n\n this.setDepth(this.#depth)\n\n // enable z-buffer for [0, 1] ([foreground, background]).\n gl.depthRange(0, 1)\n gl.clearDepth(1)\n gl.depthFunc(gl.LESS)\n\n // disable image colorspace conversions. the default is browser dependent.\n gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, false)\n\n gl.bindVertexArray(shader.vao)\n\n gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer())\n gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW)\n gl.enableVertexAttribArray(0)\n gl.vertexAttribIPointer(0, 2, gl.BYTE, 0, 0)\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n gl.bindBuffer(gl.ARRAY_BUFFER, shader.buffer)\n gl.enableVertexAttribArray(1)\n gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, drawableBytes, 0)\n gl.vertexAttribDivisor(1, 1)\n gl.enableVertexAttribArray(2)\n gl.vertexAttribIPointer(2, 1, gl.UNSIGNED_INT, drawableBytes, 4)\n gl.vertexAttribDivisor(2, 1)\n gl.enableVertexAttribArray(3)\n gl.vertexAttribIPointer(3, 1, gl.UNSIGNED_INT, drawableBytes, 8)\n gl.vertexAttribDivisor(3, 1)\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n gl.bindTexture(gl.TEXTURE_2D, shader.textures[0]!)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n if (this.#preloadAtlasImage)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n this.#preloadAtlasImage\n )\n gl.bindTexture(gl.TEXTURE_2D, null)\n\n gl.bindTexture(gl.TEXTURE_2D, shader.textures[1]!)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA16UI, // source XYWH cannot be > 65535.\n 1,\n this.#preloadAtlas.celXYWH.length / 4, // 4 u16s per row\n 0,\n gl.RGBA_INTEGER,\n gl.UNSIGNED_SHORT,\n new Uint16Array(this.#preloadAtlas.celXYWH)\n )\n gl.bindTexture(gl.TEXTURE_2D, null)\n\n gl.bindVertexArray(null)\n\n gl.uniform1i(shader.uniform.uTex!, 0)\n gl.uniform1i(shader.uniform.uCels!, 1)\n if (this.#preloadAtlasImage)\n gl.uniform2ui(\n shader.uniform.uTexWH!,\n this.#preloadAtlasImage.naturalWidth,\n this.#preloadAtlasImage.naturalHeight\n )\n\n if (!this.invalid && debug?.invalid) console.debug('renderer invalid')\n this.invalid = true\n // keep outside of #context so it can be restored.\n this.loseContext = gl.getExtension('WEBGL_lose_context') ?? undefined\n return (this.#ctx = {gl, spriteShader: shader, viewport: {w: 0, h: 0}})\n }\n\n #onContextLost = (ev: Event): void => {\n ev.preventDefault() // required.\n console.debug('[render] WebGL context lost')\n this.#ctx = undefined\n }\n\n #onContextRestored = (): void => {\n console.debug('[render] WebGL context restored')\n this.#ctx = this._Context()\n }\n}\n\nfunction GL2(canvas: HTMLCanvasElement): GL2 | undefined {\n const gl = canvas.getContext('webgl2', {\n // to-do: expose.\n antialias: false,\n powerPreference: 'low-power',\n // avoid flicker caused by clearing the drawing buffer. see\n // https://developer.chrome.com/blog/desynchronized/.\n preserveDrawingBuffer: true,\n ...(!debug?.render && {desynchronized: true})\n })\n if (!gl) {\n console.debug('[render] no GL context')\n return\n }\n\n if (debug?.render && !gl.getContextAttributes()?.desynchronized)\n console.debug('[render] no WebGL DOM desynchronization')\n\n return gl\n}\n", "import type {Millis} from './types/time.ts'\n\n/**\n * frame manager. passes frame requests when not hidden. callers should request\n * frames when an update occurs or a check for an update occurs. eg, gamepads\n * must be polled.\n *\n * when registered, restoring visibility triggers an automatic request.\n */\nexport class Looper {\n /** duration of frames observed. */\n age: Millis = 0 as Millis\n onFrame: ((millis: Millis) => void) | undefined\n #req: number = 0\n #registered: boolean = false\n\n register(op: 'add' | 'remove'): this {\n const fn = `${op}EventListener` as const\n document[fn]('visibilitychange', this.#onVisibility)\n if (op === 'remove') this.#cancel()\n // try to let user drive initial frame since assets may be loading.\n this.#registered = op === 'add'\n return this\n }\n\n requestFrame(): void {\n if (this.#req || document.hidden || !this.#registered) return\n this.#req = requestAnimationFrame(this.#onFrame as FrameRequestCallback)\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #cancel(): void {\n if (this.#req) cancelAnimationFrame(this.#req)\n this.#req = 0\n }\n\n #onFrame = (now: Millis): void => {\n const millis = (now - (this.age || now)) as Millis\n this.age = now\n this.#req = 0\n this.onFrame?.(millis)\n }\n\n #onVisibility = (ev: Event): void => {\n if (!ev.isTrusted) return\n if (document.hidden) this.#cancel()\n else this.requestFrame()\n }\n}\n", "import type {Millis} from '../types/time.ts'\n\nexport class DelayInterval {\n #delay: () => Millis\n #interval: Millis\n #intervalID: number = 0\n #onInterval: () => void\n #timerID: number = 0\n\n constructor(delay: () => Millis, interval: Millis, onInterval: () => void) {\n this.#delay = delay\n this.#interval = interval\n this.#onInterval = onInterval\n }\n\n register(op: 'add' | 'remove'): this {\n if (op === 'add') {\n this.#timerID = setTimeout(() => {\n this.#onInterval()\n this.#intervalID = setInterval(this.#onInterval, this.#interval)\n }, this.#delay())\n } else {\n clearTimeout(this.#timerID)\n clearInterval(this.#intervalID)\n }\n\n return this\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n}\n", "import {Zoo} from './ents/zoo.ts'\nimport type {Atlas, AtlasJSON, TagFormat} from './graphics/atlas.ts'\nimport {parseAtlas} from './graphics/atlas-parser.ts'\nimport {Cam} from './graphics/cam.ts'\nimport {Renderer} from './graphics/renderer.ts'\nimport {drawableBytes, Sprite} from './graphics/sprite.ts'\nimport {type DefaultButton, Input} from './input/input.ts'\nimport {Looper} from './looper.ts'\nimport {Pool, type PoolOpts} from './mem/pool.ts'\nimport type {WH} from './types/geo.ts'\nimport type {Millis} from './types/time.ts'\nimport {initCanvas} from './utils/canvas-util.ts'\nimport {DelayInterval} from './utils/delay-interval.ts'\nimport {initBody, initMetaViewport} from './utils/dom-util.ts'\nimport {loadImage} from './utils/fetch-util.ts'\n\nexport type VoidOpts<out Tag extends TagFormat> = {\n preloadAtlas?: {image: HTMLImageElement; json: AtlasJSON} | undefined\n backgroundRGBA?: number\n canvas?: HTMLCanvasElement | undefined\n minWH?: WH | undefined\n input?: 'Custom' | 'Default' | undefined\n mode?: 'Int' | 'Fraction' | undefined\n poll?: {delay?: (() => Millis) | undefined; period: Millis} | undefined\n sprites?:\n | Partial<Omit<PoolOpts<Sprite<Tag>>, 'alloc' | 'allocBytes'>>\n | undefined\n}\n\nexport class Void<\n out Tag extends TagFormat,\n Button extends string = DefaultButton\n> {\n readonly cam: Cam = new Cam()\n readonly canvas: HTMLCanvasElement\n readonly input: Input<Button>\n readonly preload: Atlas\n readonly renderer: Renderer\n readonly sprites: Pool<Sprite<Tag>>\n readonly zoo: Zoo<Tag> = new Zoo()\n readonly looper: Looper = new Looper()\n readonly #poll: DelayInterval | undefined\n readonly #preloadAtlasImage: HTMLImageElement | undefined\n // may trigger an initial force update.\n readonly #resizeObserver = new ResizeObserver(() => this.onResize())\n\n constructor(opts: Readonly<VoidOpts<Tag>>) {\n if (opts.poll != null)\n this.#poll = new DelayInterval(\n opts.poll.delay ?? (() => 0 as Millis),\n opts.poll.period,\n () => this.onPoll()\n )\n\n initMetaViewport()\n this.canvas = initCanvas(opts.canvas, opts.mode ?? 'Int')\n initBody(this.canvas, opts.backgroundRGBA ?? 0x000000ff)\n\n if (opts.minWH) this.cam.minWH = opts.minWH\n this.cam.mode = opts.mode ?? 'Int'\n this.cam.update(this.canvas)\n\n this.input = new Input(this.cam, this.canvas)\n if (opts.input !== 'Custom') this.input.mapDefault()\n this.input.onEvent = () => this.onEvent()\n\n if (opts.preloadAtlas) this.#preloadAtlasImage = opts.preloadAtlas.image\n\n this.preload = opts.preloadAtlas\n ? parseAtlas(opts.preloadAtlas.json)\n : {anim: {}, celXYWH: [], tags: []}\n\n this.renderer = new Renderer(this.preload ?? {}, this.canvas, this.looper)\n\n this.sprites = new Pool({\n alloc: pool => this.onAllocSprite(pool),\n allocBytes: drawableBytes,\n minPages: opts.sprites?.minPages ?? 3,\n pageBlocks: opts.sprites?.pageBlocks ?? 1000\n })\n\n this.looper.onFrame = millis => this.onFrame(millis)\n }\n\n onAllocSprite(pool: Pool<Sprite<Tag>>): Sprite<Tag> {\n return new Sprite(pool, 0, this.preload, this.looper)\n }\n\n onEvent(): void {\n this.requestFrame('Force')\n }\n\n /** update input, update canvas, update cam, update world, then render. */\n onFrame(millis: Millis): void {\n if (document.hidden) return\n this.input.update(millis)\n\n this.requestFrame() // request frame before in case loop cancels.\n\n this.onLoop(millis)\n\n this.cam.postupdate()\n }\n\n // biome-ignore lint/correctness/noUnusedFunctionParameters:;\n onLoop(millis: Millis): void {}\n\n onPoll(): void {\n this.requestFrame('Force')\n }\n\n onResize(): void {\n this.requestFrame('Force') // force cam reeval.\n }\n\n async register(op: 'add' | 'remove'): Promise<void> {\n this.input.register(op)\n this.renderer.register(op)\n this.looper.register(op)\n if (!this.canvas.parentElement) throw Error('no canvas parent')\n if (op === 'add') this.#resizeObserver.observe(this.canvas.parentElement)\n else this.#resizeObserver.unobserve(this.canvas.parentElement)\n\n if (op === 'add') this.looper.requestFrame()\n this.#poll?.register(op)\n\n if (this.#preloadAtlasImage) await loadImage(this.#preloadAtlasImage)\n this.renderer.load(this.#preloadAtlasImage)\n }\n\n requestFrame(force?: 'Force' | undefined): void {\n if (force || this.renderer.always || this.input.anyOn || this.input.gamepad)\n this.looper.requestFrame()\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.register('remove')\n }\n}\n", "import {voidVersion} from './types/void-version.ts'\n\nexport {type Font, memProp5x6} from 'mem-font'\nexport * from './ents/button-ent.ts'\nexport * from './ents/cursor-ent.ts'\nexport * from './ents/ent.ts'\nexport * from './ents/follow-cam-ent.ts'\nexport * from './ents/nine-patch-ent.ts'\nexport * from './ents/text-ent.ts'\nexport * from './ents/zoo.ts'\nexport * from './graphics/atlas.ts'\nexport * from './graphics/atlas-parser.ts'\nexport * from './graphics/cam.ts'\nexport * from './graphics/layer.ts'\nexport * from './graphics/sprite.ts'\nexport * from './input/input.ts'\nexport type {PointEvent} from './input/pointer.ts'\nexport * from './mem/pool.ts'\nexport * from './random/random.ts'\nexport * from './storage/local-storage.ts'\nexport * from './text/font.ts'\nexport * from './text/text-layout.ts'\nexport * from './types/geo.ts'\nexport * from './types/json.ts'\nexport * from './types/time.ts'\nexport * from './utils/async-util.ts'\nexport * from './utils/canvas-util.ts'\nexport * from './utils/debug.ts'\nexport * from './utils/dom-util.ts'\nexport * from './utils/fetch-util.ts'\nexport * from './void.ts'\n\nexport const version: string = voidVersion\n ? `${voidVersion.version}+${voidVersion.published}`\n : '?'\n", "{\n \"anim\": {\n \"background--OrangeCheckerboard\": {\"cels\": 1, \"h\": 2, \"id\": 0, \"w\": 2},\n \"background--GreyCheckerboard\": {\"cels\": 1, \"h\": 2, \"id\": 1, \"w\": 2},\n \"background--Kiwi\": {\"cels\": 1, \"h\": 2, \"id\": 2, \"w\": 2},\n \"background--Strawberry\": {\"cels\": 1, \"h\": 2, \"id\": 3, \"w\": 2},\n \"background--Grape\": {\"cels\": 1, \"h\": 2, \"id\": 4, \"w\": 2},\n \"background--Blueberry\": {\"cels\": 1, \"h\": 2, \"id\": 5, \"w\": 2},\n \"background--Bubblegum\": {\"cels\": 1, \"h\": 2, \"id\": 6, \"w\": 2},\n \"background--Transparent\": {\"cels\": 1, \"h\": 2, \"id\": 7, \"w\": 2},\n \"background--Black\": {\"cels\": 1, \"h\": 2, \"id\": 8, \"w\": 2},\n \"backpacker--WalkRight\": {\n \"cels\": 16,\n \"h\": 13,\n \"hitbox\": {\"x\": 2, \"y\": 0, \"w\": 4, \"h\": 4},\n \"id\": 9,\n \"w\": 8\n },\n \"backpacker--WalkDown\": {\n \"cels\": 16,\n \"h\": 13,\n \"hitbox\": {\"x\": 2, \"y\": 0, \"w\": 4, \"h\": 4},\n \"id\": 10,\n \"w\": 8\n },\n \"backpacker--WalkUp\": {\n \"cels\": 16,\n \"h\": 13,\n \"hitbox\": {\"x\": 2, \"y\": 0, \"w\": 4, \"h\": 4},\n \"id\": 11,\n \"w\": 8\n },\n \"cursor--Pointer\": {\n \"cels\": 1,\n \"h\": 14,\n \"hitbox\": {\"x\": 0, \"y\": 0, \"w\": 2, \"h\": 2},\n \"hurtbox\": {\"x\": 0, \"y\": 0, \"w\": 2, \"h\": 2},\n \"id\": 12,\n \"w\": 8\n },\n \"mem-prop-5x6--00\": {\"cels\": 1, \"h\": 6, \"id\": 13, \"w\": 5},\n \"mem-prop-5x6--01\": {\"cels\": 1, \"h\": 6, \"id\": 14, \"w\": 5},\n \"mem-prop-5x6--02\": {\"cels\": 1, \"h\": 6, \"id\": 15, \"w\": 5},\n \"mem-prop-5x6--03\": {\"cels\": 1, \"h\": 6, \"id\": 16, \"w\": 5},\n \"mem-prop-5x6--04\": {\"cels\": 1, \"h\": 6, \"id\": 17, \"w\": 5},\n \"mem-prop-5x6--05\": {\"cels\": 1, \"h\": 6, \"id\": 18, \"w\": 5},\n \"mem-prop-5x6--06\": {\"cels\": 1, \"h\": 6, \"id\": 19, \"w\": 5},\n \"mem-prop-5x6--07\": {\"cels\": 1, \"h\": 6, \"id\": 20, \"w\": 5},\n \"mem-prop-5x6--08\": {\"cels\": 1, \"h\": 6, \"id\": 21, \"w\": 5},\n \"mem-prop-5x6--09\": {\"cels\": 1, \"h\": 6, \"id\": 22, \"w\": 5},\n \"mem-prop-5x6--0a\": {\"cels\": 1, \"h\": 6, \"id\": 23, \"w\": 5},\n \"mem-prop-5x6--0b\": {\"cels\": 1, \"h\": 6, \"id\": 24, \"w\": 5},\n \"mem-prop-5x6--0c\": {\"cels\": 1, \"h\": 6, \"id\": 25, \"w\": 5},\n \"mem-prop-5x6--0d\": {\"cels\": 1, \"h\": 6, \"id\": 26, \"w\": 5},\n \"mem-prop-5x6--0e\": {\"cels\": 1, \"h\": 6, \"id\": 27, \"w\": 5},\n \"mem-prop-5x6--0f\": {\"cels\": 1, \"h\": 6, \"id\": 28, \"w\": 5},\n \"mem-prop-5x6--10\": {\"cels\": 1, \"h\": 6, \"id\": 29, \"w\": 5},\n \"mem-prop-5x6--11\": {\"cels\": 1, \"h\": 6, \"id\": 30, \"w\": 5},\n \"mem-prop-5x6--12\": {\"cels\": 1, \"h\": 6, \"id\": 31, \"w\": 5},\n \"mem-prop-5x6--13\": {\"cels\": 1, \"h\": 6, \"id\": 32, \"w\": 5},\n \"mem-prop-5x6--14\": {\"cels\": 1, \"h\": 6, \"id\": 33, \"w\": 5},\n \"mem-prop-5x6--15\": {\"cels\": 1, \"h\": 6, \"id\": 34, \"w\": 5},\n \"mem-prop-5x6--16\": {\"cels\": 1, \"h\": 6, \"id\": 35, \"w\": 5},\n \"mem-prop-5x6--17\": {\"cels\": 1, \"h\": 6, \"id\": 36, \"w\": 5},\n \"mem-prop-5x6--18\": {\"cels\": 1, \"h\": 6, \"id\": 37, \"w\": 5},\n \"mem-prop-5x6--19\": {\"cels\": 1, \"h\": 6, \"id\": 38, \"w\": 5},\n \"mem-prop-5x6--1a\": {\"cels\": 1, \"h\": 6, \"id\": 39, \"w\": 5},\n \"mem-prop-5x6--1b\": {\"cels\": 1, \"h\": 6, \"id\": 40, \"w\": 5},\n \"mem-prop-5x6--1c\": {\"cels\": 1, \"h\": 6, \"id\": 41, \"w\": 5},\n \"mem-prop-5x6--1d\": {\"cels\": 1, \"h\": 6, \"id\": 42, \"w\": 5},\n \"mem-prop-5x6--1e\": {\"cels\": 1, \"h\": 6, \"id\": 43, \"w\": 5},\n \"mem-prop-5x6--1f\": {\"cels\": 1, \"h\": 6, \"id\": 44, \"w\": 5},\n \"mem-prop-5x6--20\": {\"cels\": 1, \"h\": 6, \"id\": 45, \"w\": 5},\n \"mem-prop-5x6--21\": {\"cels\": 1, \"h\": 6, \"id\": 46, \"w\": 5},\n \"mem-prop-5x6--22\": {\"cels\": 1, \"h\": 6, \"id\": 47, \"w\": 5},\n \"mem-prop-5x6--23\": {\"cels\": 1, \"h\": 6, \"id\": 48, \"w\": 5},\n \"mem-prop-5x6--24\": {\"cels\": 1, \"h\": 6, \"id\": 49, \"w\": 5},\n \"mem-prop-5x6--25\": {\"cels\": 1, \"h\": 6, \"id\": 50, \"w\": 5},\n \"mem-prop-5x6--26\": {\"cels\": 1, \"h\": 6, \"id\": 51, \"w\": 5},\n \"mem-prop-5x6--27\": {\"cels\": 1, \"h\": 6, \"id\": 52, \"w\": 5},\n \"mem-prop-5x6--28\": {\"cels\": 1, \"h\": 6, \"id\": 53, \"w\": 5},\n \"mem-prop-5x6--29\": {\"cels\": 1, \"h\": 6, \"id\": 54, \"w\": 5},\n \"mem-prop-5x6--2a\": {\"cels\": 1, \"h\": 6, \"id\": 55, \"w\": 5},\n \"mem-prop-5x6--2b\": {\"cels\": 1, \"h\": 6, \"id\": 56, \"w\": 5},\n \"mem-prop-5x6--2c\": {\"cels\": 1, \"h\": 6, \"id\": 57, \"w\": 5},\n \"mem-prop-5x6--2d\": {\"cels\": 1, \"h\": 6, \"id\": 58, \"w\": 5},\n \"mem-prop-5x6--2e\": {\"cels\": 1, \"h\": 6, \"id\": 59, \"w\": 5},\n \"mem-prop-5x6--2f\": {\"cels\": 1, \"h\": 6, \"id\": 60, \"w\": 5},\n \"mem-prop-5x6--30\": {\"cels\": 1, \"h\": 6, \"id\": 61, \"w\": 5},\n \"mem-prop-5x6--31\": {\"cels\": 1, \"h\": 6, \"id\": 62, \"w\": 5},\n \"mem-prop-5x6--32\": {\"cels\": 1, \"h\": 6, \"id\": 63, \"w\": 5},\n \"mem-prop-5x6--33\": {\"cels\": 1, \"h\": 6, \"id\": 64, \"w\": 5},\n \"mem-prop-5x6--34\": {\"cels\": 1, \"h\": 6, \"id\": 65, \"w\": 5},\n \"mem-prop-5x6--35\": {\"cels\": 1, \"h\": 6, \"id\": 66, \"w\": 5},\n \"mem-prop-5x6--36\": {\"cels\": 1, \"h\": 6, \"id\": 67, \"w\": 5},\n \"mem-prop-5x6--37\": {\"cels\": 1, \"h\": 6, \"id\": 68, \"w\": 5},\n \"mem-prop-5x6--38\": {\"cels\": 1, \"h\": 6, \"id\": 69, \"w\": 5},\n \"mem-prop-5x6--39\": {\"cels\": 1, \"h\": 6, \"id\": 70, \"w\": 5},\n \"mem-prop-5x6--3a\": {\"cels\": 1, \"h\": 6, \"id\": 71, \"w\": 5},\n \"mem-prop-5x6--3b\": {\"cels\": 1, \"h\": 6, \"id\": 72, \"w\": 5},\n \"mem-prop-5x6--3c\": {\"cels\": 1, \"h\": 6, \"id\": 73, \"w\": 5},\n \"mem-prop-5x6--3d\": {\"cels\": 1, \"h\": 6, \"id\": 74, \"w\": 5},\n \"mem-prop-5x6--3e\": {\"cels\": 1, \"h\": 6, \"id\": 75, \"w\": 5},\n \"mem-prop-5x6--3f\": {\"cels\": 1, \"h\": 6, \"id\": 76, \"w\": 5},\n \"mem-prop-5x6--40\": {\"cels\": 1, \"h\": 6, \"id\": 77, \"w\": 5},\n \"mem-prop-5x6--41\": {\"cels\": 1, \"h\": 6, \"id\": 78, \"w\": 5},\n \"mem-prop-5x6--42\": {\"cels\": 1, \"h\": 6, \"id\": 79, \"w\": 5},\n \"mem-prop-5x6--43\": {\"cels\": 1, \"h\": 6, \"id\": 80, \"w\": 5},\n \"mem-prop-5x6--44\": {\"cels\": 1, \"h\": 6, \"id\": 81, \"w\": 5},\n \"mem-prop-5x6--45\": {\"cels\": 1, \"h\": 6, \"id\": 82, \"w\": 5},\n \"mem-prop-5x6--46\": {\"cels\": 1, \"h\": 6, \"id\": 83, \"w\": 5},\n \"mem-prop-5x6--47\": {\"cels\": 1, \"h\": 6, \"id\": 84, \"w\": 5},\n \"mem-prop-5x6--48\": {\"cels\": 1, \"h\": 6, \"id\": 85, \"w\": 5},\n \"mem-prop-5x6--49\": {\"cels\": 1, \"h\": 6, \"id\": 86, \"w\": 5},\n \"mem-prop-5x6--4a\": {\"cels\": 1, \"h\": 6, \"id\": 87, \"w\": 5},\n \"mem-prop-5x6--4b\": {\"cels\": 1, \"h\": 6, \"id\": 88, \"w\": 5},\n \"mem-prop-5x6--4c\": {\"cels\": 1, \"h\": 6, \"id\": 89, \"w\": 5},\n \"mem-prop-5x6--4d\": {\"cels\": 1, \"h\": 6, \"id\": 90, \"w\": 5},\n \"mem-prop-5x6--4e\": {\"cels\": 1, \"h\": 6, \"id\": 91, \"w\": 5},\n \"mem-prop-5x6--4f\": {\"cels\": 1, \"h\": 6, \"id\": 92, \"w\": 5},\n \"mem-prop-5x6--50\": {\"cels\": 1, \"h\": 6, \"id\": 93, \"w\": 5},\n \"mem-prop-5x6--51\": {\"cels\": 1, \"h\": 6, \"id\": 94, \"w\": 5},\n \"mem-prop-5x6--52\": {\"cels\": 1, \"h\": 6, \"id\": 95, \"w\": 5},\n \"mem-prop-5x6--53\": {\"cels\": 1, \"h\": 6, \"id\": 96, \"w\": 5},\n \"mem-prop-5x6--54\": {\"cels\": 1, \"h\": 6, \"id\": 97, \"w\": 5},\n \"mem-prop-5x6--55\": {\"cels\": 1, \"h\": 6, \"id\": 98, \"w\": 5},\n \"mem-prop-5x6--56\": {\"cels\": 1, \"h\": 6, \"id\": 99, \"w\": 5},\n \"mem-prop-5x6--57\": {\"cels\": 1, \"h\": 6, \"id\": 100, \"w\": 5},\n \"mem-prop-5x6--58\": {\"cels\": 1, \"h\": 6, \"id\": 101, \"w\": 5},\n \"mem-prop-5x6--59\": {\"cels\": 1, \"h\": 6, \"id\": 102, \"w\": 5},\n \"mem-prop-5x6--5a\": {\"cels\": 1, \"h\": 6, \"id\": 103, \"w\": 5},\n \"mem-prop-5x6--5b\": {\"cels\": 1, \"h\": 6, \"id\": 104, \"w\": 5},\n \"mem-prop-5x6--5c\": {\"cels\": 1, \"h\": 6, \"id\": 105, \"w\": 5},\n \"mem-prop-5x6--5d\": {\"cels\": 1, \"h\": 6, \"id\": 106, \"w\": 5},\n \"mem-prop-5x6--5e\": {\"cels\": 1, \"h\": 6, \"id\": 107, \"w\": 5},\n \"mem-prop-5x6--5f\": {\"cels\": 1, \"h\": 6, \"id\": 108, \"w\": 5},\n \"mem-prop-5x6--60\": {\"cels\": 1, \"h\": 6, \"id\": 109, \"w\": 5},\n \"mem-prop-5x6--61\": {\"cels\": 1, \"h\": 6, \"id\": 110, \"w\": 5},\n \"mem-prop-5x6--62\": {\"cels\": 1, \"h\": 6, \"id\": 111, \"w\": 5},\n \"mem-prop-5x6--63\": {\"cels\": 1, \"h\": 6, \"id\": 112, \"w\": 5},\n \"mem-prop-5x6--64\": {\"cels\": 1, \"h\": 6, \"id\": 113, \"w\": 5},\n \"mem-prop-5x6--65\": {\"cels\": 1, \"h\": 6, \"id\": 114, \"w\": 5},\n \"mem-prop-5x6--66\": {\"cels\": 1, \"h\": 6, \"id\": 115, \"w\": 5},\n \"mem-prop-5x6--67\": {\"cels\": 1, \"h\": 6, \"id\": 116, \"w\": 5},\n \"mem-prop-5x6--68\": {\"cels\": 1, \"h\": 6, \"id\": 117, \"w\": 5},\n \"mem-prop-5x6--69\": {\"cels\": 1, \"h\": 6, \"id\": 118, \"w\": 5},\n \"mem-prop-5x6--6a\": {\"cels\": 1, \"h\": 6, \"id\": 119, \"w\": 5},\n \"mem-prop-5x6--6b\": {\"cels\": 1, \"h\": 6, \"id\": 120, \"w\": 5},\n \"mem-prop-5x6--6c\": {\"cels\": 1, \"h\": 6, \"id\": 121, \"w\": 5},\n \"mem-prop-5x6--6d\": {\"cels\": 1, \"h\": 6, \"id\": 122, \"w\": 5},\n \"mem-prop-5x6--6e\": {\"cels\": 1, \"h\": 6, \"id\": 123, \"w\": 5},\n \"mem-prop-5x6--6f\": {\"cels\": 1, \"h\": 6, \"id\": 124, \"w\": 5},\n \"mem-prop-5x6--70\": {\"cels\": 1, \"h\": 6, \"id\": 125, \"w\": 5},\n \"mem-prop-5x6--71\": {\"cels\": 1, \"h\": 6, \"id\": 126, \"w\": 5},\n \"mem-prop-5x6--72\": {\"cels\": 1, \"h\": 6, \"id\": 127, \"w\": 5},\n \"mem-prop-5x6--73\": {\"cels\": 1, \"h\": 6, \"id\": 128, \"w\": 5},\n \"mem-prop-5x6--74\": {\"cels\": 1, \"h\": 6, \"id\": 129, \"w\": 5},\n \"mem-prop-5x6--75\": {\"cels\": 1, \"h\": 6, \"id\": 130, \"w\": 5},\n \"mem-prop-5x6--76\": {\"cels\": 1, \"h\": 6, \"id\": 131, \"w\": 5},\n \"mem-prop-5x6--77\": {\"cels\": 1, \"h\": 6, \"id\": 132, \"w\": 5},\n \"mem-prop-5x6--78\": {\"cels\": 1, \"h\": 6, \"id\": 133, \"w\": 5},\n \"mem-prop-5x6--79\": {\"cels\": 1, \"h\": 6, \"id\": 134, \"w\": 5},\n \"mem-prop-5x6--7a\": {\"cels\": 1, \"h\": 6, \"id\": 135, \"w\": 5},\n \"mem-prop-5x6--7b\": {\"cels\": 1, \"h\": 6, \"id\": 136, \"w\": 5},\n \"mem-prop-5x6--7c\": {\"cels\": 1, \"h\": 6, \"id\": 137, \"w\": 5},\n \"mem-prop-5x6--7d\": {\"cels\": 1, \"h\": 6, \"id\": 138, \"w\": 5},\n \"mem-prop-5x6--7e\": {\"cels\": 1, \"h\": 6, \"id\": 139, \"w\": 5},\n \"mem-prop-5x6--7f\": {\"cels\": 1, \"h\": 6, \"id\": 140, \"w\": 5},\n \"oidoid--Default\": {\"cels\": 1, \"h\": 16, \"id\": 141, \"w\": 16}\n },\n \"celXY\": [\n 22, 37, 21, 27, 21, 29, 21, 31, 20, 33, 22, 33, 20, 35, 22, 35, 20, 37, 24,\n 26, 24, 26, 8, 16, 8, 16, 0, 16, 0, 16, 16, 14, 16, 14, 72, 13, 72, 13, 32,\n 26, 32, 26, 0, 16, 0, 16, 64, 13, 64, 13, 56, 13, 56, 13, 48, 13, 48, 13,\n 40, 13, 40, 13, 32, 13, 32, 13, 56, 13, 56, 13, 24, 13, 24, 13, 72, 0, 72,\n 0, 64, 0, 64, 0, 24, 0, 24, 0, 56, 0, 56, 0, 48, 0, 48, 0, 48, 0, 48, 0, 24,\n 0, 24, 0, 40, 0, 40, 0, 32, 0, 32, 0, 32, 0, 32, 0, 16, 0, 45, 56, 45, 56,\n 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45,\n 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56,\n 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45,\n 56, 45, 56, 45, 56, 40, 56, 10, 53, 5, 53, 0, 53, 35, 51, 30, 51, 25, 51,\n 20, 51, 15, 51, 35, 45, 70, 50, 65, 50, 60, 50, 55, 50, 50, 50, 45, 50, 40,\n 50, 10, 47, 5, 47, 0, 47, 70, 62, 50, 56, 65, 62, 60, 62, 55, 62, 50, 62,\n 45, 62, 40, 62, 10, 59, 5, 59, 0, 59, 35, 57, 70, 32, 30, 57, 25, 57, 20,\n 57, 15, 57, 75, 56, 70, 56, 65, 56, 60, 56, 75, 50, 55, 56, 10, 35, 75, 32,\n 15, 33, 0, 35, 5, 35, 40, 38, 45, 38, 65, 32, 60, 32, 55, 32, 50, 32, 45,\n 32, 40, 26, 50, 26, 55, 26, 60, 26, 65, 26, 70, 26, 75, 26, 16, 27, 0, 29,\n 5, 29, 10, 29, 40, 32, 45, 26, 10, 41, 30, 45, 25, 45, 20, 45, 15, 45, 75,\n 44, 70, 44, 65, 44, 60, 44, 55, 44, 50, 44, 45, 44, 40, 44, 50, 38, 5, 41,\n 0, 41, 35, 39, 30, 39, 25, 39, 20, 39, 15, 39, 75, 38, 70, 38, 65, 38, 60,\n 38, 55, 38, 45, 56, 0, 0\n ]\n}\n", "import * as V from '../../index.ts'\nimport type {Game} from '../game.ts'\nimport type {Tag} from '../types/tag.ts'\n\nexport class ClockEnt implements V.Ent<Tag> {\n readonly #time: V.TextEnt = new V.TextEnt()\n\n constructor() {\n this.#time.scale = 3\n this.#time.z = V.Layer.A\n }\n\n free(v: Game): void {\n this.#time.free(v)\n }\n\n update(v: Game): boolean | undefined {\n const now = new Date()\n this.#time.text = timeString(now)\n\n if (this.#time.layout(v) || v.cam.invalid)\n this.#time.xy = v.cam.follow(\n {w: this.#time.wh.w, h: this.#time.wh.h - this.#time.scaledLeading},\n this.#time.z,\n 'N',\n {margin: {h: 8}}\n )\n\n return this.#time.update(v)\n }\n}\n\n/** @internal */\nexport function timeString(time: Readonly<Date>): string {\n const hh = `${time.getHours() % 12 || 12}`.padStart(2, ' ')\n const mm = `${time.getMinutes()}`.padStart(2, '0')\n const ss = `${time.getSeconds()}`.padStart(2, '0')\n return `${hh}:${mm}:${ss}`\n}\n", "import * as V from '../../index.ts'\nimport type {Game} from '../game.ts'\nimport type {Tag} from '../types/tag.ts'\n\n// to-do: follow cam sw.\nexport class RenderToggleEnt implements V.Ent<Tag> {\n readonly #toggle: V.ButtonEnt<Tag, V.DefaultButton>\n\n constructor(v: Game) {\n this.#toggle = new V.ButtonEnt(v, {\n button: {\n w: {tag: 'background--Strawberry'},\n nw: {tag: 'background--Transparent'},\n n: {tag: 'background--Bubblegum'},\n e: {tag: 'background--Blueberry'},\n s: {tag: 'background--Kiwi'},\n origin: {tag: 'background--Grape'},\n border: {n: 1},\n margin: {w: 2, h: 2}\n },\n selected: {tag: 'background--OrangeCheckerboard'},\n toggle: true,\n text: {text: 'render', scale: 2},\n w: 64,\n h: 22,\n x: 50,\n y: 25,\n pressed: {tag: 'background--Bubblegum'}\n })\n }\n\n get on(): boolean {\n return this.#toggle.on\n }\n\n set on(on: boolean) {\n this.#toggle.on = on\n }\n\n free(v: Game): void {\n this.#toggle.free(v)\n }\n\n /** always updates but never invalidates. */\n update(v: Game): boolean | undefined {\n return this.#toggle.update(v)\n }\n}\n", "import * as V from '../../index.ts'\nimport type {Game} from '../game.ts'\nimport type {Tag} from '../types/tag.ts'\n\nexport class WorkCounterEnt implements V.Ent<Tag> {\n readonly #text: V.TextEnt = new V.TextEnt()\n #updates: number = 0\n\n constructor() {\n this.#text.z = V.Layer.A\n }\n\n free(v: Game): void {\n this.#text.free(v)\n }\n\n /** always updates but never invalidates. */\n update(v: Game): undefined {\n this.#updates++\n this.#text.text = `${this.#updates} updates\\n${v.renderer.clears + 1} renders`\n this.#text.layout(v)\n this.#text.xy = v.cam.follow(\n {w: this.#text.wh.w, h: this.#text.wh.h - this.#text.scaledLeading},\n this.#text.z,\n 'NE',\n {margin: {w: 8, h: 8}}\n )\n this.#text.update(v)\n }\n}\n", "import * as V from '../index.ts'\nimport preloadAtlasJSON from './assets/preload-atlas.json' with {type: 'json'}\nimport {ClockEnt} from './ents/clock-ent.ts'\nimport {RenderToggleEnt} from './ents/render-toggle-ent.ts'\nimport {WorkCounterEnt} from './ents/work-counter-ent.ts'\nimport type {Tag} from './types/tag.ts'\n\nexport class Game extends V.Void<Tag> {\n #filterSprites: V.Pool<V.Sprite<Tag>>\n #renderToggle: RenderToggleEnt\n #workCounter: WorkCounterEnt\n\n constructor() {\n super({\n preloadAtlas: {\n image: document.querySelector('#preload-atlas')!,\n json: preloadAtlasJSON\n },\n backgroundRGBA: 0xffffb1ff,\n minWH: {w: 320, h: 240},\n poll: {\n delay: () => renderDelayMillis(new Date(), V.debug?.seconds),\n period: ((V.debug?.seconds ? 1 : 60) * 1000) as V.Millis\n }\n })\n this.#filterSprites = new V.Pool<V.Sprite<Tag>>({\n alloc: pool => new V.Sprite(pool, 0, this.preload, this.looper),\n allocBytes: V.drawableBytes,\n pageBlocks: 10\n })\n this.#renderToggle = new RenderToggleEnt(this)\n this.#renderToggle.on = this.renderer.always\n this.#workCounter = new WorkCounterEnt()\n this.#initZoo()\n }\n\n override onLoop(_millis: V.Millis): void {\n if (V.debug?.input) this.#printInput()\n this.renderer.always = this.#renderToggle.on\n\n let render = this.#updateCam()\n this.zoo.update(this)\n\n render ||=\n this.zoo.invalid ||\n this.cam.invalid ||\n this.renderer.invalid ||\n this.renderer.always\n if (render) {\n this.renderer.clear(0xffffb1ff)\n this.renderer.predraw(this.cam)\n this.renderer.setDepth(true)\n this.renderer.draw(this.sprites)\n this.renderer.setDepth(false)\n this.renderer.draw(this.#filterSprites)\n }\n }\n\n #initZoo(): void {\n const border = new V.NinePatchEnt<Tag>(this, {\n n: {tag: 'background--Black'},\n origin: {tag: 'background--Transparent'},\n border: {n: 1},\n z: V.Layer.UIA\n })\n this.zoo.add(border)\n const box = this.cam.follow({w: 0, h: 0}, V.Layer.UIA, 'NW', {fill: 'XY'})\n border.xy = box\n border.wh = box\n\n const backpacker = this.sprites.alloc()\n backpacker.tag = 'backpacker--WalkRight'\n backpacker.x = 7\n backpacker.y = 7\n backpacker.z = V.Layer.C\n backpacker.stretch = true\n backpacker.w *= 5\n backpacker.h *= 5\n\n const oidoid = new V.FollowCamEnt(this, 'oidoid--Default', 'SW')\n oidoid.z = V.Layer.UIG\n oidoid.margin = {w: 4, h: 4}\n\n this.zoo.add(\n new V.CursorEnt(this, 'cursor--Pointer'),\n this.#renderToggle,\n new ClockEnt(),\n this.#workCounter,\n oidoid\n )\n\n const overlay = this.#filterSprites.alloc()\n overlay.tag = 'background--GreyCheckerboard'\n overlay.w = V.drawableMaxWH.w\n overlay.h = V.drawableMaxWH.h\n overlay.z = V.Layer.UIA\n }\n\n #printInput(): void {\n if (this.input.started) {\n const on = !!this.input.on.length\n if (on) console.debug(`[input] buttons on: ${this.input.on.join(' ')}.`)\n else console.debug(`[input] buttons off.`)\n const combo = this.input.combo\n if (combo.length > 1 && on)\n console.debug(\n `[input] combo: ${combo.map(set => set.join('+')).join(' ')}.`\n )\n }\n if (\n this.input.point?.invalid &&\n this.input.point?.click &&\n !this.input.point.pinch\n )\n console.debug(\n `[input] ${this.input.point.drag.on ? 'drag' : 'click'} xy: ${this.input.point.x} ${this.input.point.y}.`\n )\n if (this.input.point?.pinch)\n console.debug(\n `[input] pinch xy: ${this.input.point.pinch.xy.x} ${this.input.point.pinch.xy.y}.`\n )\n if (this.input.wheel)\n console.debug(\n `[input] wheel xy: ${this.input.wheel.delta.xy.x} ${this.input.wheel.delta.xy.y}.`\n )\n }\n\n #updateCam(): boolean {\n let render = this.input.isAnyOn('L', 'R', 'U', 'D')\n\n if (this.input.isAnyOnStart('L', 'R', 'U', 'D')) {\n this.cam.x = Math.trunc(this.cam.x)\n this.cam.y = Math.trunc(this.cam.y)\n }\n\n const d = 1 / 4\n if (this.input.isOn('L')) this.cam.x -= d\n if (this.input.isOn('R')) this.cam.x += d\n if (this.input.isOn('U')) this.cam.y -= d\n if (this.input.isOn('D')) this.cam.y += d\n\n if (this.input.wheel?.delta.xy.y) {\n render = true\n this.cam.zoomOut -= this.input.wheel.delta.client.y * 0.01\n }\n\n this.cam.update(this.canvas)\n\n return render\n }\n}\n\n/**\n * returns [0, 59_999].\n * @internal\n */\nexport function renderDelayMillis(\n time: Readonly<Date>,\n debugSecs: string | undefined\n): V.Millis {\n return (((debugSecs ? 0 : (59 - (time.getSeconds() % 60)) * 1000) +\n 1000 -\n (time.getMilliseconds() % 1000)) %\n (debugSecs ? 1000 : 60_000)) as V.Millis\n}\n", "import * as V from '../index.ts'\nimport {Game} from './game.ts'\n\nconsole.debug(`void v${V.version} \u2500\u2500\u2500oidoid>\u00B0\u2500\u2500`)\n\nconst v = new Game()\nawait v.register('add')\nif (V.debug) (globalThis as unknown as {v: Game}).v = v\n"],
|
|
5
|
-
"mappings": "AAAA,IAAAA,EAAA,CAAC,UAAY,WAAW,QAAU,SAAS,ECWpC,IAAMC,EAA2BC,ECXxC,IAAAC,EAAA,CACI,GAAM,eACN,KAAQ,UACR,UAAa,EACb,WAAc,EACd,QAAW,EACX,WAAc,EACd,SAAY,EACZ,QAAW,CACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,GACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAO,EACP,KAAO,EACP,KAAO,EACP,KAAO,EACP,KAAO,EACP,KAAO,EACP,KAAO,EACP,KAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAQ,EACR,OAAQ,EACR,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,GAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,GACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,CACV,EACA,eAAkB,EAClB,yBAA4B,GAC5B,iBAAoB,EACpB,UAAa,CACT,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,EAAK,EACL,EAAK,EACL,IAAK,EACL,KAAM,EACN,IAAK,EACL,IAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,IAAK,CACT,EACA,iBAAoB,CACxB,ECveO,IAAMC,EAAmBC,ECrFzB,IAAMC,EAAQ,CACnB,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,EAAG,EACH,EAAG,EACH,EAAG,GACH,EAAG,GACH,EAAG,GACH,EAAG,GACH,OAAQ,GACR,OAAQ,EACV,EAIO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AAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACz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",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["<define:globalThis.bundle>", "../../node_modules/mem-font/dist/mem-prop-5x6.json", "../../node_modules/mem-font/src/index.ts", "../../src/ents/button.ts", "../../src/graphics/layer.ts", "../../src/types/geo.ts", "../../src/utils/math.ts", "../../src/graphics/sprite.ts", "../../src/ents/cursor.ts", "../../src/utils/debug.ts", "../../src/ents/debug-input.ts", "../../src/ents/ent-query.ts", "../../src/ents/fps.ts", "../../src/ents/hud.ts", "../../src/ents/nine-patch.ts", "../../src/ents/override.ts", "../../src/ents/sprite.ts", "../../src/text/font.ts", "../../src/text/text-layout.ts", "../../src/ents/text.ts", "../../src/ents/zoo.ts", "../../src/graphics/atlas-parser.ts", "../../src/graphics/cam.ts", "../../src/input/context-menu.ts", "../../src/input/gamepad.ts", "../../src/input/keyboard.ts", "../../src/input/pointer.ts", "../../src/input/wheel.ts", "../../src/input/input.ts", "../../src/utils/obj-util.ts", "../../src/utils/str-util.ts", "../../src/level/level-parser.ts", "../../src/mem/pool.ts", "../../src/mem/sprite-pool.ts", "../../src/random/random.ts", "../../src/types/bundle.ts", "../../src/types/time.ts", "../../src/utils/color-util.ts", "../../src/utils/dom-util.ts", "../../src/utils/canvas-util.ts", "../../src/utils/delay-interval.ts", "../../src/utils/fetch-util.ts", "../../src/graphics/pixel-ratio-observer.ts", "../../src/graphics/gl.ts", "../../src/graphics/sprite-frag.glsl.ts", "../../src/graphics/sprite-vert.glsl.ts", "../../src/graphics/renderer.ts", "../../src/looper.ts", "../../src/void.ts", "../../src/demo/assets/manifest.json", "../../src/demo/assets/void.game.json", "../../src/demo/assets/init.level.jsonc", "../../src/demo/level/level-parser.ts", "../../src/demo/ents/cam.ts", "../../src/demo/ents/clock.ts", "../../src/demo/ents/draw.ts", "../../src/demo/ents/render-toggle.ts", "../../src/demo/ents/tally.ts", "../../src/demo/ents/loader.ts", "../../src/demo/index.ts"],
|
|
4
|
+
"sourcesContent": ["{\"hash\":\"1060661\",\"published\":\"20251227\",\"version\":\"0.1.0\"}", "{\n \"id\": \"mem-prop-5x6\",\n \"name\": \"mem 5x6\",\n \"cellW\": 5,\n \"cellH\": 6,\n \"leading\": 1,\n \"lineH\": 7,\n \"baseline\": 1,\n \"kerning\": {\n \" \": 0,\n \" 0\": 0,\n \" 1\": 0,\n \" 2\": 0,\n \" 3\": 0,\n \" 4\": 0,\n \" 5\": 0,\n \" 6\": 0,\n \" 7\": 0,\n \" 8\": 0,\n \" 9\": 0,\n \"##\": -1,\n \"#_\": 0,\n \"',\": 0,\n \"'.\": 0,\n \"'/\": 0,\n \"'J\": 0,\n \"'S\": 0,\n \"'_\": 0,\n \"'j\": 0,\n \"'s\": 0,\n \"(+\": 0,\n \"(-\": 0,\n \"(<\": 0,\n \"(f\": 0,\n \"({\": 0,\n \"(~\": 0,\n \")_\": 0,\n \"*,\": 0,\n \"*.\": 0,\n \"*/\": 0,\n \"*S\": 0,\n \"*_\": 0,\n \"*j\": 0,\n \"*s\": 0,\n \"+)\": 0,\n \"+,\": 0,\n \"+.\": 0,\n \"+/\": 0,\n \"+>\": 0,\n \"+?\": 0,\n \"+I\": 0,\n \"+S\": 0,\n \"+T\": 0,\n \"+Z\": 0,\n \"+]\": 0,\n \"+_\": 0,\n \"+`\": 0,\n \"+j\": 0,\n \"+s\": 0,\n \"+}\": 0,\n \",'\": 0,\n \",*\": 0,\n \",+\": 0,\n \",-\": 0,\n \",<\": 0,\n \",?\": 0,\n \",T\": 0,\n \",Y\": 0,\n \",Z\": 0,\n \",\\\"\": 0,\n \",\\\\\": 0,\n \",^\": 0,\n \",`\": 0,\n \",f\": 0,\n \",t\": 0,\n \",z\": 0,\n \",{\": 0,\n \",~\": 0,\n \"-)\": 0,\n \"-,\": 0,\n \"--\": 0,\n \"-.\": 0,\n \"-/\": 0,\n \"->\": 0,\n \"-?\": 0,\n \"-I\": 0,\n \"-S\": 0,\n \"-T\": 0,\n \"-Z\": 0,\n \"-]\": 0,\n \"-_\": 0,\n \"-`\": 0,\n \"-j\": 0,\n \"-s\": 0,\n \"-}\": 0,\n \".'\": 0,\n \".*\": 0,\n \".+\": 0,\n \".-\": 0,\n \".<\": 0,\n \".?\": 0,\n \".T\": 0,\n \".Y\": 0,\n \".Z\": 0,\n \".\\\"\": 0,\n \".\\\\\": 0,\n \".^\": 0,\n \".`\": 0,\n \".f\": 0,\n \".t\": 0,\n \".z\": 0,\n \".{\": 0,\n \".~\": 0,\n \"/,\": 0,\n \"/.\": 0,\n \"//\": 0,\n \"/J\": 0,\n \"/S\": 0,\n \"/_\": 0,\n \"/j\": 0,\n \"/s\": 0,\n \"0 \": 0,\n \"1 \": 0,\n \"1T\": 0,\n \"1Y\": 0,\n \"1Z\": 0,\n \"1f\": 0,\n \"1t\": 0,\n \"1z\": 0,\n \"2 \": 0,\n \"3 \": 0,\n \"4 \": 0,\n \"5 \": 0,\n \"6 \": 0,\n \"7 \": 0,\n \"8 \": 0,\n \"9 \": 0,\n \":?\": 0,\n \":T\": 0,\n \":Z\": 0,\n \":`\": 0,\n \";?\": 0,\n \";T\": 0,\n \";Z\": 0,\n \"<+\": 0,\n \"<-\": 0,\n \"<<\": 0,\n \"<f\": 0,\n \"<{\": 0,\n \"<~\": 0,\n \"==\": 0,\n \"=_\": 0,\n \">)\": 0,\n \">,\": 0,\n \">.\": 0,\n \">/\": 0,\n \">>\": 0,\n \">?\": 0,\n \">I\": 0,\n \">S\": 0,\n \">T\": 0,\n \">Z\": 0,\n \">]\": 0,\n \">_\": 0,\n \">`\": 0,\n \">j\": 0,\n \">s\": 0,\n \">}\": 0,\n \"?,\": 0,\n \"?.\": 0,\n \"?/\": 0,\n \"?S\": 0,\n \"?_\": 0,\n \"?j\": 0,\n \"?s\": 0,\n \"@_\": 0,\n \"C+\": 0,\n \"C-\": 0,\n \"C<\": 0,\n \"Cf\": 0,\n \"C{\": 0,\n \"C~\": 0,\n \"D_\": 0,\n \"E+\": 0,\n \"E-\": 0,\n \"E<\": 0,\n \"Ef\": 0,\n \"E{\": 0,\n \"E~\": 0,\n \"F&\": 0,\n \"F+\": 0,\n \"F,\": 0,\n \"F-\": 0,\n \"F.\": 0,\n \"F/\": 0,\n \"F:\": 0,\n \"F;\": 0,\n \"F<\": 0,\n \"FJ\": 0,\n \"FS\": 0,\n \"F_\": 0,\n \"Fa\": 0,\n \"Fe\": 0,\n \"Ff\": 0,\n \"Fg\": 0,\n \"Fj\": 0,\n \"Fq\": 0,\n \"Fs\": 0,\n \"F{\": 0,\n \"F~\": 0,\n \"I+\": 0,\n \"I-\": 0,\n \"I<\": 0,\n \"If\": 0,\n \"I{\": 0,\n \"I~\": 0,\n \"L'\": 0,\n \"L*\": 0,\n \"L+\": 0,\n \"L-\": 0,\n \"L4\": 0,\n \"L7\": 0,\n \"L<\": 0,\n \"L?\": 0,\n \"LT\": 0,\n \"LY\": 0,\n \"LZ\": 0,\n \"L\\\"\": 0,\n \"L\\\\\": 0,\n \"L^\": 0,\n \"L`\": 0,\n \"Lf\": 0,\n \"Lt\": 0,\n \"Lz\": 0,\n \"L{\": 0,\n \"L~\": 0,\n \"P,\": 0,\n \"P.\": 0,\n \"P/\": 0,\n \"PS\": 0,\n \"P_\": 0,\n \"Pj\": 0,\n \"Ps\": 0,\n \"S&\": 0,\n \"S+\": 0,\n \"S,\": 0,\n \"S-\": 0,\n \"S.\": 0,\n \"S/\": 0,\n \"S:\": 0,\n \"S;\": 0,\n \"S<\": 0,\n \"SJ\": 0,\n \"SS\": 0,\n \"S_\": 0,\n \"Sa\": 0,\n \"Se\": 0,\n \"Sf\": 0,\n \"Sg\": 0,\n \"Sj\": 0,\n \"Sq\": 0,\n \"Ss\": 0,\n \"S{\": 0,\n \"S~\": 0,\n \"T&\": 0,\n \"T+\": 0,\n \"T,\": 0,\n \"T-\": 0,\n \"T.\": 0,\n \"T/\": 0,\n \"T:\": 0,\n \"T;\": 0,\n \"T<\": 0,\n \"TJ\": 0,\n \"TS\": 0,\n \"T_\": 0,\n \"Ta\": 0,\n \"Te\": 0,\n \"Tf\": 0,\n \"Tg\": 0,\n \"Tj\": 0,\n \"Tq\": 0,\n \"Ts\": 0,\n \"T{\": 0,\n \"T~\": 0,\n \"V_\": 0,\n \"Y,\": 0,\n \"Y.\": 0,\n \"Y/\": 0,\n \"YS\": 0,\n \"Y_\": 0,\n \"Yj\": 0,\n \"Ys\": 0,\n \"Z'\": 0,\n \"Z*\": 0,\n \"Z+\": 0,\n \"Z-\": 0,\n \"Z4\": 0,\n \"Z7\": 0,\n \"Z<\": 0,\n \"Z?\": 0,\n \"ZT\": 0,\n \"ZY\": 0,\n \"ZZ\": 0,\n \"Z\\\"\": 0,\n \"Z\\\\\": 0,\n \"Z^\": 0,\n \"Z`\": 0,\n \"Zf\": 0,\n \"Zt\": 0,\n \"Zz\": 0,\n \"Z{\": 0,\n \"Z~\": 0,\n \"[+\": 0,\n \"[-\": 0,\n \"[<\": 0,\n \"[f\": 0,\n \"[{\": 0,\n \"[~\": 0,\n \"\\\",\": 0,\n \"\\\".\": 0,\n \"\\\"/\": 0,\n \"\\\"J\": 0,\n \"\\\"S\": 0,\n \"\\\"_\": 0,\n \"\\\"j\": 0,\n \"\\\"s\": 0,\n \"\\\\'\": 0,\n \"\\\\*\": 0,\n \"\\\\+\": 0,\n \"\\\\-\": 0,\n \"\\\\<\": 0,\n \"\\\\?\": 0,\n \"\\\\T\": 0,\n \"\\\\Y\": 0,\n \"\\\\Z\": 0,\n \"\\\\\\\"\": 0,\n \"\\\\\\\\\": 0,\n \"\\\\^\": 0,\n \"\\\\`\": 0,\n \"\\\\f\": 0,\n \"\\\\t\": 0,\n \"\\\\z\": 0,\n \"\\\\{\": 0,\n \"\\\\~\": 0,\n \"^,\": 0,\n \"^.\": 0,\n \"^/\": 0,\n \"^J\": 0,\n \"^S\": 0,\n \"^_\": 0,\n \"^j\": 0,\n \"^s\": 0,\n \"_#\": 0,\n \"_%\": 0,\n \"_'\": 0,\n \"_(\": 0,\n \"_*\": 0,\n \"_+\": 0,\n \"_-\": 0,\n \"_<\": 0,\n \"_=\": 0,\n \"_?\": 0,\n \"_@\": 0,\n \"_T\": 0,\n \"_V\": 0,\n \"_Y\": 0,\n \"_Z\": 0,\n \"_\\\"\": 0,\n \"_\\\\\": 0,\n \"_^\": 0,\n \"__\": 0,\n \"_`\": 0,\n \"_a\": 0,\n \"_e\": 0,\n \"_f\": 0,\n \"_t\": 0,\n \"_v\": 0,\n \"_z\": 0,\n \"_{\": 0,\n \"_~\": 0,\n \"`,\": 0,\n \"`.\": 0,\n \"`/\": 0,\n \"`J\": 0,\n \"`S\": 0,\n \"`_\": 0,\n \"`j\": 0,\n \"`s\": 0,\n \"f,\": 0,\n \"f.\": 0,\n \"f/\": 0,\n \"fS\": 0,\n \"f_\": 0,\n \"fj\": 0,\n \"fs\": 0,\n \"q#\": 0,\n \"q$\": 0,\n \"q%\": 0,\n \"q&\": 0,\n \"q'\": 0,\n \"q(\": 0,\n \"q*\": 0,\n \"q+\": 0,\n \"q-\": 0,\n \"q0\": 0,\n \"q1\": 0,\n \"q2\": 0,\n \"q3\": 0,\n \"q4\": 0,\n \"q5\": 0,\n \"q6\": 0,\n \"q7\": 0,\n \"q8\": 0,\n \"q9\": 0,\n \"q<\": 0,\n \"q=\": 0,\n \"q?\": 0,\n \"q@\": 0,\n \"qA\": 0,\n \"qB\": 0,\n \"qC\": 0,\n \"qD\": 0,\n \"qE\": 0,\n \"qF\": 0,\n \"qG\": 0,\n \"qH\": 0,\n \"qI\": 0,\n \"qJ\": 0,\n \"qK\": 0,\n \"qL\": 0,\n \"qM\": 0,\n \"qN\": 0,\n \"qO\": 0,\n \"qP\": 0,\n \"qQ\": 0,\n \"qR\": 0,\n \"qS\": 0,\n \"qT\": 0,\n \"qU\": 0,\n \"qV\": 0,\n \"qW\": 0,\n \"qX\": 0,\n \"qY\": 0,\n \"qZ\": 0,\n \"q[\": 0,\n \"q\\\"\": 0,\n \"q\\\\\": 0,\n \"q]\": 0,\n \"q^\": 0,\n \"q`\": 0,\n \"qa\": 0,\n \"qb\": 0,\n \"qc\": 0,\n \"qd\": 0,\n \"qe\": 0,\n \"qf\": 0,\n \"qh\": 0,\n \"qk\": 0,\n \"qm\": 0,\n \"qn\": 0,\n \"qo\": 0,\n \"qq\": 0,\n \"qr\": 0,\n \"qs\": 0,\n \"qt\": 0,\n \"qu\": 0,\n \"qv\": 0,\n \"qw\": 0,\n \"qx\": 0,\n \"qz\": 0,\n \"q{\": 0,\n \"q}\": 0,\n \"q~\": 0,\n \"r,\": 0,\n \"r.\": 0,\n \"r/\": 0,\n \"rS\": 0,\n \"r_\": 0,\n \"rj\": -1,\n \"rs\": 0,\n \"s,\": 0,\n \"s.\": 0,\n \"s/\": 0,\n \"sJ\": 0,\n \"sS\": 0,\n \"s_\": 0,\n \"sj\": 0,\n \"ss\": 0,\n \"z'\": 0,\n \"z*\": 0,\n \"z+\": 0,\n \"z-\": 0,\n \"z4\": 0,\n \"z7\": 0,\n \"z<\": 0,\n \"z?\": 0,\n \"zT\": 0,\n \"zY\": 0,\n \"zZ\": 0,\n \"z\\\"\": 0,\n \"z\\\\\": 0,\n \"z^\": 0,\n \"z`\": 0,\n \"zf\": 0,\n \"zt\": 0,\n \"zz\": 0,\n \"z{\": 0,\n \"z~\": 0,\n \"{+\": 0,\n \"{-\": 0,\n \"{<\": 0,\n \"{f\": 0,\n \"{{\": 0,\n \"{~\": 0,\n \"})\": 0,\n \"},\": 0,\n \"}.\": 0,\n \"}/\": 0,\n \"}>\": 0,\n \"}?\": 0,\n \"}I\": 0,\n \"}S\": 0,\n \"}T\": 0,\n \"}Z\": 0,\n \"}]\": 0,\n \"}_\": 0,\n \"}`\": 0,\n \"}j\": 0,\n \"}s\": 0,\n \"}}\": 0,\n \"~'\": 0,\n \"~?\": 0,\n \"~T\": 0,\n \"~Z\": 0,\n \"~\\\"\": 0,\n \"~\\\\\": 0,\n \"~^\": 0,\n \"~_\": 0,\n \"~`\": 0,\n \"~t\": 0,\n \"~z\": 0\n },\n \"defaultKerning\": 1,\n \"defaultWhitespaceKerning\": -1,\n \"endOfLineKerning\": 0,\n \"charW\": {\n \" \": 4,\n \"!\": 1,\n \"#\": 5,\n \"&\": 4,\n \"'\": 1,\n \"(\": 2,\n \")\": 2,\n \",\": 1,\n \".\": 1,\n \":\": 1,\n \";\": 1,\n \"@\": 5,\n \"M\": 5,\n \"W\": 5,\n \"[\": 2,\n \"\\n\": 0,\n \"]\": 2,\n \"`\": 2,\n \"i\": 1,\n \"l\": 1,\n \"m\": 5,\n \"q\": 4,\n \"w\": 5,\n \"|\": 1\n },\n \"defaultCharW\": 3,\n \"descends\": {\n \"$\": true,\n \",\": true,\n \"/\": true,\n \";\": true,\n \"Q\": true,\n \"\\\\\": true,\n \"_\": true,\n \"g\": true,\n \"j\": true,\n \"p\": true,\n \"q\": true,\n \"y\": true\n }\n}\n", null, "import type {Void} from '../void.ts'\nimport type {Sys, SysEnt} from './sys.ts'\n\nexport type ButtonEnt = SysEnt<ButtonSys>\n\nexport class ButtonSys implements Sys {\n readonly query = 'button & sprite'\n\n free(ent: ButtonEnt): void {\n buttonFree(ent)\n }\n\n update(ent: ButtonEnt, v: Void): void {\n // to-do: !v.zoo.cursor?.invalid? I should never read another ent's invalid state.\n if (!ent.invalid && !v.input.invalid) return\n ent.invalid = true // to-do: every cursor movement!?\n\n const {button} = ent\n const toggle = button.type === 'Toggle'\n\n // to-do: these only need to be set if ent is invalid.\n button.pressed.x = ent.sprite.x\n button.pressed.y = ent.sprite.y\n button.pressed.w = ent.sprite.w\n button.pressed.h = ent.sprite.h\n button.selected.x = ent.sprite.x\n button.selected.y = ent.sprite.y\n button.selected.w = ent.sprite.w\n button.selected.h = ent.sprite.h\n // to-do: do I copy over everything from sprite? I thought I was trying to get away from copy everything update loops.\n // in particular, ent.sprite.z needs to be applied more uniformly across the parser but lots of stuff isn't always checking sprite.\n\n const hitsCursor =\n !!v.zoo.cursor && v.zoo.cursor.sprite.hitsZ(ent.sprite, v.cam)\n\n const on =\n hitsCursor && v.input.isOnStart('A')\n ? toggle\n ? !buttonOn(ent)\n : true\n : toggle\n ? buttonOn(ent)\n : v.input.isOn('A') ||\n (!!v.zoo.cursor?.cursor.keyboard && v.input.isOn('A'))\n button.started = buttonOn(ent) !== on\n button.pressed.visible = on\n\n button.selected.visible = hitsCursor\n\n v.input.handled ||= hitsCursor\n }\n}\n\nexport function buttonFree(ent: ButtonEnt): void {\n ent.button.pressed.free()\n ent.button.selected.free()\n ent.invalid = true\n // to-do: how to update zoo synchronously to remove the component and not run update()?\n}\n\nexport function buttonSetOn(ent: ButtonEnt, on: boolean): void {\n ent.button.pressed.visible = on\n ent.invalid = true\n}\n\nexport function buttonOn(ent: Readonly<ButtonEnt>): boolean {\n return ent.button.pressed.visible\n}\n\n// to-do: offStart() for pointer up listen? would need a boundary check too.\nexport function buttonOnStart(ent: Readonly<ButtonEnt>): boolean {\n return ent.button.started && buttonOn(ent)\n}\n\nexport function buttonSelected(ent: Readonly<ButtonEnt>): boolean {\n return ent.button.selected.visible\n}\n", "/** [0 (bottom), 15 (top)]; greater is above. */\nexport const Layer = {\n Bottom: 0,\n A: 1,\n B: 2,\n C: 3,\n D: 4,\n E: 5,\n F: 6,\n G: 7,\n UIA: 8,\n UIB: 9,\n UIC: 10,\n UID: 11,\n UIE: 12,\n UIF: 13,\n UIG: 14,\n Top: 15\n} as const\nexport type Layer = (typeof Layer)[keyof typeof Layer]\n\n/** positive is above. returns [bottom, top]. */\nexport function layerOffset(layer: Layer, offset: number): Layer {\n return Math.max(Layer.Bottom, Math.min(Layer.Top, layer + offset)) as Layer\n}\n\n/** true if UI or top layer. */\nexport function isUILayer(layer: Layer): boolean {\n return layer >= Layer.UIA\n}\n", "export type Border = {[dir in Lowercase<CardinalDir>]: number}\n\nexport type Box = XY & WH\nexport type WH = {w: number; h: number}\nexport type XY = {x: number; y: number}\nexport type XYZ = {x: number; y: number; z: number}\n\nexport type CardinalDir = 'N' | 'S' | 'W' | 'E'\nexport type CompassDir = 'Center' | CardinalDir | 'NW' | 'NE' | 'SW' | 'SE'\n\nexport function boxAssign(l: Box, r: Readonly<Box>): void {\n l.x = r.x\n l.y = r.y\n l.w = r.w\n l.h = r.h\n}\n\nexport function boxEq(l: Readonly<Box>, r: Readonly<Box>): boolean {\n return xyEq(l, r) && whEq(l, r)\n}\n\n// to-do: this is an example where I do want the helper. it's so errorprone to write this.\nexport function borderEq(l: Readonly<Border>, r: Readonly<Border>): boolean {\n return l.n === r.n && l.s === r.s && l.w === r.w && l.e === r.e\n}\n\nexport function borderAssign(l: Border, r: Readonly<Border>): void {\n l.n = r.n\n l.s = r.s\n l.w = r.w\n l.e = r.e\n}\n\nexport function boxHits(\n l: Readonly<Partial<XY> & WH>,\n r: Readonly<XY & Partial<WH>>\n): boolean {\n const rWH = {w: r.w ?? 1, h: r.h ?? 1} // point? an empty box has no w/h.\n if (!l.w || !l.h || !rWH.w || !rWH.h) return false // noncommutative.\n const lXY = {x: l.x ?? 0, y: l.y ?? 0}\n return (\n lXY.x < r.x + rWH.w &&\n lXY.x + l.w > r.x &&\n lXY.y < r.y + rWH.h &&\n lXY.y + l.h > r.y\n )\n}\n\nexport function whAssign(l: WH, r: Readonly<WH>): void {\n l.w = r.w\n l.h = r.h\n}\n\nexport function whEq(l: Readonly<WH>, r: Readonly<WH>): boolean {\n return l.w === r.w && l.h === r.h\n}\n\n/** l + r. */\nexport function xyAdd(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: l.x + r.x, y: l.y + r.y}\n}\n\n/** l += r. */\nexport function xyAddTo(l: XY, r: Readonly<XY>): void {\n l.x += r.x\n l.y += r.y\n}\n\nexport function xyAssign(l: XY, r: Readonly<XY>): void {\n l.x = r.x\n l.y = r.y\n}\n\n/** nonnegative. */\nexport function xyDistance(from: Readonly<XY>, to: Readonly<XY>): number {\n return xyMagnitude(xySub(from, to))\n}\n\n/** l / r. */\nexport function xyDiv(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: l.x / r.x, y: l.y / r.y}\n}\n\nexport function xyEq(l: Readonly<XY>, r: Readonly<XY>): boolean {\n return l.x === r.x && l.y === r.y\n}\n\n/** nonnegative. */\nexport function xyMagnitude(xy: Readonly<XY>): number {\n return Math.hypot(xy.x, xy.y)\n}\n\n/** the greater of each component. */\nexport function xyMax(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: Math.max(l.x, r.x), y: Math.max(l.y, r.y)}\n}\n\n/** the lesser of each component. */\nexport function xyMin(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: Math.min(l.x, r.x), y: Math.min(l.y, r.y)}\n}\n\n/** l - r. */\nexport function xySub(l: Readonly<XY>, r: Readonly<XY>): XY {\n return {x: l.x - r.x, y: l.y - r.y}\n}\n", "// to-do: port tests.\nexport function clamp(val: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, val))\n}\n\nexport function closeTo(lhs: number, rhs: number, tolerance: number): boolean {\n return Math.abs(lhs - rhs) <= tolerance\n}\n\n// to-do: port tests.\n/** ratio is [0, 1] to return [start, end]. */\nexport function lerp(start: number, end: number, ratio: number): number {\n return start + (end - start) * ratio\n}\n\n// to-do: test. mod(-1.3, 1) -> 0.7\n/** returns positive modulo. */\nexport function mod(dividend: number, divisor: number): number {\n return ((dividend % divisor) + divisor) % divisor\n}\n", "import {\n type Anim,\n type Atlas,\n animCels,\n celMillis,\n type Tag\n} from '../graphics/atlas.ts'\nimport type {Block} from '../mem/pool.ts'\nimport {type Box, boxHits, type WH, type XY} from '../types/geo.ts'\nimport type {Millis} from '../types/time.ts'\nimport {mod} from '../utils/math.ts'\nimport {isUILayer, Layer} from './layer.ts'\n\nexport type DrawablePool = {\n free(block: Block): void\n view: DataView<ArrayBuffer>\n}\n\n/** must be a multiple of 4 (`UNSIGNED_INT`). */\nexport const drawableBytes: number = 16\n/** granularity (0.015625) of drawable coords. */\nexport const drawableEpsilon: number = 1 / 64\nexport const drawableMaxWH: Readonly<WH> = {w: 4095, h: 4095}\n\n/**\n * everything not requiring an atlas. the box is the drawn region. assume little\n * endian.\n *\n * 0 xxxx xxxx x [-131072, 131071.984375] (1/64th fixed-point). 1b sign, 17b\n * 1 xxxx xxxx int, 6b fraction.\n * 2 xxxx xxxx\n * 3 yyyy yyyy y.\n * 4 yyyy yyyy\n * 5 yyyy yyyy\n * 6 sxyz llll stretch, flip x, flip y, zend, z layer (4b).\n * 7 wwww wwww width [0, 4095]. zero means discard.\n * 8 hhhh wwww height. zero means discard.\n * 9 hhhh hhhh\n * a iiic cccc animation ID [0, 2047], animation cel [0, 31].\n * b iiii iiii\n * c rrrr rrrv reserved, visible.\n * d rrrr rrrr\n * e rrrr rrrr\n * f rrrr rrrr\n *\n * animations default to looping without CPU interaction.\n * @internal\n */\nexport abstract class Drawable implements Block, Box {\n i: number\n readonly #pool: Readonly<DrawablePool>\n\n constructor(pool: Readonly<DrawablePool>, i: number) {\n this.#pool = pool\n this.i = i\n }\n\n above(draw: Readonly<Drawable>): boolean {\n const compare =\n this.z === draw.z\n ? (this.zend ? this.y + this.h : this.y) -\n (draw.zend ? draw.y + draw.h : draw.y)\n : this.z - draw.z\n return compare > 0\n }\n\n get cel(): number {\n const iiic_cccc = this.#pool.view.getUint8(this.i + 10)\n return iiic_cccc & 0x1f\n }\n\n /**\n * [0, 31]. rendered cel offset. call reset() to play animation from start.\n */\n set cel(cel: number) {\n const iiic_cccc = this.#pool.view.getUint8(this.i + 10)\n this.#pool.view.setUint8(this.i + 10, (iiic_cccc & ~0x1f) | (cel & 0x1f))\n }\n\n /**\n * `this` is a clipbox but sometimes a copy or non-Sprite instance is needed.\n */\n get clipbox(): Box {\n return {x: this.x, y: this.y, w: this.w, h: this.h}\n }\n\n /** test if render area overlaps box or sprite render area. */\n clips(box: Readonly<XY & Partial<WH>>): boolean {\n return boxHits(this, box)\n }\n\n /** like `clips()` but can supports different world and UI layers. */\n clipsZ(draw: Readonly<Drawable>, cam: Readonly<XY>): boolean {\n if (this.ui === draw.ui) return this.clips(draw)\n const clipbox = {\n x: draw.x + (draw.ui ? 1 : -1) * Math.floor(cam.x),\n y: draw.y + (draw.ui ? 1 : -1) * Math.floor(cam.y),\n w: draw.w,\n h: draw.h\n }\n return boxHits(this, clipbox)\n }\n\n get flipX(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x40)\n }\n\n set flipX(flip: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0x40) | (-flip & 0x40))\n }\n\n get flipY(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x20)\n }\n\n set flipY(flip: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0x20) | (-flip & 0x20))\n }\n\n free(): void {\n this.#pool.free(this)\n }\n\n get h(): number {\n const h12_wwww = this.#pool.view.getUint16(this.i + 8, true)\n return h12_wwww >>> 4\n }\n\n /** [0, 4095]. */\n set h(h: number) {\n const h12_wwww = this.#pool.view.getUint16(this.i + 8, true)\n this.#pool.view.setUint16(\n this.i + 8,\n (h12_wwww & ~(0xfff << 4)) | ((h & 0xfff) << 4),\n true\n )\n }\n\n get id(): number {\n const i11_c5 = this.#pool.view.getUint16(this.i + 10, true)\n return (i11_c5 >>> 5) & 0x7ff\n }\n\n /** [0, 2047]. */\n set id(id: number) {\n const i11_c5 = this.#pool.view.getUint16(this.i + 10, true)\n this.#pool.view.setUint16(\n this.i + 10,\n (i11_c5 & ~(0x7ff << 5)) | ((id & 0x7ff) << 5),\n true\n )\n }\n\n /**\n * reset most values that wouldn't be configured when setting the tag. used\n * for reinitialization on pool allocation.\n */\n init(): void {\n this.cel = 0\n this.flipX = false\n this.flipY = false\n this.h = 0\n this.id = 0\n this.stretch = false\n this.visible = true\n this.w = 0\n this.x = 0\n this.y = 0\n this.z = Layer.Bottom\n this.zend = false\n }\n\n get stretch(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x80)\n }\n\n /** wrap texture (default) or stretch to width and height. */\n set stretch(stretch: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(\n this.i + 6,\n (sxyz_llll & ~0x80) | (-stretch & 0x80)\n )\n }\n\n get ui(): boolean {\n return isUILayer(this.z)\n }\n\n get visible(): boolean {\n const rrrr_rrrv = this.#pool.view.getUint8(this.i + 12)\n return (rrrr_rrrv & 0x1) === 0x1\n }\n\n set visible(visible: boolean) {\n const rrrr_rrrv = this.#pool.view.getUint8(this.i + 12)\n this.#pool.view.setUint8(\n this.i + 12,\n (rrrr_rrrv & ~0x1) | (visible ? 0x1 : 0x0)\n )\n }\n\n get w(): number {\n const hhhh_w12 = this.#pool.view.getUint16(this.i + 7, true)\n return hhhh_w12 & 0xfff\n }\n\n /** [0, 4095]. */\n set w(w: number) {\n const hhhh_w12 = this.#pool.view.getUint16(this.i + 7, true)\n this.#pool.view.setUint16(\n this.i + 7,\n (hhhh_w12 & ~0xfff) | (w & 0xfff),\n true\n )\n }\n\n get x(): number {\n const y8_x24 = this.#pool.view.getUint32(this.i + 0, true)\n return ((y8_x24 << 8) >> 8) / 64 // signed shift.\n }\n\n /** [-131072, 131071.984375] with 1/64th (0.015625) granularity. */\n set x(x: number) {\n const y8_x24 = this.#pool.view.getUint32(this.i + 0, true)\n this.#pool.view.setUint32(\n this.i + 0,\n (y8_x24 & ~0xff_ffff) | ((x * 64) & 0xff_ffff),\n true\n )\n }\n\n get y(): number {\n const sxyz_llll_y24 = this.#pool.view.getUint32(this.i + 3, true)\n return ((sxyz_llll_y24 << 8) >> 8) / 64 // signed shift.\n }\n\n /** [-131072, 131071.984375] with 1/64th (0.015625) granularity. */\n set y(y: number) {\n const sxyz_llll_y24 = this.#pool.view.getUint32(this.i + 3, true)\n this.#pool.view.setUint32(\n this.i + 3,\n (sxyz_llll_y24 & ~0xff_ffff) | ((y * 64) & 0xff_ffff),\n true\n )\n }\n\n get z(): Layer {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return (sxyz_llll & 0xf) as Layer\n }\n\n /** layer [0 (bottom), 15 (top)]. */\n set z(z: Layer) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0xf) | (z & 0xf))\n }\n\n get zend(): boolean {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n return !!(sxyz_llll & 0x10)\n }\n\n /** z-order by top (default) or bottom of box. */\n set zend(end: boolean) {\n const sxyz_llll = this.#pool.view.getUint8(this.i + 6)\n this.#pool.view.setUint8(this.i + 6, (sxyz_llll & ~0x10) | (-end & 0x10))\n }\n}\n\nexport class Sprite extends Drawable {\n readonly #atlas: Readonly<Atlas>\n #hitbox: Box | undefined\n #hurtbox: Box | undefined\n readonly #looper: {readonly age: Millis}\n\n constructor(\n pool: Readonly<DrawablePool>,\n i: number,\n atlas: Readonly<Atlas>,\n looper: {readonly age: Millis}\n ) {\n super(pool, i)\n this.#atlas = atlas\n this.#looper = looper\n }\n\n get anim(): Anim {\n return this.#atlas.anim[this.tag]!\n }\n\n diagonalize(dir: Readonly<XY>): void {\n diagonalize(this, dir.x * dir.y)\n }\n\n override get flipX(): boolean {\n return super.flipX\n }\n\n override set flipX(flip: boolean) {\n if (this.flipX === flip) return\n super.flipX = flip\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get flipY(): boolean {\n return super.flipY\n }\n\n override set flipY(flip: boolean) {\n if (this.flipY === flip) return\n super.flipY = flip\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get h(): number {\n return super.h\n }\n\n override set h(h: number) {\n if (this.h === h) return\n super.h = h\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n /** floored hitbox. */\n get hitbox(): Readonly<Box> | undefined {\n if (this.#hitbox) return this.#hitbox\n const {hitbox} = this.anim\n if (!hitbox) return\n return (this.#hitbox ??= {\n x: Math.floor(\n this.x + (this.flipX ? this.w - hitbox.w - hitbox.x : hitbox.x)\n ),\n y: Math.floor(\n this.y + (this.flipY ? this.h - hitbox.h - hitbox.y : hitbox.y)\n ),\n w: hitbox.w,\n h: hitbox.h\n })\n }\n\n /**\n * use `clips()` to test only clipbox of this and box. hitbox and hurtbox\n * default to clipbox.\n */\n hits(box: Readonly<XY | Box>): boolean {\n const hurtbox = box instanceof Sprite ? (box.hurtbox ?? box) : box\n return boxHits(this.hitbox ?? this, hurtbox)\n }\n\n /** like `hits()` but can supports different world and UI layers. */\n hitsZ(sprite: Readonly<Sprite>, cam: Readonly<XY>): boolean {\n if (this.ui === sprite.ui) return this.hits(sprite)\n const hurtbox = {...(sprite.hurtbox ?? sprite.clipbox)}\n hurtbox.x += (sprite.ui ? 1 : -1) * Math.floor(cam.x)\n hurtbox.y += (sprite.ui ? 1 : -1) * Math.floor(cam.y)\n return boxHits(this.hitbox ?? this, hurtbox)\n }\n\n /** floored hurtbox. */\n get hurtbox(): Readonly<Box> | undefined {\n if (this.#hurtbox) return this.#hurtbox\n const {hurtbox} = this.anim\n if (!hurtbox) return\n return (this.#hurtbox ??= {\n x: Math.floor(\n this.x + (this.flipX ? this.w - hurtbox.w - hurtbox.x : hurtbox.x)\n ),\n y: Math.floor(\n this.y + (this.flipY ? this.h - hurtbox.h - hurtbox.y : hurtbox.y)\n ),\n w: hurtbox.w,\n h: hurtbox.h\n })\n }\n\n override get id(): number {\n return super.id\n }\n\n override set id(id: number) {\n if (this.id === id) return\n super.id = id\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n /** true if animation has played once. */\n get looped(): boolean {\n // this comparison resets after the second loop since cel can only count to\n // 2 * anim.cels.\n return mod(this.looperCel - this.cel, animCels * 2) >= this.anim.cels\n }\n\n /** current fractional cel in [0, 2 * anim.cels). */\n get looperCel(): number {\n const cel = this.#looper.age / celMillis\n return cel % (this.anim.cels * 2)\n }\n\n /** sets cel to animation start. */\n reset(): void {\n this.cel = this.looperCel // setter truncates.\n }\n\n get tag(): Tag {\n return this.#atlas.tags[this.id]!\n }\n\n /** sets animation, resets cel, dimensions, hitbox, and hurtbox. */\n set tag(tag: Tag) {\n const anim = this.#atlas.anim[tag]!\n this.w = anim.w\n this.h = anim.h\n this.id = anim.id\n this.reset()\n }\n\n override toString(): string {\n return `Sprite{${this.tag} (${this.x} ${this.y} ${this.z}) ${this.w}\u00D7${this.h}}`\n }\n\n override get w(): number {\n return super.w\n }\n\n override set w(w: number) {\n if (this.w === w) return\n super.w = w\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get x(): number {\n return super.x\n }\n\n override set x(x: number) {\n if (this.x === x) return\n super.x = x\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n\n override get y(): number {\n return super.y\n }\n\n override set y(y: number) {\n if (this.y === y) return\n super.y = y\n this.#hitbox = undefined\n this.#hurtbox = undefined\n }\n}\n\n/**\n * center component fractions for synchronized 45 degree diagonal movement.\n * @arg dir positive if x and y are both increasing or decreasing, negative if\n * opposing, zero if either are static.\n */\nexport function diagonalize(xy: XY, dir: number): void {\n if (!dir) return\n xy.x = Math.floor(xy.x) + 0.5\n xy.y = Math.floor(xy.y) + 0.5 - (dir > 0 ? 0 : drawableEpsilon)\n}\n\n/** truncate to nearest drawable quantum. */\nexport function truncDrawableEpsilon(x: number): number {\n return Math.trunc(x / drawableEpsilon) * drawableEpsilon\n}\n", "import {Layer} from '../graphics/layer.ts'\nimport {truncDrawableEpsilon} from '../graphics/sprite.ts'\nimport type {Input, Point} from '../input/input.ts'\nimport type {Secs} from '../types/time.ts'\nimport type {Void} from '../void.ts'\nimport type {Sys, SysEnt} from './sys.ts'\n\n// to-do: i do pass ent data here. maybe I should do that for mem pool as SpritePool(i).\n\n/**\n * writes to sprite XYZ and tag, invalid.\n *\n * update this ent first. always prefer testing against cursor, not input, in\n * other ents. the cursor may be moved by keyboard and has a hitbox.\n */\nexport type CursorEnt = SysEnt<CursorSys>\n\nexport class CursorSys implements Sys {\n readonly query = 'cursor & sprite'\n\n update(ent: CursorEnt, v: Void): void {\n if (v.input.point?.invalid) onPoint(ent, v.input.point)\n\n // assume the sprite dimensions don't vary between point and pick. always\n // update in case cam invalidates while keyboard is temporarily off.\n updateBounds(ent, v)\n\n if (\n ent.cursor.keyboard &&\n (v.input.dir.x ||\n v.input.dir.y ||\n (!v.input.point && v.input.isAnyStarted('A')))\n )\n onKey(ent, v.input, v.tick.s)\n\n if (ent.cursor.pick)\n ent.sprite.tag = v.input.isOn('A') ? ent.cursor.pick : ent.cursor.point\n }\n}\n\n/** @internal */\nexport function onKey(ent: CursorEnt, input: Input, tick: Secs): void {\n const len = truncDrawableEpsilon(ent.cursor.keyboard * tick)\n\n if (input.isAnyOnStart('U', 'D', 'L', 'R') && input.dir.x && input.dir.y)\n ent.sprite.diagonalize(input.dir)\n\n if (input.dir.x)\n ent.sprite.x = Math.min(\n ent.cursor.bounds.x + ent.cursor.bounds.w,\n Math.max(ent.cursor.bounds.x, ent.sprite.x + input.dir.x * len)\n )\n if (input.dir.y)\n ent.sprite.y = Math.min(\n ent.cursor.bounds.y + ent.cursor.bounds.h,\n Math.max(ent.cursor.bounds.y, ent.sprite.y + input.dir.y * len)\n )\n ent.sprite.z = Layer.Top\n ent.sprite.visible = true\n ent.invalid = true\n}\n\n/** @internal */\nexport function onPoint(\n ent: CursorEnt,\n point: Readonly<Pick<Point, 'local' | 'click' | 'type'>>\n): void {\n ent.sprite.x = point.local.x\n ent.sprite.y = point.local.y\n ent.sprite.z = Layer.Top\n ent.sprite.visible = point.type === 'Mouse'\n ent.invalid = true\n}\n\nfunction updateBounds(ent: CursorEnt, v: Void): void {\n if (!v.cam.invalid) return\n ent.cursor.bounds.x = -ent.sprite.w\n ent.cursor.bounds.y = -ent.sprite.h\n ent.cursor.bounds.w = v.cam.w + ent.sprite.w\n ent.cursor.bounds.h = v.cam.h + ent.sprite.h\n}\n", "/**\n * proxy for debug CSV query param with case-insensitive keys. when a key\n * exists, the value is as specified or `'true'` if no value. most void values\n * default to `'true'` when the `debug` param is empty or `'void'` is set (eg,\n * `localhost:1234?debug` or `localhost:1234?debug=void,foo=bar`). all values\n * default to true when `'all'` is set. extend interface for additional types.\n * doesn't handle multiple values like `localhost:1234?debug=a=1,b=2&debug=b=3`.\n */\nexport interface Debug {\n cam?: string\n input?: string\n /** debug render invalidations. */\n invalid?: string\n mem?: string\n render?: 'always' | string\n}\n\nexport const debug: Readonly<Debug> | undefined = Debug(\n globalThis.location?.href\n)\n\n/** @internal */\nexport function Debug(url: string | undefined): Debug | undefined {\n if (!url) return\n const csv = [...new URL(url).searchParams].find(\n ([k]) => k.toLowerCase() === 'debug'\n )?.[1]\n if (csv == null) return\n const map = Object.fromEntries(\n csv\n .split(',') // split KV pairs.\n .filter(Boolean) // drop empties.\n .map(kv => kv.split('=')) // split each pair.\n )\n\n const target: {[k: string]: string} = {}\n for (const k in map) target[k.toLowerCase()] = map[k] || 'true'\n\n const voidKeyset: Required<Omit<Debug, 'invalid'>> = {\n cam: '',\n input: '',\n mem: '',\n render: ''\n }\n\n return new Proxy<{[k: string]: string}>(target, {\n get(target, k): string | undefined {\n if (typeof k !== 'string') return target[k as unknown as string]\n k = k.toLowerCase()\n if (target[k]) return target[k]\n if (!csv || 'all' in map || (k in voidKeyset && 'void' in map))\n return 'true'\n }\n })\n}\n", "import {debug} from '../utils/debug.ts'\nimport type {Void} from '../void.ts'\nimport type {Sys, SysEnt} from './sys.ts'\n\nexport type DebutInputEnt = SysEnt<DebutInputSys>\n\nexport class DebutInputSys implements Sys {\n readonly query = 'debugInput'\n\n update(_ent: DebutInputEnt, v: Void): void {\n if (!debug?.input) return\n\n if (v.input.started) {\n const on = !!v.input.on.length\n if (on) console.debug(`[input] buttons on: ${v.input.on.join(' ')}.`)\n else console.debug(`[input] buttons off.`)\n const combo = v.input.combo\n if (combo.length > 1 && on)\n console.debug(\n `[input] combo: ${combo.map(set => set.join('+')).join(' ')}.`\n )\n }\n if (v.input.point?.invalid && v.input.point?.click && !v.input.point.pinch)\n console.debug(\n `[input] ${v.input.point.drag.on ? 'drag' : 'click'} xy: ${v.input.point.x} ${v.input.point.y}.`\n )\n if (v.input.point?.pinch)\n console.debug(\n `[input] pinch xy: ${v.input.point.pinch.xy.x} ${v.input.point.pinch.xy.y}.`\n )\n if (v.input.wheel)\n console.debug(\n `[input] wheel xy: ${v.input.wheel.delta.xy.x} ${v.input.wheel.delta.xy.y}.`\n )\n }\n}\n", "import type {Ent} from './ent.ts'\n\n/** map Query to a required subset of Ent. */\nexport type QueryEnt<Query> = Ent & ExactQueryEnt<Required<Ent>, Query>\n\n/** map Query to a subset of Ent. */\ntype ExactQueryEnt<Ent, Query> = Query extends keyof Ent\n ? {[Key in Query]: Ent[Query]}\n : Query extends `!${infer Key extends keyof Ent & string}`\n ? {[K in Key]?: never}\n : Query extends `${infer Key extends keyof Ent & string} & ${infer Rest}`\n ? {[K in Key]: Ent[K & keyof Ent]} & ExactQueryEnt<Ent, Rest>\n : Query extends `!${infer Key extends keyof Ent & string} & ${infer Rest}`\n ? {[K in Key]?: never} & ExactQueryEnt<Ent, Rest>\n : Query extends `${infer Key extends keyof Ent & string} | ${infer Rest}`\n ? {[K in Key]: Ent[K & keyof Ent]} | ExactQueryEnt<Ent, Rest>\n : Query extends `!${infer Key extends keyof Ent & string} | ${infer Rest}`\n ? {[K in Key]?: never} | ExactQueryEnt<Ent, Rest>\n : never\n/**\n * Query if valid, never otherwise. query is of the form\n * `[!]<key>[ <& or |><query>]`. eg, `'a & b | !a & c'`. no grouping is\n * permitted.\n */\nexport type EQL<Ent, Query> = Query extends `${'!' | ''}${keyof Ent & string}`\n ? Query\n : Query extends `${infer Term extends `${'!' | ''}${keyof Ent & string}`} & ${infer Rest}`\n ? `${Term} & ${EQL<Ent, Rest>}`\n : Query extends `${infer Term extends `${'!' | ''}${keyof Ent & string}`} | ${infer Rest}`\n ? `${Term} | ${EQL<Ent, Rest>}`\n : never\n\nexport function parseQuerySet<const Query>(query: EQL<Ent, Query>): string[][] {\n return query\n .split(' | ')\n .sort(compareEn)\n .map(and => and.split(' & ').sort(compareEn))\n}\n\nfunction compareEn(l: string, r: string): number {\n return l.localeCompare(r, 'en')\n}\n", "import type {Sys, SysEnt} from './sys.ts'\n\nexport type FPSEnt = SysEnt<FPSSys>\n\nexport class FPSSys implements Sys {\n readonly query = 'fps & text'\n\n update(ent: FPSEnt): void {\n const now = performance.now()\n if (now - ent.fps.next.created >= 1000) {\n ent.fps.prevFrames = ent.fps.next.frames\n ent.fps.next = {created: now, frames: 0}\n }\n ent.fps.next.frames++\n ent.text = ent.fps.prevFrames.toString().padStart(3, ' ')\n ent.invalid = true\n }\n}\n", "import {\n type Border,\n borderAssign,\n borderEq,\n boxAssign,\n type CompassDir,\n type XY,\n xyAssign,\n xyEq\n} from '../types/geo.ts'\nimport type {Void} from '../void.ts'\nimport type {Sys, SysEnt} from './sys.ts'\n\nexport type HUDEnt = SysEnt<HUDSys>\n\n/** reads invalid, hud, sprite WH and z; writes invalid, sprite XY, WH. */\nexport class HUDSys implements Sys {\n readonly query = 'hud & sprite'\n\n update(ent: HUDEnt, v: Void): void {\n if (!ent.invalid && !v.cam.invalid) return\n const follow = v.cam.follow(\n ent.sprite,\n ent.sprite.z,\n ent.hud.origin,\n ent.hud\n )\n boxAssign(ent.sprite, follow)\n ent.invalid = true // to-do: unclear if having wrappers for uniformly like\n // textSetText() is worth it.\n }\n}\n\nexport function hudSetFill(\n ent: HUDEnt,\n fill: 'X' | 'Y' | 'XY' | undefined\n): void {\n if (ent.hud.fill === fill) return\n ent.hud.fill = fill\n ent.invalid = true\n}\n\nexport function hudSetMargin(ent: HUDEnt, margin: Readonly<Border>): void {\n if (borderEq(ent.hud.margin, margin)) return\n borderAssign(ent.hud.margin, margin)\n ent.invalid = true\n}\n\nexport function hudSetModulo(ent: HUDEnt, modulo: Readonly<XY>): void {\n if (xyEq(ent.hud.modulo, modulo)) return\n xyAssign(ent.hud.modulo, modulo)\n ent.invalid = true\n}\n\nexport function hudSetOrigin(ent: HUDEnt, origin: CompassDir): void {\n if (ent.hud.origin === origin) return\n ent.hud.origin = origin\n ent.invalid = true\n}\n", "import type {XY} from '../types/geo.ts'\nimport type {Sys, SysEnt} from './sys.ts'\n\nexport type NinePatchEnt = SysEnt<NinePatchSys>\n\n/** reads invalid, sprite XY and WH; writes ninePatch, invalid. */\nexport class NinePatchSys implements Sys {\n readonly query = 'ninePatch & sprite'\n\n free(ent: NinePatchEnt): void {\n ninePatchFree(ent)\n }\n\n update(ent: NinePatchEnt): void {\n if (!ent.invalid) return\n const start = getStart(ent)\n setXYStart(ent, start)\n setWH(ent)\n setXYEnd(ent, start)\n }\n}\n\nexport function ninePatchFree(ent: NinePatchEnt): void {\n ent.ninePatch.patch.w?.free()\n ent.ninePatch.patch.nw?.free()\n ent.ninePatch.patch.n?.free()\n ent.ninePatch.patch.ne?.free()\n ent.ninePatch.patch.e?.free()\n ent.ninePatch.patch.se?.free()\n ent.ninePatch.patch.s?.free()\n ent.ninePatch.patch.sw?.free()\n ent.ninePatch.patch.center?.free()\n ent.invalid = true\n // to-do: how to update zoo synchronously to remove the component and not run update()?\n}\n\nfunction getStart(ent: Readonly<NinePatchEnt>): XY {\n const {sprite, ninePatch} = ent\n return {x: sprite.x + ninePatch.pad.w, y: sprite.y + ninePatch.pad.n}\n}\n\n/** @internal */\nexport function setWH(ent: NinePatchEnt): void {\n const {border, pad, patch} = ent.ninePatch\n\n const w = ent.sprite.w - border.w - border.e - pad.w - pad.e\n const h = ent.sprite.h - border.n - border.s - pad.n - pad.s\n if (patch.n) patch.n.w = w\n if (patch.s) patch.s.w = w\n if (patch.w) patch.w.h = h\n if (patch.e) patch.e.h = h\n if (patch.center) {\n patch.center.w = w\n patch.center.h = h\n }\n}\n\n/** @internal */\nexport function setXYEnd(\n ent: Readonly<NinePatchEnt>,\n start: Readonly<XY>\n): void {\n const {patch, pad, border} = ent.ninePatch\n const end = {\n x: ent.sprite.x + ent.sprite.w - border.e - pad.e,\n y: ent.sprite.y + ent.sprite.h - border.s - pad.s\n }\n if (patch.ne) {\n patch.ne.x = end.x\n patch.ne.y = start.y\n }\n if (patch.e) {\n patch.e.x = end.x\n patch.e.y = start.y + border.n\n }\n if (patch.se) {\n patch.se.x = end.x\n patch.se.y = end.y\n }\n if (patch.s) {\n patch.s.x = start.x + border.w\n patch.s.y = end.y\n }\n if (patch.sw) {\n patch.sw.x = start.x\n patch.sw.y = end.y\n }\n}\n\n/** @internal */\nexport function setXYStart(ent: NinePatchEnt, start: Readonly<XY>): void {\n const {border, patch} = ent.ninePatch\n\n if (patch.nw) {\n patch.nw.x = start.x\n patch.nw.y = start.y\n }\n if (patch.w) {\n patch.w.x = start.x\n patch.w.y = start.y + border.n\n }\n if (patch.n) {\n patch.n.x = start.x + border.w\n patch.n.y = start.y\n }\n if (patch.center) {\n patch.center.x = start.x + border.w\n patch.center.y = start.y + border.n\n }\n}\n", "import type {Sys, SysEnt} from './sys.ts'\n\n/** writes to invalid. */\nexport type OverrideEnt = SysEnt<OverrideSys>\n\nexport class OverrideSys implements Sys {\n readonly query = 'override'\n\n update(ent: OverrideEnt): void {\n if (ent.override.invalid != null) ent.invalid = ent.override.invalid\n }\n}\n", "import type {Sys, SysEnt} from './sys.ts'\n\nexport type SpriteEnt = SysEnt<SpriteSys>\n\n/** writes sprite, invalid. */\nexport class SpriteSys implements Sys {\n readonly query = 'sprite'\n\n free(ent: SpriteEnt): void {\n ent.sprite.free()\n // ent.sprite = undefined to-do: who does this <-- zoo?\n ent.invalid = true\n }\n}\n", "import type {Font} from 'mem-font'\nimport type {Tag} from '../graphics/atlas.ts'\n\nexport function fontCharToTag(font: Readonly<Font>, ch: string): Tag {\n let pt = ch.codePointAt(0)\n if (pt == null || pt > 0xff) pt = 63 // ?\n return `${font.id}--${pt.toString(16).padStart(2, '0')}`\n}\n\nexport function fontCharH(font: Readonly<Font>, ch: string): number {\n return font.cellH - (font.descends[ch] ? 0 : font.baseline)\n}\n\n/** @arg r undefined means end of line. */\nexport function fontKerning(\n font: Readonly<Font>,\n l: string,\n r: string | undefined\n): number {\n if (l === '\\n' || r == null || r === '\\n') return font.endOfLineKerning\n if (font.kerning[l + r] != null) return font.kerning[l + r]!\n if (/^\\s?$/.test(l) || /^\\s?$/.test(r)) return font.defaultWhitespaceKerning\n return font.defaultKerning\n}\n\nexport function fontCharW(font: Readonly<Font>, ch: string): number {\n return font.charW[ch] ?? font.defaultCharW\n}\n", "import type {Font} from 'mem-font'\nimport type {Box, XY} from '../types/geo.ts'\nimport {fontCharH, fontCharW, fontKerning} from './font.ts'\n\nexport type TextLayout = {\n /**\n * the length of this array matches the string length. undefines are\n * whitespace.\n */\n chars: (Box | undefined)[]\n /** the offset in pixels. */\n cursor: XY\n w: number\n h: number\n /** the height without without leading and only actually used height of characters. */\n trimmedH: number\n}\n\nexport type TextLayoutOpts = {\n font: Font\n maxW?: number\n scale?: number\n start?: XY\n text: string\n}\n\n// to-do: refactor so inputs and outputs of each function is a TextLayout.\ntype IntermediateTextLayout = Omit<TextLayout, 'h' | 'trimmedH'> & {\n trimmedLineH: number\n}\n\nexport function layoutText(opts: Readonly<TextLayoutOpts>): TextLayout {\n const chars = []\n const scale = opts.scale ?? 1\n const start: Readonly<XY> = opts.start ?? {x: 0, y: 0}\n const maxW = opts.maxW ?? Infinity\n let cursor = {x: start.x, y: start.y}\n let w = 0\n let trimmedLineH = 0\n while (chars.length < opts.text.length) {\n const i = chars.length\n const ch = opts.text[i]!\n let layout\n if (ch === '\\n')\n layout = layoutNewline(opts.font, cursor, start.x, scale, w)\n else if (/^\\s*$/.test(ch))\n layout = layoutSpace(\n opts.font,\n cursor,\n maxW,\n tracking(opts.font, ch, opts.text[i + 1], scale),\n start.x,\n scale,\n trimmedLineH,\n ch,\n w\n )\n else {\n layout = layoutWord(\n opts.font,\n cursor,\n maxW,\n opts.text,\n i,\n start.x,\n scale,\n trimmedLineH,\n w\n )\n if (\n cursor.x > 0 &&\n layout.cursor.y === nextLine(opts.font, start.x, cursor.y, scale).y\n ) {\n const wordW = maxW - cursor.x + layout.cursor.x\n if (wordW <= maxW) {\n // word can fit on one line if cursor is reset to the start of line.\n cursor = nextLine(opts.font, start.x, cursor.y, scale)\n layout = layoutWord(\n opts.font,\n cursor,\n maxW,\n opts.text,\n i,\n start.x,\n scale,\n trimmedLineH,\n w\n )\n }\n }\n }\n chars.push(...layout.chars)\n cursor.x = layout.cursor.x\n cursor.y = layout.cursor.y\n w = layout.w\n trimmedLineH = layout.trimmedLineH\n }\n return {\n chars,\n cursor,\n w,\n h: nextLine(opts.font, cursor.x, cursor.y, scale).y - start.y,\n trimmedH: cursor.y + trimmedLineH * scale - start.y\n }\n}\n\n/** @internal */\nexport function layoutWord(\n font: Readonly<Font>,\n cursor: Readonly<XY>,\n maxW: number,\n word: string,\n index: number,\n startX: number,\n scale: number,\n trimmedLineH: number,\n w: number\n): IntermediateTextLayout {\n const chars = []\n let {x, y} = cursor\n for (; ; index++) {\n const ch = word[index]\n if (!ch || /^\\s*$/.test(ch)) break\n const chH = fontCharH(font, ch)\n\n const span = tracking(font, ch, word[index + 1], scale)\n const next = x > startX && x + span > startX + maxW\n if (next) ({x, y} = nextLine(font, startX, y, scale))\n trimmedLineH = next ? chH : Math.max(trimmedLineH, chH)\n\n // width is not span since, with kerning, that may exceed the actual\n // width of the character's sprite. eg, if w has the maximal character width\n // of five pixels and a one pixel kerning for a given pair of characters, it\n // will have a span of six pixels which is greater than the maximal five\n // pixel sprite that can be rendered.\n chars.push({x, y, w: fontCharW(font, ch), h: font.cellH})\n x += span\n w = Math.max(w, x - startX)\n }\n return {chars, cursor: {x, y}, trimmedLineH, w}\n}\n\nfunction nextLine(\n font: Readonly<Font>,\n startX: number,\n curY: number,\n scale: number\n): XY {\n return {x: startX, y: curY + font.lineH * scale}\n}\n\nfunction layoutNewline(\n font: Readonly<Font>,\n cursor: Readonly<XY>,\n startX: number,\n scale: number,\n w: number\n): IntermediateTextLayout {\n const nextCursor = nextLine(font, startX, cursor.y, scale)\n return {\n chars: [undefined],\n cursor: nextCursor,\n trimmedLineH: 0,\n w: Math.max(w, cursor.x - startX)\n }\n}\n\n/**\n * @arg span the distance in pixels from the start of the current character to\n * the start of the next including scale.\n */\nfunction layoutSpace(\n font: Readonly<Font>,\n cursor: Readonly<XY>,\n maxW: number,\n span: number,\n startX: number,\n scale: number,\n trimmmedLineH: number,\n ch: string,\n w: number\n): IntermediateTextLayout {\n const nextCursor =\n cursor.x > startX && cursor.x + span >= maxW\n ? nextLine(font, startX, cursor.y, scale)\n : {x: cursor.x + span, y: cursor.y}\n const chH = fontCharH(font, ch)\n return {\n chars: [undefined],\n cursor: nextCursor,\n trimmedLineH:\n cursor.y === nextCursor.y ? Math.max(trimmmedLineH, chH) : chH,\n w: Math.max(w, cursor.x - startX)\n }\n}\n\n/**\n * the distance in pixels from the start of l to the start of r including scale.\n */\nfunction tracking(\n font: Readonly<Font>,\n l: string,\n r: string | undefined,\n scale: number\n): number {\n return scale * (fontCharW(font, l) + fontKerning(font, l, r))\n}\n", "import {memProp5x6} from 'mem-font'\nimport {fontCharToTag} from '../text/font.ts'\nimport {layoutText} from '../text/text-layout.ts'\nimport type {Void} from '../void.ts'\nimport type {QueryEnt} from './ent-query.ts'\nimport type {Sys, SysEnt} from './sys.ts'\n\nexport type TextEnt = QueryEnt<'text'>\nexport type TextWHEnt = SysEnt<TextWHSys>\nexport type TextXYEnt = SysEnt<TextXYSys>\n\n/** reads sprite text; writes sprite WH and invalid. */\nexport class TextWHSys implements Sys {\n readonly query = 'sprite & text & textWH'\n\n update(ent: TextWHEnt): void {\n if (!ent.invalid) return\n textSetWH(ent)\n }\n}\n\n/** reads sprite XYZ, text, text WH; writes invalid. */\nexport class TextXYSys implements Sys {\n readonly query = 'sprite & text & textWH & textXY'\n\n free(ent: TextXYEnt): void {\n for (const sprite of ent.textXY.chars) sprite.free()\n ent.textXY.chars.length = 0\n ent.invalid = true\n }\n\n update(ent: TextXYEnt, v: Void): void {\n if (!ent.invalid) return\n textSetXY(ent, v)\n }\n}\n\nexport function textSetWH(ent: TextWHEnt): void {\n const layout = layoutText({\n font: memProp5x6,\n maxW: ent.textWH.maxW,\n scale: ent.textWH.scale,\n start: {x: 0, y: 0}, // start at 0, 0 to avoid relayout in textSetXY().\n text: ent.text\n })\n ent.textWH.layout = layout\n let w = layout.w + ent.textWH.pad.w + ent.textWH.pad.e\n let h =\n (ent.textWH.trim === 'Leading'\n ? layout.h - memProp5x6.leading * ent.textWH.scale\n : ent.textWH.trim === 'Descender'\n ? layout.trimmedH\n : layout.h) +\n ent.textWH.pad.n +\n ent.textWH.pad.s\n if (ent.ninePatch) {\n w +=\n ent.ninePatch.border.w +\n ent.ninePatch.border.e +\n ent.ninePatch.pad.w +\n ent.ninePatch.pad.e\n h +=\n ent.ninePatch.border.n +\n ent.ninePatch.border.s +\n ent.ninePatch.pad.n +\n ent.ninePatch.pad.s\n }\n ent.sprite.w = w\n ent.sprite.h = h\n ent.invalid = true\n}\n\n// to-do: don't relayout if textXY.xy === sprite.xy\n// can cause a double layout due to ent.invalid. this seems worth caching with the render state so that it can keep track of its own state vs all of the ent.\nexport function textSetXY(ent: TextXYEnt, v: Void): void {\n let len = 0\n const layout = ent.textWH.layout\n for (const [i, char] of layout.chars.entries()) {\n if (char == null) continue\n const sprite = (ent.textXY.chars[len] ??= v.alloc())\n sprite.x =\n ent.sprite.x +\n char.x +\n ent.textWH.pad.w +\n (ent.ninePatch ? ent.ninePatch.border.w + ent.ninePatch.pad.w : 0)\n sprite.y =\n ent.sprite.y +\n char.y +\n ent.textWH.pad.n +\n (ent.ninePatch ? ent.ninePatch.border.n + ent.ninePatch.pad.n : 0)\n sprite.z = ent.textXY.z\n sprite.tag = fontCharToTag(memProp5x6, ent.text[i]!)\n sprite.stretch = true\n sprite.w *= ent.textWH.scale\n sprite.h *= ent.textWH.scale\n len++\n }\n while (ent.textXY.chars.length > len) ent.textXY.chars.pop()!.free()\n ent.invalid = true\n}\n\n// to-do: why doesn't sprite use a helper like this?\nexport function textSetText(ent: TextEnt, str: string): void {\n if (str === ent.text) return\n ent.text = str\n ent.invalid = true\n}\n\n// to-do: can't decide on global names like SetMaxW or Sys. single char??\n// export function labelSetMaxW(ent: TextUIEnt, w: number): void {\n// if (w === ent.textUI.maxW) return\n// ent.textUI.maxW = w\n// ent.invalid = true\n// }\n\n// export function labelSetScale(ent: TextUIEnt, scale: number): void {\n// if (scale === ent.textUI.scale) return\n// ent.textUI.scale = scale\n// ent.invalid = true\n// }\n\n// export function labelGetCenterWithin(\n// ent: Readonly<TextUIEnt>,\n// box: Readonly<Box>\n// ): XY {\n// return {\n// x: box.x + box.w / 2 - ent.sprite.w / 2,\n// y: box.y + box.h / 2 - ent.sprite.h / 2\n// }\n// }\n", "import {debug} from '../utils/debug.ts'\nimport type {Void} from '../void.ts'\nimport {ButtonSys} from './button.ts'\nimport {type CursorEnt, CursorSys} from './cursor.ts'\nimport {DebutInputSys} from './debug-input.ts'\nimport type {Ent} from './ent.ts'\nimport {type EQL, parseQuerySet, type QueryEnt} from './ent-query.ts'\nimport {FPSSys} from './fps.ts'\nimport {HUDSys} from './hud.ts'\nimport type {LoaderEnt} from './loader.ts'\nimport {NinePatchSys} from './nine-patch.ts'\nimport {OverrideSys} from './override.ts'\nimport {SpriteSys} from './sprite.ts'\nimport type {Sys} from './sys.ts'\nimport {TextWHSys, TextXYSys} from './text.ts'\n\n/** ents are updated in insertion order. */\nexport class Zoo {\n #cursor: CursorEnt | undefined\n #loader!: LoaderEnt\n readonly #ents: Set<Ent> = new Set()\n #systems: {[component in keyof Ent]?: Sys} = {}\n #invalid: boolean = false\n\n add(...ents: readonly Ent[]): void {\n for (const ent of ents) {\n if (debug) this.#validateQueries(ent)\n this.#ents.add(ent)\n if (ent.cursor) this.#cursor = ent as CursorEnt\n else if (ent.loader) this.#loader = ent as LoaderEnt\n }\n }\n\n addDefaultSystems(): void {\n this.addSystem({\n button: new ButtonSys(),\n cursor: new CursorSys(),\n debugInput: new DebutInputSys(),\n fps: new FPSSys(),\n hud: new HUDSys(),\n ninePatch: new NinePatchSys(),\n override: new OverrideSys(),\n sprite: new SpriteSys(),\n textWH: new TextWHSys(),\n textXY: new TextXYSys()\n })\n }\n\n addSystem(systems: {readonly [component in keyof Ent]?: Sys}): void {\n Object.assign(this.#systems, systems)\n }\n\n clear(): void {\n this.#cursor = undefined\n this.#ents.clear() // to-do: run free on all systems. don't clear loader.\n this.#systems = {}\n }\n\n get cursor(): CursorEnt | undefined {\n return this.#cursor\n }\n\n get loader(): LoaderEnt {\n return this.#loader\n }\n\n get invalid(): boolean {\n return this.#invalid\n }\n\n *query<const Query>(\n query: EQL<Ent, Query>\n ): IterableIterator<QueryEnt<Query>> {\n const querySet = parseQuerySet(query)\n for (const ent of this.#ents)\n if (queryEnt(ent, querySet)) yield ent as QueryEnt<Query>\n }\n\n remove(...ents: readonly Readonly<Ent>[]): void {\n for (const ent of ents) {\n if (ent !== this.#loader) this.#ents.delete(ent)\n else if (ent === this.#cursor) this.#cursor = undefined\n }\n }\n\n findById<T extends Ent>(id: string): T | undefined {\n for (const ent of this.#ents) if (ent.id === id) return ent as T\n }\n\n update(v: Void): void {\n this.#invalid = false\n for (const ent of this.#ents) {\n for (const k in ent)\n this.#systems[k as keyof Ent]?.update?.(ent as never, v)\n if (ent.invalid && debug?.invalid)\n console.debug('[invalid] ent update invalid', ent)\n this.#invalid ||= !!ent.invalid\n ent.invalid = false\n }\n }\n\n #validateQueries(ent: Ent): void {\n for (const k in ent) {\n const sys = this.#systems[k as keyof Ent]\n if (!sys) continue\n sys.querySet ??= parseQuerySet(sys.query as keyof Ent)\n if (!queryEnt(ent, sys.querySet))\n throw Error(\n `ent ${ent.id ?? ent.name ?? '?'} does not satisfy query: ${sys.query}`\n )\n }\n }\n}\n\nfunction queryEnt<Ent>(\n ent: Readonly<Ent>,\n query: readonly (readonly string[])[]\n): boolean {\n return query.some(keys =>\n keys.every(k => (k[0] === '!' ? !(k.slice(1) in ent) : k in ent))\n )\n}\n", "import type {AtlasJSON} from '../types/game-config.ts'\nimport {type Anim, type Atlas, animCels, type Tag} from './atlas.ts'\n\nexport function parseAtlas(json: Readonly<AtlasJSON>): Atlas {\n return {\n anim: json.anim,\n celXYWH: parseCelXYWH(json),\n tags: Object.keys(json.anim) as Tag[]\n }\n}\n\nfunction parseCelXYWH(json: Readonly<AtlasJSON>): number[] {\n const cels = []\n let i = 0\n for (const anim of Object.values(json.anim)) {\n cels.push(...parseXYWH(anim, json.celXY, i))\n i += anim.cels * 2\n }\n return cels\n}\n\n/** @internal */\nexport function parseXYWH(\n anim: Readonly<Anim>,\n celXY: readonly number[],\n i: number\n): number[] {\n const xywh = []\n for (let ii = 0; ii < animCels; ii++) {\n const iii = i + 2 * (ii % anim.cels)\n xywh.push(celXY[iii]!, celXY[iii + 1]!, anim.w, anim.h)\n }\n return xywh\n}\n", "import {\n type Border,\n type Box,\n boxHits,\n type CompassDir,\n type WH,\n type XY\n} from '../types/geo.ts'\nimport {debug} from '../utils/debug.ts'\nimport {isUILayer, type Layer} from './layer.ts'\nimport type {RenderMode} from './render-mode.ts'\nimport {diagonalize} from './sprite.ts'\n\nexport type LevelClientLocalXY = {\n /** position relative canvas top-left (in DPI scale). */\n client: XY\n /**\n * position relative canvas top-left in level scale (like level xy but no cam\n * offset) within cam.\n */\n local: XY\n /** level x-coord within cam. */\n x: number\n /** level y-coord within cam. */\n y: number\n}\n\n/** @internal */\nexport type Canvas = {\n width: number\n height: number\n style: {width: string; height: string}\n parentElement: {clientWidth: number; clientHeight: number} | null\n}\n\n/** given a min WH and scale, size the camera to the max WH. */\nexport class Cam {\n #devicePixelRatio: number = 0\n #h: number = 1\n #invalid: boolean = true\n #minScale: number = 1\n readonly #minWH: WH = {w: Infinity, h: Infinity}\n #mode: RenderMode = 'Int'\n #scale: number = 1\n #w: number = 1\n readonly #whClient: WH = {w: 1, h: 1}\n #x: number = 0\n #y: number = 0\n #zoomOut: number = 0\n\n center(xy: Readonly<XY>): void {\n this.x = Math.floor(xy.x - this.w / 2)\n this.y = Math.floor(xy.y - this.h / 2)\n }\n\n /** position in fractional level coordinates. */\n clientToXY(client: Readonly<XY>): XY {\n const local = this.clientToXYLocal(client)\n return {x: this.#x + local.x, y: this.#y + local.y}\n }\n\n /**\n * position relative canvas top-left in level scale (like level xy but no cam\n * offset). often used for UI that is fixed within the cam.\n */\n clientToXYLocal(client: Readonly<XY>): XY {\n return {\n x: (client.x / this.#whClient.w) * this.#w,\n y: (client.y / this.#whClient.h) * this.#h\n }\n }\n\n diagonalize(dir: Readonly<XY>): void {\n diagonalize(this, dir.x * dir.y)\n }\n\n follow(\n wh: Readonly<WH>,\n z: Layer,\n origin: CompassDir,\n opts?: {\n readonly fill?: 'X' | 'Y' | 'XY'\n readonly margin?: Partial<Readonly<Border>>\n readonly modulo?: Partial<Readonly<XY>>\n }\n ): Box {\n let x = isUILayer(z) ? 0 : Math.floor(this.x)\n switch (origin) {\n case 'SW':\n case 'W':\n case 'NW':\n x += opts?.margin?.w ?? 0\n break\n case 'SE':\n case 'E':\n case 'NE':\n x += this.w - (wh.w + (opts?.margin?.e ?? 0))\n break\n case 'N':\n case 'S':\n case 'Center':\n x += Math.trunc(this.w / 2) - Math.trunc(wh.w / 2)\n break\n }\n x -= x % ((opts?.modulo?.x ?? x) || 1)\n\n let y = isUILayer(z) ? 0 : Math.floor(this.y)\n switch (origin) {\n case 'N':\n case 'NE':\n case 'NW':\n y += opts?.margin?.n ?? 0\n break\n case 'SE':\n case 'S':\n case 'SW':\n y += this.h - (wh.h + (opts?.margin?.s ?? 0))\n break\n case 'E':\n case 'W':\n case 'Center':\n y += Math.trunc(this.h / 2) - Math.trunc(wh.h / 2)\n break\n }\n y -= y % ((opts?.modulo?.y ?? y) || 1)\n\n const w =\n opts?.fill === 'X' || opts?.fill === 'XY'\n ? this.w - (opts?.margin?.w ?? 0) - (opts?.margin?.e ?? 0)\n : wh.w\n const h =\n opts?.fill === 'Y' || opts?.fill === 'XY'\n ? this.h - (opts?.margin?.n ?? 0) - (opts?.margin?.s ?? 0)\n : wh.h\n\n return {x, y, w, h}\n }\n\n /** positive int in level px. */\n get h(): number {\n return this.#h\n }\n\n isVisible(box: Readonly<XY & Partial<WH>>): boolean {\n return boxHits(this, box)\n }\n\n /** true if cam moved or resized since last update. */\n get invalid(): boolean {\n return this.#invalid\n }\n\n /** positive int or fraction depending on mode. */\n get minScale(): number {\n return this.#minScale\n }\n\n set minScale(scale: number) {\n if (this.#scale === scale) return\n this.#scale = scale\n this.#invalidateWH()\n }\n\n /**\n * positive int or infinite min dimensions. set to\n * `{w: Infinity, h: Infinity}` to always use min scale.\n */\n get minWH(): Readonly<WH> {\n return this.#minWH\n }\n\n set minWH(wh: Readonly<WH>) {\n if (this.#minWH.w === wh.w && this.#minWH.h === wh.h) return\n this.#minWH.w = wh.w\n this.#minWH.h = wh.h\n this.#invalidateWH()\n }\n\n get mode(): RenderMode {\n return this.#mode\n }\n\n set mode(mode: RenderMode) {\n if (this.#mode === mode) return\n this.#mode = mode\n this.#invalidateWH()\n }\n\n get portrait(): boolean {\n return this.h > this.w\n }\n\n postupdate(): void {\n this.#invalid = false\n }\n\n /** positive int or fraction depending on mode. */\n get scale(): number {\n return this.#scale\n }\n\n toString(): string {\n return `Cam{(${this.x} ${this.y}) ${this.w}\u00D7${this.h}}`\n }\n\n /**\n * call after input processing but before ent processing. ents that move the\n * camera should be called immediately after update so that the invalid state\n * can be considered.\n */\n update(canvas: Canvas): void {\n if (!canvas.parentElement) throw Error('canvas has no parent')\n const {clientWidth, clientHeight} = canvas.parentElement\n\n this.#invalid ||=\n this.#whClient.w !== clientWidth ||\n this.#whClient.h !== clientHeight ||\n // doesn't seem like this should be necessary but it is when moving across\n // monitors.\n this.#devicePixelRatio !== devicePixelRatio\n if (!this.#invalid) return\n this.#devicePixelRatio = devicePixelRatio\n this.#whClient.w = clientWidth\n this.#whClient.h = clientHeight\n this.#invalidateWH()\n\n canvas.width = this.#w\n canvas.height = this.#h\n // ~parentW / parentH.\n canvas.style.width = `${(this.#w * this.#scale) / devicePixelRatio}px`\n canvas.style.height = `${(this.#h * this.#scale) / devicePixelRatio}px`\n }\n\n /** positive int in level px. */\n get w(): number {\n return this.#w\n }\n\n /**\n * positive int dimensions in client px of canvas (often\n * `canvas.parentElement.clientWidth/Height` since the canvas is resized)\n * which is assumed to be max WH.\n */\n get whClient(): Readonly<WH> {\n return this.#whClient\n }\n\n /** fractional. */\n get x(): number {\n return this.#x\n }\n\n set x(x: number) {\n this.#invalid ||= this.x !== x\n this.#x = x\n }\n\n /** fractional. */\n get y(): number {\n return this.#y\n }\n\n set y(y: number) {\n this.#invalid ||= this.y !== y\n this.#y = y\n }\n\n /** nonnegative int or fraction depending on mode. */\n get zoomOut(): number {\n return this.#zoomOut\n }\n\n set zoomOut(out: number) {\n out = Math.max(0, out)\n if (this.#zoomOut === out) return\n this.#zoomOut = out\n this.#invalidateWH()\n }\n\n #invalidateWH(): void {\n if (!this.#invalid && debug?.invalid) console.debug('[invalid] cam invalid')\n this.#invalid = true\n\n const phy = {\n w: this.#whClient.w * devicePixelRatio,\n h: this.#whClient.h * devicePixelRatio\n }\n\n const scale = Math.max(\n this.#minScale,\n Math.min(phy.w / this.#minWH.w, phy.h / this.#minWH.h) -\n (this.#mode === 'Int' ? Math.trunc(this.#zoomOut) : this.#zoomOut)\n )\n this.#scale = this.#mode === 'Int' ? Math.trunc(scale) : scale\n\n this.#w = Math.ceil(phy.w / this.#scale)\n this.#h = Math.ceil(phy.h / this.#scale)\n }\n}\n", "export class ContextMenu {\n enable: boolean = false\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n fn('contextmenu', this.#onContextMenu as EventListener)\n // disable long press vibration. nonpassive must be explicit.\n fn('touchstart', this.#onContextMenu as EventListener, {passive: false})\n return this\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #onContextMenu = (ev: PointerEvent | TouchEvent): void => {\n if (!ev.isTrusted || ev.metaKey || ev.altKey || ev.ctrlKey) return\n if (!this.enable) ev.preventDefault()\n }\n}\n", "export class Gamepad {\n bits: number = 0\n // to-do: support analog button values, expose connected status and vibration,\n // and distinct devices. would be nice if vibration could merge with\n // navigator.vibrate().\n readonly bitByAxis: {[axis: number]: [less: number, more: number]} = {}\n readonly bitByButton: {[btn: number]: number} = {}\n onEvent: () => void = () => {}\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n get connected(): boolean {\n return isSecureContext && navigator.getGamepads().filter(Boolean).length > 0\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n fn('gamepadconnected', this.onEvent)\n fn('gamepaddisconnected', this.onEvent)\n return this\n }\n\n reset(): void {\n this.bits = 0\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n update(): void {\n if (!isSecureContext) return\n for (const pad of navigator.getGamepads()) {\n for (const [index, axis] of pad?.axes.entries() ?? []) {\n const lessMore = this.bitByAxis[index]\n if (!lessMore) continue\n const bit = axis < 0 ? lessMore[0] : axis === 0 ? 0 : lessMore[1]\n this.bits |= Math.abs(axis) >= 0.5 ? bit : 0\n }\n for (const [index, btn] of pad?.buttons.entries() ?? []) {\n const bit = this.bitByButton[index]\n if (bit == null) continue\n this.bits |= btn.pressed ? bit : 0\n }\n }\n }\n}\n", "/** @internal */\nexport class Keyboard {\n /** KeyboardEvent.code to bit. */\n readonly bitByCode: {[code: string]: number} = {}\n invalid: boolean = false\n /** KeyboardEvent.code to state. Multiple keys may map to the same bit. */\n onEvent: () => void = () => {}\n #on: {[code: string]: boolean} = {}\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n get bits(): number {\n let bits = 0\n for (const k in this.bitByCode) bits |= this.#on[k] ? this.bitByCode[k]! : 0\n return bits\n }\n\n postupdate(): void {\n this.invalid = false\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n for (const ev of ['keydown', 'keyup']) fn(ev, this.#onKey as EventListener)\n return this\n }\n\n reset(): void {\n this.invalid = false\n this.#on = {}\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #onKey = (ev: KeyboardEvent): void => {\n if (!ev.isTrusted || this.bitByCode[ev.code] == null) return\n if (ev.type === 'keydown' && (ev.metaKey || ev.altKey || ev.ctrlKey)) return\n this.invalid = true\n this.#on[ev.code] = ev.type === 'keydown'\n ev.preventDefault()\n this.onEvent()\n }\n}\n", "import {\n type Box,\n type XY,\n xyAdd,\n xyDistance,\n xyMax,\n xyMin,\n xySub\n} from '../types/geo.ts'\n\nexport type PointType =\n (typeof pointTypeByPointerType)[keyof typeof pointTypeByPointerType]\n\nexport type PointEvent = {\n bits: number\n /** most recent click. */\n clickClient: XY | undefined\n drag: boolean\n ev: (typeof pointEvents)[number]\n id: number\n /**\n * cursors should only use the primary inputs to avoid flickering between\n * distant points. inputs may be only secondaries.\n */\n primary: boolean\n type: PointType | undefined\n xyClient: XY\n}\n\nconst pointTypeByPointerType = {\n mouse: 'Mouse',\n pen: 'Pen',\n touch: 'Touch'\n} as const\nconst pointEvents = [\n 'pointercancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup'\n] as const\n\n/** @internal */\nexport class Pointer {\n readonly bitByButton: {[btn: number]: number} = {}\n dragMinClient: number = 5\n invalid: boolean = false\n onEvent: () => void = () => {}\n /** primary may be on or off. */\n primary: Readonly<PointEvent> | undefined\n /**\n * secondaries are deleted when buttons are off. secondaries are only present\n * when primary is defined.\n */\n readonly secondary: {[id: number]: Readonly<PointEvent>} = {}\n /** nonnegative. */\n #pinchStartClient: XY | undefined\n readonly #target: Element\n\n constructor(target: Element) {\n this.#target = target\n }\n\n get boundsClient(): Box | undefined {\n if (!this.primary?.bits && !Object.keys(this.secondary).length) return\n let min = {x: Infinity, y: Infinity}\n let max = {x: -Infinity, y: -Infinity}\n for (const pt of [this.primary, ...Object.values(this.secondary)]) {\n if (!pt?.bits) continue\n min = xyMin(min, pt.xyClient)\n max = xyMax(max, pt.xyClient)\n }\n return {x: min.x, y: min.y, w: max.x - min.x, h: max.y - min.y}\n }\n\n get centerClient(): XY | undefined {\n const bounds = this.boundsClient\n if (!bounds) return this.primary?.xyClient\n return xyAdd(bounds, {x: bounds.w / 2, y: bounds.h / 2})\n }\n\n get locked(): boolean {\n return this.#target.ownerDocument.pointerLockElement === this.#target\n }\n\n get pinchClient(): XY | undefined {\n if (!this.#pinchStartClient) return\n const end = this.#newPinchClient\n return end ? xySub(end, this.#pinchStartClient) : undefined\n }\n\n postupdate(): void {\n this.invalid = false\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n for (const ev of pointEvents) fn(ev, this.#onInput as EventListener)\n return this\n }\n\n reset(): void {\n this.invalid = false\n this.primary = undefined\n for (const pt in this.secondary) delete this.secondary[pt]\n this.#pinchStartClient = undefined\n }\n\n update(): void {\n const on =\n (this.primary?.bits ? 1 : 0) + Object.values(this.secondary).length\n if (on < 2 || !this.#pinchStartClient)\n this.#pinchStartClient = this.#newPinchClient\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #evButtonsToBits(btns: number): number {\n let bits = 0\n for (let btn = 1; btn <= btns; btn <<= 1)\n if ((btn & btns) === btn) bits |= this.bitByButton[btn] ?? 0\n return bits\n }\n\n #onInput = (ev: PointerEvent): void => {\n if (!ev.isTrusted) return\n\n this.invalid = true\n const bits =\n ev.metaKey || ev.altKey || ev.ctrlKey\n ? 0\n : this.#evButtonsToBits(ev.buttons)\n const locked = this.locked\n if (bits && ev.type === 'pointerdown') {\n ev.preventDefault()\n if (!locked)\n try {\n this.#target.setPointerCapture(ev.pointerId)\n } catch {}\n }\n\n const prevPt = ev.isPrimary ? this.primary : this.secondary[ev.pointerId]\n\n let xyClient\n if (locked) {\n // `devicePixelRatio` seems to be incorrect. when zoom is 500%, DPR is 10.\n // in full screen, this would give the actual zoom allowing `movementX`\n // to match the `offsetX` delta:\n // const scale = document.documentElement.clientWidth / screen.availWidth\n // console.log(\n // `screenDelta=${ev.screenX - prevScreen.x} movementX=${ev.movementX} movementXScaled=${ev.movementX * scale} offsetDelta=${ev.offsetX - prevOffset.x} clientDelta=${ev.clientX - prevClient.x}`\n // )\n // probably wouldn't work across devices though.\n const scale = 1 / devicePixelRatio\n\n // to-do: this should allow offscreen.\n xyClient = {\n x: Math.min(\n Math.max(\n 0,\n (prevPt?.xyClient.x ?? ev.offsetX) + ev.movementX * scale\n ),\n this.#target.clientWidth\n ),\n y: Math.min(\n Math.max(\n 0,\n (prevPt?.xyClient.y ?? ev.offsetY) + ev.movementY * scale\n ),\n this.#target.clientHeight\n )\n }\n } else xyClient = {x: ev.offsetX, y: ev.offsetY}\n\n const evType = ev.type as (typeof pointEvents)[number]\n const type =\n pointTypeByPointerType[\n ev.pointerType as keyof typeof pointTypeByPointerType\n ]\n let clickClient\n if (!bits) {\n } else if (ev.type === 'pointerdown')\n clickClient = {x: xyClient.x, y: xyClient.y}\n else if (ev.type === 'pointermove') clickClient = prevPt?.clickClient\n const drag =\n !!bits &&\n (prevPt?.drag ||\n (!!clickClient &&\n xyDistance(clickClient, xyClient) >= this.dragMinClient))\n\n const pt = {\n clickClient,\n bits,\n drag,\n ev: evType,\n id: ev.pointerId,\n primary: ev.isPrimary,\n type,\n xyClient\n }\n if (ev.isPrimary) this.primary = pt\n else if (!bits) delete this.secondary[ev.pointerId]\n else this.secondary[ev.pointerId] = pt\n\n this.onEvent()\n }\n\n get #newPinchClient(): XY | undefined {\n if ((this.primary?.bits ? 1 : 0) + Object.values(this.secondary).length < 2)\n return\n const bounds = this.boundsClient\n return bounds ? {x: bounds.w, y: bounds.h} : undefined\n }\n}\n", "import type {XYZ} from '../types/geo.ts'\n\n/**\n * note: visual viewport magnification, a pinch on trackpad, dispatches a wheel\n * event. prevent default to disable that zoom mechanism.\n * @internal\n */\nexport class Wheel {\n deltaClient: Readonly<XYZ> | undefined\n onEvent: () => void = () => {}\n readonly #target: EventTarget\n\n constructor(target: EventTarget) {\n this.#target = target\n }\n\n postupdate(): void {\n this.deltaClient = undefined\n }\n\n register(op: 'add' | 'remove'): this {\n const fn = this.#target[`${op}EventListener`].bind(this.#target)\n fn('wheel', this.#onInput as EventListener, {passive: true})\n return this\n }\n\n reset(): void {\n this.deltaClient = undefined\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #onInput = (ev: WheelEvent): void => {\n if (!ev.isTrusted || ev.metaKey || ev.altKey || ev.ctrlKey) return\n this.deltaClient = {x: ev.deltaX, y: ev.deltaY, z: ev.deltaZ}\n this.onEvent()\n }\n}\n", "import type {Cam, LevelClientLocalXY} from '../graphics/cam.ts'\nimport type {XY, XYZ} from '../types/geo.ts'\nimport type {Millis} from '../types/time.ts'\nimport {ContextMenu} from './context-menu.ts'\nimport {Gamepad} from './gamepad.ts'\nimport {Keyboard} from './keyboard.ts'\nimport type {PointType} from './pointer.ts'\nimport {Pointer} from './pointer.ts'\nimport {Wheel} from './wheel.ts'\n\n// biome-ignore format:;\nexport type AnyButton =\n | 'U' | 'D' | 'L' | 'R' // dpad.\n | 'A' | 'B' | 'C' // primary, secondary, tertiary.\n | 'Menu' | 'Back'\n\nexport type Chord = [AnyButton, ...AnyButton[]]\nexport type Combo = [Chord, ...Chord[]]\n\nexport type InputMode = 'Default' | 'Custom'\n\nexport type Point = LevelClientLocalXY & {\n click: LevelClientLocalXY | undefined\n type: PointType | undefined\n}\n\n/**\n * doesn't consider handled. local and level positions are reevaluated each\n * frame.\n */\ntype PointerState = Point & {\n center: LevelClientLocalXY\n /** false when pinched. */\n drag: {on: boolean; start: boolean; end: boolean}\n /** true if changed since last update. */\n invalid: boolean\n /** may be negative. */\n pinch:\n | {\n client: XY\n /** level / local. */\n xy: XY\n }\n | undefined\n /** secondary points. */\n secondary: Point[]\n}\n\n/** triggered. */\ntype WheelState = {\n delta: {\n client: Readonly<XYZ>\n /** level / local. */\n xy: XY\n }\n}\n\n/**\n * input device abstraction. aggregates devices, records history, and provides\n * a convenient API.\n *\n * devices own as much device-specific detail and as little coordination (time\n * and device) as practical. devices avoid caching state which is the\n * responsibility of Input. devices strive to provide the current state and\n * nothing else.\n *\n * if you miss reporting on a event between long updates, you just miss it.\n * that's the nature of polling. there's no queue.\n *\n * to-do: expose analog state of gamepad. offer direction as a number instead of\n * bool.\n * to-do: multiplayer. possible if devices were requested instead of sought.\n * to-do: expose input source device.\n */\nexport class Input {\n /** time allowed between combo inputs. */\n comboMaxIntervalMillis: Millis = 300 as Millis\n /**\n * true if any button, key, or click was _ever_ on. doesn't consider handled.\n */\n gestured: boolean = false\n /** clear buttonish inputs for rest of frame. */\n handled: boolean = false\n /** true if _any_ input has changed since previous update. */\n invalid: boolean = false\n /**\n * minimum duration for an input to be considered held. durations are\n * calculated at frame boundaries, not on actual press. devices are treated\n * strictly as polled aggregates.\n */\n minHeldMillis: Millis = 300 as Millis\n readonly #bitByButton: {[btn in AnyButton]?: number} = {}\n readonly #buttonByBit: {[bit: number]: AnyButton} = {}\n #bits: number = 0\n readonly #cam: Readonly<Cam>\n /**\n * sequence of nonzero bits ordered from oldest to latest. combos end only by\n * expiration.\n */\n readonly #combo: number[] = []\n readonly #contextMenu: ContextMenu\n /** direction vector. */\n readonly #dir: XY = {x: 0, y: 0}\n readonly #gamepad: Gamepad\n /** time since buttons changed. */\n #heldMillis: Millis = 0\n readonly #keyboard: Keyboard\n readonly #pointer: Pointer\n #pointerState: PointerState | undefined\n /** bits last update. may not be equal to `#combo.at(-1)`. */\n #prevBits: number = 0\n readonly #wheel: Wheel\n #wheelState: Readonly<WheelState> | undefined\n\n constructor(cam: Readonly<Cam>, target: Element) {\n this.#cam = cam\n this.#contextMenu = new ContextMenu(target)\n this.#gamepad = new Gamepad(globalThis)\n this.#keyboard = new Keyboard(target.ownerDocument)\n this.#pointer = new Pointer(target)\n this.#wheel = new Wheel(target)\n }\n\n get anyOn(): boolean {\n return this.#bits !== 0\n }\n\n /** for debugging. */\n get combo(): AnyButton[][] {\n const chords: AnyButton[][] = []\n for (const bits of this.#combo) {\n const chord: AnyButton[] = []\n for (let bit = 1; bit <= bits; bit <<= 1) {\n if ((bit & bits) === bit && this.#buttonByBit[bit])\n chord.push(this.#buttonByBit[bit]!)\n }\n chord.sort()\n chords.push(chord)\n }\n return chords\n }\n\n /**\n * enable when game is paused or in photo mode to allow right clicks and long\n * presses to save canvas.\n */\n get contextMenu(): {enable: boolean} {\n return this.#contextMenu\n }\n\n get dir(): Readonly<XY> {\n return this.#dir\n }\n\n /** doesn't consider handled. gamepads must be polled. */\n get gamepad(): Readonly<object | undefined> {\n return this.#gamepad.connected ? {} : undefined\n }\n\n /** true if buttons haven't changed for a while. */\n get held(): boolean {\n return !this.handled && this.#heldMillis >= this.minHeldMillis\n }\n\n isAnyOn(...btns: Readonly<Chord>): boolean {\n return !this.handled && !!(this.#bits & this.#mapBits(btns))\n }\n\n isAnyOnStart(...btns: Readonly<Chord>): boolean {\n return this.started && this.isAnyOn(...btns)\n }\n\n /** true if on for at least two frames. */\n isAnyOnStill(...btns: Readonly<Chord>): boolean {\n const bits = this.#mapBits(btns)\n return !this.handled && !!(this.#bits & this.#prevBits & bits)\n }\n\n /** true if any buttons have started on or off. */\n isAnyStarted(...btns: Readonly<Chord>): boolean {\n const bits = this.#mapBits(btns)\n return !this.handled && (this.#bits & bits) !== (this.#prevBits & bits)\n }\n\n /**\n * buttons are exact. eg, up won't match up AND down like `isOn('U')` will.\n * combo is exact too. `['A'], ['A']` will match `['A'], ['A']` but not\n * `['A'], ['A'], ['A']`.\n */\n isCombo(...combo: Readonly<Combo>): boolean {\n return combo.length === this.#combo.length && this.isComboEndsWith(...combo)\n }\n\n /**\n * `['A'], ['A']` will match `['A'], ['A']` and `['B'], ['A'], ['A']`. eg,\n * double-clicks often don't care about any preceding buttons.\n */\n isComboEndsWith(...combo: Readonly<Combo>): boolean {\n for (const [i, btns] of combo.entries()) {\n const bits = this.#mapBits(btns)\n if (this.#combo.at(-combo.length + i) !== bits) return false\n }\n // #combo is a historical record of buttons. whenever buttons changes, a new\n // entry is pushed. make sure the current entry is the current state.\n return !this.handled && (this.#combo.at(-1) === this.#bits || !this.#bits)\n }\n\n /** like isComboEndsWith() but test if the last button is triggered. */\n isComboEndsWithStart(...combo: Readonly<Combo>): boolean {\n // isOnStart() can handle zero-length.\n return this.isOnStart(...combo.at(-1)!) && this.isComboEndsWith(...combo)\n }\n\n /** like isCombo() but test if the last button is triggered. */\n isComboStart(...combo: Readonly<Combo>): boolean {\n return this.isOnStart(...combo.at(-1)!) && this.isCombo(...combo)\n }\n\n /*:\n * true if any button in chord is not on. this is usually what's wanted. eg:\n * ```ts\n * if (isOn('A', 'B')) console.log('on')\n * if (isOff('A', 'B')) console.log('not A+B; A and/or B is off')\n * ```\n */\n isOff(...btns: Readonly<Chord>): boolean {\n return !this.handled && !this.isOn(...btns)\n }\n\n isOffStart(...btns: Readonly<Chord>): boolean {\n const bits = this.#mapBits(btns)\n const wasOn = (this.#prevBits & bits) === bits\n // don't test this.#bits === 0 since it might forever miss the off event for\n // the specific bits.\n return wasOn && this.started && this.isOff(...btns)\n }\n\n /**\n * true if all buttons are on inclusively. eg, `isOn('U')` is true when up is\n * pressed or when up and down are pressed.\n */\n isOn(...btns: Readonly<Chord>): boolean {\n const bits = this.#mapBits(btns)\n return !this.handled && (this.#bits & bits) === bits\n }\n\n isOnStart(...btns: Readonly<Chord>): boolean {\n return this.started && this.isOn(...btns)\n }\n\n get key(): {invalid: boolean} {\n return {invalid: this.#keyboard.invalid}\n }\n\n mapDefault(): void {\n this.mapKeyboardCode('U', 'ArrowUp')\n this.mapKeyboardCode('D', 'ArrowDown')\n this.mapKeyboardCode('L', 'ArrowLeft')\n this.mapKeyboardCode('R', 'ArrowRight')\n this.mapKeyboardCode('C', 'KeyC')\n this.mapKeyboardCode('A', 'KeyX', 'Space')\n this.mapKeyboardCode('B', 'KeyZ')\n this.mapKeyboardCode('Menu', 'Enter')\n this.mapKeyboardCode('Back', 'Escape')\n\n // https://w3c.github.io/gamepad/#remapping\n this.mapGamepadAxis('U', 'D', 1, 3)\n this.mapGamepadAxis('L', 'R', 0, 2)\n this.mapGamepadButton('U', 12)\n this.mapGamepadButton('D', 13)\n this.mapGamepadButton('L', 14)\n this.mapGamepadButton('R', 15)\n this.mapGamepadButton('C', 2)\n this.mapGamepadButton('B', 0) // to-do: not good from PS perspective.\n this.mapGamepadButton('A', 1) // to-do: not good from PS perspective.\n this.mapGamepadButton('Menu', 9)\n this.mapGamepadButton('Back', 8)\n\n this.mapPointerClick('A', 1)\n this.mapPointerClick('B', 2)\n this.mapPointerClick('C', 4)\n }\n\n // to-do: support analog values.\n mapGamepadAxis(\n less: AnyButton,\n more: AnyButton,\n ...axes: readonly number[]\n ): void {\n for (const axis of axes) {\n this.#gamepad.bitByAxis[axis] = [\n this.#mapButton(less),\n this.#mapButton(more)\n ]\n }\n }\n\n mapGamepadButton(btn: AnyButton, ...indices: readonly number[]): void {\n for (const index of indices)\n this.#gamepad.bitByButton[index] = this.#mapButton(btn)\n }\n\n /** @arg codes union of KeyboardEvent.code. */\n mapKeyboardCode(btn: AnyButton, ...codes: readonly string[]): void {\n for (const code of codes)\n this.#keyboard.bitByCode[code] = this.#mapButton(btn)\n }\n\n mapPointerClick(btn: AnyButton, ...clicks: readonly number[]): void {\n for (const click of clicks)\n this.#pointer.bitByButton[click] = this.#mapButton(btn)\n }\n\n get on(): AnyButton[] {\n const on: AnyButton[] = []\n for (const btn in this.#bitByButton)\n if (this.isOn(btn as AnyButton)) on.push(btn as AnyButton)\n return on.sort()\n }\n\n set onEvent(hook: () => void) {\n this.#gamepad.onEvent = hook\n this.#keyboard.onEvent = hook\n this.#pointer.onEvent = hook\n this.#wheel.onEvent = hook\n }\n\n /** doesn't consider handled. */\n get point(): PointerState | undefined {\n return this.#pointerState\n }\n\n get pointer(): {dragMinClient: number} {\n return this.#pointer\n }\n\n register(op: 'add' | 'remove'): this {\n globalThis[`${op}EventListener`]('blur', this.reset) // keyup is lost if window loses focus.\n this.#contextMenu.register(op)\n this.#gamepad.register(op)\n this.#keyboard.register(op)\n this.#pointer.register(op)\n this.#wheel.register(op)\n return this\n }\n\n reset = (): void => {\n this.#bits = 0\n this.#prevBits = 0\n this.handled = false\n this.#heldMillis = 0\n this.#combo.length = 0\n this.#gamepad.reset()\n this.#keyboard.reset()\n this.#pointer.reset()\n this.#pointerState = undefined\n this.#wheel.reset()\n this.#wheelState = undefined\n }\n\n /** true if bits has changed. */\n get started(): boolean {\n return !this.handled && this.#bits !== this.#prevBits\n }\n\n /**\n * call on new frame before altering cam. dispatches always occur before an\n * update.\n * @arg millis duration since last update.\n */\n update(millis: Millis): void {\n this.handled = false\n this.#gamepad.update()\n this.#pointer.update()\n\n this.#prevBits = this.#bits\n this.#bits =\n this.#gamepad.bits |\n this.#keyboard.bits |\n (this.#pointer.primary?.bits ?? 0)\n this.invalid =\n this.#bits !== this.#prevBits ||\n this.#pointer.invalid ||\n !!this.#wheel.deltaClient\n this.gestured ||= !!this.#bits\n\n this.#dir.x = this.#dir.y = 0\n if ((this.#bitByButton.U! & this.#bits) === this.#bitByButton.U)\n this.#dir.y -= 1\n if ((this.#bitByButton.D! & this.#bits) === this.#bitByButton.D)\n this.#dir.y += 1\n if ((this.#bitByButton.L! & this.#bits) === this.#bitByButton.L)\n this.#dir.x -= 1\n if ((this.#bitByButton.R! & this.#bits) === this.#bitByButton.R)\n this.#dir.x += 1\n\n if (\n (millis > this.comboMaxIntervalMillis && this.#bits !== this.#prevBits) ||\n (this.#heldMillis + millis > this.comboMaxIntervalMillis && !this.#bits)\n )\n this.#combo.length = 0\n\n if (this.#bits === this.#prevBits)\n this.#heldMillis = (this.#heldMillis + millis) as Millis\n else this.#heldMillis = millis\n\n if (this.#bits && this.#bits !== this.#prevBits) {\n if (this.#prevBits) this.#combo.length = 0 // new button without release.\n this.#combo.push(this.#bits)\n }\n\n if (this.#pointer.primary) {\n const pinchClient = this.#pointer.pinchClient\n const dragOn =\n this.#pointer.primary.drag &&\n !Object.values(this.#pointer.secondary).length\n const secondary: Point[] = []\n for (const pt of Object.values(this.#pointer.secondary)) {\n secondary.push({\n type: pt.type,\n click: pt.clickClient\n ? {\n client: pt.clickClient,\n local: this.#cam.clientToXYLocal(pt.clickClient),\n ...this.#cam.clientToXY(pt.clickClient)\n }\n : undefined,\n ...this.#cam.clientToXY(pt.xyClient),\n client: pt.xyClient,\n local: this.#cam.clientToXYLocal(pt.xyClient)\n })\n }\n const centerClient = this.#pointer.centerClient!\n const center = {\n client: centerClient,\n local: this.#cam.clientToXYLocal(centerClient),\n ...this.#cam.clientToXY(centerClient)\n }\n this.#pointerState = {\n center,\n click: this.#pointer.primary.clickClient\n ? {\n client: this.#pointer.primary.clickClient,\n local: this.#cam.clientToXYLocal(\n this.#pointer.primary.clickClient\n ),\n ...this.#cam.clientToXY(this.#pointer.primary.clickClient)\n }\n : undefined,\n drag: {\n on: dragOn,\n start: !this.#pointerState?.drag.on && dragOn,\n end: !!this.#pointerState?.drag.on && !dragOn\n },\n invalid: this.#pointer.invalid,\n pinch: pinchClient\n ? {client: pinchClient, xy: this.#cam.clientToXY(pinchClient)}\n : undefined,\n secondary,\n type: this.#pointer.primary.type,\n ...this.#cam.clientToXY(this.#pointer.primary.xyClient),\n client: this.#pointer.primary.xyClient,\n local: this.#cam.clientToXYLocal(this.#pointer.primary.xyClient)\n }\n }\n // secondary should never be set when primary isn't.\n else this.#pointerState = undefined\n\n this.#wheelState = this.#wheel.deltaClient\n ? {\n delta: {\n client: this.#wheel.deltaClient,\n xy: this.#cam.clientToXY(this.#wheel.deltaClient)\n }\n }\n : undefined\n this.#keyboard.postupdate()\n this.#pointer.postupdate()\n this.#wheel.postupdate()\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n /** doesn't consider handled. */\n get wheel(): Readonly<WheelState | undefined> {\n return this.#wheelState\n }\n\n /** get bits for buttons. */\n #mapBits(btns: Readonly<Chord>): number {\n let bits = 0\n for (const btn of btns) bits |= this.#bitByButton[btn] ?? 0\n return bits\n }\n\n /** assign button to bit. */\n #mapButton(btn: AnyButton): number {\n const bit = (this.#bitByButton[btn] ??=\n 1 << Object.keys(this.#bitByButton).length)\n this.#buttonByBit[bit] = btn\n return bit\n }\n}\n", "export function assertRecord<T extends {[k: PropertyKey]: unknown}>(\n v: unknown\n): asserts v is T {\n if (!isRecord(v)) throw new Error('not a record')\n}\n\nexport function isRecord<T extends {[k: PropertyKey]: unknown}>(\n v: unknown\n): v is T {\n return v != null && !Array.isArray(v) && typeof v === 'object'\n}\n", "export function uncapitalize<Str extends string>(str: Str): Uncapitalize<Str> {\n if (!str[0]) return str as Uncapitalize<Str>\n return `${str[0].toLocaleLowerCase()}${str.slice(1)}` as Uncapitalize<Str>\n}\n", "import type {\n Button,\n Cursor,\n Ent,\n FPS,\n HUD,\n NinePatch,\n Override,\n TextWH,\n TextXY\n} from '../ents/ent.ts'\nimport type {Atlas, Tag} from '../graphics/atlas.ts'\nimport {Layer} from '../graphics/layer.ts'\nimport {drawableMaxWH, type Sprite} from '../graphics/sprite.ts'\nimport type {PoolMap} from '../mem/pool-map.ts'\nimport type {Border, WH, XY} from '../types/geo.ts'\nimport {isRecord} from '../utils/obj-util.ts'\nimport {uncapitalize} from '../utils/str-util.ts'\nimport type {Level} from './level.ts'\nimport type {\n BorderSchema,\n ButtonSchema,\n CursorSchema,\n EntSchema,\n FPSSchema,\n HUDSchema,\n LevelSchema,\n NinePatchSchema,\n OverrideSchema,\n SpriteSchema,\n TextWHSchema,\n TextXYSchema,\n UnboundedWHSchema\n} from './level-schema.ts'\n\nexport type ComponentHook = (\n ent: Ent,\n json: Readonly<EntSchema>,\n k: keyof EntSchema,\n pools: Readonly<PoolMap>,\n atlas: Readonly<Atlas>\n) => Ent[typeof k]\n\nexport function parseLevel(\n json: Readonly<LevelSchema>,\n pools: Readonly<PoolMap>,\n hook: ComponentHook,\n atlas: Readonly<Atlas>\n): Level {\n return {\n ents: json.ents?.map(ent => parseEnt(ent, pools, hook, atlas)) ?? [],\n keepZoo: json.keepZoo ?? false,\n minWH: json.minWH ? parseWH(json.minWH) : {w: Infinity, h: Infinity}\n }\n}\n\nexport function parseBorder(json: Readonly<BorderSchema> | undefined): Border {\n if (!json || typeof json === 'number') {\n const w = json ?? 0\n return {n: w, s: w, w, e: w}\n }\n if ('x' in json || 'y' in json)\n return {n: json.y ?? 0, s: json.y ?? 0, w: json.x ?? 0, e: json.x ?? 0}\n return {\n n: (json as Partial<Border>).n ?? 0,\n s: (json as Partial<Border>).s ?? 0,\n w: (json as Partial<Border>).w ?? 0,\n e: (json as Partial<Border>).e ?? 0\n }\n}\n\nexport function parseButton(\n json: Readonly<ButtonSchema>,\n pools: Readonly<PoolMap>,\n atlas: Readonly<Atlas>\n): Button {\n const pressed = parseSprite(json.pressed, pools, atlas)\n if (json.z) pressed.z = Layer[json.z]\n pressed.visible = false // button state is based on visibility.\n const selected = parseSprite(json.selected, pools, atlas)\n if (json.z) selected.z = Layer[json.z]\n return {pressed, selected, started: false, type: json.type ?? 'Button'}\n}\n\nexport function parseCursor(ent: Ent, json: Readonly<CursorSchema>): Cursor {\n if (!ent.sprite) throw Error('cursor missing sprite')\n ent.sprite.visible = false\n return {\n bounds: {x: 0, y: 0, w: 0, h: 0},\n keyboard: json.keyboard ?? 0,\n pick: json.pick,\n point: ent.sprite.tag\n }\n}\n\nexport function parseEnt(\n json: Readonly<EntSchema>,\n pools: Readonly<PoolMap>,\n hook: ComponentHook,\n atlas: Readonly<Atlas>\n): Ent {\n const ent: {[k: string]: Ent[keyof Ent]} = {}\n for (const _k in json) {\n const k = _k as keyof EntSchema\n ent[k] =\n hook(ent, json, k, pools, atlas) ??\n parseEntComponent(ent, json, k, pools, atlas)\n }\n ent.invalid = true\n return ent\n}\n\nexport function parseEntComponent(\n ent: Ent,\n json: Readonly<EntSchema>,\n k: keyof EntSchema,\n pools: Readonly<PoolMap>,\n atlas: Readonly<Atlas>\n): Ent[typeof k] {\n if (json[k] == null) return\n switch (k) {\n case 'button':\n return parseButton(json[k], pools, atlas) satisfies Ent[typeof k]\n case 'cursor':\n return parseCursor(ent, json[k]) satisfies Ent[typeof k]\n case 'fps':\n return parseFPS(json[k]) satisfies Ent[typeof k]\n case 'hud':\n return parseHUD(json[k]) satisfies Ent[typeof k]\n case 'cam':\n case 'draw':\n case 'debugInput':\n case 'id':\n case 'name':\n case 'text':\n return json[k] satisfies Ent[typeof k]\n case 'ninePatch':\n return parseNinePatch(ent, json[k], pools, atlas) satisfies Ent[typeof k]\n case 'override':\n return parseOverride(json[k]) satisfies Ent[typeof k]\n case 'sprite':\n return parseSprite(json[k], pools, atlas) satisfies Ent[typeof k]\n case 'textWH':\n return parseTextWH(json[k]) satisfies Ent[typeof k]\n case 'textXY':\n return parseTextXY(ent, json[k]) satisfies Ent[typeof k]\n default:\n k satisfies never\n }\n}\n\nexport function parseFPS(_json: Readonly<FPSSchema>): FPS {\n return {\n prevFrames: 0,\n next: {created: performance.now(), frames: 0}\n }\n}\n\nexport function parseHUD(json: Readonly<HUDSchema>): HUD {\n return {\n fill: json.fill,\n margin: parseBorder(json.margin ?? 0),\n modulo: parseXY(json.modulo ?? 0),\n origin: json.origin\n }\n}\n\nexport function parseNinePatch(\n ent: Ent,\n json: Readonly<NinePatchSchema>,\n pools: Readonly<PoolMap>,\n atlas: Readonly<Atlas>\n): NinePatch {\n if (!ent.sprite) throw Error('nine patch missing sprite')\n const patch = {\n center:\n json.patch.center == null\n ? undefined\n : parseSprite(json.patch.center, pools, atlas),\n n:\n json.patch.n == null\n ? undefined\n : parseSprite(json.patch.n, pools, atlas),\n s:\n json.patch.s == null\n ? undefined\n : parseSprite(json.patch.s, pools, atlas),\n w:\n json.patch.w == null\n ? undefined\n : parseSprite(json.patch.w, pools, atlas),\n e:\n json.patch.e == null\n ? undefined\n : parseSprite(json.patch.e, pools, atlas),\n nw:\n json.patch.nw == null\n ? undefined\n : parseSprite(json.patch.nw, pools, atlas),\n ne:\n json.patch.ne == null\n ? undefined\n : parseSprite(json.patch.ne, pools, atlas),\n sw:\n json.patch.sw == null\n ? undefined\n : parseSprite(json.patch.sw, pools, atlas),\n se:\n json.patch.se == null\n ? undefined\n : parseSprite(json.patch.se, pools, atlas)\n }\n const border = parseBorder(json.border)\n const ninePatch = {border, pad: parseBorder(json.pad), patch}\n if (patch.center) patch.center.z = ent.sprite.z\n if (patch.n) {\n patch.n.h = border.n\n if (!isRecord(json.patch.n) || json.patch.n.z == null)\n patch.n.z = ent.sprite.z\n }\n if (patch.s) {\n patch.s.h = border.s\n if (!isRecord(json.patch.s) || json.patch.s.z == null)\n patch.s.z = ent.sprite.z\n }\n if (patch.w) {\n patch.w.w = border.w\n if (!isRecord(json.patch.w) || json.patch.w.z == null)\n patch.w.z = ent.sprite.z\n }\n if (patch.e) {\n patch.e.w = border.e\n if (!isRecord(json.patch.e) || json.patch.e.z == null)\n patch.e.z = ent.sprite.z\n }\n if (patch.nw) {\n patch.nw.w = border.w\n patch.nw.h = border.n\n if (!isRecord(json.patch.nw) || json.patch.nw.z == null)\n patch.nw.z = ent.sprite.z\n }\n if (patch.ne) {\n patch.ne.w = border.e\n patch.ne.h = border.n\n if (!isRecord(json.patch.ne) || json.patch.ne.z == null)\n patch.ne.z = ent.sprite.z\n }\n if (patch.sw) {\n patch.sw.w = border.w\n patch.sw.h = border.s\n if (!isRecord(json.patch.sw) || json.patch.sw.z == null)\n patch.sw.z = ent.sprite.z\n }\n if (patch.se) {\n patch.se.w = border.e\n patch.se.h = border.s\n if (!isRecord(json.patch.se) || json.patch.se.z == null)\n patch.se.z = ent.sprite.z\n }\n return ninePatch\n}\n\nexport function parseOverride(json: Readonly<OverrideSchema>): Override {\n return {invalid: json.invalid}\n}\n\nexport function parseSprite(\n json:\n | Readonly<\n SpriteSchema &\n Partial<WH> &\n Partial<XY> & {scale?: number | Partial<XY>}\n >\n | Tag,\n pools: Readonly<PoolMap>,\n atlas: Readonly<Atlas>\n): Sprite {\n const pool =\n typeof json === 'string' ? 'default' : uncapitalize(json.pool ?? 'Default')\n if (!pools[pool as keyof PoolMap]) throw Error(`no ${pool} sprite pool`)\n const sprite = pools[pool as keyof PoolMap].alloc()\n if (typeof json === 'string') {\n if (!(json in atlas.anim)) throw Error(`no tag \"${json}\"`)\n sprite.tag = json\n return sprite\n }\n if (json.tag != null) {\n if (!(json.tag in atlas.anim)) throw Error(`no tag \"${json.tag}\"`)\n sprite.tag = json.tag\n }\n sprite.visible = json.visible ?? json.tag != null\n if (json.flip) {\n sprite.flipX = json.flip === 'X' || json.flip === 'XY'\n sprite.flipY = json.flip === 'Y' || json.flip === 'XY'\n }\n if (json.stretch != null) sprite.stretch = json.stretch\n if (json.w != null) sprite.w = json.w\n if (json.h != null) sprite.h = json.h\n if (json.scale != null) {\n sprite.w *=\n typeof json.scale === 'number' ? json.scale : (json.scale.x ?? 1)\n sprite.h *=\n typeof json.scale === 'number' ? json.scale : (json.scale.y ?? 1)\n }\n if (json.x != null) sprite.x = json.x\n if (json.y != null) sprite.y = json.y\n if (json.z != null) sprite.z = Layer[json.z]\n if (json.zend != null) sprite.zend = json.zend\n return sprite\n}\n\nexport function parseTextWH<_Tag extends Tag>(\n json: Readonly<TextWHSchema>\n): TextWH {\n return {\n layout: {chars: [], cursor: {x: 0, y: 0}, w: 0, h: 0, trimmedH: 0},\n maxW: json.maxW ?? drawableMaxWH.w,\n pad: parseBorder(json.pad),\n scale: json.scale ?? 1,\n trim: json.trim\n }\n}\n\nexport function parseTextXY(ent: Ent, json: Readonly<TextXYSchema>): TextXY {\n return {\n chars: [],\n z: json.z ? Layer[json.z] : (ent.sprite?.z ?? Layer.Bottom)\n }\n}\n\nexport function parseWH(json: Readonly<UnboundedWHSchema> | number): WH {\n if (typeof json === 'number') return {w: json, h: json}\n return {w: Number(json?.w ?? 0), h: Number(json?.h ?? 0)}\n}\n\nexport function parseXY(json: Readonly<Partial<XY>> | number): XY {\n if (typeof json === 'number') return {x: json, y: json}\n return {x: json.x ?? 0, y: json.y ?? 0}\n}\n", "import {debug} from '../utils/debug.ts'\n\nexport type PoolOpts<out T extends Block> = {\n alloc(pool: Pool<T>): T\n init?(block: T): void\n /** bytes per block. */\n allocBytes: number\n minPages?: number\n /** blocks per page. */\n pageBlocks: number\n}\n\nexport type Block = {/** variable pool byte offset. */ i: number}\n\n/**\n * a contiguous resizable TypedArray associated with an array of objects.\n *\n * alternatives:\n * - operating on the array without classes would probably be faster but the DX\n * sucks:\n * this.#sprite = this.#pool.alloc()\n * this.#pool.setX(this.#sprite, this.#pool.getX(this.#sprite) + 1)\n * - sprite classes owning all the data is nice DX but requires a copy on every\n * frame.\n * - ArrayBuffer.resize() is incompatible with WebGL.\n */\nexport class Pool<out T extends Block> {\n /** the next free block is always at size. */\n readonly #blocks: T[]\n readonly #opts: Readonly<Required<PoolOpts<T>>>\n #size: number = 0\n #u8: Uint8Array<ArrayBuffer>\n #view!: DataView<ArrayBuffer>\n\n constructor(opts: Readonly<PoolOpts<T>>) {\n if (opts.allocBytes <= 0) throw Error('byte allocation must be > 0')\n if (opts.pageBlocks <= 0) throw Error('page blocks must be > 0')\n this.#opts = {\n ...opts,\n init: opts.init ?? (() => {}),\n minPages: opts.minPages ?? 1\n }\n const initSize = this.#opts.minPages * opts.pageBlocks\n this.#blocks = new Array(initSize)\n this.#u8 = new Uint8Array()\n this.#resize(initSize, 'Init')\n }\n\n alloc(): T {\n if (this.#size >= this.#currentCapacity)\n this.#resize(this.#currentCapacity + this.#opts.pageBlocks, 'Call')\n const block = this.#blocks[this.#size]!\n block.i = this.#size * this.#opts.allocBytes\n this.#size++\n this.#opts.init(block)\n return block\n }\n\n clear(): void {\n this.#size = 0\n const minCapacity = this.#opts.minPages * this.#opts.pageBlocks\n if (this.#currentCapacity > minCapacity) this.#resize(minCapacity, 'Call')\n }\n\n free(block: T): void {\n if (!this.#size) throw Error('pool underflow')\n\n this.#size--\n const start = this.#size * this.#opts.allocBytes\n this.#u8.copyWithin(block.i, start, start + this.#opts.allocBytes)\n this.#blocks[this.#size]!.i = block.i\n ;[this.#blocks[block.i], this.#blocks[this.#size]] = [\n this.#blocks[this.#size]!,\n this.#blocks[block.i]!\n ]\n\n const free = Math.floor(\n (this.#currentCapacity - this.#size) / this.#opts.pageBlocks\n )\n if (\n free &&\n this.#currentCapacity / this.#opts.pageBlocks - free >=\n this.#opts.minPages\n )\n this.#resize(this.#currentCapacity - free * this.#opts.pageBlocks, 'Call')\n }\n\n get size(): number {\n return this.#size\n }\n\n get view(): DataView<ArrayBuffer> {\n return this.#view\n }\n\n toDebugString(): string {\n let str = ''\n for (let i = 0; i < this.#u8.buffer.byteLength; i++) {\n if (i && !(i % this.#opts.allocBytes)) str += ' '\n str += this.#u8[i]!.toString(16).padStart(2, '0')\n }\n return str\n }\n\n get #currentCapacity(): number {\n return this.#u8.buffer.byteLength / this.#opts.allocBytes\n }\n\n #resize(capacity: number, origin: 'Init' | 'Call'): void {\n if (origin === 'Call' && debug?.mem)\n console.debug(\n `[mem] ${capacity < this.#currentCapacity ? 'shrinking' : 'growing'} pool to ${capacity}`\n )\n\n this.#blocks.length = capacity\n for (let i = this.#currentCapacity; i < capacity; i++)\n this.#blocks[i] = this.#opts.alloc(this)\n\n const buffer = new ArrayBuffer(capacity * this.#opts.allocBytes)\n const u8 = new Uint8Array(buffer)\n u8.set(this.#u8.subarray(0, capacity * this.#opts.allocBytes))\n this.#u8 = u8\n this.#view = new DataView(buffer)\n }\n}\n", "import type {Atlas} from '../graphics/atlas.ts'\nimport {drawableBytes, Sprite} from '../graphics/sprite.ts'\nimport type {Millis} from '../types/time.ts'\nimport {Pool, type PoolOpts} from './pool.ts'\n\nexport type SpritePoolOpts = {\n atlas: Atlas\n looper: {age: Millis}\n} & Omit<PoolOpts<Sprite>, 'alloc' | 'allocBytes' | 'init'>\n\nexport function SpritePool(opts: Readonly<SpritePoolOpts>): Pool<Sprite> {\n return new Pool({\n alloc: pool => new Sprite(pool, 0, opts.atlas, opts.looper),\n init: sprite => sprite.init(),\n allocBytes: drawableBytes,\n ...opts\n })\n}\n", "/** http://www.firstpr.com.au/dsp/rand31. */\nexport class Random {\n /** only [1, 0x7fff_fffe] is valid. */\n #seed: number\n\n constructor(seed: number) {\n this.#seed = (seed * 16_807) % 0x7fff_ffff // [-0x7fff_fffe, 0x7fff_fffe]\n\n // account for out of range numbers.\n if (this.#seed <= 0)\n // [-0x7fff_fffe, 0]\n this.#seed =\n ((this.#seed + 0x7fff_fffe) % 0x7fff_fffe) + // [0, 0x7fff_fffd]\n 1 // [1, 0x7fff_fffe]\n }\n\n /** @return a fraction in [0, 1). */\n get num(): number {\n this.#seed = (this.#seed * 16_807) % 0x7fff_ffff\n return (this.#seed - 1) / 0x7fff_fffe\n }\n\n get seed(): number {\n return this.#seed\n }\n}\n", "export type Bundle = {\n /** Git short hash at build time. do not use if builds are committed. */\n hash: string | undefined\n /** package.json `published` YYYYMMDD. */\n published: string | undefined\n /** package.json semantic `version`. */\n version: string | undefined\n}\n\ndeclare namespace globalThis {\n // imported JSON doesn't treeshake. define as a constant with esbuild.\n const bundle: Bundle\n}\n\nexport const bundle: Readonly<Bundle> = globalThis.bundle\n", "declare global {\n interface DateConstructor {\n now(): UTCMillis\n }\n\n interface Performance {\n now(): Millis\n }\n}\n\ndeclare const millis: unique symbol\n/** duration in milliseconds. */\nexport type Millis = (number & {readonly [millis]: never}) | 0\n\ndeclare const secs: unique symbol\n/** duration in seconds. */\nexport type Secs = (number & {readonly [secs]: never}) | 0\n\ndeclare const utcMillis: unique symbol\nexport type UTCMillis = number & {readonly [utcMillis]: never}\n\nexport function dateToTimestamp(date: Readonly<Date>): string {\n const yyyy = `${date.getFullYear()}`.padStart(4, '0')\n const MM = `${date.getMonth() + 1}`.padStart(2, '0')\n const dd = `${date.getDate()}`.padStart(2, '0')\n const hh = `${date.getHours()}`.padStart(2, '0')\n const mm = `${date.getMinutes()}`.padStart(2, '0')\n const ss = `${date.getSeconds()}`.padStart(2, '0')\n return `${yyyy}${MM}${dd}${hh}${mm}${ss}`\n}\n\n/**\n * returns [0, 59_999].\n * @internal\n */\nexport function millisUntilNext(\n time: Readonly<Date>,\n next: 'Sec' | 'Min'\n): Millis {\n return (((next === 'Sec' ? 0 : (59 - (time.getSeconds() % 60)) * 1000) +\n 1000 -\n (time.getMilliseconds() % 1000)) %\n (next === 'Sec' ? 1000 : 60000)) as Millis\n}\n", "export function rgbaHex(rgba: number): `#${string}` {\n return `#${rgba.toString(16).padStart(8, '0')}`\n}\n\n/**\n * for use with `getComputedStyle()` format. eg, `rgba(255, 255, 255, 1)` to\n * xffffffff. percentage unsupported.\n */\nexport function parseComputedColor(rgba: string): number {\n const [r, g, b, a] = rgba.match(/[0-9.]+/g)?.map(Number) ?? []\n return (\n ((Math.round(r ?? 0) << 24) |\n (Math.round(g ?? 0) << 16) |\n (Math.round(b ?? 0) << 8) |\n Math.round((a ?? 1) * 255)) >>>\n 0\n )\n}\n", "import {rgbaHex} from './color-util.ts'\n\nexport function download(uri: string, filename: string): void {\n const a = document.createElement('a')\n a.href = uri\n a.download = filename\n a.click()\n a.remove()\n}\n\nexport function initBody(rgba: number): void {\n document.body.style.margin = '0'\n // fill the screen except for UI chrome.\n document.body.style.width = '100dvw'\n document.body.style.height = '100dvh'\n document.body.style.overflow = 'hidden'\n document.body.style.background = rgbaHex(rgba)\n}\n\nexport function initMetaViewport(description: string | undefined): void {\n if (!document.querySelector('meta[name=\"viewport\"]')) {\n const viewport = document.createElement('meta')\n viewport.name = 'viewport'\n // don't wait for double-tap scaling on mobile.\n viewport.content =\n 'width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no'\n document.head.appendChild(viewport)\n }\n\n if (description && !document.querySelector('meta[name=\"description\"]')) {\n const desc = document.createElement('meta')\n desc.name = 'description'\n desc.content = description\n document.head.appendChild(desc)\n }\n}\n", "import type {RenderMode} from '../graphics/render-mode.ts'\nimport {dateToTimestamp} from '../types/time.ts'\nimport {download} from './dom-util.ts'\n\nexport async function downloadScreenshot(\n canvas: HTMLCanvasElement,\n name: string\n): Promise<void> {\n using img = await screenshot(canvas)\n download(img.uri, `${name}-screenshot-${dateToTimestamp(new Date())}.webp`)\n}\n\nexport function initCanvas(\n canvas: HTMLCanvasElement | null | undefined,\n mode: RenderMode\n): HTMLCanvasElement {\n canvas ??= document.createElement('canvas')\n canvas.width = 0 // guarantee Renderer.#resize().\n canvas.style.cursor = 'none'\n canvas.style.display = 'block' // no line height spacing.\n canvas.style.outline = 'none' // disable focus outline.\n if (mode === 'Int') canvas.style.imageRendering = 'pixelated' // to-do: why doesn't cam mode set this?\n // update on each pointermove *touch* Event like *mouse* Events.\n canvas.style.touchAction = 'none'\n canvas.tabIndex = 0\n canvas.focus()\n if (!canvas.parentNode) {\n const main = document.createElement('main') // a11y.\n main.style.backgroundColor = document.body.style.backgroundColor\n main.style.height = '100%'\n main.append(canvas)\n document.body.append(main)\n }\n return canvas\n}\n\nexport async function requestFullscreen(\n canvas: HTMLCanvasElement\n): Promise<boolean> {\n if (!document.fullscreenEnabled) return false\n\n if (document.fullscreenElement !== canvas)\n try {\n await canvas.requestFullscreen({navigationUI: 'hide'})\n } catch {\n return false\n }\n\n if (!document.pointerLockElement) {\n try {\n await canvas.requestPointerLock({unadjustedMovement: true})\n } catch (err) {\n if (err instanceof Error && err.name === 'NotSupportedError')\n try {\n await canvas.requestPointerLock()\n } catch {}\n }\n }\n\n return true\n}\n\n/** draws a canvas to a blob URI. */\nexport function screenshot(\n canvas: HTMLCanvasElement\n): Promise<Disposable & {uri: string}> {\n return new Promise((fulfil, reject) => {\n canvas.toBlob(blob => {\n if (blob) {\n const img = {\n [Symbol.dispose]() {\n URL.revokeObjectURL(this.uri)\n },\n uri: URL.createObjectURL(blob)\n }\n fulfil(img)\n } else reject(Error('no blob'))\n }, 'image/webp')\n })\n}\n", "import type {Millis} from '../types/time.ts'\n\nexport class DelayInterval {\n #delay: () => Millis\n #interval: Millis\n #intervalID: number = 0\n #onInterval: () => void\n #timerID: number = 0\n\n constructor(delay: () => Millis, interval: Millis, onInterval: () => void) {\n this.#delay = delay\n this.#interval = interval\n this.#onInterval = onInterval\n }\n\n register(op: 'add' | 'remove'): this {\n if (op === 'add') {\n this.#timerID = setTimeout(() => {\n this.#onInterval()\n this.#intervalID = setInterval(this.#onInterval, this.#interval)\n }, this.#delay())\n } else {\n clearTimeout(this.#timerID)\n clearInterval(this.#intervalID)\n }\n\n return this\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n}\n", "export async function fetchAudio(url: string): Promise<ArrayBuffer> {\n const rsp = await fetch(url, {headers: {accept: 'audio/mpeg'}})\n if (!rsp.ok)\n throw Error(`fetch error ${rsp.status}: ${rsp.statusText} for ${url}`)\n const type = rsp.headers.get('Content-Type')\n // to-do: ogg\n if (!type?.startsWith('audio/mpeg'))\n throw Error(`bad fetch response type ${type} for ${url}`)\n return await rsp.arrayBuffer()\n}\n\nexport function fetchImage(uri: string): Promise<HTMLImageElement> {\n const img = new Image()\n const promise = loadImage(img)\n img.src = uri\n return promise\n}\n\nexport async function loadImage(\n img: HTMLImageElement\n): Promise<HTMLImageElement> {\n const promise = new Promise<HTMLImageElement>((fulfil, reject) => {\n img.onload = () => fulfil(img)\n img.onerror = () => reject(Error(`image load error for ${img.src}`))\n })\n return img.complete ? img : await promise\n}\n", "/** resolution changes may not trigger a resize. observe density changes. */\nexport class PixelRatioObserver {\n onChange: () => void = () => {}\n #mediaQuery: MediaQueryList | undefined\n\n register(op: 'add' | 'remove'): this {\n this.#mediaQuery?.removeEventListener('change', this.#onChange)\n\n if (op === 'add') {\n this.#mediaQuery = matchMedia(`not (resolution: ${devicePixelRatio}dppx)`)\n this.#mediaQuery.addEventListener('change', this.#onChange)\n } else this.#mediaQuery = undefined\n\n return this\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #onChange = (): void => {\n this.register('add')\n this.onChange()\n }\n}\n", "import {debug} from '../utils/debug.ts'\n\nexport type GL2 = WebGL2RenderingContext\nexport type GLProgram = WebGLProgram\nexport type GLShader = WebGLShader\nexport type GLTexture = WebGLTexture\nexport type GLUniformLocation = WebGLUniformLocation\nexport type GLUniformMap = {[name: string]: GLUniformLocation}\n\nexport type Shader = {\n program: GLProgram | null\n buffer: WebGLBuffer | null\n uniform: GLUniformMap\n vao: WebGLVertexArrayObject | null\n textures: GLTexture[]\n}\n\nexport function Shader(\n gl: GL2,\n vertGLSL: string,\n fragGLSL: string,\n textures: GLTexture[]\n): Shader {\n const program = loadProgram(gl, vertGLSL, fragGLSL)\n gl.useProgram(program)\n return {\n buffer: gl.createBuffer(),\n program,\n textures,\n uniform: GLUniformMap(gl, program),\n vao: gl.createVertexArray()\n }\n}\n\nfunction GLUniformMap(gl: GL2, pgm: GLProgram | null): GLUniformMap {\n const len = pgm ? gl.getProgramParameter(pgm, gl.ACTIVE_UNIFORMS) : 0\n const map = debug?.render\n ? new Proxy<GLUniformMap>(\n {},\n {\n get(target, k: string): GLUniformLocation {\n if (target[k] == null) throw Error(`no shader uniform \"${k}\"`)\n return target[k]\n }\n }\n )\n : {}\n for (let i = 0; i < len; ++i) {\n const uniform = gl.getActiveUniform(pgm!, i)\n if (!uniform) throw Error(`no shader uniform at index ${i}`)\n const location = gl.getUniformLocation(pgm!, uniform.name)\n if (!location) throw Error(`no shader uniform \"${uniform.name}\"`)\n const name = uniform.name.replace('[0]', '') // arrays.\n map[name] = location\n }\n return map\n}\n\nfunction loadProgram(\n gl: GL2,\n vertGLSL: string,\n fragGLSL: string\n): GLProgram | null {\n const pgm = gl.createProgram()\n if (!pgm) return null\n\n const vert = compileShader(gl, 'VERTEX_SHADER', vertGLSL)\n const frag = compileShader(gl, 'FRAGMENT_SHADER', fragGLSL)\n if (!vert || !frag) return null\n gl.attachShader(pgm, vert)\n gl.attachShader(pgm, frag)\n gl.linkProgram(pgm)\n\n if (debug?.render && !gl.getProgramParameter(pgm, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(pgm)?.slice(0, -1)\n throw Error(`shader link failure; ${log}`)\n }\n\n gl.detachShader(pgm, frag)\n gl.detachShader(pgm, vert)\n gl.deleteShader(frag)\n gl.deleteShader(vert)\n\n return pgm\n}\n\nfunction compileShader(\n gl: GL2,\n type: 'FRAGMENT_SHADER' | 'VERTEX_SHADER',\n glsl: string\n): GLShader | null {\n const shader = gl.createShader(gl[type])\n if (!shader) return shader\n gl.shaderSource(shader, glsl.trim())\n gl.compileShader(shader)\n\n if (debug?.render && !gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader)?.slice(0, -1)\n throw Error(`shader compile failure; ${log}`)\n }\n\n return shader\n}\n", "export const spriteFragGLSL: string = `#version 300 es\n#pragma debug(${debug?.render ? 'on' : 'off'})\n#pragma optimize(${debug?.render ? 'off' : 'on'})\n\nprecision highp int;\nprecision highp float;\nprecision highp usampler2D;\n\nuniform sampler2D uTex;\nuniform uvec2 uTexWH;\n\nflat in uint vStretch;\nflat in ivec4 vTexXYWH;\nflat in uint vVisible;\nin vec2 vDstWH;\nflat in ivec2 vDstWHFixed;\n\nout vec4 oRGBA;\n\nvoid main() {\n if (vVisible == 0u || vDstWHFixed.x == 0 || vDstWHFixed.y == 0)\n discard;\n\n vec2 px = vec2(vTexXYWH.xy) + (\n vStretch == 1u ? (vDstWH * vec2(vTexXYWH.zw) / vec2(vDstWHFixed))\n : mod(vDstWH, vec2(vTexXYWH.zw))\n );\n\n oRGBA = texture(uTex, px / vec2(uTexWH));\n if(oRGBA.a < .001) discard;\n}\n`\n\nimport {debug} from '../utils/debug.ts'\n", "export const spriteVertGLSL: string = `#version 300 es\n#pragma debug(${debug?.render ? 'on' : 'off'})\n#pragma optimize(${debug?.render ? 'off' : 'on'})\n\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2\nprecision highp int;\nprecision highp float;\nprecision highp usampler2D;\n\nuniform ivec4 uCam;\nuniform usampler2D uCels;\nuniform float uAge;\n\nlayout (location=0) in ivec2 iUV;\nlayout (location=1) in uint iy8_x24;\nlayout (location=2) in uint iw8_sxyz_llll_y16;\nlayout (location=3) in uint ii11_c5_h12_w4;\nlayout (location=4) in uint r31_v;\n\nconst int maxY = 0x20000;\nconst int layers = 16;\nconst int maxDepth = maxY * layers;\n\nflat out uint vStretch;\nflat out ivec4 vTexXYWH;\nflat out uint vVisible;\nout vec2 vDstWH;\nflat out ivec2 vDstWHFixed;\n\nvoid main() {\n int x = int(floor(float(int((iy8_x24 & 0xffffffu) << 8) >> 8) / 64.));\n int y = int(floor(float(int(iy8_x24 >> 24) | (int(iw8_sxyz_llll_y16 & 0xffffu) << 16 >> 8)) / 64.));\n int z = int((iw8_sxyz_llll_y16 >> 16) & 0xfu);\n bool zend = bool(iw8_sxyz_llll_y16 & 0x100000u);\n bool flipY = bool(iw8_sxyz_llll_y16 & 0x200000u);\n bool flipX = bool(iw8_sxyz_llll_y16 & 0x400000u);\n bool stretch = bool(iw8_sxyz_llll_y16 & 0x800000u);\n int id = int((ii11_c5_h12_w4 >> 17) & 0x7ff0u); // ignore cel.\n int cel = int((ii11_c5_h12_w4 >> 16) & 0xfu); // ignore the MSB.\n int w = int(((ii11_c5_h12_w4 & 0xfu) << 8) | (iw8_sxyz_llll_y16 >> 24));\n int h = int((ii11_c5_h12_w4 >> 4) & 0xfffu);\n bool visible = bool(r31_v & 0x1u);\n\n // https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel\n float depth = float((${Layer.Top} - z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);\n\n ivec2 targetWH = iUV * ivec2(w, h);\n\n vec2 end = vec2(x + targetWH.x, y + targetWH.y);\n // UI layers are always given in screen coordinates.\n // to-do: how to handle non-int mode?\n vec2 camXY = z >= ${Layer.UIA} ? vec2(0, 0) : vec2(uCam.xy);\n vec2 clip = ((-2. * camXY + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);\n gl_Position = vec4(clip, depth, 1);\n\n int frame = (((int(uAge / ${celMillis}) & 0x1f) - cel) + ${animCels}) & 0xf;\n uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);\n vTexXYWH = ivec4(texXYWH);\n vVisible = uint(visible);\n\n vDstWH = vec2(targetWH * ivec2(flipX ? -1 : 1, flipY ? -1 : 1));\n vDstWHFixed = ivec2(w, h) * ivec2(flipX ? -1 : 1, flipY ? -1 : 1);\n\n vStretch = stretch ? 1u : 0u;\n}\n`\n\nimport {debug} from '../utils/debug.ts'\nimport {animCels, celMillis} from './atlas.ts'\nimport {Layer} from './layer.ts'\n", "import type {Pool} from '../mem/pool.ts'\nimport {type WH, whEq} from '../types/geo.ts'\nimport type {Millis} from '../types/time.ts'\nimport {debug} from '../utils/debug.ts'\nimport type {Atlas} from './atlas.ts'\nimport type {Cam} from './cam.ts'\nimport {type GL2, Shader} from './gl.ts'\nimport {drawableBytes, type Sprite} from './sprite.ts'\nimport {spriteFragGLSL} from './sprite-frag.glsl.ts'\nimport {spriteVertGLSL} from './sprite-vert.glsl.ts'\n\n/** @internal */\nexport type Context = {gl: GL2; spriteShader: Shader; viewport: WH}\n\nconst uv: Readonly<Int8Array> = new Int8Array([1, 1, 0, 1, 1, 0, 0, 0])\n\nexport class Renderer {\n /** when off, ents should avoid requesting renders. */\n always: boolean = debug?.render === 'always'\n /** number of clears performed. often used to count render passes. */\n clears: number = 0\n loseContext: WEBGL_lose_context | undefined\n readonly #canvas: HTMLCanvasElement\n #clearRGBA: number = 0\n #depth: boolean = true\n #ctx: Context | undefined\n #invalid: boolean = false\n readonly #looper: {readonly age: Millis}\n readonly #preloadAtlas: Readonly<Atlas>\n #preloadAtlasImage: Readonly<HTMLImageElement> | undefined\n\n constructor(\n preloadAtlas: Readonly<Atlas>,\n canvas: HTMLCanvasElement,\n looper: {readonly age: Millis}\n ) {\n this.#preloadAtlas = preloadAtlas\n this.#canvas = canvas\n this.#looper = looper\n }\n\n clear(rgba: number): void {\n if (!this.#ctx) return\n const {gl} = this.#ctx\n if (this.#clearRGBA !== rgba) {\n this.#clearRGBA = rgba\n gl.clearColor(\n ((rgba >>> 24) & 0xff) / 0xff,\n ((rgba >>> 16) & 0xff) / 0xff,\n ((rgba >>> 8) & 0xff) / 0xff,\n ((rgba >>> 0) & 0xff) / 0xff\n )\n }\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)\n this.clears++\n }\n\n draw(pool: Readonly<Pool<Sprite>>): void {\n if (!this.#preloadAtlasImage || !this.#ctx) return\n const {gl, spriteShader} = this.#ctx\n\n gl.bindBuffer(gl.ARRAY_BUFFER, spriteShader.buffer)\n gl.bufferData(\n gl.ARRAY_BUFFER,\n pool.view,\n gl.DYNAMIC_DRAW,\n 0,\n pool.size * drawableBytes\n )\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n gl.bindVertexArray(spriteShader.vao)\n gl.drawArraysInstanced(\n gl.TRIANGLE_STRIP,\n 0,\n uv.length / 2, // d\n pool.size\n )\n gl.bindVertexArray(null)\n\n if (debug?.render) {\n const err = gl.getError()\n if (err !== gl.NO_ERROR)\n console.error(`[render] GL error x${err.toString(16)}`)\n }\n\n this.#invalid = false\n }\n\n get hasContext(): boolean {\n return this.#ctx != null\n }\n\n /**\n * true when context has changed since last draw and screen should be redrawn.\n */\n get invalid(): boolean {\n return this.#invalid || this.always\n }\n\n load(preloadAtlas: Readonly<HTMLImageElement> | undefined): void {\n this.#preloadAtlasImage = preloadAtlas\n this.#ctx = this._Context()\n }\n\n predraw(cam: Readonly<Cam>): void {\n if (!this.#ctx) return\n const {gl, spriteShader, viewport} = this.#ctx\n\n if (!whEq(viewport, cam)) {\n gl.viewport(0, 0, cam.w, cam.h)\n viewport.w = cam.w\n viewport.h = cam.h\n }\n\n gl.useProgram(spriteShader.program)\n\n gl.uniform4i(\n spriteShader.uniform.uCam!,\n Math.floor(cam.x),\n Math.floor(cam.y),\n cam.w,\n cam.h\n )\n gl.uniform1f(spriteShader.uniform.uAge!, this.#looper.age)\n\n for (const [i, tex] of spriteShader.textures.entries()) {\n gl.activeTexture(gl.TEXTURE0 + i)\n gl.bindTexture(gl.TEXTURE_2D, tex)\n }\n }\n\n register(op: 'add' | 'remove'): this {\n this.#canvas[`${op}EventListener`]('webglcontextlost', this.#onContextLost)\n this.#canvas[`${op}EventListener`](\n 'webglcontextrestored',\n this.#onContextRestored\n )\n return this\n }\n\n setDepth(enable: boolean): void {\n this.#depth = enable\n if (!this.#ctx) return\n if (enable) this.#ctx.gl.enable(this.#ctx.gl.DEPTH_TEST)\n else this.#ctx.gl.disable(this.#ctx.gl.DEPTH_TEST)\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n /** @internal */\n _Context(): Context | undefined {\n const gl = this.#ctx?.gl ?? GL2(this.#canvas, this.always)\n if (!gl) return\n\n const shader = Shader(gl, spriteVertGLSL, spriteFragGLSL, [\n gl.createTexture(),\n gl.createTexture()\n ])\n\n // allow translucent textures to be layered.\n gl.enable(gl.BLEND)\n gl.blendFuncSeparate(\n gl.SRC_ALPHA,\n gl.ONE_MINUS_SRC_ALPHA,\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA\n )\n\n this.setDepth(this.#depth)\n\n // enable z-buffer for [0, 1] ([foreground, background]).\n gl.depthRange(0, 1)\n gl.clearDepth(1)\n gl.depthFunc(gl.LESS)\n\n // disable image colorspace conversions. the default is browser dependent.\n gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, false)\n\n gl.bindVertexArray(shader.vao)\n\n gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer())\n gl.bufferData(gl.ARRAY_BUFFER, uv, gl.STATIC_DRAW)\n gl.enableVertexAttribArray(0)\n gl.vertexAttribIPointer(0, 2, gl.BYTE, 0, 0)\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n gl.bindBuffer(gl.ARRAY_BUFFER, shader.buffer)\n gl.enableVertexAttribArray(1)\n gl.vertexAttribIPointer(1, 1, gl.UNSIGNED_INT, drawableBytes, 0)\n gl.vertexAttribDivisor(1, 1)\n gl.enableVertexAttribArray(2)\n gl.vertexAttribIPointer(2, 1, gl.UNSIGNED_INT, drawableBytes, 4)\n gl.vertexAttribDivisor(2, 1)\n gl.enableVertexAttribArray(3)\n gl.vertexAttribIPointer(3, 1, gl.UNSIGNED_INT, drawableBytes, 8)\n gl.vertexAttribDivisor(3, 1)\n gl.enableVertexAttribArray(4)\n gl.vertexAttribIPointer(4, 1, gl.UNSIGNED_INT, drawableBytes, 12)\n gl.vertexAttribDivisor(4, 1)\n gl.bindBuffer(gl.ARRAY_BUFFER, null)\n\n gl.bindTexture(gl.TEXTURE_2D, shader.textures[0]!)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n if (this.#preloadAtlasImage)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n this.#preloadAtlasImage\n )\n gl.bindTexture(gl.TEXTURE_2D, null)\n\n gl.bindTexture(gl.TEXTURE_2D, shader.textures[1]!)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA16UI, // source XYWH cannot be > 65535.\n 1,\n this.#preloadAtlas.celXYWH.length / 4, // 4 u16s per row\n 0,\n gl.RGBA_INTEGER,\n gl.UNSIGNED_SHORT,\n new Uint16Array(this.#preloadAtlas.celXYWH)\n )\n gl.bindTexture(gl.TEXTURE_2D, null)\n\n gl.bindVertexArray(null)\n\n gl.uniform1i(shader.uniform.uTex!, 0)\n gl.uniform1i(shader.uniform.uCels!, 1)\n if (this.#preloadAtlasImage)\n gl.uniform2ui(\n shader.uniform.uTexWH!,\n this.#preloadAtlasImage.naturalWidth,\n this.#preloadAtlasImage.naturalHeight\n )\n\n if (!this.#invalid && debug?.invalid)\n console.debug('[invalid] renderer invalid')\n this.#invalid = true\n // keep outside of #context so it can be restored.\n this.loseContext = gl.getExtension('WEBGL_lose_context') ?? undefined\n return (this.#ctx = {gl, spriteShader: shader, viewport: {w: 0, h: 0}})\n }\n\n #onContextLost = (ev: Event): void => {\n ev.preventDefault() // required.\n console.debug('[render] GL context lost')\n this.#ctx = undefined\n }\n\n #onContextRestored = (): void => {\n console.debug('[render] GL context restored')\n this.#ctx = this._Context()\n }\n}\n\nfunction GL2(canvas: HTMLCanvasElement, always: boolean): GL2 | undefined {\n const gl = canvas.getContext('webgl2', {\n // to-do: expose with Int / Frac mode.\n antialias: false,\n powerPreference: 'low-power',\n // avoid flicker caused by clearing the drawing buffer. see\n // https://developer.chrome.com/blog/desynchronized/.\n preserveDrawingBuffer: true,\n // disable desync in debug since it breaks FPS meter. only enable\n // when canvas is known to draw next frame.\n ...(!debug?.render && {desynchronized: always})\n })\n if (!gl) {\n console.debug('[render] no GL context')\n return\n }\n\n if (debug?.render && !gl.getContextAttributes()?.desynchronized)\n console.debug('[render] no GL DOM desynchronization')\n\n return gl\n}\n", "import type {Millis} from './types/time.ts'\n\n/**\n * frame manager. passes frame requests when not hidden. callers should request\n * frames when an update occurs or a check for an update occurs. eg, gamepads\n * must be polled.\n *\n * when registered, restoring visibility triggers an automatic request.\n */\nexport class Looper {\n /** duration of frames observed. */\n age: Millis = 0\n onFrame: ((millis: Millis) => void) | undefined\n #req: number = 0\n #registered: boolean = false\n #start: Millis = 0\n\n register(op: 'add' | 'remove'): this {\n const fn = `${op}EventListener` as const\n document[fn]('visibilitychange', this.#onVisibility)\n if (op === 'remove') this.#cancel()\n // try to let user drive initial frame since assets may be loading.\n this.#registered = op === 'add'\n return this\n }\n\n requestFrame(): void {\n if (this.#req || document.hidden || !this.#registered) return\n this.#start = performance.now()\n this.#req = requestAnimationFrame(this.#onFrame)\n }\n\n [Symbol.dispose](): void {\n this.register('remove')\n }\n\n #cancel(): void {\n if (this.#req) cancelAnimationFrame(this.#req)\n this.#req = 0\n }\n\n #onFrame = (): void => {\n const now = performance.now()\n const millis = (now - this.#start) as Millis\n this.age = now\n this.#req = 0\n this.onFrame?.(millis)\n }\n\n #onVisibility = (ev: Event): void => {\n if (!ev.isTrusted) return\n if (document.hidden) this.#cancel()\n else this.requestFrame()\n }\n}\n", "import type {LoaderEnt} from './ents/loader.ts'\nimport type {Sys} from './ents/sys.ts'\nimport {Zoo} from './ents/zoo.ts'\nimport type {Atlas} from './graphics/atlas.ts'\nimport {parseAtlas} from './graphics/atlas-parser.ts'\nimport {Cam} from './graphics/cam.ts'\nimport {PixelRatioObserver} from './graphics/pixel-ratio-observer.ts'\nimport {Renderer} from './graphics/renderer.ts'\nimport type {Sprite} from './graphics/sprite.ts'\nimport {Input} from './input/input.ts'\nimport {Looper} from './looper.ts'\nimport type {PoolOpts} from './mem/pool.ts'\nimport type {PoolMap} from './mem/pool-map.ts'\nimport {SpritePool} from './mem/sprite-pool.ts'\nimport {Random} from './random/random.ts'\nimport type {GameConfig} from './types/game-config.ts'\nimport type {Millis, Secs} from './types/time.ts'\nimport {initCanvas} from './utils/canvas-util.ts'\nimport {parseComputedColor} from './utils/color-util.ts'\nimport {DelayInterval} from './utils/delay-interval.ts'\nimport {initBody, initMetaViewport} from './utils/dom-util.ts'\nimport {loadImage} from './utils/fetch-util.ts'\n\nexport type VoidOpts = {\n canvas?: HTMLCanvasElement | null\n config: GameConfig\n description?: string\n loader: LoaderEnt\n loaderSys: Sys\n preloadAtlas?: HTMLImageElement | null\n random?: Random\n sprites?: Partial<Omit<PoolOpts<Sprite>, 'alloc' | 'allocBytes'>>\n}\n\nexport class Void {\n readonly cam: Cam = new Cam()\n readonly canvas: HTMLCanvasElement\n readonly input: Input\n readonly looper: Looper = new Looper()\n readonly pool: PoolMap\n readonly preload: Atlas\n readonly random: Random\n readonly renderer: Renderer\n /** delta since frame request. */\n readonly tick: {ms: Millis; s: Secs} = {ms: 0, s: 0}\n readonly zoo: Zoo = new Zoo()\n readonly #backgroundRGBA: number\n #invalid: boolean = false\n readonly #pixelRatioObserver: PixelRatioObserver = new PixelRatioObserver()\n #poller: DelayInterval | undefined\n readonly #preloadAtlasImage: HTMLImageElement | undefined\n #registered: boolean = false\n /** may trigger an initial force update. */\n readonly #resizeObserver = new ResizeObserver(() => this.onResize())\n\n constructor(opts: Readonly<VoidOpts>) {\n initMetaViewport(opts.description)\n this.canvas = initCanvas(opts.canvas, opts.config.init.mode)\n if (!this.canvas.parentElement) throw Error('no canvas parent')\n this.#backgroundRGBA =\n opts.config.init.background ??\n parseComputedColor(\n getComputedStyle(this.canvas.parentElement).backgroundColor\n )\n if (!opts.canvas) initBody(this.#backgroundRGBA)\n\n this.cam.minWH = opts.config.init.minWH\n this.cam.mode = opts.config.init.mode\n this.cam.update(this.canvas)\n\n this.random = opts.random ?? new Random(Date.now())\n\n this.input = new Input(this.cam, this.canvas)\n if (opts.config.init.input !== 'Custom') this.input.mapDefault()\n this.input.onEvent = () => this.onEvent()\n\n this.#pixelRatioObserver.onChange = () => this.onResize()\n\n this.#preloadAtlasImage = opts.preloadAtlas ?? undefined\n if (!!this.#preloadAtlasImage !== !!opts.config.atlas)\n throw Error('atlas misconfigured')\n\n this.preload = opts.config.atlas\n ? parseAtlas(opts.config.atlas)\n : {anim: {}, celXYWH: [], tags: []}\n\n this.renderer = new Renderer(this.preload ?? {}, this.canvas, this.looper)\n\n this.pool = {\n default: SpritePool({\n atlas: this.preload,\n looper: this.looper,\n minPages: opts.sprites?.minPages ?? 3,\n pageBlocks: opts.sprites?.pageBlocks ?? 1000\n })\n }\n\n this.looper.onFrame = millis => this.onFrame(millis)\n\n this.zoo.addSystem({loader: opts.loaderSys})\n this.zoo.add(opts.loader)\n }\n\n alloc(k: keyof PoolMap = 'default'): Sprite {\n return this.pool[k].alloc()\n }\n\n get backgroundRGBA(): number {\n return this.#backgroundRGBA\n }\n\n /**\n * invalid state only impacts drawing in the current frame not requesting a\n * new frame.\n */\n get invalid(): boolean {\n return (\n this.zoo.invalid ||\n this.cam.invalid ||\n this.renderer.invalid ||\n this.#invalid\n )\n }\n\n set invalid(invalid: true) {\n this.#invalid = invalid\n }\n\n onEvent(): void {\n this.requestFrame('Force')\n }\n\n /** update input, update canvas, update cam, update world, then render. */\n onFrame(millis: Millis): void {\n this.tick.ms = millis\n this.tick.s = (millis / 1000) as Secs\n if (document.hidden) return\n this.input.update(millis)\n\n this.requestFrame() // request frame before in case update cancels.\n\n this.#invalid = false\n this.zoo.update(this)\n\n this.cam.postupdate()\n }\n\n onPoll(): void {\n this.requestFrame('Force')\n }\n\n onResize(): void {\n this.requestFrame('Force') // force cam reeval.\n }\n\n // to-do: clear.\n setPoller(period: Millis, delay?: () => Millis): void {\n if (this.#poller) this.#poller.register('remove')\n this.#poller = new DelayInterval(delay ?? (() => 0), period, () =>\n this.onPoll()\n )\n if (this.#registered) this.#poller.register('add')\n }\n\n async register(op: 'add' | 'remove'): Promise<void> {\n this.input.register(op)\n this.renderer.register(op)\n this.looper.register(op)\n if (op === 'add') this.#resizeObserver.observe(this.canvas.parentElement!)\n else this.#resizeObserver.unobserve(this.canvas.parentElement!)\n this.#pixelRatioObserver.register(op)\n\n if (op === 'add') this.looper.requestFrame()\n this.#poller?.register(op)\n\n if (this.#preloadAtlasImage) await loadImage(this.#preloadAtlasImage)\n this.renderer.load(this.#preloadAtlasImage)\n this.#registered = op === 'add'\n }\n\n requestFrame(force?: 'Force'): void {\n if (force || this.renderer.always || this.input.anyOn || this.input.gamepad)\n this.looper.requestFrame()\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.register('remove')\n }\n}\n", "{\n \"author\": \"oidoid\",\n \"background_color\": \"#e6e6e6\",\n \"description\": \"void 2D game library demo.\",\n \"display\": \"standalone\",\n \"homepage_url\": \"https://oidoid.com/\",\n \"icons\": [\n {\n \"src\": \"../../../dist/public/favicon/favicon16.webp\",\n \"sizes\": \"16x16\",\n \"type\": \"image/webp\"\n },\n {\n \"src\": \"../../../dist/public/favicon/favicon32.webp\",\n \"sizes\": \"32x32\",\n \"type\": \"image/webp\"\n },\n {\n \"src\": \"../../../dist/public/favicon/favicon48.webp\",\n \"sizes\": \"48x48\",\n \"type\": \"image/webp\"\n },\n {\n \"src\": \"../../../dist/public/favicon/favicon64.webp\",\n \"sizes\": \"64x64\",\n \"type\": \"image/webp\"\n },\n {\n \"src\": \"../../../dist/public/favicon/favicon192.webp\",\n \"sizes\": \"192x192\",\n \"type\": \"image/webp\"\n }\n ],\n \"manifest_version\": 3,\n \"name\": \"void\",\n \"orientation\": \"any\",\n \"short_name\": \"void\",\n \"start_url\": \"https://oidoid.com/\",\n \"theme_color\": \"#e6e6e6\",\n \"version\": \"0.0.0\"\n}\n", "{\n \"atlas\": {\n \"anim\": {\n \"background--OrangeCheckerboard\": {\"cels\": 1, \"h\": 2, \"id\": 0, \"w\": 2},\n \"background--GreyCheckerboard\": {\"cels\": 1, \"h\": 2, \"id\": 1, \"w\": 2},\n \"background--Kiwi\": {\"cels\": 1, \"h\": 2, \"id\": 2, \"w\": 2},\n \"background--Strawberry\": {\"cels\": 1, \"h\": 2, \"id\": 3, \"w\": 2},\n \"background--Grape\": {\"cels\": 1, \"h\": 2, \"id\": 4, \"w\": 2},\n \"background--Blueberry\": {\"cels\": 1, \"h\": 2, \"id\": 5, \"w\": 2},\n \"background--Bubblegum\": {\"cels\": 1, \"h\": 2, \"id\": 6, \"w\": 2},\n \"background--Transparent\": {\"cels\": 1, \"h\": 2, \"id\": 7, \"w\": 2},\n \"background--Black\": {\"cels\": 1, \"h\": 2, \"id\": 8, \"w\": 2},\n \"backpacker--WalkRight\": {\n \"cels\": 16,\n \"h\": 13,\n \"hitbox\": {\"x\": 2, \"y\": 0, \"w\": 4, \"h\": 4},\n \"id\": 9,\n \"w\": 8\n },\n \"backpacker--WalkDown\": {\n \"cels\": 16,\n \"h\": 13,\n \"hitbox\": {\"x\": 2, \"y\": 0, \"w\": 4, \"h\": 4},\n \"id\": 10,\n \"w\": 8\n },\n \"backpacker--WalkUp\": {\n \"cels\": 16,\n \"h\": 13,\n \"hitbox\": {\"x\": 2, \"y\": 0, \"w\": 4, \"h\": 4},\n \"id\": 11,\n \"w\": 8\n },\n \"cursor--Pointer\": {\n \"cels\": 1,\n \"h\": 14,\n \"hitbox\": {\"x\": 0, \"y\": 0, \"w\": 2, \"h\": 2},\n \"hurtbox\": {\"x\": 0, \"y\": 0, \"w\": 2, \"h\": 2},\n \"id\": 12,\n \"w\": 8\n },\n \"mem-prop-5x6--00\": {\"cels\": 1, \"h\": 6, \"id\": 13, \"w\": 5},\n \"mem-prop-5x6--01\": {\"cels\": 1, \"h\": 6, \"id\": 14, \"w\": 5},\n \"mem-prop-5x6--02\": {\"cels\": 1, \"h\": 6, \"id\": 15, \"w\": 5},\n \"mem-prop-5x6--03\": {\"cels\": 1, \"h\": 6, \"id\": 16, \"w\": 5},\n \"mem-prop-5x6--04\": {\"cels\": 1, \"h\": 6, \"id\": 17, \"w\": 5},\n \"mem-prop-5x6--05\": {\"cels\": 1, \"h\": 6, \"id\": 18, \"w\": 5},\n \"mem-prop-5x6--06\": {\"cels\": 1, \"h\": 6, \"id\": 19, \"w\": 5},\n \"mem-prop-5x6--07\": {\"cels\": 1, \"h\": 6, \"id\": 20, \"w\": 5},\n \"mem-prop-5x6--08\": {\"cels\": 1, \"h\": 6, \"id\": 21, \"w\": 5},\n \"mem-prop-5x6--09\": {\"cels\": 1, \"h\": 6, \"id\": 22, \"w\": 5},\n \"mem-prop-5x6--0a\": {\"cels\": 1, \"h\": 6, \"id\": 23, \"w\": 5},\n \"mem-prop-5x6--0b\": {\"cels\": 1, \"h\": 6, \"id\": 24, \"w\": 5},\n \"mem-prop-5x6--0c\": {\"cels\": 1, \"h\": 6, \"id\": 25, \"w\": 5},\n \"mem-prop-5x6--0d\": {\"cels\": 1, \"h\": 6, \"id\": 26, \"w\": 5},\n \"mem-prop-5x6--0e\": {\"cels\": 1, \"h\": 6, \"id\": 27, \"w\": 5},\n \"mem-prop-5x6--0f\": {\"cels\": 1, \"h\": 6, \"id\": 28, \"w\": 5},\n \"mem-prop-5x6--10\": {\"cels\": 1, \"h\": 6, \"id\": 29, \"w\": 5},\n \"mem-prop-5x6--11\": {\"cels\": 1, \"h\": 6, \"id\": 30, \"w\": 5},\n \"mem-prop-5x6--12\": {\"cels\": 1, \"h\": 6, \"id\": 31, \"w\": 5},\n \"mem-prop-5x6--13\": {\"cels\": 1, \"h\": 6, \"id\": 32, \"w\": 5},\n \"mem-prop-5x6--14\": {\"cels\": 1, \"h\": 6, \"id\": 33, \"w\": 5},\n \"mem-prop-5x6--15\": {\"cels\": 1, \"h\": 6, \"id\": 34, \"w\": 5},\n \"mem-prop-5x6--16\": {\"cels\": 1, \"h\": 6, \"id\": 35, \"w\": 5},\n \"mem-prop-5x6--17\": {\"cels\": 1, \"h\": 6, \"id\": 36, \"w\": 5},\n \"mem-prop-5x6--18\": {\"cels\": 1, \"h\": 6, \"id\": 37, \"w\": 5},\n \"mem-prop-5x6--19\": {\"cels\": 1, \"h\": 6, \"id\": 38, \"w\": 5},\n \"mem-prop-5x6--1a\": {\"cels\": 1, \"h\": 6, \"id\": 39, \"w\": 5},\n \"mem-prop-5x6--1b\": {\"cels\": 1, \"h\": 6, \"id\": 40, \"w\": 5},\n \"mem-prop-5x6--1c\": {\"cels\": 1, \"h\": 6, \"id\": 41, \"w\": 5},\n \"mem-prop-5x6--1d\": {\"cels\": 1, \"h\": 6, \"id\": 42, \"w\": 5},\n \"mem-prop-5x6--1e\": {\"cels\": 1, \"h\": 6, \"id\": 43, \"w\": 5},\n \"mem-prop-5x6--1f\": {\"cels\": 1, \"h\": 6, \"id\": 44, \"w\": 5},\n \"mem-prop-5x6--20\": {\"cels\": 1, \"h\": 6, \"id\": 45, \"w\": 5},\n \"mem-prop-5x6--21\": {\"cels\": 1, \"h\": 6, \"id\": 46, \"w\": 5},\n \"mem-prop-5x6--22\": {\"cels\": 1, \"h\": 6, \"id\": 47, \"w\": 5},\n \"mem-prop-5x6--23\": {\"cels\": 1, \"h\": 6, \"id\": 48, \"w\": 5},\n \"mem-prop-5x6--24\": {\"cels\": 1, \"h\": 6, \"id\": 49, \"w\": 5},\n \"mem-prop-5x6--25\": {\"cels\": 1, \"h\": 6, \"id\": 50, \"w\": 5},\n \"mem-prop-5x6--26\": {\"cels\": 1, \"h\": 6, \"id\": 51, \"w\": 5},\n \"mem-prop-5x6--27\": {\"cels\": 1, \"h\": 6, \"id\": 52, \"w\": 5},\n \"mem-prop-5x6--28\": {\"cels\": 1, \"h\": 6, \"id\": 53, \"w\": 5},\n \"mem-prop-5x6--29\": {\"cels\": 1, \"h\": 6, \"id\": 54, \"w\": 5},\n \"mem-prop-5x6--2a\": {\"cels\": 1, \"h\": 6, \"id\": 55, \"w\": 5},\n \"mem-prop-5x6--2b\": {\"cels\": 1, \"h\": 6, \"id\": 56, \"w\": 5},\n \"mem-prop-5x6--2c\": {\"cels\": 1, \"h\": 6, \"id\": 57, \"w\": 5},\n \"mem-prop-5x6--2d\": {\"cels\": 1, \"h\": 6, \"id\": 58, \"w\": 5},\n \"mem-prop-5x6--2e\": {\"cels\": 1, \"h\": 6, \"id\": 59, \"w\": 5},\n \"mem-prop-5x6--2f\": {\"cels\": 1, \"h\": 6, \"id\": 60, \"w\": 5},\n \"mem-prop-5x6--30\": {\"cels\": 1, \"h\": 6, \"id\": 61, \"w\": 5},\n \"mem-prop-5x6--31\": {\"cels\": 1, \"h\": 6, \"id\": 62, \"w\": 5},\n \"mem-prop-5x6--32\": {\"cels\": 1, \"h\": 6, \"id\": 63, \"w\": 5},\n \"mem-prop-5x6--33\": {\"cels\": 1, \"h\": 6, \"id\": 64, \"w\": 5},\n \"mem-prop-5x6--34\": {\"cels\": 1, \"h\": 6, \"id\": 65, \"w\": 5},\n \"mem-prop-5x6--35\": {\"cels\": 1, \"h\": 6, \"id\": 66, \"w\": 5},\n \"mem-prop-5x6--36\": {\"cels\": 1, \"h\": 6, \"id\": 67, \"w\": 5},\n \"mem-prop-5x6--37\": {\"cels\": 1, \"h\": 6, \"id\": 68, \"w\": 5},\n \"mem-prop-5x6--38\": {\"cels\": 1, \"h\": 6, \"id\": 69, \"w\": 5},\n \"mem-prop-5x6--39\": {\"cels\": 1, \"h\": 6, \"id\": 70, \"w\": 5},\n \"mem-prop-5x6--3a\": {\"cels\": 1, \"h\": 6, \"id\": 71, \"w\": 5},\n \"mem-prop-5x6--3b\": {\"cels\": 1, \"h\": 6, \"id\": 72, \"w\": 5},\n \"mem-prop-5x6--3c\": {\"cels\": 1, \"h\": 6, \"id\": 73, \"w\": 5},\n \"mem-prop-5x6--3d\": {\"cels\": 1, \"h\": 6, \"id\": 74, \"w\": 5},\n \"mem-prop-5x6--3e\": {\"cels\": 1, \"h\": 6, \"id\": 75, \"w\": 5},\n \"mem-prop-5x6--3f\": {\"cels\": 1, \"h\": 6, \"id\": 76, \"w\": 5},\n \"mem-prop-5x6--40\": {\"cels\": 1, \"h\": 6, \"id\": 77, \"w\": 5},\n \"mem-prop-5x6--41\": {\"cels\": 1, \"h\": 6, \"id\": 78, \"w\": 5},\n \"mem-prop-5x6--42\": {\"cels\": 1, \"h\": 6, \"id\": 79, \"w\": 5},\n \"mem-prop-5x6--43\": {\"cels\": 1, \"h\": 6, \"id\": 80, \"w\": 5},\n \"mem-prop-5x6--44\": {\"cels\": 1, \"h\": 6, \"id\": 81, \"w\": 5},\n \"mem-prop-5x6--45\": {\"cels\": 1, \"h\": 6, \"id\": 82, \"w\": 5},\n \"mem-prop-5x6--46\": {\"cels\": 1, \"h\": 6, \"id\": 83, \"w\": 5},\n \"mem-prop-5x6--47\": {\"cels\": 1, \"h\": 6, \"id\": 84, \"w\": 5},\n \"mem-prop-5x6--48\": {\"cels\": 1, \"h\": 6, \"id\": 85, \"w\": 5},\n \"mem-prop-5x6--49\": {\"cels\": 1, \"h\": 6, \"id\": 86, \"w\": 5},\n \"mem-prop-5x6--4a\": {\"cels\": 1, \"h\": 6, \"id\": 87, \"w\": 5},\n \"mem-prop-5x6--4b\": {\"cels\": 1, \"h\": 6, \"id\": 88, \"w\": 5},\n \"mem-prop-5x6--4c\": {\"cels\": 1, \"h\": 6, \"id\": 89, \"w\": 5},\n \"mem-prop-5x6--4d\": {\"cels\": 1, \"h\": 6, \"id\": 90, \"w\": 5},\n \"mem-prop-5x6--4e\": {\"cels\": 1, \"h\": 6, \"id\": 91, \"w\": 5},\n \"mem-prop-5x6--4f\": {\"cels\": 1, \"h\": 6, \"id\": 92, \"w\": 5},\n \"mem-prop-5x6--50\": {\"cels\": 1, \"h\": 6, \"id\": 93, \"w\": 5},\n \"mem-prop-5x6--51\": {\"cels\": 1, \"h\": 6, \"id\": 94, \"w\": 5},\n \"mem-prop-5x6--52\": {\"cels\": 1, \"h\": 6, \"id\": 95, \"w\": 5},\n \"mem-prop-5x6--53\": {\"cels\": 1, \"h\": 6, \"id\": 96, \"w\": 5},\n \"mem-prop-5x6--54\": {\"cels\": 1, \"h\": 6, \"id\": 97, \"w\": 5},\n \"mem-prop-5x6--55\": {\"cels\": 1, \"h\": 6, \"id\": 98, \"w\": 5},\n \"mem-prop-5x6--56\": {\"cels\": 1, \"h\": 6, \"id\": 99, \"w\": 5},\n \"mem-prop-5x6--57\": {\"cels\": 1, \"h\": 6, \"id\": 100, \"w\": 5},\n \"mem-prop-5x6--58\": {\"cels\": 1, \"h\": 6, \"id\": 101, \"w\": 5},\n \"mem-prop-5x6--59\": {\"cels\": 1, \"h\": 6, \"id\": 102, \"w\": 5},\n \"mem-prop-5x6--5a\": {\"cels\": 1, \"h\": 6, \"id\": 103, \"w\": 5},\n \"mem-prop-5x6--5b\": {\"cels\": 1, \"h\": 6, \"id\": 104, \"w\": 5},\n \"mem-prop-5x6--5c\": {\"cels\": 1, \"h\": 6, \"id\": 105, \"w\": 5},\n \"mem-prop-5x6--5d\": {\"cels\": 1, \"h\": 6, \"id\": 106, \"w\": 5},\n \"mem-prop-5x6--5e\": {\"cels\": 1, \"h\": 6, \"id\": 107, \"w\": 5},\n \"mem-prop-5x6--5f\": {\"cels\": 1, \"h\": 6, \"id\": 108, \"w\": 5},\n \"mem-prop-5x6--60\": {\"cels\": 1, \"h\": 6, \"id\": 109, \"w\": 5},\n \"mem-prop-5x6--61\": {\"cels\": 1, \"h\": 6, \"id\": 110, \"w\": 5},\n \"mem-prop-5x6--62\": {\"cels\": 1, \"h\": 6, \"id\": 111, \"w\": 5},\n \"mem-prop-5x6--63\": {\"cels\": 1, \"h\": 6, \"id\": 112, \"w\": 5},\n \"mem-prop-5x6--64\": {\"cels\": 1, \"h\": 6, \"id\": 113, \"w\": 5},\n \"mem-prop-5x6--65\": {\"cels\": 1, \"h\": 6, \"id\": 114, \"w\": 5},\n \"mem-prop-5x6--66\": {\"cels\": 1, \"h\": 6, \"id\": 115, \"w\": 5},\n \"mem-prop-5x6--67\": {\"cels\": 1, \"h\": 6, \"id\": 116, \"w\": 5},\n \"mem-prop-5x6--68\": {\"cels\": 1, \"h\": 6, \"id\": 117, \"w\": 5},\n \"mem-prop-5x6--69\": {\"cels\": 1, \"h\": 6, \"id\": 118, \"w\": 5},\n \"mem-prop-5x6--6a\": {\"cels\": 1, \"h\": 6, \"id\": 119, \"w\": 5},\n \"mem-prop-5x6--6b\": {\"cels\": 1, \"h\": 6, \"id\": 120, \"w\": 5},\n \"mem-prop-5x6--6c\": {\"cels\": 1, \"h\": 6, \"id\": 121, \"w\": 5},\n \"mem-prop-5x6--6d\": {\"cels\": 1, \"h\": 6, \"id\": 122, \"w\": 5},\n \"mem-prop-5x6--6e\": {\"cels\": 1, \"h\": 6, \"id\": 123, \"w\": 5},\n \"mem-prop-5x6--6f\": {\"cels\": 1, \"h\": 6, \"id\": 124, \"w\": 5},\n \"mem-prop-5x6--70\": {\"cels\": 1, \"h\": 6, \"id\": 125, \"w\": 5},\n \"mem-prop-5x6--71\": {\"cels\": 1, \"h\": 6, \"id\": 126, \"w\": 5},\n \"mem-prop-5x6--72\": {\"cels\": 1, \"h\": 6, \"id\": 127, \"w\": 5},\n \"mem-prop-5x6--73\": {\"cels\": 1, \"h\": 6, \"id\": 128, \"w\": 5},\n \"mem-prop-5x6--74\": {\"cels\": 1, \"h\": 6, \"id\": 129, \"w\": 5},\n \"mem-prop-5x6--75\": {\"cels\": 1, \"h\": 6, \"id\": 130, \"w\": 5},\n \"mem-prop-5x6--76\": {\"cels\": 1, \"h\": 6, \"id\": 131, \"w\": 5},\n \"mem-prop-5x6--77\": {\"cels\": 1, \"h\": 6, \"id\": 132, \"w\": 5},\n \"mem-prop-5x6--78\": {\"cels\": 1, \"h\": 6, \"id\": 133, \"w\": 5},\n \"mem-prop-5x6--79\": {\"cels\": 1, \"h\": 6, \"id\": 134, \"w\": 5},\n \"mem-prop-5x6--7a\": {\"cels\": 1, \"h\": 6, \"id\": 135, \"w\": 5},\n \"mem-prop-5x6--7b\": {\"cels\": 1, \"h\": 6, \"id\": 136, \"w\": 5},\n \"mem-prop-5x6--7c\": {\"cels\": 1, \"h\": 6, \"id\": 137, \"w\": 5},\n \"mem-prop-5x6--7d\": {\"cels\": 1, \"h\": 6, \"id\": 138, \"w\": 5},\n \"mem-prop-5x6--7e\": {\"cels\": 1, \"h\": 6, \"id\": 139, \"w\": 5},\n \"mem-prop-5x6--7f\": {\"cels\": 1, \"h\": 6, \"id\": 140, \"w\": 5},\n \"oidoid--Default\": {\"cels\": 1, \"h\": 16, \"id\": 141, \"w\": 16}\n },\n \"celXY\": [\n 22, 37, 21, 27, 21, 29, 21, 31, 20, 33, 22, 33, 20, 35, 22, 35, 20, 37,\n 24, 26, 24, 26, 8, 16, 8, 16, 0, 16, 0, 16, 16, 14, 16, 14, 72, 13, 72,\n 13, 32, 26, 32, 26, 0, 16, 0, 16, 64, 13, 64, 13, 56, 13, 56, 13, 48, 13,\n 48, 13, 40, 13, 40, 13, 32, 13, 32, 13, 56, 13, 56, 13, 24, 13, 24, 13,\n 72, 0, 72, 0, 64, 0, 64, 0, 24, 0, 24, 0, 56, 0, 56, 0, 48, 0, 48, 0, 48,\n 0, 48, 0, 24, 0, 24, 0, 40, 0, 40, 0, 32, 0, 32, 0, 32, 0, 32, 0, 16, 0,\n 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56,\n 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56,\n 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56,\n 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 45, 56, 40, 56, 10, 53, 5, 53, 0,\n 53, 35, 51, 30, 51, 25, 51, 20, 51, 15, 51, 35, 45, 70, 50, 65, 50, 60,\n 50, 55, 50, 50, 50, 45, 50, 40, 50, 10, 47, 5, 47, 0, 47, 70, 62, 50, 56,\n 65, 62, 60, 62, 55, 62, 50, 62, 45, 62, 40, 62, 10, 59, 5, 59, 0, 59, 35,\n 57, 70, 32, 30, 57, 25, 57, 20, 57, 15, 57, 75, 56, 70, 56, 65, 56, 60,\n 56, 75, 50, 55, 56, 10, 35, 75, 32, 15, 33, 0, 35, 5, 35, 40, 38, 45, 38,\n 65, 32, 60, 32, 55, 32, 50, 32, 45, 32, 40, 26, 50, 26, 55, 26, 60, 26,\n 65, 26, 70, 26, 75, 26, 16, 27, 0, 29, 5, 29, 10, 29, 40, 32, 45, 26, 10,\n 41, 30, 45, 25, 45, 20, 45, 15, 45, 75, 44, 70, 44, 65, 44, 60, 44, 55,\n 44, 50, 44, 45, 44, 40, 44, 50, 38, 5, 41, 0, 41, 35, 39, 30, 39, 25, 39,\n 20, 39, 15, 39, 75, 38, 70, 38, 65, 38, 60, 38, 55, 38, 45, 56, 0, 0\n ]\n },\n \"init\": {\n \"input\": \"Default\",\n \"minWH\": {\"w\": 320, \"h\": 240},\n \"minScale\": 1,\n \"mode\": \"Int\",\n \"zoomOut\": 0\n }\n}\n", "{\n \"$schema\": \"../level/level-file.json\",\n \"ents\": [\n {\"name\": \"Debug\", \"debugInput\": true},\n\n {\"name\": \"Cam\", \"cam\": {}},\n\n {\n \"id\": \"Cursor\",\n \"sprite\": {\"tag\": \"cursor--Pointer\"},\n \"cursor\": {}\n },\n\n {\n \"name\": \"FPS\",\n \"fps\": true,\n \"text\": \"\",\n \"sprite\": {\"z\": \"UIA\"},\n \"textWH\": {\"trim\": \"Descender\"},\n \"hud\": {\"origin\": \"SE\", \"margin\": 4},\n \"textXY\": {},\n \"override\": {\"invalid\": false}\n },\n\n {\n \"name\": \"Overlay\",\n \"sprite\": {\n \"pool\": \"Overlay\",\n \"tag\": \"background--GreyCheckerboard\",\n \"w\": 4095,\n \"h\": 4095,\n \"z\": \"Top\"\n }\n },\n {\n \"id\": \"RenderToggle\",\n \"name\": \"RenderToggle\",\n \"text\": \"render\",\n \"sprite\": {\"z\": \"UID\"},\n \"textWH\": {\"pad\": 2, \"scale\": 2, \"trim\": \"Leading\"},\n \"hud\": {\"origin\": \"NE\", \"margin\": {\"n\": 2, \"e\": 2}},\n \"ninePatch\": {\n \"border\": 1,\n \"pad\": 2,\n \"patch\": {\n \"center\": \"background--Grape\",\n \"n\": \"background--Bubblegum\",\n \"s\": \"background--Kiwi\",\n \"w\": \"background--Strawberry\",\n \"e\": \"background--Blueberry\"\n }\n },\n \"button\": {\n \"pressed\": \"background--Bubblegum\",\n \"selected\": \"background--OrangeCheckerboard\",\n \"type\": \"Toggle\",\n \"z\": \"UIC\"\n },\n \"renderToggle\": {},\n \"textXY\": {\"z\": \"UIE\"}\n },\n {\n \"name\": \"Clock\",\n \"text\": \"\",\n \"sprite\": {\"z\": \"UIF\"},\n \"clock\": {},\n \"textWH\": {\"scale\": 2, \"trim\": \"Descender\"},\n \"hud\": {\"margin\": {\"y\": 4}, \"origin\": \"S\"},\n \"textXY\": {}\n },\n {\n \"name\": \"Logo\",\n \"sprite\": {\"tag\": \"oidoid--Default\", \"z\": \"UIF\"},\n \"hud\": {\"origin\": \"SW\", \"margin\": 4}\n },\n {\n \"name\": \"Border\",\n \"sprite\": {\"z\": \"UIG\"},\n \"hud\": {\"origin\": \"NW\", \"fill\": \"XY\"},\n \"ninePatch\": {\n \"patch\": {\n \"n\": \"background--Black\",\n \"s\": \"background--Black\",\n \"w\": \"background--Black\",\n \"e\": \"background--Black\",\n \"nw\": \"background--Black\",\n \"ne\": \"background--Black\",\n \"sw\": \"background--Black\",\n \"se\": \"background--Black\"\n },\n \"border\": 1\n }\n },\n\n {\n \"name\": \"Backpacker\",\n \"sprite\": {\n \"tag\": \"backpacker--WalkRight\",\n \"x\": 7,\n \"y\": 7,\n \"z\": \"C\",\n \"stretch\": true,\n \"scale\": 5\n }\n },\n\n {\n \"name\": \"Tally\",\n \"text\": \"\",\n \"sprite\": {\"z\": \"UIA\"},\n \"tally\": {},\n \"textWH\": {},\n \"hud\": {\"origin\": \"NE\", \"margin\": {\"n\": 4, \"e\": 60}},\n \"textXY\": {},\n \"override\": {\"invalid\": false}\n },\n\n {\"name\": \"Draw\", \"draw\": {}}\n ]\n}\n", "import * as V from '../../index.ts'\n\nexport function parseLevel(\n json: Readonly<V.LevelSchema>,\n pools: Readonly<V.PoolMap>,\n atlas: Readonly<V.Atlas>\n): V.Level {\n return V.parseLevel(json, pools, parseComponent, atlas)\n}\n\n/** @internal */\nexport const parseComponent: V.ComponentHook = (ent, json, k) => {\n if (json[k] == null) throw Error('no component val')\n switch (k) {\n case 'clock':\n return json[k] satisfies V.Ent[typeof k]\n case 'renderToggle':\n if (!ent.button) throw Error('no button in render toggle')\n V.buttonSetOn(ent as V.ButtonEnt, V.debug?.render === 'always')\n return json[k] satisfies V.Ent[typeof k]\n case 'tally':\n return {updates: 0} satisfies V.Ent[typeof k]\n }\n}\n", "import * as V from '../../index.ts'\n\nexport class CamSys implements V.Sys {\n readonly query = 'cam'\n\n update(_ent: V.CamEnt, v: V.Void): void {\n if (v.input.isAnyOnStart('U', 'D', 'L', 'R')) v.cam.diagonalize(v.input.dir)\n\n const len = V.truncDrawableEpsilon(25 * v.tick.s)\n if (v.input.isOn('U')) v.cam.y -= len\n if (v.input.isOn('D')) v.cam.y += len\n if (v.input.isOn('L')) v.cam.x -= len\n if (v.input.isOn('R')) v.cam.x += len\n\n if (v.input.wheel?.delta.xy.y)\n v.cam.zoomOut -= v.input.wheel.delta.client.y * 0.01\n\n v.cam.update(v.canvas)\n }\n}\n", "import * as V from '../../index.ts'\n\nexport type ClockEnt = V.SysEnt<ClockSys>\n\n/** writes to text, invalid. */\nexport class ClockSys implements V.Sys {\n readonly query = 'clock & text'\n\n update(ent: ClockEnt): void {\n V.textSetText(ent, timeString(new Date()))\n }\n}\n\n/** @internal */\nexport function timeString(time: Readonly<Date>): string {\n const hh = `${time.getHours() % 12 || 12}`.padStart(2, ' ')\n const mm = `${time.getMinutes()}`.padStart(2, '0')\n const ss = `${time.getSeconds()}`.padStart(2, '0')\n return `${hh}:${mm}:${ss}`\n}\n", "import type * as V from '../../index.ts'\n\nexport class DrawSys implements V.Sys {\n readonly query = 'draw'\n\n update(_ent: V.DrawEnt, v: V.Void): void {\n if (!v.invalid) return\n v.renderer.clear(v.backgroundRGBA)\n v.renderer.predraw(v.cam)\n v.renderer.setDepth(true)\n v.renderer.draw(v.pool.default)\n v.renderer.setDepth(false)\n v.renderer.draw(v.pool.overlay)\n }\n}\n", "import * as V from '../../index.ts'\n\nexport type RenderToggleEnt = V.SysEnt<RenderToggleSys>\n\nexport class RenderToggleSys implements V.Sys {\n readonly query = 'button & renderToggle & sprite'\n\n update(ent: RenderToggleEnt, v: V.Void): void {\n v.renderer.always = V.buttonOn(ent)\n }\n}\n", "import * as V from '../../index.ts'\n\nexport type TallyEnt = V.SysEnt<TallySys>\n\n/** writes to text, invalid. */\nexport class TallySys implements V.Sys {\n readonly query = 'tally & text'\n\n update(ent: TallyEnt, v: V.Void): void {\n ent.tally.updates++\n const text = [\n `${`${ent.tally.updates}`.padStart(8, ' ')} updates`,\n `${`${v.renderer.clears + 1}`.padStart(8, ' ')} renders`\n ].join('\\n')\n V.textSetText(ent, text)\n }\n}\n", "import * as V from '../../index.ts'\nimport levelJSON from '../assets/init.level.jsonc' with {type: 'json'}\nimport {parseLevel} from '../level/level-parser.ts'\nimport {CamSys} from './cam.ts'\nimport {ClockSys} from './clock.ts'\nimport {DrawSys} from './draw.ts'\nimport {RenderToggleSys} from './render-toggle.ts'\nimport {TallySys} from './tally.ts'\n\nexport class LoaderSys implements V.Sys {\n readonly query = 'loader'\n\n update(ent: V.LoaderEnt, v: V.Void): void {\n switch (ent.loader.level) {\n case undefined: {\n init(ent, v)\n return\n }\n case 'Init':\n return\n default:\n ent.loader.level satisfies never\n }\n }\n}\n\nfunction init(ent: V.LoaderEnt, v: V.Void): void {\n v.pool.overlay = V.SpritePool({\n atlas: v.preload,\n looper: v.looper,\n pageBlocks: 10\n })\n v.setPoller(((V.debug?.seconds ? 1 : 60) * 1000) as V.Millis, () =>\n V.millisUntilNext(new Date(), V.debug?.seconds ? 'Sec' : 'Min')\n )\n // to-do: move under Void helper methods and hide zoo? same for other APIs.\n v.zoo.addDefaultSystems()\n v.zoo.addSystem({\n cam: new CamSys(),\n clock: new ClockSys(),\n draw: new DrawSys(),\n renderToggle: new RenderToggleSys(),\n tally: new TallySys()\n })\n const level = parseLevel(levelJSON, v.pool, v.preload)\n // to-do: validate all ents on a system add.\n v.zoo.add(...level.ents)\n ent.loader.level = 'Init'\n}\n", "import * as V from '../index.ts'\nimport {description} from './assets/manifest.json' // non-standard import to treeshake.\nimport config from './assets/void.game.json' with {type: 'json'}\nimport {LoaderSys} from './ents/loader.ts'\n\nconsole.debug(\n `void v${V.bundle.version}+${V.bundle.published}.${V.bundle.hash} \u2500\u2500\u2500oidoid>\u00B0\u2500\u2500`\n)\n\nconst v = new V.Void({\n config: config as V.GameConfig,\n description,\n preloadAtlas: document.querySelector<HTMLImageElement>('#preload-atlas'),\n loader: {loader: {level: undefined}},\n loaderSys: new LoaderSys()\n})\nv.setPoller(((V.debug?.seconds ? 1 : 60) * 1000) as V.Millis, () =>\n V.millisUntilNext(new Date(), V.debug?.seconds ? 'Sec' : 'Min')\n)\nawait v.register('add')\nif (V.debug) (globalThis as {v?: V.Void}).v = v\n"],
|
|
5
|
+
"mappings": "AAAA,IAAAA,EAAA,CAAC,KAAO,UAAU,UAAY,WAAW,QAAU,OAAO,ECA1D,IAAAC,GAAA,CACI,GAAM,eACN,KAAQ,UACR,MAAS,EACT,MAAS,EACT,QAAW,EACX,MAAS,EACT,SAAY,EACZ,QAAW,CACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,GACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAO,EACP,KAAO,EACP,KAAO,EACP,KAAO,EACP,KAAO,EACP,KAAO,EACP,KAAO,EACP,KAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAQ,EACR,OAAQ,EACR,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,GAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,GACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,CACV,EACA,eAAkB,EAClB,yBAA4B,GAC5B,iBAAoB,EACpB,MAAS,CACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,EAAK,EACL,EAAK,EACL,IAAK,EACL,KAAM,EACN,IAAK,EACL,IAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,EAAK,EACL,IAAK,CACT,EACA,aAAgB,EAChB,SAAY,CACR,EAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,EAAK,GACL,KAAM,GACN,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,EACT,CACJ,ECnfO,IAAMC,EAAmBC,GCnFzB,IAAMC,EAAN,KAA+B,CAC3B,MAAQ,kBAEjB,KAAKC,EAAsB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AAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,GAAI,EAAK,CAAC,EACxD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,mBAAoB,CAAC,KAAQ,EAAG,EAAK,EAAG,GAAM,IAAK,EAAK,CAAC,EACzD,kBAAmB,CAAC,KAAQ,EAAG,EAAK,GAAI,GAAM,IAAK,EAAK,EAAE,CAC5D,EACA,MAAS,CACP,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACpE,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACpE,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACtE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACpE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GACtE,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EACtE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACpE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACpE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACpE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EACvE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACpE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GACtE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,GACtE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACpE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GACtE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACpE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAA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",
|
|
6
|
+
"names": ["define_globalThis_bundle_default", "mem_prop_5x6_default", "memProp5x6", "mem_prop_5x6_default", "ButtonSys", "ent", "buttonFree", "v", "button", "toggle", "hitsCursor", "on", "buttonOn", "buttonSetOn", "Layer", "isUILayer", "layer", "Layer", "boxAssign", "l", "r", "boxHits", "l", "r", "rWH", "lXY", "whEq", "l", "r", "xyAdd", "xyDistance", "from", "to", "xyMagnitude", "xySub", "xyMagnitude", "xy", "xyMax", "l", "r", "xyMin", "xySub", "mod", "dividend", "divisor", "drawableBytes", "drawableEpsilon", "drawableMaxWH", "Drawable", "#pool", "pool", "draw", "cel", "iiic_cccc", "box", "boxHits", "cam", "clipbox", "flip", "sxyz_llll", "h", "h12_wwww", "id", "i11_c5", "Layer", "stretch", "isUILayer", "visible", "rrrr_rrrv", "w", "hhhh_w12", "x", "y8_x24", "y", "sxyz_llll_y24", "z", "end", "Sprite", "_Sprite", "#atlas", "#hitbox", "#hurtbox", "#looper", "atlas", "looper", "dir", "diagonalize", "hitbox", "hurtbox", "sprite", "mod", "tag", "anim", "xy", "truncDrawableEpsilon", "CursorSys", "ent", "v", "onPoint", "updateBounds", "onKey", "input", "tick", "len", "truncDrawableEpsilon", "Layer", "point", "debug", "Debug", "url", "csv", "k", "map", "kv", "target", "voidKeyset", "DebutInputSys", "_ent", "v", "debug", "on", "combo", "set", "parseQuerySet", "query", "compareEn", "and", "l", "r", "FPSSys", "ent", "now", "HUDSys", "ent", "v", "follow", "boxAssign", "NinePatchSys", "ent", "ninePatchFree", "start", "getStart", "setXYStart", "setWH", "setXYEnd", "sprite", "ninePatch", "border", "pad", "patch", "w", "h", "end", "OverrideSys", "ent", "SpriteSys", "ent", "fontCharToTag", "font", "ch", "pt", "fontCharH", "fontKerning", "l", "r", "fontCharW", "layoutText", "opts", "chars", "scale", "start", "maxW", "cursor", "w", "trimmedLineH", "i", "ch", "layout", "layoutNewline", "layoutSpace", "tracking", "layoutWord", "nextLine", "font", "word", "index", "startX", "x", "y", "chH", "fontCharH", "span", "next", "fontCharW", "curY", "nextCursor", "trimmmedLineH", "l", "r", "fontKerning", "TextWHSys", "ent", "textSetWH", "TextXYSys", "sprite", "v", "textSetXY", "layout", "layoutText", "memProp5x6", "w", "h", "len", "i", "char", "fontCharToTag", "textSetText", "str", "Zoo", "#cursor", "#loader", "#ents", "#systems", "#invalid", "ents", "ent", "debug", "#validateQueries", "ButtonSys", "CursorSys", "DebutInputSys", "FPSSys", "HUDSys", "NinePatchSys", "OverrideSys", "SpriteSys", "TextWHSys", "TextXYSys", "systems", "query", "querySet", "parseQuerySet", "queryEnt", "id", "v", "k", "sys", "keys", "parseAtlas", "json", "parseCelXYWH", "cels", "anim", "parseXYWH", "celXY", "xywh", "ii", "iii", "Cam", "#devicePixelRatio", "#h", "#invalid", "#minScale", "#minWH", "#mode", "#scale", "#w", "#whClient", "#x", "#y", "#zoomOut", "xy", "client", "local", "dir", "diagonalize", "wh", "z", "origin", "opts", "x", "isUILayer", "y", "w", "h", "box", "boxHits", "scale", "#invalidateWH", "mode", "canvas", "clientWidth", "clientHeight", "out", "debug", "phy", "ContextMenu", "#target", "target", "op", "fn", "#onContextMenu", "ev", "Gamepad", "#target", "target", "op", "fn", "pad", "index", "axis", "lessMore", "bit", "btn", "Keyboard", "#on", "#target", "target", "bits", "k", "op", "fn", "ev", "#onKey", "pointTypeByPointerType", "pointEvents", "Pointer", "#pinchStartClient", "#target", "target", "min", "max", "pt", "xyMin", "xyMax", "bounds", "xyAdd", "end", "#newPinchClient", "xySub", "op", "fn", "ev", "#onInput", "#evButtonsToBits", "btns", "bits", "btn", "locked", "prevPt", "xyClient", "scale", "evType", "type", "clickClient", "drag", "xyDistance", "Wheel", "#target", "target", "op", "#onInput", "ev", "Input", "#bitByButton", "#buttonByBit", "#bits", "#cam", "#combo", "#contextMenu", "#dir", "#gamepad", "#heldMillis", "#keyboard", "#pointer", "#pointerState", "#prevBits", "#wheel", "#wheelState", "cam", "target", "ContextMenu", "Gamepad", "Keyboard", "Pointer", "Wheel", "chords", "bits", "chord", "bit", "btns", "#mapBits", "combo", "less", "more", "axes", "axis", "#mapButton", "btn", "indices", "index", "codes", "code", "clicks", "click", "on", "hook", "op", "millis", "pinchClient", "dragOn", "secondary", "pt", "centerClient", "center", "isRecord", "v", "uncapitalize", "str", "parseLevel", "json", "pools", "hook", "atlas", "ent", "parseEnt", "parseWH", "parseBorder", "w", "parseButton", "pressed", "parseSprite", "Layer", "selected", "parseCursor", "_k", "k", "parseEntComponent", "parseFPS", "parseHUD", "parseNinePatch", "parseOverride", "parseTextWH", "parseTextXY", "_json", "parseXY", "patch", "border", "ninePatch", "isRecord", "pool", "uncapitalize", "sprite", "drawableMaxWH", "Pool", "#blocks", "#opts", "#size", "#u8", "#view", "opts", "initSize", "#resize", "#currentCapacity", "block", "minCapacity", "start", "free", "str", "capacity", "origin", "debug", "i", "buffer", "u8", "SpritePool", "opts", "Pool", "pool", "Sprite", "sprite", "drawableBytes", "Random", "#seed", "seed", "bundle", "define_globalThis_bundle_default", "millisUntilNext", "time", "next", "rgbaHex", "rgba", "parseComputedColor", "r", "g", "b", "a", "initBody", "rgba", "rgbaHex", "initMetaViewport", "description", "viewport", "desc", "initCanvas", "canvas", "mode", "main", "DelayInterval", "#delay", "#interval", "#intervalID", "#onInterval", "#timerID", "delay", "interval", "onInterval", "op", "loadImage", "img", "promise", "fulfil", "reject", "PixelRatioObserver", "#mediaQuery", "op", "#onChange", "Shader", "gl", "vertGLSL", "fragGLSL", "textures", "program", "loadProgram", "GLUniformMap", "pgm", "len", "map", "debug", "target", "k", "i", "uniform", "location", "name", "vert", "compileShader", "frag", "log", "type", "glsl", "shader", "spriteFragGLSL", "debug", "spriteVertGLSL", "debug", "Layer", "uv", "Renderer", "debug", "#canvas", "#clearRGBA", "#depth", "#ctx", "#invalid", "#looper", "#preloadAtlas", "#preloadAtlasImage", "preloadAtlas", "canvas", "looper", "rgba", "gl", "pool", "spriteShader", "drawableBytes", "err", "cam", "viewport", "whEq", "i", "tex", "op", "#onContextLost", "#onContextRestored", "enable", "GL2", "shader", "Shader", "spriteVertGLSL", "spriteFragGLSL", "ev", "always", "Looper", "#req", "#registered", "#start", "op", "fn", "#onVisibility", "#cancel", "#onFrame", "now", "millis", "ev", "Void", "Cam", "Looper", "Zoo", "#backgroundRGBA", "#invalid", "#pixelRatioObserver", "PixelRatioObserver", "#poller", "#preloadAtlasImage", "#registered", "#resizeObserver", "opts", "initMetaViewport", "initCanvas", "parseComputedColor", "initBody", "Random", "Input", "parseAtlas", "Renderer", "SpritePool", "millis", "k", "invalid", "period", "delay", "DelayInterval", "op", "loadImage", "force", "description", "void_game_default", "init_level_default", "parseLevel", "json", "pools", "atlas", "parseComponent", "ent", "k", "buttonSetOn", "debug", "CamSys", "_ent", "v", "len", "truncDrawableEpsilon", "ClockSys", "ent", "textSetText", "timeString", "time", "hh", "mm", "ss", "DrawSys", "_ent", "v", "RenderToggleSys", "ent", "v", "buttonOn", "TallySys", "ent", "v", "text", "textSetText", "LoaderSys", "ent", "v", "init", "SpritePool", "debug", "millisUntilNext", "CamSys", "ClockSys", "DrawSys", "RenderToggleSys", "TallySys", "level", "parseLevel", "init_level_default", "bundle", "v", "Void", "void_game_default", "description", "LoaderSys", "debug", "millisUntilNext"]
|
|
7
7
|
}
|