@the-inclusionist/engine 9.0.0 → 11.0.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/README.md +120 -78
- package/app/css/style.css +761 -377
- package/app/public/vendor/fonts/playwrite-cu.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-es-deco.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-es.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-gb-j.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-gb-s.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-pe.woff2 +0 -0
- package/app/public/vendor/fonts/playwrite-pt.woff2 +0 -0
- package/app/public/vendor/fonts-licences/NOTICE.txt +166 -0
- package/app/public/vendor/fonts-licences/OFL-1.1.txt +86 -0
- package/app/public/vendor/fonts.css +36 -84
- package/dist-pkg/boot/create-game.d.ts +499 -219
- package/dist-pkg/boot/create-game.js +3944 -562
- package/dist-pkg/core/a11y-sr.d.ts +25 -3
- package/dist-pkg/core/a11y-sr.js +38 -19
- package/dist-pkg/core/accessible-label.d.ts +17 -0
- package/dist-pkg/core/accessible-label.js +37 -0
- package/dist-pkg/core/accommodation-subjects.d.ts +26 -0
- package/dist-pkg/core/accommodation-subjects.js +32 -0
- package/dist-pkg/core/accommodations.d.ts +125 -0
- package/dist-pkg/core/accommodations.js +195 -0
- package/dist-pkg/core/actions.d.ts +108 -55
- package/dist-pkg/core/actions.js +122 -71
- package/dist-pkg/core/calm-mode.d.ts +31 -0
- package/dist-pkg/core/calm-mode.js +47 -0
- package/dist-pkg/core/camera-cycle.d.ts +15 -0
- package/dist-pkg/core/camera-cycle.js +7 -0
- package/dist-pkg/core/caption-duration.d.ts +15 -0
- package/dist-pkg/core/caption-duration.js +19 -0
- package/dist-pkg/core/cartridge-problems.d.ts +34 -0
- package/dist-pkg/core/cartridge-problems.js +53 -0
- package/dist-pkg/core/constants.d.ts +0 -54
- package/dist-pkg/core/constants.js +9 -76
- package/dist-pkg/core/contract.d.ts +142 -164
- package/dist-pkg/core/contract.js +222 -208
- package/dist-pkg/core/dom-query.d.ts +4 -4
- package/dist-pkg/core/dom-query.js +12 -20
- package/dist-pkg/core/entity.d.ts +62 -77
- package/dist-pkg/core/entity.js +18 -32
- package/dist-pkg/core/escape-html.d.ts +9 -10
- package/dist-pkg/core/escape-html.js +16 -20
- package/dist-pkg/core/flash-threshold.d.ts +17 -0
- package/dist-pkg/core/flash-threshold.js +113 -0
- package/dist-pkg/core/game-speed.d.ts +11 -0
- package/dist-pkg/core/game-speed.js +16 -0
- package/dist-pkg/core/genres.d.ts +20 -0
- package/dist-pkg/core/genres.js +44 -0
- package/dist-pkg/core/i18n.d.ts +71 -60
- package/dist-pkg/core/i18n.js +186 -200
- package/dist-pkg/core/loop.d.ts +17 -6
- package/dist-pkg/core/loop.js +26 -26
- package/dist-pkg/core/pause-icon-catalogue.d.ts +15 -0
- package/dist-pkg/core/pause-icon-catalogue.js +54 -0
- package/dist-pkg/core/ring.d.ts +17 -0
- package/dist-pkg/core/ring.js +29 -0
- package/dist-pkg/core/rng.d.ts +7 -12
- package/dist-pkg/core/rng.js +23 -53
- package/dist-pkg/core/route.d.ts +26 -26
- package/dist-pkg/core/route.js +126 -121
- package/dist-pkg/core/scenes.d.ts +37 -40
- package/dist-pkg/core/scenes.js +41 -43
- package/dist-pkg/core/screens.d.ts +4 -4
- package/dist-pkg/core/screens.js +11 -16
- package/dist-pkg/core/session-clock.d.ts +23 -0
- package/dist-pkg/core/session-clock.js +37 -0
- package/dist-pkg/core/setting-defaults.d.ts +61 -0
- package/dist-pkg/core/setting-defaults.js +66 -0
- package/dist-pkg/core/speech-rate.d.ts +29 -0
- package/dist-pkg/core/speech-rate.js +47 -0
- package/dist-pkg/core/state.d.ts +118 -118
- package/dist-pkg/core/state.js +322 -297
- package/dist-pkg/core/visual-cycles.d.ts +30 -0
- package/dist-pkg/core/visual-cycles.js +52 -0
- package/dist-pkg/core/visual-state.d.ts +13 -0
- package/dist-pkg/core/visual-state.js +6 -0
- package/dist-pkg/educational/activities-registry.d.ts +1 -1
- package/dist-pkg/educational/activities-registry.js +9 -8
- package/dist-pkg/educational/adaptive-engine.d.ts +11 -11
- package/dist-pkg/educational/adaptive-engine.js +17 -17
- package/dist-pkg/educational/segment-bar.d.ts +12 -12
- package/dist-pkg/educational/segment-bar.js +9 -9
- package/dist-pkg/i18n/en.js +324 -223
- package/dist-pkg/i18n/es.js +323 -223
- package/dist-pkg/i18n/pt.js +348 -226
- package/dist-pkg/input/default-bindings.d.ts +37 -38
- package/dist-pkg/input/default-bindings.js +127 -144
- package/dist-pkg/input/devices.d.ts +7 -7
- package/dist-pkg/input/devices.js +17 -16
- package/dist-pkg/input/edges.d.ts +23 -32
- package/dist-pkg/input/edges.js +23 -28
- package/dist-pkg/input/empathy-filter.d.ts +22 -0
- package/dist-pkg/input/empathy-filter.js +34 -0
- package/dist-pkg/input/face-map.d.ts +96 -0
- package/dist-pkg/input/face-map.js +255 -0
- package/dist-pkg/input/face-signals.d.ts +40 -0
- package/dist-pkg/input/face-signals.js +48 -0
- package/dist-pkg/input/gamepad.d.ts +195 -145
- package/dist-pkg/input/gamepad.js +383 -556
- package/dist-pkg/input/gaze-cycle.d.ts +64 -0
- package/dist-pkg/input/gaze-cycle.js +133 -0
- package/dist-pkg/input/gaze-relative.d.ts +68 -0
- package/dist-pkg/input/gaze-relative.js +142 -0
- package/dist-pkg/input/hand-map.d.ts +28 -0
- package/dist-pkg/input/hand-map.js +142 -0
- package/dist-pkg/input/input-cooldown.d.ts +17 -0
- package/dist-pkg/input/input-cooldown.js +39 -0
- package/dist-pkg/input/key-default.d.ts +30 -0
- package/dist-pkg/input/key-default.js +60 -0
- package/dist-pkg/input/keyboard-runtime.d.ts +15 -21
- package/dist-pkg/input/keyboard-runtime.js +23 -27
- package/dist-pkg/input/keyboard.d.ts +68 -63
- package/dist-pkg/input/keyboard.js +83 -105
- package/dist-pkg/input/keydown.d.ts +123 -137
- package/dist-pkg/input/keydown.js +284 -289
- package/dist-pkg/input/latch-edge.d.ts +33 -21
- package/dist-pkg/input/latch-edge.js +34 -35
- package/dist-pkg/input/latch-scope.d.ts +51 -50
- package/dist-pkg/input/latch-scope.js +61 -82
- package/dist-pkg/input/latch-store.d.ts +26 -30
- package/dist-pkg/input/latch-store.js +42 -50
- package/dist-pkg/input/latch-sync.d.ts +29 -29
- package/dist-pkg/input/latch-sync.js +25 -25
- package/dist-pkg/input/latch.d.ts +14 -17
- package/dist-pkg/input/latch.js +29 -37
- package/dist-pkg/input/pad-defaults.d.ts +13 -16
- package/dist-pkg/input/pad-defaults.js +21 -28
- package/dist-pkg/input/pad-reading.d.ts +76 -0
- package/dist-pkg/input/pad-reading.js +169 -0
- package/dist-pkg/input/pad-wizard.d.ts +99 -0
- package/dist-pkg/input/pad-wizard.js +256 -0
- package/dist-pkg/input/pointer-space.d.ts +19 -20
- package/dist-pkg/input/pointer-space.js +27 -32
- package/dist-pkg/input/pointer.d.ts +39 -40
- package/dist-pkg/input/pointer.js +42 -45
- package/dist-pkg/input/state.d.ts +101 -89
- package/dist-pkg/input/state.js +54 -134
- package/dist-pkg/input/switch-scan.d.ts +59 -0
- package/dist-pkg/input/switch-scan.js +67 -0
- package/dist-pkg/input/synthetic-source.d.ts +42 -0
- package/dist-pkg/input/synthetic-source.js +57 -0
- package/dist-pkg/input/touch-bindings.d.ts +127 -116
- package/dist-pkg/input/touch-bindings.js +158 -173
- package/dist-pkg/input/touch.d.ts +147 -72
- package/dist-pkg/input/touch.js +362 -126
- package/dist-pkg/input/transport-in-use.d.ts +107 -0
- package/dist-pkg/input/transport-in-use.js +130 -0
- package/dist-pkg/input/transports.d.ts +90 -117
- package/dist-pkg/input/transports.js +104 -106
- package/dist-pkg/input/virtual-controller.d.ts +82 -0
- package/dist-pkg/input/virtual-controller.js +69 -0
- package/dist-pkg/input/vocabulary-migration.d.ts +50 -49
- package/dist-pkg/input/vocabulary-migration.js +80 -79
- package/dist-pkg/input/voice-map.d.ts +59 -0
- package/dist-pkg/input/voice-map.js +123 -0
- package/dist-pkg/platform/audio-ambient.d.ts +13 -2
- package/dist-pkg/platform/audio-ambient.js +14 -14
- package/dist-pkg/platform/audio-earcons.d.ts +20 -19
- package/dist-pkg/platform/audio-earcons.js +51 -42
- package/dist-pkg/platform/audio-jingles.js +9 -10
- package/dist-pkg/platform/audio-mixer.d.ts +14 -2
- package/dist-pkg/platform/audio-mixer.js +31 -39
- package/dist-pkg/platform/audio-sonar.d.ts +49 -152
- package/dist-pkg/platform/audio-sonar.js +124 -302
- package/dist-pkg/platform/audio.d.ts +62 -19
- package/dist-pkg/platform/audio.js +193 -168
- package/dist-pkg/platform/choose-by-voice.d.ts +70 -0
- package/dist-pkg/platform/choose-by-voice.js +157 -0
- package/dist-pkg/platform/flash-sampler.d.ts +19 -0
- package/dist-pkg/platform/flash-sampler.js +79 -0
- package/dist-pkg/platform/font-library.d.ts +77 -0
- package/dist-pkg/platform/font-library.js +98 -0
- package/dist-pkg/platform/font-library.json +721 -0
- package/dist-pkg/platform/heavy-catalogue.d.ts +77 -0
- package/dist-pkg/platform/heavy-catalogue.js +256 -0
- package/dist-pkg/platform/heavy-mirror.d.ts +20 -0
- package/dist-pkg/platform/heavy-mirror.js +73 -0
- package/dist-pkg/platform/heavy.d.ts +136 -0
- package/dist-pkg/platform/heavy.js +324 -0
- package/dist-pkg/platform/interruptible-speech.d.ts +23 -16
- package/dist-pkg/platform/interruptible-speech.js +77 -54
- package/dist-pkg/platform/kokoro-port.d.ts +27 -0
- package/dist-pkg/platform/kokoro-port.js +50 -0
- package/dist-pkg/platform/kokoro-runtime.d.ts +20 -0
- package/dist-pkg/platform/kokoro-runtime.js +52 -0
- package/dist-pkg/platform/kokoro.d.ts +70 -0
- package/dist-pkg/platform/kokoro.js +133 -0
- package/dist-pkg/platform/listener-scope.d.ts +12 -0
- package/dist-pkg/platform/listener-scope.js +90 -0
- package/dist-pkg/platform/locale-host.d.ts +14 -0
- package/dist-pkg/platform/locale-host.js +45 -0
- package/dist-pkg/platform/microphone.d.ts +51 -0
- package/dist-pkg/platform/microphone.js +118 -0
- package/dist-pkg/platform/onnx-runtime.d.ts +34 -0
- package/dist-pkg/platform/onnx-runtime.js +42 -0
- package/dist-pkg/platform/reading-in-worker.d.ts +64 -0
- package/dist-pkg/platform/reading-in-worker.js +125 -0
- package/dist-pkg/platform/reading-model.d.ts +94 -0
- package/dist-pkg/platform/reading-model.js +272 -0
- package/dist-pkg/platform/reading-runtime.d.ts +24 -0
- package/dist-pkg/platform/reading-runtime.js +164 -0
- package/dist-pkg/platform/reading-worker.d.ts +41 -0
- package/dist-pkg/platform/reading-worker.js +58 -0
- package/dist-pkg/platform/reading.d.ts +80 -0
- package/dist-pkg/platform/reading.js +136 -0
- package/dist-pkg/platform/speech-recognition.d.ts +60 -0
- package/dist-pkg/platform/speech-recognition.js +104 -0
- package/dist-pkg/platform/speech.d.ts +23 -1
- package/dist-pkg/platform/speech.js +29 -18
- package/dist-pkg/platform/storage-keys.d.ts +96 -0
- package/dist-pkg/platform/storage-keys.js +106 -0
- package/dist-pkg/platform/storage.d.ts +46 -111
- package/dist-pkg/platform/storage.js +104 -169
- package/dist-pkg/platform/tts.d.ts +85 -39
- package/dist-pkg/platform/tts.js +447 -127
- package/dist-pkg/platform/vision-loop.d.ts +23 -0
- package/dist-pkg/platform/vision-loop.js +56 -0
- package/dist-pkg/platform/vision.d.ts +132 -0
- package/dist-pkg/platform/vision.js +117 -0
- package/dist-pkg/platform/voice-listener.d.ts +40 -0
- package/dist-pkg/platform/voice-listener.js +88 -0
- package/dist-pkg/platform/voice-plan.d.ts +15 -98
- package/dist-pkg/platform/voice-plan.js +56 -143
- package/dist-pkg/platform/vosk-runtime.d.ts +96 -0
- package/dist-pkg/platform/vosk-runtime.js +151 -0
- package/dist-pkg/platform/vosk-vocabulary.d.ts +6 -0
- package/dist-pkg/platform/vosk-vocabulary.js +178 -0
- package/dist-pkg/render/canvas.d.ts +13 -7
- package/dist-pkg/render/canvas.js +13 -13
- package/dist-pkg/render/crt.d.ts +48 -12
- package/dist-pkg/render/crt.js +78 -80
- package/dist-pkg/render/cvd-matrices.d.ts +22 -18
- package/dist-pkg/render/cvd-matrices.js +37 -38
- package/dist-pkg/render/hc-role-data.d.ts +7 -7
- package/dist-pkg/render/hc-role-data.js +14 -14
- package/dist-pkg/render/high-contrast.d.ts +67 -56
- package/dist-pkg/render/high-contrast.js +226 -217
- package/dist-pkg/render/low-vision-drawing.d.ts +5 -0
- package/dist-pkg/render/low-vision-drawing.js +46 -0
- package/dist-pkg/render/lq-filter.d.ts +32 -20
- package/dist-pkg/render/lq-filter.js +59 -65
- package/dist-pkg/render/port.d.ts +86 -88
- package/dist-pkg/render/port.js +17 -23
- package/dist-pkg/render/screen-pipeline.d.ts +42 -42
- package/dist-pkg/render/screen-pipeline.js +80 -87
- package/dist-pkg/render/sprite-fx.d.ts +2 -1
- package/dist-pkg/render/sprite-fx.js +16 -14
- package/dist-pkg/render/viewports.d.ts +20 -15
- package/dist-pkg/render/viewports.js +83 -114
- package/dist-pkg/render/viz-axes-labels.d.ts +47 -0
- package/dist-pkg/render/viz-axes-labels.js +88 -0
- package/dist-pkg/render/viz-axes.d.ts +89 -86
- package/dist-pkg/render/viz-axes.js +128 -116
- package/dist-pkg/render/viz-modes.d.ts +28 -29
- package/dist-pkg/render/viz-modes.js +40 -45
- package/dist-pkg/render/viz-refusal.d.ts +32 -0
- package/dist-pkg/render/viz-refusal.js +57 -0
- package/dist-pkg/render/viz-setters.d.ts +104 -66
- package/dist-pkg/render/viz-setters.js +182 -191
- package/dist-pkg/ui/aac-sets.d.ts +45 -0
- package/dist-pkg/ui/aac-sets.js +41 -0
- package/dist-pkg/ui/audio-choices.d.ts +68 -0
- package/dist-pkg/ui/audio-choices.js +98 -0
- package/dist-pkg/ui/audio-rows-that-apply.d.ts +12 -0
- package/dist-pkg/ui/audio-rows-that-apply.js +43 -0
- package/dist-pkg/ui/camera-control.d.ts +53 -0
- package/dist-pkg/ui/camera-control.js +48 -0
- package/dist-pkg/ui/changed-mark.d.ts +9 -8
- package/dist-pkg/ui/changed-mark.js +22 -53
- package/dist-pkg/ui/control-choices.d.ts +37 -0
- package/dist-pkg/ui/control-choices.js +84 -0
- package/dist-pkg/ui/debug-panel.d.ts +59 -43
- package/dist-pkg/ui/debug-panel.js +68 -69
- package/dist-pkg/ui/declared-words.d.ts +21 -0
- package/dist-pkg/ui/declared-words.js +66 -0
- package/dist-pkg/ui/dom.d.ts +10 -14
- package/dist-pkg/ui/dom.js +10 -47
- package/dist-pkg/ui/drawing-problems.d.ts +25 -0
- package/dist-pkg/ui/drawing-problems.js +94 -0
- package/dist-pkg/ui/eye-control.d.ts +36 -0
- package/dist-pkg/ui/eye-control.js +178 -0
- package/dist-pkg/ui/face-control.d.ts +25 -0
- package/dist-pkg/ui/face-control.js +183 -0
- package/dist-pkg/ui/focus-trap.d.ts +39 -49
- package/dist-pkg/ui/focus-trap.js +56 -65
- package/dist-pkg/ui/fonts.d.ts +157 -68
- package/dist-pkg/ui/fonts.js +305 -115
- package/dist-pkg/ui/footer-scroll-driver.d.ts +14 -0
- package/dist-pkg/ui/footer-scroll-driver.js +201 -0
- package/dist-pkg/ui/footer-scroll.d.ts +38 -0
- package/dist-pkg/ui/footer-scroll.js +55 -0
- package/dist-pkg/ui/game-options.d.ts +47 -0
- package/dist-pkg/ui/game-options.js +158 -0
- package/dist-pkg/ui/gaze-overlay.d.ts +64 -0
- package/dist-pkg/ui/gaze-overlay.js +165 -0
- package/dist-pkg/ui/hand-control.d.ts +25 -0
- package/dist-pkg/ui/hand-control.js +143 -0
- package/dist-pkg/ui/help-panel.d.ts +87 -0
- package/dist-pkg/ui/help-panel.js +242 -0
- package/dist-pkg/ui/hud-bands.d.ts +62 -0
- package/dist-pkg/ui/hud-bands.js +146 -0
- package/dist-pkg/ui/hud-row.d.ts +34 -0
- package/dist-pkg/ui/hud-row.js +80 -0
- package/dist-pkg/ui/hud.d.ts +73 -73
- package/dist-pkg/ui/hud.js +94 -98
- package/dist-pkg/ui/item-announcement.d.ts +13 -12
- package/dist-pkg/ui/item-announcement.js +25 -26
- package/dist-pkg/ui/layout.d.ts +103 -28
- package/dist-pkg/ui/layout.js +117 -99
- package/dist-pkg/ui/libras-avatar-clip.d.ts +30 -0
- package/dist-pkg/ui/libras-avatar-clip.js +86 -0
- package/dist-pkg/ui/libras-avatar-load.d.ts +52 -0
- package/dist-pkg/ui/libras-avatar-load.js +134 -0
- package/dist-pkg/ui/libras-avatar-plan.d.ts +102 -0
- package/dist-pkg/ui/libras-avatar-plan.js +211 -0
- package/dist-pkg/ui/libras-avatar-player.d.ts +28 -0
- package/dist-pkg/ui/libras-avatar-player.js +226 -0
- package/dist-pkg/ui/libras-avatar-stage.d.ts +37 -0
- package/dist-pkg/ui/libras-avatar-stage.js +208 -0
- package/dist-pkg/ui/libras-glosses.d.ts +28 -0
- package/dist-pkg/ui/libras-glosses.js +161 -0
- package/dist-pkg/ui/locale-flags.d.ts +16 -0
- package/dist-pkg/ui/locale-flags.js +30 -0
- package/dist-pkg/ui/loop-crash.d.ts +17 -17
- package/dist-pkg/ui/loop-crash.js +33 -62
- package/dist-pkg/ui/menu-intent.d.ts +61 -0
- package/dist-pkg/ui/menu-intent.js +88 -0
- package/dist-pkg/ui/menu-items.d.ts +20 -0
- package/dist-pkg/ui/menu-items.js +51 -0
- package/dist-pkg/ui/menu-nav.d.ts +98 -92
- package/dist-pkg/ui/menu-nav.js +398 -286
- package/dist-pkg/ui/mobility-choices.d.ts +26 -0
- package/dist-pkg/ui/mobility-choices.js +41 -0
- package/dist-pkg/ui/motion-choices.d.ts +31 -0
- package/dist-pkg/ui/motion-choices.js +68 -0
- package/dist-pkg/ui/motion-scene.d.ts +24 -19
- package/dist-pkg/ui/motion-scene.js +29 -61
- package/dist-pkg/ui/mount-panel.d.ts +81 -0
- package/dist-pkg/ui/mount-panel.js +61 -0
- package/dist-pkg/ui/panel-shell.d.ts +65 -31
- package/dist-pkg/ui/panel-shell.js +92 -66
- package/dist-pkg/ui/panel-widgets.d.ts +150 -0
- package/dist-pkg/ui/panel-widgets.js +294 -0
- package/dist-pkg/ui/pause-buttons.d.ts +35 -0
- package/dist-pkg/ui/pause-buttons.js +66 -0
- package/dist-pkg/ui/pause-icons.d.ts +261 -347
- package/dist-pkg/ui/pause-icons.js +671 -601
- package/dist-pkg/ui/pause-markup.d.ts +86 -0
- package/dist-pkg/ui/pause-markup.js +125 -0
- package/dist-pkg/ui/reach-notice.d.ts +22 -23
- package/dist-pkg/ui/reach-notice.js +55 -58
- package/dist-pkg/ui/scan-overlay.d.ts +23 -0
- package/dist-pkg/ui/scan-overlay.js +50 -0
- package/dist-pkg/ui/screen-text.d.ts +25 -0
- package/dist-pkg/ui/screen-text.js +152 -0
- package/dist-pkg/ui/session-clock.d.ts +32 -0
- package/dist-pkg/ui/session-clock.js +67 -0
- package/dist-pkg/ui/settings-aac.d.ts +70 -0
- package/dist-pkg/ui/settings-aac.js +208 -0
- package/dist-pkg/ui/settings-audio.d.ts +97 -114
- package/dist-pkg/ui/settings-audio.js +493 -425
- package/dist-pkg/ui/settings-controls.d.ts +53 -96
- package/dist-pkg/ui/settings-controls.js +143 -215
- package/dist-pkg/ui/settings-empathy.d.ts +39 -30
- package/dist-pkg/ui/settings-empathy.js +53 -60
- package/dist-pkg/ui/settings-mobility.d.ts +192 -0
- package/dist-pkg/ui/settings-mobility.js +332 -0
- package/dist-pkg/ui/settings-motion.d.ts +91 -70
- package/dist-pkg/ui/settings-motion.js +287 -198
- package/dist-pkg/ui/settings-panel.d.ts +58 -45
- package/dist-pkg/ui/settings-panel.js +189 -94
- package/dist-pkg/ui/settings-typo.d.ts +29 -78
- package/dist-pkg/ui/settings-typo.js +158 -129
- package/dist-pkg/ui/settings-visual.d.ts +29 -87
- package/dist-pkg/ui/settings-visual.js +240 -193
- package/dist-pkg/ui/shell.d.ts +112 -135
- package/dist-pkg/ui/shell.js +148 -217
- package/dist-pkg/ui/simulation-list.d.ts +27 -0
- package/dist-pkg/ui/simulation-list.js +76 -0
- package/dist-pkg/ui/simulation-over-the-world.d.ts +23 -0
- package/dist-pkg/ui/simulation-over-the-world.js +131 -0
- package/dist-pkg/ui/simulation-refusal.d.ts +5 -31
- package/dist-pkg/ui/simulation-refusal.js +8 -56
- package/dist-pkg/ui/switchable-control.d.ts +11 -0
- package/dist-pkg/ui/switchable-control.js +19 -0
- package/dist-pkg/ui/title.d.ts +3 -12
- package/dist-pkg/ui/title.js +49 -18
- package/dist-pkg/ui/top-band.d.ts +26 -0
- package/dist-pkg/ui/top-band.js +96 -0
- package/dist-pkg/ui/typo-choices.d.ts +71 -0
- package/dist-pkg/ui/typo-choices.js +85 -0
- package/dist-pkg/ui/visual-axes-panel.d.ts +11 -47
- package/dist-pkg/ui/visual-axes-panel.js +12 -94
- package/dist-pkg/ui/visual-choices.d.ts +77 -0
- package/dist-pkg/ui/visual-choices.js +107 -0
- package/dist-pkg/ui/vlibras.d.ts +77 -10
- package/dist-pkg/ui/vlibras.js +130 -81
- package/dist-pkg/ui/voice-control.d.ts +68 -0
- package/dist-pkg/ui/voice-control.js +276 -0
- package/dist-pkg/ui/voice-settings.d.ts +95 -0
- package/dist-pkg/ui/voice-settings.js +352 -0
- package/dist-pkg/ui/where-the-child-is.d.ts +31 -0
- package/dist-pkg/ui/where-the-child-is.js +70 -0
- package/docs/CREDITS.md +300 -44
- package/docs/LICENSES.md +189 -145
- package/package.json +51 -27
- package/scripts/check-cartridge.mjs +78 -0
- package/scripts/game-build.d.mts +25 -0
- package/scripts/game-build.mjs +144 -0
- package/scripts/heavy-into-the-delivery.mjs +388 -0
- package/scripts/libras-avatar.json +680 -0
- package/scripts/libras-avatar.mjs +246 -0
- package/scripts/libras-glosses/gloss.py +95 -0
- package/scripts/libras-glosses/pyproject.toml +32 -0
- package/scripts/libras-glosses/uv.lock +781 -0
- package/scripts/libras-glosses.mjs +351 -0
- package/scripts/licences/Apache-2.0.txt +176 -0
- package/scripts/licences/GPL-3.0.txt +674 -0
- package/scripts/licences/MIT.txt +17 -0
- package/scripts/licences/OFL-1.1.txt +86 -0
- package/scripts/licences/UFL-1.0.txt +96 -0
- package/scripts/licences/fonts.mjs +389 -0
- package/scripts/licences/third-party.mjs +301 -0
- package/scripts/licences/vosk-browser.NOTICE.txt +268 -0
- package/app/public/vendor/fonts/comicneue-400.woff2 +0 -0
- package/app/public/vendor/fonts/comicneue-700.woff2 +0 -0
- package/app/public/vendor/fonts/fondamento-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/fondamento-400.woff2 +0 -0
- package/app/public/vendor/fonts/inter-400.woff2 +0 -0
- package/app/public/vendor/fonts/inter-700.woff2 +0 -0
- package/app/public/vendor/fonts/lato-400.woff2 +0 -0
- package/app/public/vendor/fonts/lato-700.woff2 +0 -0
- package/app/public/vendor/fonts/literata-400.woff2 +0 -0
- package/app/public/vendor/fonts/literata-700.woff2 +0 -0
- package/app/public/vendor/fonts/newsreader-400.woff2 +0 -0
- package/app/public/vendor/fonts/newsreader-700.woff2 +0 -0
- package/app/public/vendor/fonts/opendyslexic-400.woff2 +0 -0
- package/app/public/vendor/fonts/opensans-400.woff2 +0 -0
- package/app/public/vendor/fonts/opensans-700.woff2 +0 -0
- package/app/public/vendor/fonts/pinyon-400.woff2 +0 -0
- package/app/public/vendor/fonts/pressstart-400.woff2 +0 -0
- package/app/public/vendor/fonts/quattro-400.woff2 +0 -0
- package/app/public/vendor/fonts/quattro-700.woff2 +0 -0
- package/app/public/vendor/fonts/sourcesans-400.woff2 +0 -0
- package/app/public/vendor/fonts/sourcesans-700.woff2 +0 -0
- package/app/public/vendor/fonts/sourceserif-400.woff2 +0 -0
- package/app/public/vendor/fonts/sourceserif-700.woff2 +0 -0
- package/app/public/vendor/fonts/ufmag-400.woff2 +0 -0
- package/dist-pkg/core/anel.d.ts +0 -17
- package/dist-pkg/core/anel.js +0 -31
- package/dist-pkg/core/collision.d.ts +0 -21
- package/dist-pkg/core/collision.js +0 -62
- package/dist-pkg/core/layers.d.ts +0 -63
- package/dist-pkg/core/layers.js +0 -95
- package/dist-pkg/core/letter-grid.d.ts +0 -55
- package/dist-pkg/core/letter-grid.js +0 -116
- package/dist-pkg/core/password.d.ts +0 -34
- package/dist-pkg/core/password.js +0 -205
- package/dist-pkg/core/rotulo-acessivel.d.ts +0 -17
- package/dist-pkg/core/rotulo-acessivel.js +0 -41
- package/dist-pkg/core/run-state.d.ts +0 -115
- package/dist-pkg/core/run-state.js +0 -40
- package/dist-pkg/core/tiles.d.ts +0 -12
- package/dist-pkg/core/tiles.js +0 -61
- package/dist-pkg/core/world.d.ts +0 -4
- package/dist-pkg/core/world.js +0 -58
- package/dist-pkg/input/origem-sintetica.d.ts +0 -44
- package/dist-pkg/input/origem-sintetica.js +0 -60
- package/dist-pkg/input/transporte-em-uso.d.ts +0 -101
- package/dist-pkg/input/transporte-em-uso.js +0 -130
- package/dist-pkg/platform/audio-nav.d.ts +0 -51
- package/dist-pkg/platform/audio-nav.js +0 -99
- package/dist-pkg/platform/guide-intensity.d.ts +0 -40
- package/dist-pkg/platform/guide-intensity.js +0 -73
- package/dist-pkg/platform/pesados-catalogo.d.ts +0 -14
- package/dist-pkg/platform/pesados-catalogo.js +0 -177
- package/dist-pkg/platform/pesados.d.ts +0 -31
- package/dist-pkg/platform/pesados.js +0 -75
- package/dist-pkg/platform/vozes-prontas.d.ts +0 -28
- package/dist-pkg/platform/vozes-prontas.js +0 -61
- package/dist-pkg/render/camera.d.ts +0 -58
- package/dist-pkg/render/camera.js +0 -105
- package/dist-pkg/render/cenario-data.d.ts +0 -127
- package/dist-pkg/render/cenario-data.js +0 -145
- package/dist-pkg/render/city-tex.d.ts +0 -63
- package/dist-pkg/render/city-tex.js +0 -228
- package/dist-pkg/render/city-tiles.d.ts +0 -11
- package/dist-pkg/render/city-tiles.js +0 -140
- package/dist-pkg/render/draw.d.ts +0 -149
- package/dist-pkg/render/draw.js +0 -231
- package/dist-pkg/render/fx.d.ts +0 -63
- package/dist-pkg/render/fx.js +0 -123
- package/dist-pkg/render/minimap.d.ts +0 -11
- package/dist-pkg/render/minimap.js +0 -94
- package/dist-pkg/render/parallax.d.ts +0 -85
- package/dist-pkg/render/parallax.js +0 -158
- package/dist-pkg/render/player-anim.d.ts +0 -71
- package/dist-pkg/render/player-anim.js +0 -152
- package/dist-pkg/render/recycling-tex.d.ts +0 -48
- package/dist-pkg/render/recycling-tex.js +0 -164
- package/dist-pkg/render/scene-city.d.ts +0 -77
- package/dist-pkg/render/scene-city.js +0 -181
- package/dist-pkg/render/scene-parallax.d.ts +0 -72
- package/dist-pkg/render/scene-parallax.js +0 -426
- package/dist-pkg/render/scene-sky.d.ts +0 -126
- package/dist-pkg/render/scene-sky.js +0 -295
- package/dist-pkg/render/set-cenario.d.ts +0 -54
- package/dist-pkg/render/set-cenario.js +0 -103
- package/dist-pkg/render/textures.d.ts +0 -75
- package/dist-pkg/render/textures.js +0 -240
- package/dist-pkg/render/title-scene.d.ts +0 -46
- package/dist-pkg/render/title-scene.js +0 -75
- package/dist-pkg/render/weather.d.ts +0 -96
- package/dist-pkg/render/weather.js +0 -171
- package/dist-pkg/render/wheelchair-sprites.d.ts +0 -32
- package/dist-pkg/render/wheelchair-sprites.js +0 -69
- package/dist-pkg/render/world-tex.d.ts +0 -18
- package/dist-pkg/render/world-tex.js +0 -87
- package/dist-pkg/ui/activities-menu.d.ts +0 -258
- package/dist-pkg/ui/activities-menu.js +0 -648
- package/dist-pkg/ui/caa-sets.d.ts +0 -39
- package/dist-pkg/ui/caa-sets.js +0 -65
- package/dist-pkg/ui/latch-refusal.d.ts +0 -32
- package/dist-pkg/ui/latch-refusal.js +0 -60
- package/dist-pkg/ui/map-hub.d.ts +0 -56
- package/dist-pkg/ui/map-hub.js +0 -138
- package/dist-pkg/ui/settings-caa.d.ts +0 -45
- package/dist-pkg/ui/settings-caa.js +0 -137
- package/dist-pkg/ui/settings-motor.d.ts +0 -175
- package/dist-pkg/ui/settings-motor.js +0 -342
- package/dist-pkg/ui/webcam.d.ts +0 -7
- package/dist-pkg/ui/webcam.js +0 -93
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import { ACTIONS } from '../core/actions.js';
|
|
3
|
+
/**
|
|
4
|
+
* THE FOUR ARROWS, one per direction.
|
|
5
|
+
*
|
|
6
|
+
* 🔴 The Dev asked for exactly these: «Por que está escrevendo "↔Up", "↔Down" etc ao invés de simplesmente "↑",
|
|
7
|
+
* "↓", "←" e "→"? Não escolha poluir a UI.» A chain of `replace` calls over the physical code is a hidden table, and a
|
|
8
|
+
* hidden table writes what nobody chose — so the table is written out.
|
|
9
|
+
*
|
|
10
|
+
* 📌 And there is nothing to translate here: an arrow is the same in pt, en and es, which is exactly why it is a
|
|
11
|
+
* glyph and not a word. The child who remaps sees the key they have in hand.
|
|
12
|
+
*/
|
|
13
|
+
const GLYPH = {
|
|
14
|
+
ArrowUp: '↑', ArrowDown: '↓', ArrowLeft: '←', ArrowRight: '→',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Physical key code → short readable label.
|
|
18
|
+
*
|
|
19
|
+
* `Space` is the only one with a word to translate; the arrows are glyphs and the rest are the bare letter or
|
|
20
|
+
* digit, identical in every language.
|
|
21
|
+
*
|
|
22
|
+
* ⚠️ A TABLE AND A LADDER, and not a chain of replacements, which leaks the MACHINE's name whenever a prefix is not
|
|
23
|
+
* foreseen (`Digit1`, `Numpad5`). What is not recognised still passes through untouched on purpose: `Comma` is ugly
|
|
24
|
+
* and honest, and inventing a name for it would be guessing.
|
|
25
|
+
*/
|
|
26
|
+
export function keyName(t, code) {
|
|
27
|
+
const c = String(code);
|
|
28
|
+
if (GLYPH[c])
|
|
29
|
+
return GLYPH[c];
|
|
30
|
+
if (c === 'Space')
|
|
31
|
+
return t('key.space');
|
|
32
|
+
if (c.startsWith('Shift'))
|
|
33
|
+
return 'Shift';
|
|
34
|
+
if (c.startsWith('Key'))
|
|
35
|
+
return c.slice(3);
|
|
36
|
+
if (c.startsWith('Digit'))
|
|
37
|
+
return c.slice(5);
|
|
38
|
+
// «Num 5», «Num Add»: the numeric keypad is a different PHYSICAL place, and saying only «5» would make two
|
|
39
|
+
// distinct keys show the same label in the same list.
|
|
40
|
+
if (c.startsWith('Numpad'))
|
|
41
|
+
return `Num ${c.slice(6)}`;
|
|
42
|
+
return c;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Which OTHER player already owns `code`, among `schemes` (one entry per player, same order as player index) —
|
|
46
|
+
* or -1 if free. `mapRef` (the scheme currently being edited) is excluded BY REFERENCE. Built over a Map (code →
|
|
47
|
+
* owner index) so a scheme with many bound keys does not cost a full re-scan per lookup.
|
|
48
|
+
*/
|
|
49
|
+
export function keyUsedByOther(code, mapRef, schemes) {
|
|
50
|
+
const owners = new Map();
|
|
51
|
+
schemes.forEach((m, i) => {
|
|
52
|
+
if (m === mapRef)
|
|
53
|
+
return;
|
|
54
|
+
for (const a of ACTIONS)
|
|
55
|
+
for (const c of m[a] || [])
|
|
56
|
+
if (!owners.has(c))
|
|
57
|
+
owners.set(c, i);
|
|
58
|
+
});
|
|
59
|
+
return owners.get(code) ?? -1;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Which OTHER action OF THE SAME scheme already has `code` — or `null` if none.
|
|
63
|
+
*
|
|
64
|
+
* ⚠️ THE SIBLING `keyUsedByOther` NEEDS, AND ITS ABSENCE IS INVISIBLE IN A ONE-PLAYER GAME (#126). That function
|
|
65
|
+
* excludes the scheme being edited **by reference**; with a single player, `schemesFor()` returns exactly that
|
|
66
|
+
* scheme, so its guard scans an empty list and **can never fire**. A child who puts `W` on a new action would keep
|
|
67
|
+
* `W` on the old one too, and play the whole game with both firing together.
|
|
68
|
+
*
|
|
69
|
+
* ⚠️ AND THAT IS THE WORST SHAPE A DEFECT CAN TAKE, as the `input/default-bindings` header says: the two actions fire
|
|
70
|
+
* together, and the child sees an intermittent double action nobody can reproduce on purpose — on a screen they
|
|
71
|
+
* opened **because** they could not use the default controls.
|
|
72
|
+
*
|
|
73
|
+
* Returns the ACTION and not a boolean, because the announcement has to say which one — saying only that the key is
|
|
74
|
+
* in use sends the child looking for what the function already knows.
|
|
75
|
+
*/
|
|
76
|
+
export function actionAlreadyBound(code, mapRef, except) {
|
|
77
|
+
for (const a of ACTIONS) {
|
|
78
|
+
if (a === except)
|
|
79
|
+
continue;
|
|
80
|
+
if ((mapRef[a] || []).includes(code))
|
|
81
|
+
return a;
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
@@ -1,67 +1,83 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
import type { JuiceFlags } from '../render/fx.js';
|
|
3
2
|
type Tune = Record<string, number>;
|
|
4
3
|
type Anim = Record<string, number>;
|
|
5
|
-
type Juice =
|
|
4
|
+
type Juice = {
|
|
5
|
+
dust: boolean;
|
|
6
|
+
sparkle: boolean;
|
|
7
|
+
squash: boolean;
|
|
8
|
+
hitstop: boolean;
|
|
9
|
+
shake: boolean;
|
|
10
|
+
shimmer: boolean;
|
|
11
|
+
};
|
|
6
12
|
/**
|
|
7
|
-
*
|
|
13
|
+
* A SNAPSHOT OF THE CHARACTER in one frame — DATA, and no PixiJS object.
|
|
8
14
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
15
|
+
* The composition root, the only place where PixiJS is known, takes the snapshot and hands over strings. It is the
|
|
16
|
+
* same choice as `RenderInto` and `CreateSprite` in render/port: asking for the VERB fits where lending the object does
|
|
17
|
+
* not — and here it pays twice, because it keeps `ui/debug-panel` testable in the `node` project.
|
|
12
18
|
*/
|
|
13
|
-
export interface
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
+
export interface CharacterSample {
|
|
20
|
+
/** Identity of the texture WITHIN this recording. Not geometry: the four idle frames share it. */
|
|
21
|
+
textureId: number;
|
|
22
|
+
/** The crop, "x,y WxH". */
|
|
23
|
+
crop: string;
|
|
24
|
+
/** The texture base, "WxH". */
|
|
19
25
|
base: string;
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
|
|
26
|
+
/** The sprite position, "x,y". */
|
|
27
|
+
position: string;
|
|
28
|
+
/** The scale, "x,y" — squash & stretch moves it. */
|
|
29
|
+
scale: string;
|
|
30
|
+
/** How many camera SIBLINGS were drawing a texture of the character in this frame. */
|
|
31
|
+
siblingsDrawing: number;
|
|
32
|
+
/** Where they were, in case there is one. */
|
|
33
|
+
siblingPositions: string;
|
|
28
34
|
}
|
|
29
|
-
/**
|
|
30
|
-
export interface
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
/**
|
|
35
|
+
/** What the probe answers. Three questions, because they are what separates the remaining causes. */
|
|
36
|
+
export interface ProbeSummary {
|
|
37
|
+
frames: number;
|
|
38
|
+
textures: number;
|
|
39
|
+
maxSiblings: number;
|
|
40
|
+
siblingExample: string;
|
|
41
|
+
/** The textures whose crop is too large for a character frame — atlas bleeding. */
|
|
36
42
|
sangramento: string[];
|
|
37
|
-
|
|
38
|
-
|
|
43
|
+
scales: string[];
|
|
44
|
+
verdict: string;
|
|
39
45
|
}
|
|
40
46
|
/**
|
|
41
|
-
*
|
|
47
|
+
* Reduces the recording to three questions and a verdict.
|
|
42
48
|
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
49
|
+
* THE ORDER OF THE VERDICT IS THE DECISION: a sibling drawing beats bleeding, because it is what produces WHOLE copies
|
|
50
|
+
* at different positions. And when the three questions come back clean the verdict does NOT say "all is well": it says
|
|
51
|
+
* WHERE to look next. Absence of evidence in the three is not evidence of absence, and ending the search here would end
|
|
52
|
+
* it in the wrong place.
|
|
47
53
|
*/
|
|
48
|
-
export declare function
|
|
54
|
+
export declare function summariseProbe(samples: readonly CharacterSample[]): ProbeSummary;
|
|
49
55
|
export interface DebugPanelCtx {
|
|
50
56
|
TUNE: Tune;
|
|
51
57
|
ANIM: Anim;
|
|
52
58
|
JUICE: Juice;
|
|
53
59
|
saveJuice: () => void;
|
|
54
60
|
/**
|
|
55
|
-
*
|
|
61
|
+
* A snapshot of the character NOW, or `null` if there is no character in the scene yet.
|
|
56
62
|
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
63
|
+
* OPTIONAL: a host with no character (the quiz) does not provide it, and the probe simply does not appear. The
|
|
64
|
+
* panel still does not know PixiJS.
|
|
59
65
|
*/
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
|
|
66
|
+
sampleCharacter?: () => CharacterSample | null;
|
|
67
|
+
/** Calls `fn` every frame and returns how to cancel. It is the render clock, injected as a verb. */
|
|
68
|
+
onFrame?: (fn: () => void) => () => void;
|
|
69
|
+
/**
|
|
70
|
+
* The page's query string (`location.search`): the panel exists only under `?debug=true`. REQUIRED (ADR-0232 D4): the
|
|
71
|
+
* host reads its own location, and this module reaches none.
|
|
72
|
+
*/
|
|
73
|
+
search: string;
|
|
74
|
+
/** The document the panel is built in and appended to (its `body`). REQUIRED (ADR-0232 D4): never the global one. */
|
|
75
|
+
doc: Document;
|
|
76
|
+
/**
|
|
77
|
+
* Where the probe's RAW recording goes, for whoever wants more than the summary without 180 lines in the panel — the
|
|
78
|
+
* platformer puts it on `window.__sonda`. REQUIRED (ADR-0232 D4): the module used to write that global itself.
|
|
79
|
+
*/
|
|
80
|
+
expose: (samples: readonly CharacterSample[]) => void;
|
|
65
81
|
}
|
|
66
82
|
export declare function initDebugPanel(ctx: DebugPanelCtx): HTMLElement | null;
|
|
67
83
|
export {};
|
|
@@ -1,43 +1,42 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
2
|
// ui/debug-panel — the ?debug=true live-tuning panel (physics/animation sliders + juice toggles). Leaf UI module.
|
|
3
3
|
// Built via closure DI: receives the LIVE TUNE/ANIM/JUICE objects (mutated in place) + saveJuice from the composition
|
|
4
|
-
// root, so the sliders/checkboxes tune the same state the game reads.
|
|
4
|
+
// root, so the sliders/checkboxes tune the same state the game reads.
|
|
5
5
|
// Returns the panel element (or null when not in ?debug=true) — testable without booting the game.
|
|
6
|
-
/**
|
|
7
|
-
const
|
|
6
|
+
/** A crop larger than this is not a character frame: it is a piece of the atlas. The largest real one is 31x35. */
|
|
7
|
+
const MAX_CHARACTER_FRAME_SIDE = 64;
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* Reduces the recording to three questions and a verdict.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* THE ORDER OF THE VERDICT IS THE DECISION: a sibling drawing beats bleeding, because it is what produces WHOLE copies
|
|
12
|
+
* at different positions. And when the three questions come back clean the verdict does NOT say "all is well": it says
|
|
13
|
+
* WHERE to look next. Absence of evidence in the three is not evidence of absence, and ending the search here would end
|
|
14
|
+
* it in the wrong place.
|
|
15
15
|
*/
|
|
16
|
-
export function
|
|
17
|
-
if (!
|
|
18
|
-
return {
|
|
16
|
+
export function summariseProbe(samples) {
|
|
17
|
+
if (!samples.length) {
|
|
18
|
+
return { frames: 0, textures: 0, maxSiblings: 0, siblingExample: '', sangramento: [], scales: [], verdict: 'não gravou nada — o personagem existia?' };
|
|
19
19
|
}
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const
|
|
20
|
+
const textureCount = new Set(samples.map((a) => a.textureId)).size;
|
|
21
|
+
const withSiblings = samples.filter((a) => a.siblingsDrawing > 0);
|
|
22
|
+
const mostSiblings = withSiblings.reduce((m, a) => Math.max(m, a.siblingsDrawing), 0);
|
|
23
|
+
const isAtlasPiece = (r) => {
|
|
24
24
|
const m = /(\d+)x(\d+)$/.exec(r);
|
|
25
|
-
return !!m && (+m[1] >
|
|
25
|
+
return !!m && (+m[1] > MAX_CHARACTER_FRAME_SIDE || +m[2] > MAX_CHARACTER_FRAME_SIDE);
|
|
26
26
|
};
|
|
27
|
-
const sangramento = [...new Set(
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
? 'ALGUÉM DESENHA DUAS VEZES: até ' +
|
|
27
|
+
const sangramento = [...new Set(samples.filter((a) => isAtlasPiece(a.crop)).map((a) => a.crop + ' (base ' + a.base + ')'))];
|
|
28
|
+
const distinctScales = [...new Set(samples.map((a) => a.scale))].sort();
|
|
29
|
+
const finding = mostSiblings > 0
|
|
30
|
+
? 'ALGUÉM DESENHA DUAS VEZES: até ' + mostSiblings + ' irmão(s) da câmera com a textura do personagem'
|
|
31
31
|
: sangramento.length
|
|
32
32
|
? 'RECORTE GRANDE DEMAIS: o quadro está pegando pedaço do atlas'
|
|
33
33
|
: 'sprite limpo (uma textura por quadro, sem irmão, recorte de quadro) — procure em composição: filtro, pós-efeito ou câmera';
|
|
34
|
-
return {
|
|
34
|
+
return { frames: samples.length, textures: textureCount, maxSiblings: mostSiblings, siblingExample: withSiblings.length ? withSiblings[0].siblingPositions : '', sangramento, scales: distinctScales, verdict: finding };
|
|
35
35
|
}
|
|
36
36
|
export function initDebugPanel(ctx) {
|
|
37
|
-
|
|
38
|
-
if (!/[?&]debug=true/.test(search))
|
|
37
|
+
if (!/[?&]debug=true/.test(ctx.search))
|
|
39
38
|
return null;
|
|
40
|
-
const { TUNE, ANIM, JUICE, saveJuice } = ctx;
|
|
39
|
+
const { TUNE, ANIM, JUICE, saveJuice, doc } = ctx;
|
|
41
40
|
const KNOBS = [
|
|
42
41
|
{ h: 'Movimento (valores absolutos)' },
|
|
43
42
|
{ label: 'Velocidade de andar', get: () => TUNE.hWalk, set: (v) => (TUNE.hWalk = v), min: 0.5, max: 5, step: 0.1 },
|
|
@@ -55,10 +54,10 @@ export function initDebugPanel(ctx) {
|
|
|
55
54
|
{ label: 'Queda máxima', get: () => TUNE.maxFall, set: (v) => (TUNE.maxFall = v), min: 3, max: 14, step: 0.5 },
|
|
56
55
|
{ label: 'Queda máxima na água', get: () => TUNE.waterMaxFall, set: (v) => (TUNE.waterMaxFall = v), min: 1, max: 8, step: 0.5 },
|
|
57
56
|
{ h: 'Animação (cadência: ticks/quadro)' },
|
|
58
|
-
{ label: 'Andar', get: () => ANIM.walkHold, set: (v) => (ANIM.walkHold = v), min: 1, max: 20, step: 1,
|
|
59
|
-
{ label: 'Correr', get: () => ANIM.runHold, set: (v) => (ANIM.runHold = v), min: 1, max: 20, step: 1,
|
|
60
|
-
{ label: 'Parado (idle)', get: () => ANIM.idleHold, set: (v) => (ANIM.idleHold = v), min: 2, max: 40, step: 1,
|
|
61
|
-
{ label: 'Nado', get: () => ANIM.swimHold, set: (v) => (ANIM.swimHold = v), min: 2, max: 24, step: 1,
|
|
57
|
+
{ label: 'Andar', get: () => ANIM.walkHold, set: (v) => (ANIM.walkHold = v), min: 1, max: 20, step: 1, cadence: true },
|
|
58
|
+
{ label: 'Correr', get: () => ANIM.runHold, set: (v) => (ANIM.runHold = v), min: 1, max: 20, step: 1, cadence: true },
|
|
59
|
+
{ label: 'Parado (idle)', get: () => ANIM.idleHold, set: (v) => (ANIM.idleHold = v), min: 2, max: 40, step: 1, cadence: true },
|
|
60
|
+
{ label: 'Nado', get: () => ANIM.swimHold, set: (v) => (ANIM.swimHold = v), min: 2, max: 24, step: 1, cadence: true },
|
|
62
61
|
{ h: 'Juice (efeitos de resposta) — toggles independentes' },
|
|
63
62
|
{ label: '💨 Poeira (pulo/pouso/corrida)', chk: () => JUICE.dust, set: (v) => { JUICE.dust = v; saveJuice(); } },
|
|
64
63
|
{ label: '✨ Brilho ao coletar', chk: () => JUICE.sparkle, set: (v) => { JUICE.sparkle = v; saveJuice(); } },
|
|
@@ -66,44 +65,44 @@ export function initDebugPanel(ctx) {
|
|
|
66
65
|
{ label: '⏱️ Hit-stop (impacto)', chk: () => JUICE.hitstop, set: (v) => { JUICE.hitstop = v; saveJuice(); } },
|
|
67
66
|
{ label: '📳 Tremor de tela', chk: () => JUICE.shake, set: (v) => { JUICE.shake = v; saveJuice(); } },
|
|
68
67
|
{ label: '🌟 Cintilar dos itens', chk: () => JUICE.shimmer, set: (v) => { JUICE.shimmer = v; saveJuice(); } },
|
|
69
|
-
]; //
|
|
70
|
-
const p =
|
|
68
|
+
]; // The CRT look is not here: it lives in the visual sensitivity panel (the Dev's request).
|
|
69
|
+
const p = doc.createElement('div');
|
|
71
70
|
p.id = 'debug-panel';
|
|
72
|
-
p.hidden = true; //
|
|
71
|
+
p.hidden = true; // starts hidden; opened by the 🐞 Debug button
|
|
73
72
|
p.setAttribute('role', 'group');
|
|
74
73
|
p.setAttribute('aria-label', 'Painel de depuração');
|
|
75
74
|
p.style.cssText = 'position:fixed;top:8px;right:8px;z-index:200;background:rgba(11,16,32,.97);color:#fff;border:2px solid #ffd23f;border-radius:8px;padding:.6rem .7rem;font:13px/1.4 system-ui,sans-serif;max-width:270px;max-height:86vh;overflow:auto;box-shadow:0 4px 16px rgba(0,0,0,.5)';
|
|
76
75
|
p.innerHTML = '<strong>🔧 ?debug — valores ao vivo</strong>';
|
|
77
76
|
for (const k of KNOBS) {
|
|
78
77
|
if ('h' in k) {
|
|
79
|
-
const h =
|
|
78
|
+
const h = doc.createElement('div');
|
|
80
79
|
h.textContent = k.h;
|
|
81
80
|
h.style.cssText = 'margin:.7rem 0 .1rem;font-weight:700;color:#ffd23f;border-bottom:1px solid rgba(255,210,63,.4)';
|
|
82
81
|
p.appendChild(h);
|
|
83
82
|
continue;
|
|
84
83
|
}
|
|
85
84
|
if ('chk' in k) {
|
|
86
|
-
const row =
|
|
85
|
+
const row = doc.createElement('label');
|
|
87
86
|
row.style.cssText = 'display:flex;gap:.4rem;align-items:center;margin-top:.4rem;font-size:12px;cursor:pointer';
|
|
88
|
-
const inp =
|
|
87
|
+
const inp = doc.createElement('input');
|
|
89
88
|
inp.type = 'checkbox';
|
|
90
89
|
inp.checked = k.chk();
|
|
91
90
|
inp.addEventListener('change', () => k.set(inp.checked));
|
|
92
91
|
row.appendChild(inp);
|
|
93
|
-
row.appendChild(
|
|
92
|
+
row.appendChild(doc.createTextNode(k.label));
|
|
94
93
|
p.appendChild(row);
|
|
95
94
|
continue;
|
|
96
95
|
}
|
|
97
|
-
const row =
|
|
96
|
+
const row = doc.createElement('div');
|
|
98
97
|
row.style.cssText = 'margin-top:.5rem';
|
|
99
|
-
const lab =
|
|
98
|
+
const lab = doc.createElement('label');
|
|
100
99
|
lab.style.cssText = 'display:block;font-size:12px;margin-bottom:2px';
|
|
101
|
-
const val =
|
|
100
|
+
const val = doc.createElement('strong');
|
|
102
101
|
val.style.cssText = 'color:#ffd23f;float:right';
|
|
103
|
-
const upd = () => { val.textContent = k.
|
|
102
|
+
const upd = () => { val.textContent = k.cadence ? `${k.get()} (${Math.round(60 / k.get())}fps)` : String(k.get()); };
|
|
104
103
|
lab.textContent = k.label;
|
|
105
104
|
lab.appendChild(val);
|
|
106
|
-
const inp =
|
|
105
|
+
const inp = doc.createElement('input');
|
|
107
106
|
inp.type = 'range';
|
|
108
107
|
inp.min = String(k.min);
|
|
109
108
|
inp.max = String(k.max);
|
|
@@ -117,23 +116,23 @@ export function initDebugPanel(ctx) {
|
|
|
117
116
|
p.appendChild(row);
|
|
118
117
|
upd();
|
|
119
118
|
}
|
|
120
|
-
/* =====================
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
119
|
+
/* ===================== THE CHARACTER PROBE =====================
|
|
120
|
+
It lives HERE, and not in a script to paste into the console, because that is what the Dev asked for — an
|
|
121
|
+
instrument that exists only while someone remembers to paste it is not an instrument, it is a memory. Here it
|
|
122
|
+
sits beside the other live values, behind the same `?debug=true`.
|
|
124
123
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (ctx.
|
|
128
|
-
const
|
|
129
|
-
const h =
|
|
124
|
+
It only appears if the host can take the snapshot: a game with no character does not get a button that does
|
|
125
|
+
nothing. */
|
|
126
|
+
if (ctx.sampleCharacter && ctx.onFrame) {
|
|
127
|
+
const sampleCharacter = ctx.sampleCharacter, everyFrame = ctx.onFrame;
|
|
128
|
+
const h = doc.createElement('div');
|
|
130
129
|
h.textContent = 'Sonda do personagem';
|
|
131
130
|
h.style.cssText = 'margin:.7rem 0 .1rem;font-weight:700;color:#ffd23f;border-bottom:1px solid rgba(255,210,63,.4)';
|
|
132
131
|
p.appendChild(h);
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
const btn =
|
|
132
|
+
const migrated = doc.createElement('pre');
|
|
133
|
+
migrated.style.cssText = 'margin:.4rem 0 0;font:11px/1.35 ui-monospace,monospace;white-space:pre-wrap;color:#cfe';
|
|
134
|
+
migrated.setAttribute('aria-live', 'polite');
|
|
135
|
+
const btn = doc.createElement('button');
|
|
137
136
|
btn.type = 'button';
|
|
138
137
|
btn.textContent = '🥷 Gravar 180 quadros';
|
|
139
138
|
btn.style.cssText = 'margin-top:.4rem;width:100%;min-height:32px;font:inherit;font-weight:700;cursor:pointer;border-radius:6px;border:1px solid #ffd23f;background:#1a2740;color:#fff';
|
|
@@ -141,33 +140,33 @@ export function initDebugPanel(ctx) {
|
|
|
141
140
|
if (btn.disabled)
|
|
142
141
|
return;
|
|
143
142
|
btn.disabled = true;
|
|
144
|
-
const
|
|
143
|
+
const samples = [];
|
|
145
144
|
let n = 0;
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
const a =
|
|
145
|
+
migrated.textContent = 'gravando… PULE agora';
|
|
146
|
+
const stopSampling = everyFrame(() => {
|
|
147
|
+
const a = sampleCharacter();
|
|
149
148
|
if (a)
|
|
150
|
-
|
|
149
|
+
samples.push(a);
|
|
151
150
|
if (++n < 180)
|
|
152
151
|
return;
|
|
153
|
-
|
|
152
|
+
stopSampling();
|
|
154
153
|
btn.disabled = false;
|
|
155
|
-
const r =
|
|
156
|
-
|
|
157
|
-
'quadros: ' + r.
|
|
158
|
-
'irmãos desenhando: ' + r.
|
|
154
|
+
const r = summariseProbe(samples);
|
|
155
|
+
migrated.textContent = [
|
|
156
|
+
'quadros: ' + r.frames + ' texturas: ' + r.textures,
|
|
157
|
+
'irmãos desenhando: ' + r.maxSiblings + (r.siblingExample ? ' em ' + r.siblingExample : ''),
|
|
159
158
|
'recorte grande: ' + (r.sangramento.length ? r.sangramento.join(' ') : 'nenhum'),
|
|
160
|
-
'escalas: ' + r.
|
|
159
|
+
'escalas: ' + r.scales.join(' '),
|
|
161
160
|
'',
|
|
162
|
-
'→ ' + r.
|
|
161
|
+
'→ ' + r.verdict,
|
|
163
162
|
].join(String.fromCharCode(10));
|
|
164
|
-
//
|
|
165
|
-
|
|
163
|
+
// The RAW recording stays reachable for whoever wants more than the summary — without filling the panel with 180 lines.
|
|
164
|
+
ctx.expose(samples);
|
|
166
165
|
});
|
|
167
166
|
});
|
|
168
167
|
p.appendChild(btn);
|
|
169
|
-
p.appendChild(
|
|
168
|
+
p.appendChild(migrated);
|
|
170
169
|
}
|
|
171
|
-
|
|
170
|
+
doc.body.appendChild(p);
|
|
172
171
|
return p;
|
|
173
172
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { ActionPreset } from '../core/actions.js';
|
|
3
|
+
import type { AccommodationAnswers } from '../core/accommodations.js';
|
|
4
|
+
import type { GameOption } from './game-options.js';
|
|
5
|
+
import type { HowToPlaySlide } from './help-panel.js';
|
|
6
|
+
import type { HudNumber } from './hud-bands.js';
|
|
7
|
+
/** The game's fields that carry declared words — a `Pick` of `CreateGameOptions`, written here so `ui` does not import `boot`. */
|
|
8
|
+
interface DeclaredWords {
|
|
9
|
+
readonly preset?: ActionPreset;
|
|
10
|
+
readonly accommodations?: AccommodationAnswers;
|
|
11
|
+
readonly gameOptions?: readonly GameOption[];
|
|
12
|
+
readonly howToPlay?: readonly HowToPlaySlide[];
|
|
13
|
+
readonly hud?: readonly HudNumber[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* THE DECLARED KEYS THIS GAME'S DICTIONARIES LACK, one line each for `problems` (ADR-0169). `declares` is the root's
|
|
17
|
+
* translator's (`Translator.declares`): a key in ANY language counts as present, because a key given in one language and not
|
|
18
|
+
* another is already a line of its own (`Translator.dictionaryGaps`).
|
|
19
|
+
*/
|
|
20
|
+
export declare function missingDeclaredKeys(declared: DeclaredWords, declares: (key: string) => boolean): string[];
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
const ACTION_NAME = 'the child sees this button unnamed: the help, the remap screen, the pad and the scan leave it out';
|
|
3
|
+
const ACTION_SHORT = 'the pad shows the long name squeezed under the glyph';
|
|
4
|
+
const ACTION_HINT = 'the help shows this button without its sentence';
|
|
5
|
+
const ACCOMMODATION_NAME = 'this accommodation has its row left out, and the child who needs it cannot reach it';
|
|
6
|
+
const ACCOMMODATION_SHORT = 'where only a short name fits, the long one is squeezed';
|
|
7
|
+
const ACCOMMODATION_HINT = 'the row explains itself in the engine\'s general words, or not at all';
|
|
8
|
+
const OPTION_NAME = 'this option has its row left out, and the child cannot change it';
|
|
9
|
+
const OPTION_HINT = 'the row shows without its explanation';
|
|
10
|
+
const SLIDE_TEXT = 'this slide is left out of the help';
|
|
11
|
+
const HUD_NAME = 'this number is hidden from the child';
|
|
12
|
+
function presetKeys(preset) {
|
|
13
|
+
if (!preset)
|
|
14
|
+
return [];
|
|
15
|
+
return Object.entries(preset).flatMap(([action, keys]) => (keys ? [
|
|
16
|
+
{ subject: `preset.${action}.labelKey`, key: keys.labelKey, cost: ACTION_NAME, optional: false },
|
|
17
|
+
{ subject: `preset.${action}.shortKey`, key: keys.shortKey, cost: ACTION_SHORT, optional: true },
|
|
18
|
+
{ subject: `preset.${action}.hintKey`, key: keys.hintKey, cost: ACTION_HINT, optional: true },
|
|
19
|
+
] : []));
|
|
20
|
+
}
|
|
21
|
+
function accommodationKeys(answers) {
|
|
22
|
+
if (!answers)
|
|
23
|
+
return [];
|
|
24
|
+
return Object.entries(answers).flatMap(([accommodation, keys]) => (keys ? [
|
|
25
|
+
{ subject: `accommodations.${accommodation}.labelKey`, key: keys.labelKey, cost: ACCOMMODATION_NAME, optional: false },
|
|
26
|
+
{ subject: `accommodations.${accommodation}.shortKey`, key: keys.shortKey, cost: ACCOMMODATION_SHORT, optional: true },
|
|
27
|
+
{ subject: `accommodations.${accommodation}.hintKey`, key: keys.hintKey, cost: ACCOMMODATION_HINT, optional: true },
|
|
28
|
+
] : []));
|
|
29
|
+
}
|
|
30
|
+
function optionKeys(options) {
|
|
31
|
+
return (options ?? []).flatMap((o) => [
|
|
32
|
+
{ subject: `gameOptions «${o.id}».labelKey`, key: o.labelKey, cost: OPTION_NAME, optional: false },
|
|
33
|
+
{ subject: `gameOptions «${o.id}».hintKey`, key: o.hintKey, cost: OPTION_HINT, optional: true },
|
|
34
|
+
...(o.kind === 'switch' ? [] : o.values.map((v) => ({ subject: `gameOptions «${o.id}».values «${v.value}».labelKey`, key: v.labelKey, cost: OPTION_NAME, optional: false }))),
|
|
35
|
+
]);
|
|
36
|
+
}
|
|
37
|
+
function slideKeys(slides) {
|
|
38
|
+
return (slides ?? []).map((s, i) => ({ subject: `howToPlay[${i}].textKey`, key: s.textKey, cost: SLIDE_TEXT, optional: false }));
|
|
39
|
+
}
|
|
40
|
+
function hudKeys(numbers) {
|
|
41
|
+
return (numbers ?? []).map((n, i) => ({ subject: `hud[${i}].nameKey`, key: n.nameKey, cost: HUD_NAME, optional: false }));
|
|
42
|
+
}
|
|
43
|
+
/** What is wrong with ONE declared key, or `null`: it must be text, and it must be in the game's dictionaries. */
|
|
44
|
+
function keyProblem(k, declares) {
|
|
45
|
+
if (k.optional && k.key === undefined)
|
|
46
|
+
return null;
|
|
47
|
+
const fix = 'add it to CreateGameOptions.dictionaries, in pt, en and es';
|
|
48
|
+
if (typeof k.key !== 'string' || !k.key.trim()) {
|
|
49
|
+
return `${k.subject} is not a key (since ADR-0232 D3 a game declares the KEY of each word, never the word): ${k.cost} — name a key, and ${fix}`;
|
|
50
|
+
}
|
|
51
|
+
return declares(k.key) ? null : `${k.subject} «${k.key}» is in none of this game's dictionaries: ${k.cost} — ${fix}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* THE DECLARED KEYS THIS GAME'S DICTIONARIES LACK, one line each for `problems` (ADR-0169). `declares` is the root's
|
|
55
|
+
* translator's (`Translator.declares`): a key in ANY language counts as present, because a key given in one language and not
|
|
56
|
+
* another is already a line of its own (`Translator.dictionaryGaps`).
|
|
57
|
+
*/
|
|
58
|
+
export function missingDeclaredKeys(declared, declares) {
|
|
59
|
+
return [
|
|
60
|
+
...presetKeys(declared.preset),
|
|
61
|
+
...accommodationKeys(declared.accommodations),
|
|
62
|
+
...optionKeys(declared.gameOptions),
|
|
63
|
+
...slideKeys(declared.howToPlay),
|
|
64
|
+
...hudKeys(declared.hud),
|
|
65
|
+
].map((k) => keyProblem(k, declares)).filter((line) => line !== null);
|
|
66
|
+
}
|
package/dist-pkg/ui/dom.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
|
|
3
|
-
export declare const $$: <T extends Element = HTMLElement>(s: string) => T[];
|
|
2
|
+
import type { Translate } from '../core/i18n.js';
|
|
4
3
|
/**
|
|
5
4
|
* Reflects an on/off state onto a toggle button: the visual class AND `aria-pressed`.
|
|
6
5
|
* Lives here because the two must never drift apart — a button that looks pressed but does not
|
|
@@ -8,17 +7,14 @@ export declare const $$: <T extends Element = HTMLElement>(s: string) => T[];
|
|
|
8
7
|
*/
|
|
9
8
|
export declare function toggleBtn(b: Element | null, on: boolean): void;
|
|
10
9
|
/**
|
|
11
|
-
*
|
|
10
|
+
* The TEXT of a toggle button: 'On' / 'Off' in English.
|
|
12
11
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* (`settings-empathy.toggleLabel` e `settings-motor.onOffLabel`, ambos apagados agora).
|
|
17
|
-
*
|
|
18
|
-
* O custo dessa dispersão não era estético: com o texto em treze lugares, traduzir o jogo exigiria achar os
|
|
19
|
-
* treze, e esquecer um deixaria um botão em português no meio do inglês — sem erro, sem teste vermelho.
|
|
12
|
+
* It lives here for the same reason as `toggleBtn` just above — the two are halves of one gesture, and must not
|
|
13
|
+
* drift apart. A text copied into each panel is a text that translating the game has to find everywhere, and the
|
|
14
|
+
* one copy it misses leaves a button in the wrong language — with no error and no red test.
|
|
20
15
|
*/
|
|
21
|
-
export declare function toggleLabel(on: boolean): string;
|
|
22
|
-
/**
|
|
23
|
-
*
|
|
24
|
-
|
|
16
|
+
export declare function toggleLabel(t: Translate, on: boolean): string;
|
|
17
|
+
/** The `aria-label` of the same toggle: '{alvo}: on' (`{alvo}` is the dictionary's interpolation key). Separate from
|
|
18
|
+
* the visible label because a screen reader needs the NAME of the target with it, and the screen does not (the
|
|
19
|
+
* name is already on the row beside the button). */
|
|
20
|
+
export declare function toggleAria(t: Translate, target: string, on: boolean): string;
|