@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,60 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// input/origem-sintetica.ts — QUEM DESPACHOU ESTA TECLA, quando não foi um dedo num teclado (ADR-0109).
|
|
3
|
-
//
|
|
4
|
-
// ========================= O PONTO DIFÍCIL DA ARESTA, E ELE ESTAVA NOMEADO =========================
|
|
5
|
-
// O crivo `tests/origem-da-tecla` carrega esta frase na entrada do `input/keydown` desde que o
|
|
6
|
-
// estrangulamento começou: «a webcam despacha `KeyboardEvent` SINTÉTICO, entra pelo `keydown` e seria
|
|
7
|
-
// carimbada `teclado` — a erasão a voltar pela porta da frente». O `ui/webcam` constrói um `KeyboardEvent` e
|
|
8
|
-
// despacha-o na janela (`ui/webcam.ts`, `eyeSet`), e do lado de lá ele é indistinguível de uma tecla premida.
|
|
9
|
-
//
|
|
10
|
-
// `isTrusted` distingue PREMIDA de DESPACHADA — é a única propriedade que um script não consegue forjar — mas
|
|
11
|
-
// não diz QUAL transporte assistido despachou. Isso tem de chegar DECLARADO, e é o que este módulo é.
|
|
12
|
-
//
|
|
13
|
-
// ⚠️ POR QUE O CARIMBO VIAJA NO EVENTO, e não num «qual é a fonte sintética agora?» injectado. A resposta
|
|
14
|
-
// injectada é um estado GLOBAL, e a entrada não é global: uma criança que joga por olhar e tem um adulto a
|
|
15
|
-
// carregar numa tecla ao lado produz as duas arestas no mesmo instante, e o estado global carimbaria as duas
|
|
16
|
-
// como olhar. O evento não se confunde consigo próprio — a origem anda com a aresta a que pertence, que é a
|
|
17
|
-
// mesma razão por que o `origemDaTecla` é um mapa por CÓDIGO e não um campo só.
|
|
18
|
-
//
|
|
19
|
-
// 📌 E é aditivo por construção: um evento sem carimbo continua a funcionar. Foi isso que permitiu migrar os
|
|
20
|
-
// escritores um a um sem nenhum commit vermelho pelo meio.
|
|
21
|
-
import { ehTransporte } from './transporte-em-uso.js';
|
|
22
|
-
/**
|
|
23
|
-
* A propriedade pendurada no evento.
|
|
24
|
-
*
|
|
25
|
-
* 📌 Prefixada e feia de propósito: é um expando num objecto que não é nosso, e um nome curto («origem»)
|
|
26
|
-
* podia colidir com o de outra biblioteca sem que nada o dissesse.
|
|
27
|
-
*/
|
|
28
|
-
export const CHAVE_DE_ORIGEM = '__vpOrigem';
|
|
29
|
-
/**
|
|
30
|
-
* DECLARA que este evento veio daquele aparelho. Devolve o próprio evento, para o despacho ficar numa linha.
|
|
31
|
-
*
|
|
32
|
-
* ⚠️ Carimba-se ANTES de despachar. Depois de `dispatchEvent` os ouvintes já correram, e o carimbo chegaria
|
|
33
|
-
* a um evento que ninguém mais vai ler.
|
|
34
|
-
*/
|
|
35
|
-
export function carimbarOrigem(ev, origem) {
|
|
36
|
-
ev[CHAVE_DE_ORIGEM] = origem;
|
|
37
|
-
return ev;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* QUEM PRODUZIU ESTE EVENTO? `undefined` quando não se sabe.
|
|
41
|
-
*
|
|
42
|
-
* A regra inteira, em três linhas e por esta ordem:
|
|
43
|
-
*
|
|
44
|
-
* 1. **Carimbo válido ganha.** Uma declaração explícita vence sempre uma inferência — inverter isto faria
|
|
45
|
-
* um evento REAL que alguém reatribuiu (um pedal, um interruptor de sopro que emite teclas de verdade)
|
|
46
|
-
* ser lido como teclado, apagando exactamente a informação que quem carimbou se deu ao trabalho de pôr.
|
|
47
|
-
* 2. **Sem carimbo mas de confiança → `'teclado'`.** É o que `isTrusted` significa: o navegador viu a
|
|
48
|
-
* pessoa carregar. É a única inferência que este módulo faz, e fá-la sobre a propriedade que não se forja.
|
|
49
|
-
* 3. **Sem carimbo e sem confiança → `undefined`.** Um evento sintético que ninguém assinou. Depois desta
|
|
50
|
-
* migração nada nesta engine produz um; quem o produz é código de fora, e código de fora não declarou.
|
|
51
|
-
* ⚠️ Devolver `'teclado'` aqui seria a erasão a voltar por outra porta, que é o defeito que o ADR-0109
|
|
52
|
-
* inteiro existe para fechar — e seria pior do que a erasão original, porque teria a forma de uma
|
|
53
|
-
* resposta.
|
|
54
|
-
*/
|
|
55
|
-
export function origemDoEvento(ev) {
|
|
56
|
-
const declarada = ev[CHAVE_DE_ORIGEM];
|
|
57
|
-
if (ehTransporte(declarada))
|
|
58
|
-
return declarada;
|
|
59
|
-
return ev.isTrusted ? 'teclado' : undefined;
|
|
60
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
/** Os aparelhos por onde uma criança joga. Fechado: um transporte novo tem de decidir a sua regra aqui. */
|
|
3
|
-
export type Transporte = 'teclado' | 'gamepad' | 'toque' | 'olhos' | 'rosto' | 'gestos' | 'fala';
|
|
4
|
-
/**
|
|
5
|
-
* A UNIÃO COMO VALOR, porque há um sítio onde ela tem de ser verificada em runtime.
|
|
6
|
-
*
|
|
7
|
-
* ⚠️ EXISTE POR CAUSA DE UMA FRONTEIRA, e é a única razão que a justifica: o `input/origem-sintetica` lê o
|
|
8
|
-
* transporte de um EXPANDO pendurado num `KeyboardEvent` — um objecto que este código não construiu e que
|
|
9
|
-
* qualquer script da página pode construir. Um valor que atravessa essa fronteira não é um `Transporte` por
|
|
10
|
-
* o TypeScript o dizer; é uma `string` até alguém a conferir. Sem lista, `'olho'` entrava no mapa de origens
|
|
11
|
-
* como transporte fantasma, e nada o diria.
|
|
12
|
-
*
|
|
13
|
-
* 📌 Não é o defeito da lista-ao-lado-da-união que este repositório já desfez três vezes (o `RM_KEYS`, os
|
|
14
|
-
* rótulos de movimento reduzido, as chaves de armazenamento), porque a guarda abaixo é do COMPILADOR: as duas
|
|
15
|
-
* não podem divergir. Uma cópia que não pode divergir é uma projecção, não uma segunda fonte.
|
|
16
|
-
*/
|
|
17
|
-
export declare const TRANSPORTES: readonly ["teclado", "gamepad", "toque", "olhos", "rosto", "gestos", "fala"];
|
|
18
|
-
/**
|
|
19
|
-
* Isto que veio de fora é mesmo um transporte?
|
|
20
|
-
*
|
|
21
|
-
* ⚠️ A pergunta não é de segurança — os scripts desta página são todos da casa, e quem quisesse mentir usaria
|
|
22
|
-
* um valor VÁLIDO. É de correcção: impede que um carimbo errado ou ausente vire uma entrada silenciosa no
|
|
23
|
-
* `origemDaTecla`, que é a estrutura de que a alternância inteira depende.
|
|
24
|
-
*/
|
|
25
|
-
export declare function ehTransporte(v: unknown): v is Transporte;
|
|
26
|
-
/**
|
|
27
|
-
* OS QUATRO QUE EXIGEM HABILITAÇÃO EXPLÍCITA e, uma vez habilitados, mandam em todos (regra 4).
|
|
28
|
-
*
|
|
29
|
-
* ⚠️ É a mesma lista do `UM_COMANDO_DE_CADA_VEZ` do `input/latch-scope`, e a coincidência não é acaso: são
|
|
30
|
-
* os transportes de quem NÃO CONSEGUE SEGURAR NADA. O que o ADR-0109 acrescenta é que eles não ligam a
|
|
31
|
-
* alternância só para si — ligam-na para o resto, porque quem usa a webcam pode também tocar na tela, e uma
|
|
32
|
-
* alternância que se desliga ao mudar de aparelho é uma armadilha para exactamente essa pessoa.
|
|
33
|
-
*/
|
|
34
|
-
export declare const EXIGEM_HABILITACAO: ReadonlySet<Transporte>;
|
|
35
|
-
/** O transporte que liga a alternância por si só, sem prioridade nenhuma envolvida (regra 2). */
|
|
36
|
-
export declare const COM_ALTERNANCIA_PROPRIA: ReadonlySet<Transporte>;
|
|
37
|
-
export interface EstadoDaEntrada {
|
|
38
|
-
/** Qual aparelho está a ser usado AGORA por este jogador. */
|
|
39
|
-
readonly emUso: Transporte;
|
|
40
|
-
/**
|
|
41
|
-
* A câmera/microfone foi habilitada? ⚠️ Uma vez `true`, NUNCA volta a `false` por uma aresta — só uma
|
|
42
|
-
* decisão explícita a desliga, e o ADR-0109 §4 diz que a criança não tem essa decisão. Ver `desabilitar`.
|
|
43
|
-
*/
|
|
44
|
-
readonly assistidaLigada: boolean;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* O ESTADO INICIAL: teclado, sem alternância.
|
|
48
|
-
*
|
|
49
|
-
* ⚠️ A regra 1 diz «controle E teclado, ambos sem alternância», e é por isso que o padrão pode nomear um só
|
|
50
|
-
* sem mentir: entre os dois a resposta à única pergunta que este módulo faz — há alternância? — é a MESMA.
|
|
51
|
-
* O `emUso` só passa a distingui-los quando alguém quiser MOSTRAR o aparelho corrente, que é outra questão
|
|
52
|
-
* e o ADR-0109 deixa-a explicitamente por decidir.
|
|
53
|
-
*/
|
|
54
|
-
export declare const PADRAO: EstadoDaEntrada;
|
|
55
|
-
/**
|
|
56
|
-
* HÁ ALTERNÂNCIA AGORA? — ⚠️ **NÃO PERGUNTE ISTO A ESTA FUNÇÃO.** Ver o parágrafo abaixo.
|
|
57
|
-
*
|
|
58
|
-
* ⚠️ A prioridade da assistida vem PRIMEIRO, e a ordem é a regra 4 inteira: enquanto ela estiver ligada,
|
|
59
|
-
* nenhum outro aparelho a desliga — nem o teclado, que noutro caso a desligaria. Inverter estas duas linhas
|
|
60
|
-
* é o defeito que trancaria uma criança fora do próprio jogo, e é silencioso.
|
|
61
|
-
*
|
|
62
|
-
* @deprecated 🔴 **ESTA FUNÇÃO IMPLEMENTA O MODELO QUE O ADR-0113 SUPERSEDEU**, e fica exportada por ser
|
|
63
|
-
* superfície publicada (`./input/*.js`) e por o registo ter valor histórico — não por ser a resposta.
|
|
64
|
-
*
|
|
65
|
-
* O ADR-0109 decidia a alternância **só pelo aparelho**: assistida ligada → sim; toque → sim; todo o resto
|
|
66
|
-
* → não. O ADR-0113 retirou essa cláusula, com a razão do Dev: a alternância é um **caps-lock guardado com
|
|
67
|
-
* o mapeamento do controle**, e o valor que a criança gravou vale.
|
|
68
|
-
*
|
|
69
|
-
* 🔴 A DIVERGÊNCIA TEM UMA CRIANÇA CONCRETA, e é a que motivou o registo: quem tem dificuldade motora, joga
|
|
70
|
-
* no TECLADO e gravou a alternância ligada. Esta função devolve `false` para ela — `teclado` não está em
|
|
71
|
-
* `COM_ALTERNANCIA_PROPRIA` — e é exactamente o controle que lhe seria retirado. O `latch-scope.alternanciaDe`
|
|
72
|
-
* devolve `true`, porque lê o que ela gravou.
|
|
73
|
-
*
|
|
74
|
-
* ⚠️ E A CLÁUSULA DO TOQUE TAMBÉM CAIU: sob o ADR-0113 o toque é um transporte como os outros — o valor dele
|
|
75
|
-
* é escolha e fica guardado. Só olhos, rosto, gestos e fala podem recusar-se a DESLIGAR, e essa metade vive
|
|
76
|
-
* em `latch-scope.alternanciaSempreLigada`, com um conjunto diferente deste e a responder a outra pergunta.
|
|
77
|
-
*
|
|
78
|
-
* **A resposta certa é `latch-scope.alternanciaDe(estado.emUso, leitura)`.** O papel que sobra a este
|
|
79
|
-
* módulo é o que o nome dele diz: QUAL transporte está em uso — que é o que alimenta aquele primeiro
|
|
80
|
-
* argumento. `tests/alternancia-por-transporte.node.test.js` afirma que esta função continua sem consumidor.
|
|
81
|
-
*/
|
|
82
|
-
export declare function alternanciaAgora(estado: EstadoDaEntrada): boolean;
|
|
83
|
-
/**
|
|
84
|
-
* UMA ARESTA CHEGOU, com a sua origem. Devolve o estado NOVO.
|
|
85
|
-
*
|
|
86
|
-
* ⚠️ Uma aresta de um transporte assistido NÃO o habilita. Habilitar é um acto explícito (regra 4: «precisam
|
|
87
|
-
* ser habilitados»), e deixar uma aresta fazê-lo significaria que um falso positivo da webcam — uma sombra,
|
|
88
|
-
* um segundo rosto a passar — trancava a alternância de toda a gente sem ninguém ter pedido.
|
|
89
|
-
*/
|
|
90
|
-
export declare function aposAresta(estado: EstadoDaEntrada, origem: Transporte): EstadoDaEntrada;
|
|
91
|
-
/** A criança (ou quem a acompanha) habilitou câmera/microfone. Daqui em diante a alternância é lei. */
|
|
92
|
-
export declare function habilitarAssistida(estado: EstadoDaEntrada): EstadoDaEntrada;
|
|
93
|
-
/**
|
|
94
|
-
* DESABILITAR a assistida. Existe, e o ADR-0109 diz de quem é: NÃO é da criança durante a partida.
|
|
95
|
-
*
|
|
96
|
-
* ⚠️ Fica exportada porque desligar a câmera tem de ser possível em algum lugar — trocar de utilizador,
|
|
97
|
-
* fechar o jogo, um adulto a reconfigurar. O que o §4 proíbe é oferecê-la como um botão ao lado do jogo.
|
|
98
|
-
* Uma função que existe e não é oferecida é diferente de uma função que não existe: a primeira diz onde a
|
|
99
|
-
* decisão mora.
|
|
100
|
-
*/
|
|
101
|
-
export declare function desabilitarAssistida(estado: EstadoDaEntrada): EstadoDaEntrada;
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// input/transporte-em-uso — A ALTERNÂNCIA SEGUE O APARELHO EM USO (ADR-0109), na metade pura.
|
|
3
|
-
//
|
|
4
|
-
// ========================= O QUE ESTE MÓDULO É =========================
|
|
5
|
-
// O autómato das quatro regras do ADR-0109 §1, sem DOM, sem armazenamento e sem eventos. Recebe ARESTAS com
|
|
6
|
-
// origem e devolve estado; quem pergunta «há alternância agora?» pergunta ao estado.
|
|
7
|
-
//
|
|
8
|
-
// 1. Por padrão, controle e teclado, ambos SEM alternância.
|
|
9
|
-
// 2. Clique de mouse ou toque na tela → controles de tela COM alternância.
|
|
10
|
-
// 3. Apertar tecla devolve o teclado SEM alternância; usar o controle faz o mesmo.
|
|
11
|
-
// 4. Câmera e microfone precisam ser habilitados; habilitados, ligam a alternância em TODOS os outros
|
|
12
|
-
// controles, SEM possibilidade de desligar. São prioridade.
|
|
13
|
-
//
|
|
14
|
-
// ⚠️ POR QUE ISTO É UM AUTÓMATO E NÃO UM VALOR GUARDADO — e é o que o ADR-0109 supersede do ADR-0104 §C. A
|
|
15
|
-
// alternância era uma ESCOLHA guardada por transporte, e a issue #114 mediu que a fiação dela não era
|
|
16
|
-
// escrevível: a origem da aresta é apagada à porta (`input/state.keys` é `Set<string>` de CÓDIGOS, e o toque
|
|
17
|
-
// e a webcam escrevem lá dentro). O Dev decidiu o COMPORTAMENTO, e o comportamento escolhe o mecanismo.
|
|
18
|
-
//
|
|
19
|
-
// ⚠️ E A REGRA 3 É A RAZÃO DE PRECISAR DE DUAS COISAS, não de uma. «Apertar uma tecla devolve o teclado sem
|
|
20
|
-
// alternância» são DOIS factos: um EVENTO cuja origem tem de ser conhecida, e um MODO que persiste até à
|
|
21
|
-
// troca seguinte. Uma aresta não guarda estado; um modo guardado não detecta a própria troca. Nenhuma metade
|
|
22
|
-
// exprime a regra; juntas exprimem. Este ficheiro é a segunda metade — o MODO.
|
|
23
|
-
//
|
|
24
|
-
// 📌 A imagem do Dev, mantida porque diz a coisa: é um CAPS-LOCK NUM TECLADO COM MEMÓRIA. Modo e não estado
|
|
25
|
-
// momentâneo; lembrado por aparelho; trocar de aparelho não apaga o que o outro lembra.
|
|
26
|
-
/**
|
|
27
|
-
* A UNIÃO COMO VALOR, porque há um sítio onde ela tem de ser verificada em runtime.
|
|
28
|
-
*
|
|
29
|
-
* ⚠️ EXISTE POR CAUSA DE UMA FRONTEIRA, e é a única razão que a justifica: o `input/origem-sintetica` lê o
|
|
30
|
-
* transporte de um EXPANDO pendurado num `KeyboardEvent` — um objecto que este código não construiu e que
|
|
31
|
-
* qualquer script da página pode construir. Um valor que atravessa essa fronteira não é um `Transporte` por
|
|
32
|
-
* o TypeScript o dizer; é uma `string` até alguém a conferir. Sem lista, `'olho'` entrava no mapa de origens
|
|
33
|
-
* como transporte fantasma, e nada o diria.
|
|
34
|
-
*
|
|
35
|
-
* 📌 Não é o defeito da lista-ao-lado-da-união que este repositório já desfez três vezes (o `RM_KEYS`, os
|
|
36
|
-
* rótulos de movimento reduzido, as chaves de armazenamento), porque a guarda abaixo é do COMPILADOR: as duas
|
|
37
|
-
* não podem divergir. Uma cópia que não pode divergir é uma projecção, não uma segunda fonte.
|
|
38
|
-
*/
|
|
39
|
-
export const TRANSPORTES = ['teclado', 'gamepad', 'toque', 'olhos', 'rosto', 'gestos', 'fala'];
|
|
40
|
-
const _COBRE_OS_TRANSPORTES = true;
|
|
41
|
-
void _COBRE_OS_TRANSPORTES;
|
|
42
|
-
/**
|
|
43
|
-
* Isto que veio de fora é mesmo um transporte?
|
|
44
|
-
*
|
|
45
|
-
* ⚠️ A pergunta não é de segurança — os scripts desta página são todos da casa, e quem quisesse mentir usaria
|
|
46
|
-
* um valor VÁLIDO. É de correcção: impede que um carimbo errado ou ausente vire uma entrada silenciosa no
|
|
47
|
-
* `origemDaTecla`, que é a estrutura de que a alternância inteira depende.
|
|
48
|
-
*/
|
|
49
|
-
export function ehTransporte(v) {
|
|
50
|
-
return typeof v === 'string' && TRANSPORTES.includes(v);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* OS QUATRO QUE EXIGEM HABILITAÇÃO EXPLÍCITA e, uma vez habilitados, mandam em todos (regra 4).
|
|
54
|
-
*
|
|
55
|
-
* ⚠️ É a mesma lista do `UM_COMANDO_DE_CADA_VEZ` do `input/latch-scope`, e a coincidência não é acaso: são
|
|
56
|
-
* os transportes de quem NÃO CONSEGUE SEGURAR NADA. O que o ADR-0109 acrescenta é que eles não ligam a
|
|
57
|
-
* alternância só para si — ligam-na para o resto, porque quem usa a webcam pode também tocar na tela, e uma
|
|
58
|
-
* alternância que se desliga ao mudar de aparelho é uma armadilha para exactamente essa pessoa.
|
|
59
|
-
*/
|
|
60
|
-
export const EXIGEM_HABILITACAO = new Set(['olhos', 'rosto', 'gestos', 'fala']);
|
|
61
|
-
/** O transporte que liga a alternância por si só, sem prioridade nenhuma envolvida (regra 2). */
|
|
62
|
-
export const COM_ALTERNANCIA_PROPRIA = new Set(['toque']);
|
|
63
|
-
/**
|
|
64
|
-
* O ESTADO INICIAL: teclado, sem alternância.
|
|
65
|
-
*
|
|
66
|
-
* ⚠️ A regra 1 diz «controle E teclado, ambos sem alternância», e é por isso que o padrão pode nomear um só
|
|
67
|
-
* sem mentir: entre os dois a resposta à única pergunta que este módulo faz — há alternância? — é a MESMA.
|
|
68
|
-
* O `emUso` só passa a distingui-los quando alguém quiser MOSTRAR o aparelho corrente, que é outra questão
|
|
69
|
-
* e o ADR-0109 deixa-a explicitamente por decidir.
|
|
70
|
-
*/
|
|
71
|
-
export const PADRAO = Object.freeze({ emUso: 'teclado', assistidaLigada: false });
|
|
72
|
-
/**
|
|
73
|
-
* HÁ ALTERNÂNCIA AGORA? — ⚠️ **NÃO PERGUNTE ISTO A ESTA FUNÇÃO.** Ver o parágrafo abaixo.
|
|
74
|
-
*
|
|
75
|
-
* ⚠️ A prioridade da assistida vem PRIMEIRO, e a ordem é a regra 4 inteira: enquanto ela estiver ligada,
|
|
76
|
-
* nenhum outro aparelho a desliga — nem o teclado, que noutro caso a desligaria. Inverter estas duas linhas
|
|
77
|
-
* é o defeito que trancaria uma criança fora do próprio jogo, e é silencioso.
|
|
78
|
-
*
|
|
79
|
-
* @deprecated 🔴 **ESTA FUNÇÃO IMPLEMENTA O MODELO QUE O ADR-0113 SUPERSEDEU**, e fica exportada por ser
|
|
80
|
-
* superfície publicada (`./input/*.js`) e por o registo ter valor histórico — não por ser a resposta.
|
|
81
|
-
*
|
|
82
|
-
* O ADR-0109 decidia a alternância **só pelo aparelho**: assistida ligada → sim; toque → sim; todo o resto
|
|
83
|
-
* → não. O ADR-0113 retirou essa cláusula, com a razão do Dev: a alternância é um **caps-lock guardado com
|
|
84
|
-
* o mapeamento do controle**, e o valor que a criança gravou vale.
|
|
85
|
-
*
|
|
86
|
-
* 🔴 A DIVERGÊNCIA TEM UMA CRIANÇA CONCRETA, e é a que motivou o registo: quem tem dificuldade motora, joga
|
|
87
|
-
* no TECLADO e gravou a alternância ligada. Esta função devolve `false` para ela — `teclado` não está em
|
|
88
|
-
* `COM_ALTERNANCIA_PROPRIA` — e é exactamente o controle que lhe seria retirado. O `latch-scope.alternanciaDe`
|
|
89
|
-
* devolve `true`, porque lê o que ela gravou.
|
|
90
|
-
*
|
|
91
|
-
* ⚠️ E A CLÁUSULA DO TOQUE TAMBÉM CAIU: sob o ADR-0113 o toque é um transporte como os outros — o valor dele
|
|
92
|
-
* é escolha e fica guardado. Só olhos, rosto, gestos e fala podem recusar-se a DESLIGAR, e essa metade vive
|
|
93
|
-
* em `latch-scope.alternanciaSempreLigada`, com um conjunto diferente deste e a responder a outra pergunta.
|
|
94
|
-
*
|
|
95
|
-
* **A resposta certa é `latch-scope.alternanciaDe(estado.emUso, leitura)`.** O papel que sobra a este
|
|
96
|
-
* módulo é o que o nome dele diz: QUAL transporte está em uso — que é o que alimenta aquele primeiro
|
|
97
|
-
* argumento. `tests/alternancia-por-transporte.node.test.js` afirma que esta função continua sem consumidor.
|
|
98
|
-
*/
|
|
99
|
-
export function alternanciaAgora(estado) {
|
|
100
|
-
if (estado.assistidaLigada)
|
|
101
|
-
return true;
|
|
102
|
-
return COM_ALTERNANCIA_PROPRIA.has(estado.emUso);
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* UMA ARESTA CHEGOU, com a sua origem. Devolve o estado NOVO.
|
|
106
|
-
*
|
|
107
|
-
* ⚠️ Uma aresta de um transporte assistido NÃO o habilita. Habilitar é um acto explícito (regra 4: «precisam
|
|
108
|
-
* ser habilitados»), e deixar uma aresta fazê-lo significaria que um falso positivo da webcam — uma sombra,
|
|
109
|
-
* um segundo rosto a passar — trancava a alternância de toda a gente sem ninguém ter pedido.
|
|
110
|
-
*/
|
|
111
|
-
export function aposAresta(estado, origem) {
|
|
112
|
-
if (estado.emUso === origem)
|
|
113
|
-
return estado; // sem mudança: devolve o MESMO objecto, não uma cópia
|
|
114
|
-
return { emUso: origem, assistidaLigada: estado.assistidaLigada };
|
|
115
|
-
}
|
|
116
|
-
/** A criança (ou quem a acompanha) habilitou câmera/microfone. Daqui em diante a alternância é lei. */
|
|
117
|
-
export function habilitarAssistida(estado) {
|
|
118
|
-
return estado.assistidaLigada ? estado : { emUso: estado.emUso, assistidaLigada: true };
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* DESABILITAR a assistida. Existe, e o ADR-0109 diz de quem é: NÃO é da criança durante a partida.
|
|
122
|
-
*
|
|
123
|
-
* ⚠️ Fica exportada porque desligar a câmera tem de ser possível em algum lugar — trocar de utilizador,
|
|
124
|
-
* fechar o jogo, um adulto a reconfigurar. O que o §4 proíbe é oferecê-la como um botão ao lado do jogo.
|
|
125
|
-
* Uma função que existe e não é oferecida é diferente de uma função que não existe: a primeira diz onde a
|
|
126
|
-
* decisão mora.
|
|
127
|
-
*/
|
|
128
|
-
export function desabilitarAssistida(estado) {
|
|
129
|
-
return estado.assistidaLigada ? { emUso: estado.emUso, assistidaLigada: false } : estado;
|
|
130
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
import type { PlayerView, ControlledPlayer } from '../core/entity.js';
|
|
3
|
-
import type { AudioSonar, PlayerAudioOut, PlayerCtxOut } from './audio-sonar.js';
|
|
4
|
-
export type { PlayerCtxOut };
|
|
5
|
-
/**
|
|
6
|
-
* O jogador visto pela BENGALA e pelo NADO. `facing` e `wnT` são desta metade; a outra não os usa.
|
|
7
|
-
*
|
|
8
|
-
* A saída dedicada (`_ac`/`_acOut`) entra por INTERSECÇÃO com o tipo do dono, `PlayerAudioOut` de
|
|
9
|
-
* `platform/audio-sonar` — não por uma redeclaração local.
|
|
10
|
-
*
|
|
11
|
-
* ⚠️ A JUSTIFICATIVA QUE ESTAVA AQUI ERA FALSA e vale corrigi-la em vez de apagá-la, senão o próximo leitor
|
|
12
|
-
* a re-deriva: dizia que `core/` "não pode importar tipos de Web Audio". Não há importação a fazer — o
|
|
13
|
-
* `tsconfig.json` tem `"lib": ["ES2022", "DOM", "DOM.Iterable"]`, então `AudioContext` e `GainNode` são
|
|
14
|
-
* globais ambientes em qualquer arquivo desta árvore. O motivo verdadeiro é de CAMADA: `_ac` e `_acOut` não
|
|
15
|
-
* são da entidade da engine, e por isso o `core/entity` deixou de mencioná-los (ADR-0039, opção A1).
|
|
16
|
-
*/
|
|
17
|
-
type Player = PlayerView<'x' | 'y' | 'facing' | 'viz' | 'i' | 'audioSink' | 'wnT' | 'pad'> & PlayerAudioOut & Pick<ControlledPlayer, 'ctrl'>;
|
|
18
|
-
export interface AudioNavCtx {
|
|
19
|
-
tileAt: (x: number, y: number) => number;
|
|
20
|
-
solidAt: (x: number, y: number) => boolean;
|
|
21
|
-
held: (pl: Player, act: string) => boolean;
|
|
22
|
-
tonePan: (freq: number, dur: number, cat: string, pan?: number | null, vol?: number, type?: OscillatorType, pc?: PlayerCtxOut | null) => void;
|
|
23
|
-
noiseHit: (mat: string, pan?: number, pc?: PlayerCtxOut | null) => void;
|
|
24
|
-
BOX: {
|
|
25
|
-
w: number;
|
|
26
|
-
h: number;
|
|
27
|
-
};
|
|
28
|
-
TILE: number;
|
|
29
|
-
getCenario: () => string;
|
|
30
|
-
/**
|
|
31
|
-
* A NAVEGAÇÃO SONORA, pronta (`platform/audio-sonar`). Entra por injeção e não por importação: é o que
|
|
32
|
-
* permite empacotar o sonar sem levar a bengala junto — e é a diferença entre "dois arquivos" e "dois
|
|
33
|
-
* módulos". Onze coisas do ctx antigo saíram com ela.
|
|
34
|
-
*/
|
|
35
|
-
sonar: AudioSonar;
|
|
36
|
-
}
|
|
37
|
-
export interface AudioNav {
|
|
38
|
-
playerCtx: (pl: Player) => PlayerCtxOut | null;
|
|
39
|
-
caneProbe: (pl: Player) => string;
|
|
40
|
-
caneTap: (pl: Player) => void;
|
|
41
|
-
waterNav: (pl: Player) => void;
|
|
42
|
-
panFor: (wx: number, pl: Player) => number;
|
|
43
|
-
needsAudioCues: (pl: Player) => boolean;
|
|
44
|
-
sonar: (pl: Player) => void;
|
|
45
|
-
updateGuide: () => void;
|
|
46
|
-
readonly caneCount: number;
|
|
47
|
-
readonly waterNavCount: number;
|
|
48
|
-
readonly sonarCount: number;
|
|
49
|
-
readonly guideCount: number;
|
|
50
|
-
}
|
|
51
|
-
export declare function createAudioNav(ctx: AudioNavCtx): AudioNav;
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// platform/audio-nav — BENGALA e NADO CEGO: as pistas sonoras que só existem onde há MUNDO (item 19).
|
|
3
|
-
//
|
|
4
|
-
// ========================= ESTE MÓDULO ERA DOIS =========================
|
|
5
|
-
// O achado 9 do segundo consumidor: "o módulo é DOIS módulos com um nome só — `caneProbe`/`caneTap`/
|
|
6
|
-
// `waterNav` são bengala e natação, isto é, plataforma; `sonar`/`panFor`/`needsAudioCues` são navegação
|
|
7
|
-
// sonora, que serve a qualquer jogo". A navegação sonora saiu para `platform/audio-sonar` e recebe o
|
|
8
|
-
// CONTRATO em vez de tiles; aqui ficou a metade que lê o mundo, e que lê sem disfarce.
|
|
9
|
-
//
|
|
10
|
-
// O QUE SOBROU É PLATAFORMA, e é bom que o nome não esconda isso:
|
|
11
|
-
// caneProbe(pl) — material À FRENTE (água/vazio/madeira/chão do tema), lendo tile e chão.
|
|
12
|
-
// caneTap(pl) — batida da bengala no material adiante (ou tom grave oco no vazio).
|
|
13
|
-
// waterNav(pl) — nado cego: contato com paredes/chão/superfície (cordas).
|
|
14
|
-
//
|
|
15
|
-
// A bengala precisa de `facing`, `BOX.w` e `TILE` para saber o que é "à frente"; o nado precisa de `solidAt`
|
|
16
|
-
// em três alturas. Nada disso é traduzível para um jogo sem corpo e sem mundo, e por isso NÃO foi traduzido:
|
|
17
|
-
// o corte separa o que viaja do que não viaja, em vez de fingir que tudo viaja.
|
|
18
|
-
//
|
|
19
|
-
// ========================= A METADE QUE VIAJOU CONTINUA SAINDO DAQUI =========================
|
|
20
|
-
// `playerCtx`, `panFor`, `needsAudioCues`, `sonar` e `updateGuide` seguem no retorno, delegados ao
|
|
21
|
-
// `AudioSonar` injetado. Não é preguiça de mexer no chamador: a bengala PRECISA do `playerCtx` (a batida sai
|
|
22
|
-
// no dispositivo do jogador) e o `main.js` monta um objeto só de navegação. O que mudou é que este módulo
|
|
23
|
-
// deixou de IMPLEMENTAR a metade genérica — ele a repassa, e quem quiser só ela importa o outro arquivo.
|
|
24
|
-
// Extraído do game.js. Ver docs/5-Refactoring/plano-modularizacao-mapa.md (Tier 2, áudio rodada 3).
|
|
25
|
-
export function createAudioNav(ctx) {
|
|
26
|
-
const SURF_MAT = { cidade: 'piso', campo: 'grama', floresta: 'grama', cemiterio: 'terra', espaco: 'pedra', classico: 'pedra' }; // chão por tema
|
|
27
|
-
let _caneCount = 0, _waterNavCount = 0;
|
|
28
|
-
const som = ctx.sonar; // a metade que viaja, injetada
|
|
29
|
-
const playerCtx = (pl) => som.playerCtx(pl);
|
|
30
|
-
function caneProbe(pl) {
|
|
31
|
-
const dir = pl.facing < 0 ? -1 : 1;
|
|
32
|
-
const ax = Math.floor((pl.x + dir * (ctx.BOX.w / 2 + ctx.TILE * 0.6)) / ctx.TILE), footTy = Math.floor((pl.y + 1) / ctx.TILE);
|
|
33
|
-
if (ctx.tileAt(ax, footTy) === 3 || ctx.tileAt(ax, footTy - 1) === 3)
|
|
34
|
-
return 'agua'; // água à frente
|
|
35
|
-
let gty = -1;
|
|
36
|
-
for (let ty = footTy; ty <= footTy + 1; ty++) {
|
|
37
|
-
if (ctx.solidAt(ax, ty)) {
|
|
38
|
-
gty = ty;
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
} // chão (pé ou 1 abaixo = degrau/rampa)
|
|
42
|
-
if (gty < 0)
|
|
43
|
-
return 'vazio'; // sem chão → fosso
|
|
44
|
-
if (ctx.tileAt(ax, gty) === 4)
|
|
45
|
-
return 'madeira'; // escada
|
|
46
|
-
return SURF_MAT[ctx.getCenario()] || 'pedra';
|
|
47
|
-
}
|
|
48
|
-
function caneTap(pl) {
|
|
49
|
-
const mat = caneProbe(pl), dir = pl.facing < 0 ? -1 : 1, pan = dir * 0.5, pc = playerCtx(pl);
|
|
50
|
-
_caneCount++;
|
|
51
|
-
if (mat === 'vazio') {
|
|
52
|
-
ctx.tonePan(150, 0.18, 'guard', pan, 0.16, 'sine', pc);
|
|
53
|
-
return;
|
|
54
|
-
} // vazio = tom grave oco
|
|
55
|
-
ctx.noiseHit(mat, pan, pc); // batida no material adiante (no dispositivo do jogador)
|
|
56
|
-
}
|
|
57
|
-
function waterNav(pl) {
|
|
58
|
-
// dir tipado como number (não 1|-1) DE PROPÓSITO: o original usa `dir!==0` (sempre true aqui, pois facing é ±1) —
|
|
59
|
-
// preservo essa guarda sempre-verdadeira exatamente; alargar o tipo satisfaz o tsc sem mudar o comportamento.
|
|
60
|
-
const dir = pl.facing < 0 ? -1 : 1, tx = Math.floor(pl.x / ctx.TILE), tyF = Math.floor((pl.y - 1) / ctx.TILE), tyH = Math.floor((pl.y - ctx.BOX.h) / ctx.TILE);
|
|
61
|
-
const wallAhead = ctx.solidAt(tx + dir, tyF) || ctx.solidAt(tx + dir, tyH); // parede lateral (azulejo)
|
|
62
|
-
const floorBelow = ctx.solidAt(tx, tyF + 1); // chão (fundo)
|
|
63
|
-
const openAbove = ctx.tileAt(tx, tyH - 1) !== 3 && !ctx.solidAt(tx, tyH - 1); // acima da cabeça é ar → dá p/ subir/sair
|
|
64
|
-
const moving = (dir !== 0) || ctx.held(pl, 'up') || ctx.held(pl, 'down'), pc = playerCtx(pl);
|
|
65
|
-
pl.wnT = (pl.wnT || 0) + 1;
|
|
66
|
-
if (pl.wnT < 18)
|
|
67
|
-
return;
|
|
68
|
-
let played = true;
|
|
69
|
-
if (openAbove && wallAhead)
|
|
70
|
-
ctx.noiseHit('parede', dir * 0.5, pc); // superfície + parede = batida (fim da corda)
|
|
71
|
-
else if (openAbove && moving)
|
|
72
|
-
ctx.tonePan(560, 0.09, 'guide', dir * 0.4, 0.12, 'sine', pc); // corda livre: "dá p/ subir"
|
|
73
|
-
else if (wallAhead && dir !== 0)
|
|
74
|
-
ctx.noiseHit('parede', dir * 0.5, pc); // parede submersa à frente
|
|
75
|
-
else if (floorBelow && ctx.held(pl, 'down'))
|
|
76
|
-
ctx.noiseHit('areia', 0, pc); // fundo (chão)
|
|
77
|
-
else
|
|
78
|
-
played = false;
|
|
79
|
-
if (played) {
|
|
80
|
-
pl.wnT = 0;
|
|
81
|
-
_waterNavCount++;
|
|
82
|
-
}
|
|
83
|
-
else
|
|
84
|
-
pl.wnT = 17; // sem contato = SEM som (pronto p/ tocar ao encostar)
|
|
85
|
-
}
|
|
86
|
-
return {
|
|
87
|
-
playerCtx, caneProbe, caneTap, waterNav,
|
|
88
|
-
// Delegação PURA para a metade que viajou. Sem lógica no meio: um adaptador que decidisse alguma coisa
|
|
89
|
-
// seria uma terceira implementação escondida entre as duas.
|
|
90
|
-
panFor: (wx, pl) => som.panFor(wx, pl),
|
|
91
|
-
needsAudioCues: (pl) => som.needsAudioCues(pl),
|
|
92
|
-
sonar: (pl) => som.sonar(pl),
|
|
93
|
-
updateGuide: () => som.updateGuide(),
|
|
94
|
-
get caneCount() { return _caneCount; },
|
|
95
|
-
get waterNavCount() { return _waterNavCount; },
|
|
96
|
-
get sonarCount() { return som.sonarCount; },
|
|
97
|
-
get guideCount() { return som.guideCount; },
|
|
98
|
-
};
|
|
99
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
/** O que o guia soa, para uma dada distância. */
|
|
3
|
-
export interface Intensidade {
|
|
4
|
-
/** Corte do passa-baixo, em hertz. Grave e abafado longe; aberto e brilhante perto. */
|
|
5
|
-
readonly corte: number;
|
|
6
|
-
/** Fator sobre o volume da categoria `guide`, entre `VOL_LONGE` e 1. NUNCA zero. */
|
|
7
|
-
readonly volume: number;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* A partir de quantos passos o guia deixa de escurecer mais.
|
|
11
|
-
*
|
|
12
|
-
* Doze, e o número não é novo: o `chaveDeDistancia` do sonar corta «muito perto» em 4 passos e «perto» em 9,
|
|
13
|
-
* e o `PAN_PACES` satura o estéreo em 11. O guia satura logo depois — a informação fina serve para quem já
|
|
14
|
-
* está a chegar, e mais longe do que isso «longe» basta.
|
|
15
|
-
*/
|
|
16
|
-
export declare const PASSOS_ATE_O_FUNDO = 12;
|
|
17
|
-
/** O corte no fundo da escala: abafado, presente, sem ser um som de alarme. */
|
|
18
|
-
export declare const CORTE_LONGE = 320;
|
|
19
|
-
/** O corte no alvo: aberto. Acima disto o timbre passa a sibilar, e sibilar chama atenção como um bipe. */
|
|
20
|
-
export declare const CORTE_PERTO = 3200;
|
|
21
|
-
/**
|
|
22
|
-
* O fator de volume mais baixo.
|
|
23
|
-
*
|
|
24
|
-
* ⚠️ NUNCA ZERO, E É A ASSERÇÃO MAIS IMPORTANTE DESTE FICHEIRO. Se o guia emudecesse ao longe, «longe» ficaria
|
|
25
|
-
* indistinguível de «não há alvo» — e a criança que depende dele concluiria que não há nada para achar,
|
|
26
|
-
* exatamente quando há e está distante. Silêncio é uma afirmação, e aqui seria uma afirmação falsa.
|
|
27
|
-
*/
|
|
28
|
-
export declare const VOL_LONGE = 0.55;
|
|
29
|
-
/**
|
|
30
|
-
* A intensidade para `passos` de distância ao longo da rota.
|
|
31
|
-
*
|
|
32
|
-
* ⚠️ A INTERPOLAÇÃO DO CORTE É EXPONENCIAL, e não linear, pelo mesmo motivo do earcon da #124: o ouvido
|
|
33
|
-
* percebe altura e brilho em RAZÃO, não em diferença. Uma rampa linear de 320 a 3200 abriria quase tudo no
|
|
34
|
-
* primeiro terço do caminho e depois pareceria parada — a criança sentiria que chegou quando ainda faltava
|
|
35
|
-
* metade.
|
|
36
|
-
*
|
|
37
|
-
* O volume interpola LINEARMENTE, e a assimetria é deliberada: ele é o eixo secundário, e uma curva também
|
|
38
|
-
* exponencial ali faria os dois acelerarem no mesmo ponto, que é o oposto de ter dois eixos.
|
|
39
|
-
*/
|
|
40
|
-
export declare function intensidadeDoGuia(passos: number): Intensidade;
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// platform/guide-intensity — QUÃO PERTO SOA, sem bipe (#84 item 2).
|
|
3
|
-
//
|
|
4
|
-
// ========================= O QUE ISTO SUBSTITUI =========================
|
|
5
|
-
// O guia tocava um `triangle` de 0,12 s a cada 0,8 s, PARA SEMPRE, sem depender de movimento nem de nada ter
|
|
6
|
-
// mudado. O veredicto do Dev: «um ping é a pior escolha possível, tenebroso para quem tem TEA». Não era a
|
|
7
|
-
// frequência que estava errada — era o bipe. Reduzi-lo a «só andando» deixaria a mesma coisa a doer menos
|
|
8
|
-
// vezes.
|
|
9
|
-
//
|
|
10
|
-
// O que entra é uma presença CONTÍNUA que fica mais intensa conforme a criança se aproxima, ao longo da rota
|
|
11
|
-
// mapeada (`core/route`). Nada dispara; a coisa apenas fica mais presente.
|
|
12
|
-
//
|
|
13
|
-
// ========================= O EIXO É O BRILHO, E A DECISÃO É DO DEV =========================
|
|
14
|
-
// Quatro eixos foram postos na mesa — volume, brilho (corte de filtro), camadas e andamento — e a escolha foi
|
|
15
|
-
// **brilho como principal, com uma parcela pequena de volume como secundário**. As razões, para quem reabrir:
|
|
16
|
-
//
|
|
17
|
-
// · VOLUME SOZINHO colide com o cursor do mixer: a criança que baixou a categoria `guide` perderia o sinal
|
|
18
|
-
// inteiro, e variação de volume é a mais cansativa das quatro.
|
|
19
|
-
// · ANDAMENTO lê-se como PRESSA, que é o oposto do que o modo TEA existe para proteger.
|
|
20
|
-
// · CAMADAS precisa de material composto, e esta engine sintetiza.
|
|
21
|
-
// · BRILHO é contínuo, sai de um `BiquadFilter` que o Web Audio já tem, e não disputa o cursor.
|
|
22
|
-
//
|
|
23
|
-
// ⚠️ E A PARCELA DE VOLUME NÃO É ENFEITE: para uma criança com perda auditiva o brilho pode cair exatamente na
|
|
24
|
-
// banda que ela não alcança. Dois eixos redundantes significam que nenhum deles sozinho decide.
|
|
25
|
-
//
|
|
26
|
-
// ========================= O QUE ESTE MÓDULO NÃO FAZ =========================
|
|
27
|
-
// Não toca nada. Devolve dois números a partir de UM: quantos passos faltam ao longo da rota. Quem monta o
|
|
28
|
-
// grafo é o `platform/audio-sonar`, e quem calcula a rota é o `core/route` — que já sabe contornar parede, e é
|
|
29
|
-
// isso que torna a intensidade honesta: ela cresce com a distância que a criança REALMENTE vai andar.
|
|
30
|
-
//
|
|
31
|
-
// Módulo-folha: não importa nada.
|
|
32
|
-
/**
|
|
33
|
-
* A partir de quantos passos o guia deixa de escurecer mais.
|
|
34
|
-
*
|
|
35
|
-
* Doze, e o número não é novo: o `chaveDeDistancia` do sonar corta «muito perto» em 4 passos e «perto» em 9,
|
|
36
|
-
* e o `PAN_PACES` satura o estéreo em 11. O guia satura logo depois — a informação fina serve para quem já
|
|
37
|
-
* está a chegar, e mais longe do que isso «longe» basta.
|
|
38
|
-
*/
|
|
39
|
-
export const PASSOS_ATE_O_FUNDO = 12;
|
|
40
|
-
/** O corte no fundo da escala: abafado, presente, sem ser um som de alarme. */
|
|
41
|
-
export const CORTE_LONGE = 320;
|
|
42
|
-
/** O corte no alvo: aberto. Acima disto o timbre passa a sibilar, e sibilar chama atenção como um bipe. */
|
|
43
|
-
export const CORTE_PERTO = 3200;
|
|
44
|
-
/**
|
|
45
|
-
* O fator de volume mais baixo.
|
|
46
|
-
*
|
|
47
|
-
* ⚠️ NUNCA ZERO, E É A ASSERÇÃO MAIS IMPORTANTE DESTE FICHEIRO. Se o guia emudecesse ao longe, «longe» ficaria
|
|
48
|
-
* indistinguível de «não há alvo» — e a criança que depende dele concluiria que não há nada para achar,
|
|
49
|
-
* exatamente quando há e está distante. Silêncio é uma afirmação, e aqui seria uma afirmação falsa.
|
|
50
|
-
*/
|
|
51
|
-
export const VOL_LONGE = 0.55;
|
|
52
|
-
/**
|
|
53
|
-
* A intensidade para `passos` de distância ao longo da rota.
|
|
54
|
-
*
|
|
55
|
-
* ⚠️ A INTERPOLAÇÃO DO CORTE É EXPONENCIAL, e não linear, pelo mesmo motivo do earcon da #124: o ouvido
|
|
56
|
-
* percebe altura e brilho em RAZÃO, não em diferença. Uma rampa linear de 320 a 3200 abriria quase tudo no
|
|
57
|
-
* primeiro terço do caminho e depois pareceria parada — a criança sentiria que chegou quando ainda faltava
|
|
58
|
-
* metade.
|
|
59
|
-
*
|
|
60
|
-
* O volume interpola LINEARMENTE, e a assimetria é deliberada: ele é o eixo secundário, e uma curva também
|
|
61
|
-
* exponencial ali faria os dois acelerarem no mesmo ponto, que é o oposto de ter dois eixos.
|
|
62
|
-
*/
|
|
63
|
-
export function intensidadeDoGuia(passos) {
|
|
64
|
-
if (!Number.isFinite(passos) || passos < 0)
|
|
65
|
-
return { corte: CORTE_LONGE, volume: VOL_LONGE };
|
|
66
|
-
// 0 = em cima do alvo; 1 = no fundo da escala ou além.
|
|
67
|
-
const longe = Math.min(1, passos / PASSOS_ATE_O_FUNDO);
|
|
68
|
-
const perto = 1 - longe;
|
|
69
|
-
return {
|
|
70
|
-
corte: CORTE_LONGE * Math.pow(CORTE_PERTO / CORTE_LONGE, perto),
|
|
71
|
-
volume: VOL_LONGE + (1 - VOL_LONGE) * perto,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
/** Uma coisa pesada que a engine promete e que não cabe no pacote. */
|
|
3
|
-
export interface Pesado {
|
|
4
|
-
readonly id: string;
|
|
5
|
-
/** `null` = decidido que existe, mas ainda não há de onde vir. Ver `porQueNaoTemFonte`. */
|
|
6
|
-
readonly url: string | null;
|
|
7
|
-
/** Medido, não estimado — é o número que uma frase honesta usa antes de começar a descarga. */
|
|
8
|
-
readonly bytes?: number;
|
|
9
|
-
/** Obrigatório quando `url` é `null`: uma ausência sem razão escrita vira uma ausência esquecida. */
|
|
10
|
-
readonly porQueNaoTemFonte?: string;
|
|
11
|
-
}
|
|
12
|
-
/** O nome da Cache Storage. Versionado: mudar o conteúdo do catálogo não deve servir bytes velhos. */
|
|
13
|
-
export declare const CACHE_PESADOS = "incl-pesados-v1";
|
|
14
|
-
export declare const PESADOS: readonly Pesado[];
|