@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
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// input/devices.ts —
|
|
3
|
-
// PAD_DESIGNS:
|
|
4
|
-
//
|
|
5
|
-
// A leitura de pads (pollPads) e o layout de toque ficam no game.js. (Fase 2, subsistema input)
|
|
2
|
+
// input/devices.ts — gamepad and touch labels and mappings (data). A leaf module, NO dependencies.
|
|
3
|
+
// PAD_DESIGNS: how to label the 4 action buttons per pad model (the browser detects a generic one on Windows).
|
|
4
|
+
// TOUCH_DEFAULT: the default map of the 13 touch slots (the 4 shoulder ones since ADR-0160).
|
|
6
5
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
6
|
+
// WHY KEYS AND NOT TEXT: the table is a module `const`, evaluated ONCE at import. If it held an already resolved `t('…')`,
|
|
7
|
+
// the language would freeze at boot — whoever read before a switch would never see the switch. Holding the key, the
|
|
8
|
+
// place of use resolves it. This module stays dependency-free on purpose: a key is data, `t` is behaviour and lives in
|
|
9
|
+
// the consumer.
|
|
11
10
|
export const PAD_DESIGNS = {
|
|
12
11
|
generic: { '0': ['0', '#3a4a6a'], '1': ['1', '#3a4a6a'], '2': ['2', '#3a4a6a'], '3': ['3', '#3a4a6a'] },
|
|
13
12
|
microsoft: { '0': ['A', '#2fae4e'], '1': ['B', '#d23b3b'], '2': ['X', '#2f6fd2'], '3': ['Y', '#d9a400'] },
|
|
@@ -15,17 +14,19 @@ export const PAD_DESIGNS = {
|
|
|
15
14
|
nintendo: { '0': ['B', '#d9a400'], '1': ['A', '#d23b3b'], '2': ['Y', '#2fae4e'], '3': ['X', '#2f6fd2'] },
|
|
16
15
|
};
|
|
17
16
|
/**
|
|
18
|
-
*
|
|
17
|
+
* Pad glyphs that CANNOT BE READ ALOUD — the i18n key of each one's spoken name (ADR-0044, item 4).
|
|
19
18
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
19
|
+
* A screen reader reads `✕` as "multiplication sign", or reads nothing, and `△` usually comes out mute. That is why the
|
|
20
|
+
* pause legend carried `aria-hidden="true"`: the noise AND the information were hidden together. Here is the half that
|
|
21
|
+
* was missing to take the attribute off — the glyph stays on screen for whoever recognises it, and the WORD exists for
|
|
22
|
+
* whoever hears it.
|
|
24
23
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
24
|
+
* Only the four PlayStation ones are here. `A`, `B`, `X`, `Y` and `0`–`3` already read, and translating them to "letter
|
|
25
|
+
* A" would add noise in accessibility's name — the defect this item fixes, inside out.
|
|
27
26
|
*/
|
|
28
27
|
export const PAD_GLYPH_SPOKEN = {
|
|
29
28
|
'✕': 'pad.glyph.cross', '○': 'pad.glyph.circle', '□': 'pad.glyph.square', '△': 'pad.glyph.triangle',
|
|
30
29
|
};
|
|
31
|
-
export const TOUCH_DEFAULT = { up: 'up', down: 'down', left: 'left', right: 'right', start: 'start', b0: 'action2', b1: 'action3', b2: 'action1', b3: 'action4'
|
|
30
|
+
export const TOUCH_DEFAULT = { up: 'up', down: 'down', left: 'left', right: 'right', start: 'start', b0: 'action2', b1: 'action3', b2: 'action1', b3: 'action4',
|
|
31
|
+
// The SHOULDERS (ADR-0160): L1/L2 in the top-left corner, R1/R2 in the right. They show only if the game names them (ADR-0162).
|
|
32
|
+
bl1: 'leftShoulder', bl2: 'leftTrigger', br1: 'rightShoulder', br2: 'rightTrigger' };
|
|
@@ -1,58 +1,49 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
/**
|
|
2
|
+
/** The six input edges, by the name of the field they raise on the player. */
|
|
3
3
|
export type EdgeFlag = 'jumpEdge' | 'runEdge' | 'leftEdge' | 'rightEdge' | 'swapEdge' | 'specialEdge';
|
|
4
|
-
/**
|
|
5
|
-
*
|
|
4
|
+
/** The six actions that raise an edge. Named (not `string`) so the compiler matches it with the pad transport, which
|
|
5
|
+
* reads the table passing the action on. */
|
|
6
6
|
export type EdgeAction = 'action2' | 'action1' | 'left' | 'right' | 'action4' | 'action3';
|
|
7
|
-
/**
|
|
7
|
+
/** Action → edge, in the ORDER the three paths raise them. */
|
|
8
8
|
export declare const EDGE_BY_ACTION: ReadonlyArray<readonly [EdgeAction, EdgeFlag]>;
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* May this player raise this action's edge?
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* There is one rule today, and it is about accessibility: in Easy mode `action1` raises no edge — no running, and so no
|
|
13
|
+
* wall climbing. It holds for keyboard, pad and touch, which is exactly the point. A second rule would enter HERE and
|
|
14
|
+
* hold for all three at once.
|
|
15
15
|
*/
|
|
16
16
|
export declare function edgeAllowed(action: EdgeAction, easy: boolean | undefined): boolean;
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* The six menu-navigation intents — the edges' story, one floor up.
|
|
19
19
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* pedindo para ser notada. E já tinham divergido: a de `ui/activities-menu` declarava os seis campos
|
|
23
|
-
* OPCIONAIS e as outras três, obrigatórios — de modo que `navTitle` aceitava `{}` enquanto quem a alimenta
|
|
24
|
-
* sempre manda os seis.
|
|
20
|
+
* It was declared FOUR times, and three of them carried a comment saying "SAME shape as…", which is a copy asking to be
|
|
21
|
+
* noticed. They had already diverged: one declared the six fields OPTIONAL and the other three required.
|
|
25
22
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* `input/devices`. A direção é essa.
|
|
23
|
+
* It lives in `input/` because it is an INPUT intent: the translators (keyboard, pad, touch, voice, camera) produce it and
|
|
24
|
+
* the UI consumes it. `input/` never imports `ui/`; `ui/` imports `input/`. That is the direction.
|
|
29
25
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* negações que ninguém lê. É a forma que `ui/activities-menu` já usava, e é a certa; o que estava errado era
|
|
33
|
-
* as outras três discordarem dela.
|
|
26
|
+
* OPTIONAL on purpose, unlike the edges: a translator sends only what happened. `{ down: true }` is a whole sentence —
|
|
27
|
+
* "down" — and requiring the other five `false`s would make every call carry five negations nobody reads.
|
|
34
28
|
*/
|
|
35
29
|
export interface NavKeys {
|
|
36
30
|
up?: boolean;
|
|
37
31
|
down?: boolean;
|
|
38
32
|
left?: boolean;
|
|
39
33
|
right?: boolean;
|
|
40
|
-
/**
|
|
34
|
+
/** Confirm / enter. */
|
|
41
35
|
yes?: boolean;
|
|
42
|
-
/**
|
|
36
|
+
/** Back / cancel. */
|
|
43
37
|
no?: boolean;
|
|
44
38
|
}
|
|
45
39
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
40
|
+
* Was any intent expressed this frame? With no intent, the key is NOT consumed — no `preventDefault`, no
|
|
41
|
+
* `stopPropagation`, no navigation.
|
|
48
42
|
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* para cá e criar uma função nova seria trocar seis por meia dúzia — o raciocínio estava certo e o número,
|
|
52
|
-
* errado: não era uma cópia, eram duas, e o canônico apaga as duas. Os dois módulos reexportam com o nome
|
|
53
|
-
* que os chamadores e os testes deles já usam.
|
|
43
|
+
* It was written TWICE, with the same body under two names; the canonical one erases both, and the two modules re-export
|
|
44
|
+
* it under the names their callers and tests already use.
|
|
54
45
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
46
|
+
* The `!!` matters: with optional fields, the `||` chain returns `boolean | undefined`. The compiler pointed it out when
|
|
47
|
+
* the type narrowed — both functions had been returning `undefined` as if it were `false`.
|
|
57
48
|
*/
|
|
58
49
|
export declare function hasNavIntent(k: NavKeys): boolean;
|
package/dist-pkg/input/edges.js
CHANGED
|
@@ -1,48 +1,43 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// input/edges —
|
|
3
|
-
//
|
|
2
|
+
// input/edges — the "action → input edge" table, and the rule of who may raise it. A LEAF module: no imports, no DOM,
|
|
3
|
+
// no state.
|
|
4
4
|
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// `input/touch-bindings.ts`. Três cópias que precisavam concordar, e nada obrigando.
|
|
5
|
+
// WHY THIS EXISTS AS A MODULE
|
|
6
|
+
// An "edge" is the instant the player JUST triggered something — `jumpEdge`, `runEdge`, `leftEdge`… — as opposed to
|
|
7
|
+
// holding it. The three input paths raise edges, and each had its own copy of the same table: three copies that had to
|
|
8
|
+
// agree, with nothing forcing them.
|
|
10
9
|
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// este módulo é o que impede a divergência de voltar, porque agora só há um lugar onde ela poderia morar.
|
|
10
|
+
// They diverged. The touch copy lacked the Easy-mode guard, and since `runEdge` is not the running speed — it is the
|
|
11
|
+
// trigger that clings to and lets go of a wall — a child in Easy mode (which exists for motor difficulty) could not climb
|
|
12
|
+
// with keyboard or pad and could with the on-screen button. On a public-school tablet, touch is not the alternative path:
|
|
13
|
+
// it is the only one. The symptom was fixed before this module; this module is what keeps the divergence from coming
|
|
14
|
+
// back, because there is only one place left for it to live.
|
|
17
15
|
//
|
|
18
|
-
//
|
|
19
|
-
/**
|
|
16
|
+
// THE TABLE'S ORDER IS OBSERVABLE: the edges come back in the order it is walked, and a test anchors it.
|
|
17
|
+
/** Action → edge, in the ORDER the three paths raise them. */
|
|
20
18
|
export const EDGE_BY_ACTION = Object.freeze([
|
|
21
19
|
['action2', 'jumpEdge'], ['action1', 'runEdge'], ['left', 'leftEdge'],
|
|
22
20
|
['right', 'rightEdge'], ['action4', 'swapEdge'], ['action3', 'specialEdge'],
|
|
23
21
|
]);
|
|
24
22
|
/**
|
|
25
|
-
*
|
|
23
|
+
* May this player raise this action's edge?
|
|
26
24
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
25
|
+
* There is one rule today, and it is about accessibility: in Easy mode `action1` raises no edge — no running, and so no
|
|
26
|
+
* wall climbing. It holds for keyboard, pad and touch, which is exactly the point. A second rule would enter HERE and
|
|
27
|
+
* hold for all three at once.
|
|
30
28
|
*/
|
|
31
29
|
export function edgeAllowed(action, easy) {
|
|
32
30
|
return !(action === 'action1' && !!easy);
|
|
33
31
|
}
|
|
34
32
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
33
|
+
* Was any intent expressed this frame? With no intent, the key is NOT consumed — no `preventDefault`, no
|
|
34
|
+
* `stopPropagation`, no navigation.
|
|
37
35
|
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* para cá e criar uma função nova seria trocar seis por meia dúzia — o raciocínio estava certo e o número,
|
|
41
|
-
* errado: não era uma cópia, eram duas, e o canônico apaga as duas. Os dois módulos reexportam com o nome
|
|
42
|
-
* que os chamadores e os testes deles já usam.
|
|
36
|
+
* It was written TWICE, with the same body under two names; the canonical one erases both, and the two modules re-export
|
|
37
|
+
* it under the names their callers and tests already use.
|
|
43
38
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
39
|
+
* The `!!` matters: with optional fields, the `||` chain returns `boolean | undefined`. The compiler pointed it out when
|
|
40
|
+
* the type narrowed — both functions had been returning `undefined` as if it were `false`.
|
|
46
41
|
*/
|
|
47
42
|
export function hasNavIntent(k) {
|
|
48
43
|
return !!(k.yes || k.no || k.up || k.down || k.left || k.right);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
/**
|
|
3
|
+
* THE TWO MOTOR EMPATHY SIMULATIONS, AS DECISIONS ON GAME KEYS (ADR-0181). Pure: the root applies the decision to the event
|
|
4
|
+
* before any cartridge hears it.
|
|
5
|
+
*
|
|
6
|
+
* A simulation makes play harder on purpose, to show what a motor disability costs; it is never an accommodation.
|
|
7
|
+
* · «um botão por vez»: while one game key is held, a second is never accepted — nor its release;
|
|
8
|
+
* · «sem força para segurar»: a held key reads as one tap — the press passes and is released at once; its repeats and its
|
|
9
|
+
* real release do not reach the game.
|
|
10
|
+
*/
|
|
11
|
+
export type KeyDecision = 'passar' | 'barrar' | 'tocar';
|
|
12
|
+
export interface EmpathySimulation {
|
|
13
|
+
readonly noChords: boolean;
|
|
14
|
+
readonly noGripStrength: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface EmpathyFilter {
|
|
17
|
+
/** A game key goes down. `tocar`: let it through and release it at once. */
|
|
18
|
+
keydown(code: string, repeat: boolean, sim: EmpathySimulation): KeyDecision;
|
|
19
|
+
/** A game key comes up. */
|
|
20
|
+
keyup(code: string): KeyDecision;
|
|
21
|
+
}
|
|
22
|
+
export declare function createEmpathyFilter(): EmpathyFilter;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
export function createEmpathyFilter() {
|
|
3
|
+
const accepted = new Set(); // held, and the game saw them go down
|
|
4
|
+
const touched = new Set(); // physically held, already released to the game as a tap
|
|
5
|
+
const blocked = new Set(); // held, and the game never saw them
|
|
6
|
+
const anotherHeld = (code) => [...accepted, ...touched].some((k) => k !== code);
|
|
7
|
+
return {
|
|
8
|
+
keydown(code, repeat, sim) {
|
|
9
|
+
if (touched.has(code) || blocked.has(code))
|
|
10
|
+
return 'barrar';
|
|
11
|
+
if (sim.noChords && anotherHeld(code)) {
|
|
12
|
+
blocked.add(code);
|
|
13
|
+
return 'barrar';
|
|
14
|
+
}
|
|
15
|
+
if (sim.noGripStrength) {
|
|
16
|
+
if (repeat && accepted.has(code))
|
|
17
|
+
return 'barrar';
|
|
18
|
+
accepted.delete(code);
|
|
19
|
+
touched.add(code);
|
|
20
|
+
return 'tocar';
|
|
21
|
+
}
|
|
22
|
+
accepted.add(code);
|
|
23
|
+
return 'passar';
|
|
24
|
+
},
|
|
25
|
+
keyup(code) {
|
|
26
|
+
if (touched.delete(code))
|
|
27
|
+
return 'barrar';
|
|
28
|
+
if (blocked.delete(code))
|
|
29
|
+
return 'barrar';
|
|
30
|
+
accepted.delete(code);
|
|
31
|
+
return 'passar';
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { Action } from '../core/actions.js';
|
|
3
|
+
export type FaceExpression = 'browsUp' | 'frown' | 'headLeft' | 'headRight' | 'squeeze' | 'pressLips' | 'openMouth' | 'smile' | 'pucker' | 'lookRightThenLeft' | 'mouthLeft' | 'lookLeftThenRight' | 'mouthRight';
|
|
4
|
+
/** The Dev's map (ADR-0210 erratum): each expression and the action it presses. SELECT has no expression. */
|
|
5
|
+
export declare const FACE_MAP: {
|
|
6
|
+
readonly [E in FaceExpression]: Action;
|
|
7
|
+
};
|
|
8
|
+
/** The blendshapes the map reads — a closed list. */
|
|
9
|
+
export declare const FACE_BLENDSHAPES: readonly ["browInnerUp", "browOuterUpLeft", "browOuterUpRight", "browDownLeft", "browDownRight", "mouthPressLeft", "mouthPressRight", "jawOpen", "mouthSmileLeft", "mouthSmileRight", "mouthUpperUpLeft", "mouthUpperUpRight", "mouthPucker", "mouthLeft", "mouthRight", "eyeLookOutLeft", "eyeLookInLeft", "eyeLookOutRight", "eyeLookInRight", "eyeBlinkLeft", "eyeBlinkRight", "eyeSquintLeft", "eyeSquintRight"];
|
|
10
|
+
export type FaceBlendshape = (typeof FACE_BLENDSHAPES)[number];
|
|
11
|
+
export type FaceScores = Partial<Readonly<Record<FaceBlendshape, number>>>;
|
|
12
|
+
export type ExpressionLevels = {
|
|
13
|
+
readonly [E in FaceExpression]?: number;
|
|
14
|
+
};
|
|
15
|
+
/** The Face Landmarker's categories, keeping the ones the map reads. */
|
|
16
|
+
export declare function faceScoresFromCategories(categories: ReadonlyArray<{
|
|
17
|
+
readonly categoryName: string;
|
|
18
|
+
readonly score: number;
|
|
19
|
+
}> | null | undefined): FaceScores;
|
|
20
|
+
/** The calibrated rest: each blendshape's median, and where the nose sat. */
|
|
21
|
+
export interface FaceRest {
|
|
22
|
+
readonly scores: FaceScores;
|
|
23
|
+
readonly headX: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The head turned, from the nose tip's offset against the middle of the face's two sides (landmarks 1, 234, 454), in face widths, from the
|
|
27
|
+
* rest. In the camera's unmirrored image the player's left is +x. `FULL_TURN` 0.65 puts the 0.3 mark near 18° (the Dev asked for a less
|
|
28
|
+
* sensitive head; geometry, not measured on a face).
|
|
29
|
+
*/
|
|
30
|
+
export declare const FULL_TURN = 0.65;
|
|
31
|
+
export declare function headTurn(landmarks: ReadonlyArray<{
|
|
32
|
+
readonly x: number;
|
|
33
|
+
readonly y: number;
|
|
34
|
+
}> | null | undefined, restX?: number): {
|
|
35
|
+
x: number | null;
|
|
36
|
+
left: number;
|
|
37
|
+
right: number;
|
|
38
|
+
};
|
|
39
|
+
/** The raw levels of one frame, from the scores and the head turn, against the rest. */
|
|
40
|
+
export declare function faceLevels(s: FaceScores, rest: FaceRest, turn: {
|
|
41
|
+
left: number;
|
|
42
|
+
right: number;
|
|
43
|
+
}): ExpressionLevels;
|
|
44
|
+
/** START's squeeze mark: above the relaxed narrowing (0.30–0.34) and the eye a real frown squeezes (0.36–0.49) in the Dev's runs. */
|
|
45
|
+
export declare const SQUEEZE_MARK = 0.5;
|
|
46
|
+
/** The exclusions: a held specific expression clears the generic one it drags along; a squeeze at START's mark clears the frown. */
|
|
47
|
+
export declare function resolveFace(levels: ExpressionLevels, mark: number): ExpressionLevels;
|
|
48
|
+
/** The pucker's own mark (0.6): below it, it is not a pucker. */
|
|
49
|
+
export declare const PUCKER_MARK = 0.6;
|
|
50
|
+
export declare function ownMarks(levels: ExpressionLevels): ExpressionLevels;
|
|
51
|
+
/**
|
|
52
|
+
* The crossed look. In: the look to each side (in the levels, under the button it ends on). Out: the button levels. A first side counts
|
|
53
|
+
* only if it peaked at `peakMin` and then left the mark; the second must reach `peakMin` within `windowMs` and stay `holdMs`; held, it
|
|
54
|
+
* stays down while the look stays at the mark; a turned head cancels any crossing.
|
|
55
|
+
*/
|
|
56
|
+
export declare function createCrossedLook({ mark, peakMin, windowMs, holdMs }: {
|
|
57
|
+
mark: number;
|
|
58
|
+
peakMin?: number;
|
|
59
|
+
windowMs?: number;
|
|
60
|
+
holdMs?: number;
|
|
61
|
+
}): (ms: number, levels: ExpressionLevels) => ExpressionLevels;
|
|
62
|
+
/** START's long squeeze: its level passes only after staying at `SQUEEZE_MARK` for `ms` (the usual hold comes on top: about 1 s). */
|
|
63
|
+
export declare function createLongSqueeze(ms?: number): (now: number, levels: ExpressionLevels) => ExpressionLevels;
|
|
64
|
+
export declare function createMouthHold({ mark, ms }: {
|
|
65
|
+
mark: number;
|
|
66
|
+
ms?: number;
|
|
67
|
+
}): (now: number, levels: ExpressionLevels) => ExpressionLevels;
|
|
68
|
+
/** The whole reader: a frame's scores and landmarks in, the actions held and the ones that just started out. */
|
|
69
|
+
export declare function createFaceMapReader({ rest, mark, holdMs }: {
|
|
70
|
+
rest: FaceRest;
|
|
71
|
+
mark?: number;
|
|
72
|
+
holdMs?: number;
|
|
73
|
+
}): (ms: number, scores: FaceScores, landmarks?: ReadonlyArray<{
|
|
74
|
+
readonly x: number;
|
|
75
|
+
readonly y: number;
|
|
76
|
+
}> | null) => {
|
|
77
|
+
held: Action[];
|
|
78
|
+
started: Action[];
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* THE FACE'S REST, MEASURED BY ITSELF (the Dev, 2026-09-16: «sozinho, quando o rosto fica parado olhando para o centro da tela por 3 s+»).
|
|
82
|
+
* Frames gather while the face stays still — every blendshape and the nose within `maxSpread` of their median — for `restMs` in a row;
|
|
83
|
+
* any movement restarts the count, so the rest is never taken from a child who is talking, reading or looking around.
|
|
84
|
+
*/
|
|
85
|
+
export declare function createFaceRest({ restMs, maxSpread }?: {
|
|
86
|
+
restMs?: number;
|
|
87
|
+
maxSpread?: number;
|
|
88
|
+
}): (ms: number, scores: FaceScores, headX: number | null) => {
|
|
89
|
+
rest: FaceRest | null;
|
|
90
|
+
stillMs: number;
|
|
91
|
+
};
|
|
92
|
+
/** The rest from a few seconds of samples: each blendshape's median, and the nose's. */
|
|
93
|
+
export declare function faceRestFromSamples(samples: ReadonlyArray<{
|
|
94
|
+
readonly scores: FaceScores;
|
|
95
|
+
readonly headX: number | null;
|
|
96
|
+
}>): FaceRest;
|