@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,30 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
/** The part of a key event's target this reads — an `Element` satisfies it; `window`/`document` have no `closest`. */
|
|
3
|
+
export interface KeyTargetLike {
|
|
4
|
+
readonly isContentEditable?: boolean;
|
|
5
|
+
closest?(selector: string): unknown;
|
|
6
|
+
}
|
|
7
|
+
/** The keys a focused button answers natively: Enter presses it on the key's press, Space on its release. */
|
|
8
|
+
export declare const BUTTON_ACTIVATION_KEYS: ReadonlySet<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Whether a key pressed with the focus on `target` is being typed into a field — input, textarea, select or contenteditable, in
|
|
11
|
+
* the game region or anywhere on the page. Then every key is the field's: Enter and every character.
|
|
12
|
+
*
|
|
13
|
+
* 📌 ASKED BY THE ENGINE'S SYSTEM KEYS TOO, and not only by the delivery. START and SELECT never reach play, so they never pass
|
|
14
|
+
* through `keyGoesToGame`: their own listeners (`boot/create-game`) ask this. 📏 Before they did, Enter typed into a text field
|
|
15
|
+
* opened the quick pause, and «half» typed into one paused on the `h` and opened the menus on the `f`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function keyTypedIntoField(target: KeyTargetLike | null): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Whether the key `code` presses the engine's own control that has the focus (`ownControls`, a selector): Space or Enter on it.
|
|
20
|
+
*
|
|
21
|
+
* 📌 ASKED BY THE QUICK PAUSE TOO, and not only by the delivery. `Enter` is `start`, and START in play opens the quick pause — so
|
|
22
|
+
* Enter on a focused ☰ paused instead of pressing ☰, while Space pressed it (📏 measured on the served quiz). A focused button is
|
|
23
|
+
* activated by Enter as well as Space; that press is the button's, and the pause does not take it.
|
|
24
|
+
*/
|
|
25
|
+
export declare function keyPressesOwnControl(code: string, target: KeyTargetLike | null, ownControls: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Whether the key `code`, pressed with the focus on `target`, is play's to hear. `false`: it belongs to what has the focus — a
|
|
28
|
+
* field, or the engine's own control it activates (`ownControls`, a selector) — and keeps its default.
|
|
29
|
+
*/
|
|
30
|
+
export declare function keyGoesToGame(code: string, target: KeyTargetLike | null, ownControls: string): boolean;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// input/key-default — WHICH KEY THE GAME HEARS, AND WHICH KEEPS ITS BROWSER DEFAULT (ADR-0111 errata of 2026-09-26).
|
|
3
|
+
//
|
|
4
|
+
// The engine owns the keyboard (ADR-0111): it turns a key into a position and carries the position to the game. One key press
|
|
5
|
+
// is one action, and that makes two rules, which are one rule seen from two sides:
|
|
6
|
+
// · A KEY THE GAME HEARD IS SPENT. The keyboard conductor cancels its default, or Space on a focused `<button>` was the game's
|
|
7
|
+
// `action2` AND the button's click on the release.
|
|
8
|
+
// · A KEY THAT WENT TO SOMETHING ELSE IS NOT ALSO PLAYED. It keeps its default, and the game does not hear it. That is what
|
|
9
|
+
// this module answers, before the engine delivers:
|
|
10
|
+
// · a key typed into an editable field (input, textarea, select, contenteditable): typing is the field's;
|
|
11
|
+
// · a key that ACTIVATES one of the engine's own focused controls (`ownControls`, the accessibility bar, in the tab order
|
|
12
|
+
// in play): Space and Enter press a focused button, and that press is the control's.
|
|
13
|
+
// 📏 Both used to keep their default AND be delivered. On the served quiz, Space on ☰ opened the menus and answered a
|
|
14
|
+
// question; Space typed into a text field answered one too.
|
|
15
|
+
//
|
|
16
|
+
// 📌 ONLY THE ACTIVATION KEYS on the engine's control, and not every key: a focused button does nothing native with an arrow or
|
|
17
|
+
// a letter, so an arrow pressed after Tab left the focus on ☰ is still the child moving in the game — held back, it would be
|
|
18
|
+
// lost, and the game would stop answering until she clicked somewhere else.
|
|
19
|
+
//
|
|
20
|
+
// Not decided here: a key refused by an open menu, or consumed by the engine's menus, is the menus' (`input/virtual-controller`,
|
|
21
|
+
// `ui/menu-nav`); a key mapped to no position was never the game's.
|
|
22
|
+
//
|
|
23
|
+
// Pure: it is told the key and where the focus was; it answers a decision. No document, no event.
|
|
24
|
+
const EDITABLE = 'input, textarea, select';
|
|
25
|
+
/** The keys a focused button answers natively: Enter presses it on the key's press, Space on its release. */
|
|
26
|
+
export const BUTTON_ACTIVATION_KEYS = new Set(['Space', 'Enter', 'NumpadEnter']);
|
|
27
|
+
/**
|
|
28
|
+
* Whether a key pressed with the focus on `target` is being typed into a field — input, textarea, select or contenteditable, in
|
|
29
|
+
* the game region or anywhere on the page. Then every key is the field's: Enter and every character.
|
|
30
|
+
*
|
|
31
|
+
* 📌 ASKED BY THE ENGINE'S SYSTEM KEYS TOO, and not only by the delivery. START and SELECT never reach play, so they never pass
|
|
32
|
+
* through `keyGoesToGame`: their own listeners (`boot/create-game`) ask this. 📏 Before they did, Enter typed into a text field
|
|
33
|
+
* opened the quick pause, and «half» typed into one paused on the `h` and opened the menus on the `f`.
|
|
34
|
+
*/
|
|
35
|
+
export function keyTypedIntoField(target) {
|
|
36
|
+
if (!target || typeof target.closest !== 'function')
|
|
37
|
+
return false;
|
|
38
|
+
return !!target.isContentEditable || !!target.closest(EDITABLE);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Whether the key `code` presses the engine's own control that has the focus (`ownControls`, a selector): Space or Enter on it.
|
|
42
|
+
*
|
|
43
|
+
* 📌 ASKED BY THE QUICK PAUSE TOO, and not only by the delivery. `Enter` is `start`, and START in play opens the quick pause — so
|
|
44
|
+
* Enter on a focused ☰ paused instead of pressing ☰, while Space pressed it (📏 measured on the served quiz). A focused button is
|
|
45
|
+
* activated by Enter as well as Space; that press is the button's, and the pause does not take it.
|
|
46
|
+
*/
|
|
47
|
+
export function keyPressesOwnControl(code, target, ownControls) {
|
|
48
|
+
if (!target || typeof target.closest !== 'function')
|
|
49
|
+
return false;
|
|
50
|
+
return BUTTON_ACTIVATION_KEYS.has(code) && !!target.closest(ownControls);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Whether the key `code`, pressed with the focus on `target`, is play's to hear. `false`: it belongs to what has the focus — a
|
|
54
|
+
* field, or the engine's own control it activates (`ownControls`, a selector) — and keeps its default.
|
|
55
|
+
*/
|
|
56
|
+
export function keyGoesToGame(code, target, ownControls) {
|
|
57
|
+
if (!target || typeof target.closest !== 'function')
|
|
58
|
+
return true; // no element had the focus: nothing else to go to
|
|
59
|
+
return !keyTypedIntoField(target) && !keyPressesOwnControl(code, target, ownControls);
|
|
60
|
+
}
|
|
@@ -2,25 +2,21 @@
|
|
|
2
2
|
import type { ControlledPlayer } from '../core/entity.js';
|
|
3
3
|
import type { KeyScheme } from '../core/entity.js';
|
|
4
4
|
import type { KBDefaults } from '../input/keyboard.js';
|
|
5
|
-
/**
|
|
6
|
-
* ui/settings-controls.ts also defines locally (input/keyboard.ts's KeyScheme is not exported — each consumer
|
|
7
|
-
* keeps its own structural copy rather than reaching across layers for a type alias). */
|
|
8
|
-
export type { KeyScheme } from '../core/entity.js';
|
|
9
|
-
/** input/keyboard.ts's KBDefaults shape ({solo,p2,p3,p4}) — the live `KB` value in game.js. */
|
|
10
|
-
/** O `KBDefaults` de `input/keyboard`, que é o dono. O nome local sobrevive porque os consumidores o usam. */
|
|
5
|
+
/** `input/keyboard`'s `KBDefaults` ({solo,p2,p3,p4}), which owns it. The local name survives because consumers use it. */
|
|
11
6
|
export type KeyboardConfig = KBDefaults;
|
|
12
7
|
/** Minimal player shape this module needs: only `ctrl` is read/written — derived from core/entity.
|
|
13
8
|
* `ControlledPlayer` rather than `Player` because this module runs after assignControls, so `ctrl` is no
|
|
14
9
|
* longer null. That was already assumed here; now it is stated. */
|
|
15
10
|
export type KeyboardRuntimePlayer = Pick<ControlledPlayer, 'ctrl'>;
|
|
16
11
|
export interface KeyboardRuntimeCtx {
|
|
17
|
-
/** The live keyboard config
|
|
12
|
+
/** The live keyboard config, read fresh on every call — never cached. */
|
|
18
13
|
getKB(): KeyboardConfig;
|
|
19
|
-
/**
|
|
14
|
+
/** The current player count, read live. */
|
|
20
15
|
getNumPlayers(): number;
|
|
21
|
-
/** The live players array (
|
|
16
|
+
/** The live players array (mutated in place — never reassigned). */
|
|
22
17
|
getPlayers(): KeyboardRuntimePlayer[];
|
|
23
18
|
}
|
|
19
|
+
/** The controls state as a value: player 1's `controls` + its per-action aliases + the flattened list of game keys. */
|
|
24
20
|
export interface ControlsState {
|
|
25
21
|
controls: KeyScheme;
|
|
26
22
|
action2: readonly string[];
|
|
@@ -32,24 +28,22 @@ export interface ControlsState {
|
|
|
32
28
|
gameKeys: string[];
|
|
33
29
|
}
|
|
34
30
|
export interface KeyboardRuntime {
|
|
35
|
-
/** The key scheme for player `playerIndex`, given the current
|
|
31
|
+
/** The key scheme for player `playerIndex`, given the current config + player count. */
|
|
36
32
|
kbFor(playerIndex: number): KeyScheme;
|
|
37
|
-
/** Which action (if any) `code` triggers FOR that player, given their scheme
|
|
33
|
+
/** Which action (if any) `code` triggers FOR that player, given their scheme. */
|
|
38
34
|
actionOf(code: string, playerIndex: number): string | null;
|
|
39
|
-
/** Which player (0-based) owns `code` among the active players; -1 if none
|
|
35
|
+
/** Which player (0-based) owns `code` among the active players; -1 if none. */
|
|
40
36
|
whichPlayer(code: string): number;
|
|
41
|
-
/** Propagates
|
|
37
|
+
/** Propagates the config -> each active player's `p.ctrl`, mutated in place. */
|
|
42
38
|
assignControls(): void;
|
|
43
|
-
/** Computes
|
|
39
|
+
/** Computes player 1's `controls` alias + the game keys. */
|
|
44
40
|
computeControlsState(): ControlsState;
|
|
45
|
-
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* explícita e única: `refreshControls()`. NÃO recalcula a cada leitura de propósito — recalcular mudaria
|
|
50
|
-
* o comportamento (passaria a enxergar remapeamento que ainda não foi aplicado), e isto é refatoração. */
|
|
41
|
+
/** The CURRENT state, memoised. It was a set of copies kept in variables, derived from the config + players — the
|
|
42
|
+
* kind of state that rots fastest, because nothing forces a copy to follow its source. Here the memo stays with
|
|
43
|
+
* whoever owns the sum, and invalidating it is explicit and single: `refreshControls()`. It does NOT recompute on
|
|
44
|
+
* every read, on purpose — that would change behaviour (it would see a remap not applied yet). */
|
|
51
45
|
controlsState(): ControlsState;
|
|
52
|
-
/**
|
|
46
|
+
/** Recomputes and memoises. */
|
|
53
47
|
refreshControls(): ControlsState;
|
|
54
48
|
}
|
|
55
49
|
/** Which action does `code` trigger in this ONE scheme? Pure — no player/KB involved. */
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
2
|
// input/keyboard-runtime.ts — keyboard ROUTING at play time: which key belongs to which player, which action
|
|
3
|
-
// it fires. Extracted from
|
|
4
|
-
// via initKeyboardRuntime(ctx): reads the live KB config (input/keyboard.ts owns
|
|
5
|
-
//
|
|
6
|
-
// `document`.
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// for `coins`/`players`).
|
|
3
|
+
// it fires. Extracted from the monolith (kbFor/actionOf/whichPlayer/assignControls/applyControls). Pure logic, DI
|
|
4
|
+
// via initKeyboardRuntime(ctx), which `boot/create-game` calls: reads the live KB config (input/keyboard.ts owns
|
|
5
|
+
// load/save/reset) and the live player count and players through injected getters — never imports the composition
|
|
6
|
+
// root, never touches `document`. The per-action aliases and GAME_KEYS come back as a plain VALUE object
|
|
7
|
+
// (`ControlsState`) instead of exported `let`s, because imported bindings can't be reassigned from outside their own
|
|
8
|
+
// module; `controlsState()` memoises it and `refreshControls()` is the one way to recompute it.
|
|
10
9
|
import { ACTIONS } from '../core/actions.js';
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
/** A lista que uma posição SEM ALCANCE devolve. Congelada e partilhada: ninguém deve escrever nela. */
|
|
14
|
-
const VAZIO = Object.freeze([]);
|
|
10
|
+
/** The list a position WITH NO REACH returns. Frozen and shared: nobody may write to it. */
|
|
11
|
+
const EMPTY = Object.freeze([]);
|
|
15
12
|
// ---------------------------------------------------------------------------------------------
|
|
16
13
|
// Pure logic (no ctx, no `document` — directly testable with plain KeyScheme fixtures)
|
|
17
14
|
// ---------------------------------------------------------------------------------------------
|
|
@@ -19,10 +16,10 @@ const VAZIO = Object.freeze([]);
|
|
|
19
16
|
* (mirrors ui/settings-controls.ts's keyUsedByOther: a Map built over the scheme, not a re-scan per query). */
|
|
20
17
|
function buildActionIndex(scheme) {
|
|
21
18
|
const index = new Map();
|
|
22
|
-
// ⚠️
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
19
|
+
// ⚠️ THE LOOP IS OVER `ACTIONS` AND NOT OVER THE OBJECT'S KEYS (issue #118). They are the same list now that
|
|
20
|
+
// `KeyScheme` is closed — but walking `ACTIONS` says WHICH list it is, and a scheme that gains an extra key by mistake
|
|
21
|
+
// no longer sees it. And `?? []` handles the DECLARED ABSENCE: a `null` is not a broken scheme, it is a keyboard that
|
|
22
|
+
// does not reach that position.
|
|
26
23
|
for (const action of ACTIONS) {
|
|
27
24
|
for (const code of scheme[action] ?? []) {
|
|
28
25
|
if (!index.has(code))
|
|
@@ -73,18 +70,17 @@ export function initKeyboardRuntime(ctx) {
|
|
|
73
70
|
}
|
|
74
71
|
function computeControlsState() {
|
|
75
72
|
const kb = ctx.getKB();
|
|
76
|
-
const controls = kb.solo; //
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
//
|
|
73
|
+
const controls = kb.solo; // player 1's alias — ALWAYS kb.solo, even with more players (the original behaviour)
|
|
74
|
+
// The aliases are LISTS, never `null`: whoever reads them does `.includes(code)` without asking. A position the
|
|
75
|
+
// scheme does not reach becomes an empty list here — "does not reach" and "reaches with zero keys" are worth the
|
|
76
|
+
// same to whoever only asks whether the key is there.
|
|
80
77
|
//
|
|
81
|
-
// ⚠️
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
const
|
|
87
|
-
const up = lista('up'), down = lista('down'), action1 = lista('action1');
|
|
78
|
+
// ⚠️ AND IT RETURNS THE SAME REFERENCE, not a copy. A case asserts "it is the same array", which is asserting that
|
|
79
|
+
// nobody put a copy between the live scheme and its reader. Copying would cost nothing today and would start costing
|
|
80
|
+
// the day someone mutated the list in place.
|
|
81
|
+
const list = (a) => controls[a] ?? EMPTY;
|
|
82
|
+
const action2 = list('action2'), left = list('left'), right = list('right');
|
|
83
|
+
const up = list('up'), down = list('down'), action1 = list('action1');
|
|
88
84
|
const gameKeySet = new Set();
|
|
89
85
|
ctx.getPlayers().forEach((_, i) => {
|
|
90
86
|
const scheme = kbFor(i);
|
|
@@ -95,7 +91,7 @@ export function initKeyboardRuntime(ctx) {
|
|
|
95
91
|
const gameKeys = gameKeySet.size ? [...gameKeySet] : [...action2, ...left, ...right, ...up, ...down];
|
|
96
92
|
return { controls, action2, left, right, up, down, action1, gameKeys };
|
|
97
93
|
}
|
|
98
|
-
let cache = null; //
|
|
94
|
+
let cache = null; // the derived state's memo; only refreshControls invalidates it
|
|
99
95
|
function controlsState() { return cache ?? (cache = computeControlsState()); }
|
|
100
96
|
function refreshControls() { cache = computeControlsState(); return cache; }
|
|
101
97
|
return { kbFor, actionOf, whichPlayer, assignControls, computeControlsState, controlsState, refreshControls };
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import type { Store } from '../platform/storage.js';
|
|
2
3
|
import type { KeyScheme } from '../core/entity.js';
|
|
3
|
-
export type { KeyScheme } from '../core/entity.js';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* What the key map is read and written through: the page's store (ADR-0232, issue #207). A PARAMETER of each function that
|
|
6
|
+
* touches it, not a module import — a test hands in its own, and two roots never write each other's map.
|
|
7
|
+
*/
|
|
8
|
+
export type KeyboardStore = Pick<Store, 'getJSON' | 'setJSON' | 'remove'>;
|
|
9
|
+
/**
|
|
10
|
+
* THE SET OF keyboard SCHEMES — solo plus those for 2, 3 and 4 players.
|
|
6
11
|
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
9
|
-
*
|
|
12
|
+
* Exported because it was already being copied: `input/keyboard-runtime` and `ui/settings-controls` each
|
|
13
|
+
* declared their own `KeyboardConfig`, and BOTH said in a comment it was "the shape of input/keyboard's
|
|
14
|
+
* KBDefaults". They knew they were a copy and copied anyway.
|
|
10
15
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
16
|
+
* The `settings-controls` one was `Record<string, unknown>` — meant as opaque, so the module would not depend on
|
|
17
|
+
* the shape. But in PARAMETER position that inverts: to accept `(next: KBDefaults)`, the declared type has to be
|
|
18
|
+
* a SUBTYPE, not a supertype. Opacity is kept by discipline — not indexing the value — and not by writing a wider
|
|
19
|
+
* type (ADR-0039).
|
|
15
20
|
*/
|
|
16
21
|
export type KBDefaults = {
|
|
17
22
|
solo: KeyScheme;
|
|
@@ -19,69 +24,69 @@ export type KBDefaults = {
|
|
|
19
24
|
p3: KeyScheme[];
|
|
20
25
|
p4: KeyScheme[];
|
|
21
26
|
};
|
|
22
|
-
export declare const KB_SCHEMES4: KeyScheme[];
|
|
23
27
|
/**
|
|
24
|
-
* ⚠️
|
|
25
|
-
*
|
|
28
|
+
* ⚠️ THE TWO KEYBOARD TABLES BECAME ONE (issue #118). Solo and duo are no longer written here: they are LIVE
|
|
29
|
+
* COPIES of what `input/default-bindings` declares, which is where ADR-0096 put the decision.
|
|
26
30
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
31
|
+
* They used to be two parallel lists of eight positions each, and all eight "matched" — but one. Player 1's
|
|
32
|
+
* `Space` in duo was in one list and not the other, and the cost was concrete: the webcam control of the time
|
|
33
|
+
* synthesised `Space` for "look up = jump", so a second player joining took JUMP away from whoever played with
|
|
34
|
+
* their eyes and left walking. Nothing failed out loud. Deriving instead of repeating makes that divergence
|
|
35
|
+
* impossible to come back, instead of catching it after it happens.
|
|
32
36
|
*/
|
|
33
37
|
export declare const KB_DEFAULTS: KBDefaults;
|
|
34
38
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*/
|
|
38
|
-
export type MapeamentoDoTeclado = (jogadores: number, assento: number) => Partial<KeyScheme> | null;
|
|
39
|
-
/**
|
|
40
|
-
* REGISTA O PADRÃO DO JOGO. Chamado uma vez pelo arranque (`boot/create-game`), a partir da declaração.
|
|
41
|
-
*
|
|
42
|
-
* 🔴 REGISTO E NÃO PARÂMETRO, e a razão é um defeito medido em vez de uma preferência. Há DOIS sítios que
|
|
43
|
-
* materializam padrões — `loadKB` e `resetKB` — e o segundo é chamado pelo painel de controles, que não tem a
|
|
44
|
-
* declaração do jogo à mão. Um parâmetro que o painel não passasse faria «restaurar padrões» devolver o mapa
|
|
45
|
-
* da ENGINE por cima do mapa do JOGO: a criança carrega no botão esperando voltar ao que o jogo lhe deu, e
|
|
46
|
-
* volta para outra coisa — num jogo cujo autor escolheu o layout por uma razão de acessibilidade, ela perde
|
|
47
|
-
* essa razão e nada o diz.
|
|
48
|
-
*
|
|
49
|
-
* 📌 É a mesma forma que o `kb` deste ficheiro já tem, e pela mesma justificação: o dono é evidente, e as
|
|
50
|
-
* funções que o gerem vivem todas aqui.
|
|
51
|
-
*/
|
|
52
|
-
export declare function registrarMapeamentoDoTeclado(f: MapeamentoDoTeclado | null): void;
|
|
53
|
-
/**
|
|
54
|
-
* A FÁBRICA COM O PADRÃO DO JOGO POR CIMA — a **única** resolução, usada pelo `loadKB` E pelo `resetKB`.
|
|
55
|
-
*
|
|
56
|
-
* ⚠️ Uma função só, e é o ponto inteiro: enquanto eram duas cópias do `JSON.parse(JSON.stringify(...))`, a do
|
|
57
|
-
* `resetKB` não conhecia o jogo e a diferença só aparecia quando uma criança carregava em «restaurar».
|
|
39
|
+
* THE DEFAULT THE GAME WANTS, per player count and per seat (ADR-0115). Partial: whatever it does not say stays
|
|
40
|
+
* as the engine's factory left it.
|
|
58
41
|
*/
|
|
59
|
-
export
|
|
60
|
-
export declare function loadKB(): KBDefaults;
|
|
61
|
-
export declare function saveKB(kb: KBDefaults): void;
|
|
42
|
+
export type KeyboardMapping = (players: number, seat: number) => Partial<KeyScheme> | null;
|
|
62
43
|
/**
|
|
63
|
-
*
|
|
64
|
-
* `setKB: (k) => { KB = k; }` fabricado à mão para o painel de controles reatribuí-lo.
|
|
65
|
-
*
|
|
66
|
-
* Mora AQUI, e não em core/state como os outros migrados, porque o dono é evidente: `loadKB`, `saveKB` e
|
|
67
|
-
* `resetKB` já viviam neste arquivo. Separar o valor das três funções que o gerenciam seria mover o problema
|
|
68
|
-
* de lugar em vez de resolvê-lo.
|
|
44
|
+
* THE FACTORY WITH THE GAME'S DEFAULT ON TOP — the **only** resolution, used by `loadKB` AND by the reset.
|
|
69
45
|
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
46
|
+
* ⚠️ One function, and that is the whole point: while there were two copies of `JSON.parse(JSON.stringify(...))`,
|
|
47
|
+
* the reset's did not know the game, and the difference only showed when a child pressed "restore".
|
|
48
|
+
* 📌 The mapping is a PARAMETER, `null` for a game with no opinion (ADR-0232 D4): as a module registration a second
|
|
49
|
+
* root would overwrite the first root's (D2b erratum). What once justified the registration — the controls panel
|
|
50
|
+
* resetting without the game's declaration at hand — is answered by `createKeyboardConfig`, which receives the
|
|
51
|
+
* mapping once and hands the panel a reset that already knows it.
|
|
74
52
|
*/
|
|
75
|
-
export declare
|
|
76
|
-
|
|
77
|
-
export declare function
|
|
78
|
-
/**
|
|
79
|
-
|
|
80
|
-
|
|
53
|
+
export declare function factoryWithGame(mapping: KeyboardMapping | null): KBDefaults;
|
|
54
|
+
export declare function loadKB(store: KeyboardStore, mapping: KeyboardMapping | null): KBDefaults;
|
|
55
|
+
export declare function saveKB(store: KeyboardStore, kb: KBDefaults): void;
|
|
56
|
+
/** What one root's keyboard config is built from (ADR-0232 D4). Both required: see `createKeyboardConfig`. */
|
|
57
|
+
export interface KeyboardConfigOptions {
|
|
58
|
+
/** Where the child's remapping is kept — the page's store, built by the root. */
|
|
59
|
+
readonly store: KeyboardStore;
|
|
60
|
+
/** The GAME's default, `null` for a game with no opinion. Read on every factory resolution, so a root that mounts
|
|
61
|
+
* another cartridge can answer with the mounted one's. */
|
|
62
|
+
readonly mapping: KeyboardMapping | null;
|
|
63
|
+
}
|
|
64
|
+
/** ONE ROOT'S LIVE KEY MAP and the doors that manage it — what `Engine.keyboardConfig` is. */
|
|
65
|
+
export interface KeyboardConfigApi {
|
|
66
|
+
/** THE LIVE KEY MAP (#50). Remapping one key MUTATES this object; `set` is the only way to replace it. */
|
|
67
|
+
kb(): KBDefaults;
|
|
68
|
+
/** Replaces the whole map. Only "restore defaults" needs this — reassigning by mistake would leave live references
|
|
69
|
+
* pointing at the old map. */
|
|
70
|
+
set(next: KBDefaults): void;
|
|
71
|
+
/** Stores `conf` (the live map when omitted) in the store. */
|
|
72
|
+
save(conf?: KBDefaults): void;
|
|
73
|
+
/**
|
|
74
|
+
* "RESTORE DEFAULTS" — erases what the child stored and returns the GAME's default, not the engine's (ADR-0115).
|
|
75
|
+
* 🔴 Resetting to the engine's factory alone would silently erase the mapping the game chose. It does NOT replace
|
|
76
|
+
* the live map: the caller decides (`set`), as the controls panel does.
|
|
77
|
+
*/
|
|
78
|
+
reset(): KBDefaults;
|
|
79
|
+
/** The engine's factory with this game's default on top — a fresh copy each call. */
|
|
80
|
+
factoryWithGame(): KBDefaults;
|
|
81
|
+
/** Reads the stored map into the live one and returns it. */
|
|
82
|
+
load(): KBDefaults;
|
|
83
|
+
}
|
|
81
84
|
/**
|
|
82
|
-
*
|
|
85
|
+
* BUILDS ONE ROOT'S KEYBOARD CONFIG (ADR-0232 D4). The mapping is a construction parameter and not a registration: a
|
|
86
|
+
* registration is module state a second root overwrites (D2b erratum), and the reset this object hands out already knows
|
|
87
|
+
* the game, which is what the registration existed to guarantee.
|
|
83
88
|
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
89
|
+
* ⚠️ IT DOES NOT READ THE STORE WHEN BUILT: the live map is born from the game's factory and `load()` is what reads, called
|
|
90
|
+
* once by the root. A test that builds one inherits nothing from any storage.
|
|
86
91
|
*/
|
|
87
|
-
export declare function
|
|
92
|
+
export declare function createKeyboardConfig(opts: KeyboardConfigOptions): KeyboardConfigApi;
|