@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
package/dist-pkg/ui/shell.js
CHANGED
|
@@ -1,207 +1,139 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// ui/shell.ts —
|
|
2
|
+
// ui/shell.ts — THE SHELL: which SCREEN the game is on (title, playing, paused), and what the screen turns on and off
|
|
3
|
+
// when it changes.
|
|
3
4
|
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
5
|
+
// It knows nothing of physics or pixels; it knows `hidden`, focus, mute and the pause cards. `createGame` does NOT mount
|
|
6
|
+
// it — nothing in `app/js` calls `initShell`. It is a published kit for a game that has a title screen and wants the
|
|
7
|
+
// engine's projection of scenes onto the document; several of its ctx fields (`setQuizLevel`, `openTypo`, the pause
|
|
8
|
+
// actions) are one game's vocabulary.
|
|
8
9
|
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
10
|
+
// WHY `projectScene` IS NOT A STATE MACHINE WITH A TRANSITION TABLE. There are three scenes and every transition between
|
|
11
|
+
// them is legal — no guard, no named event, no entry/exit hook beyond the body below. A `Map<[from, to], handler>` would
|
|
12
|
+
// forbid no illegal state (there is none) and turn a block read top to bottom into a jump. What IS worth it is separating
|
|
13
|
+
// the DECISION from the EFFECT: `phaseView(facts)` returns everything a scene asks of the document, and `applyPhaseView`
|
|
14
|
+
// is the only part that touches it. The decision is then testable in the `node` project, and a sign error (the title
|
|
15
|
+
// overlay visible during play, sound not muted on pause — accessibility broken silently) becomes an assertion instead of a
|
|
16
|
+
// symptom found by playing. `ui/title.ts` made the same move with `computeTitleMenuView`.
|
|
17
|
+
// The only part with MEMORY — giving the touch controls back on resume, from the `dataset.wasOn` written on pause — is
|
|
18
|
+
// `touchControlsPlan`, a pure function of (scene facts, previous state, number of screens).
|
|
18
19
|
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
// · NÃO vale a tabela de transição. São TRÊS estados e as nove transições são todas legais — de qualquer
|
|
23
|
-
// fase para qualquer fase, sem guarda, sem evento nomeado, sem hook de entrada/saída além do corpo que já
|
|
24
|
-
// está aqui. Uma `Map<[from,to], handler>` sobre isso não impede nenhum estado ilegal (não existe nenhum),
|
|
25
|
-
// não descreve nada que o código já não diga, e troca um bloco linear que se lê de cima a baixo por uma
|
|
26
|
-
// indireção que obriga a saltar. Seria cerimônia sobre três estados. Não fiz.
|
|
27
|
-
// · VALE, e muito, separar a DECISÃO do EFEITO. Os `if`s do original não são transições: são nove perguntas
|
|
28
|
-
// diferentes feitas à MESMA fase (`p!=='playing'`, `p!=='title'`, `p!=='paused'`, `p==='paused'`…),
|
|
29
|
-
// espalhadas no meio de nove escritas no DOM. Isso é uma PROJEÇÃO pura da fase disfarçada de sequência
|
|
30
|
-
// imperativa. Extraí a projeção — `phaseView(p)` devolve o registro completo do que a fase manda fazer, e
|
|
31
|
-
// `applyPhaseView` é a única parte que toca o documento. O ganho é concreto e não é estético: a decisão
|
|
32
|
-
// passa a ser testável no project `node`, sem DOM, sem PIXI e sem áudio, e um erro de sinal num `!==`
|
|
33
|
-
// (o tipo de erro que aqui deixa a11y quebrada em silêncio: overlay do título visível durante o jogo,
|
|
34
|
-
// áudio não silenciado na pausa) vira uma asserção em vez de um sintoma que só aparece jogando.
|
|
35
|
-
// É o mesmo movimento que ui/title.ts já fez com `computeTitleMenuView`, e por isso é o precedente da casa.
|
|
36
|
-
// · O único pedaço com MEMÓRIA (e portanto o único candidato legítimo a "estado") é a restauração dos
|
|
37
|
-
// controles de toque, que depende do `dataset.wasOn` gravado na pausa anterior. Esse virou
|
|
38
|
-
// `touchControlsPlan(...)`, uma função pura de (fase, wasOn, escondido, nº de telas) → (escondido', wasOn').
|
|
39
|
-
// Ver, logo abaixo, o defeito que essa separação tornou visível.
|
|
20
|
+
// WHAT IS NOT HERE: the `.pm-btn`/`.pi-btn` markup and click delegation belong to `ui/pause-icons`, which reads this
|
|
21
|
+
// module's action table through `getPauseActs()`. Opening and closing the settings panels belongs to
|
|
22
|
+
// `ui/settings-panel` and the `ui/settings-*` panels; `pauseActs` only CALLS them, by injection.
|
|
40
23
|
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
// tela. Trazê-lo para cá acoplaria o "em que tela estamos" ao "quantos quadros por segundo" sem nenhum
|
|
45
|
-
// parentesco. O precedente da casa já é esse: ui/layout.ts diz, no cabeçalho, "fpsTick/configureRender
|
|
46
|
-
// seguem no game.js (outro concern)". Não forcei; segue no game.js, e o lar natural dele, quando chegar a
|
|
47
|
-
// vez, é ui/hud.ts.
|
|
48
|
-
// · `padKind()` — NÃO extraí porque JÁ ESTÁ EXTRAÍDO: `input/touch.ts` exporta `padKind()` desde a Onda A,
|
|
49
|
-
// com o corpo idêntico ao do game.js, e o cabeçalho de lá registra que a cópia é órfã. A que sobrou no
|
|
50
|
-
// game.js é código morto duplicado (nenhum chamador — ver o relatório). O certo é apagá-la, não mudá-la
|
|
51
|
-
// de lugar mais uma vez.
|
|
52
|
-
// · `updateTitleLegend()` — a fronteira deixava em aberto se ela é de shell ou de menu-nav. É de SHELL, e a
|
|
53
|
-
// razão é simples: ela não navega nada. Não lê foco, não trata tecla, não anda entre itens; ela pinta o
|
|
54
|
-
// rodapé de UMA tela específica (o título) com a configuração de entrada vigente, e quem a chama é o
|
|
55
|
-
// próprio `setPhase('title')`. Se morasse em ui/menu-nav, a casca precisaria importar o módulo de
|
|
56
|
-
// navegação só para desenhar uma legenda, e a dependência apontaria para o lado errado (a casca chamando o
|
|
57
|
-
// teclado). Ficando aqui, ui/menu-nav não precisa saber que existe uma tela de título.
|
|
58
|
-
// · O `.pm-btn`/`.pi-btn` (markup e delegação de clique) é de ui/pause-icons.ts, que já os constrói e já
|
|
59
|
-
// consome esta tabela por `getPauseActs()`. Aqui está só a TABELA, não o botão.
|
|
60
|
-
// · Abrir/fechar os nove diálogos de configuração é de ui/settings-panel.ts + ui/settings-*.ts. `pauseActs`
|
|
61
|
-
// apenas os CHAMA, por injeção.
|
|
24
|
+
// INJECTION: every entry of `pauseActs` is a callback resolved when it is CALLED, so the host can wire the shell before
|
|
25
|
+
// the panels it opens exist. The number of players and the players are asked through getters: they are round state,
|
|
26
|
+
// owned by the host, and a module-level binding would be shared by a second game on the same page.
|
|
62
27
|
//
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
// `function` içadas OU `const` declarados depois (`motor`, `motion`, `empathy`, `hud`, `selVizPlayer`).
|
|
73
|
-
// Com callbacks, a resolução acontece na CHAMADA (sempre pós-boot) e não na montagem do ctx.
|
|
74
|
-
// · `setPhase` é chamado de fora por game/session.ts, input/gamepad.ts, game/attract.ts e
|
|
75
|
-
// ui/activities-menu.ts, todos com o ctx montado ANTES do ponto de extração. Por isso o game.js deve
|
|
76
|
-
// manter um envelope `function setPhase(p){ shell.setPhase(p); }` — declaração de função, içada — em vez
|
|
77
|
-
// de trocar as quatro fiações. É o mesmo padrão já usado lá para `hideTouchControls`, `showTouchControls`,
|
|
78
|
-
// `restartGame`, `fitsN`, `joinPlayer` e `quitGame`.
|
|
79
|
-
// · O original protegia duas chamadas com `typeof pauseSelect==='function'` / `typeof reflectPauseIcons===
|
|
80
|
-
// 'function'`. Eram guardas de TDZ do tempo do monólito; aqui `pauseSelect` é função local (sempre
|
|
81
|
-
// definida) e `reflectPauseIcons` é injetada (sempre função). Verifiquei que `reflectPauseIcons` é `const`
|
|
82
|
-
// declarado no game.js MUITO antes de a primeira pausa acontecer, então as guardas nunca foram falsas em
|
|
83
|
-
// execução real — removê-las não muda comportamento, só tira ruído. Registrado aqui porque é a única
|
|
84
|
-
// linha que não é cópia literal.
|
|
85
|
-
//
|
|
86
|
-
// SEM I/O NO IMPORT: o corpo do módulo só declara dados e funções puras. Todo efeito passa por `initShell`.
|
|
87
|
-
// GUARDAS: cada consulta ao DOM passa por guarda de nulo, como manda a casa — é o que permite rodar no project
|
|
88
|
-
// `node` com um `$` falso que devolve `null`.
|
|
89
|
-
//
|
|
90
|
-
// Ver docs/5-Refactoring/plano-modularizacao-mapa.md (C3).
|
|
91
|
-
import { t } from '../core/i18n.js';
|
|
92
|
-
import { PAD_DESIGNS, PAD_GLYPH_SPOKEN } from '../input/devices.js'; // módulo-folha de DADOS (zero deps) — importado, não injetado
|
|
93
|
-
// UMA constante, e não um seletor repetido: com o submenu de opções (ADR-0044, item 5) o cartão de pausa passou
|
|
94
|
-
// a ter DUAS listas, e quem varrer `.pm-btn` cru enxerga também a que está escondida.
|
|
95
|
-
import { PM_ITENS_VISIVEIS } from './pause-icons.js';
|
|
96
|
-
// `FatosDaCena` mora em `core/scenes`, ao lado da pilha que os produz — é tipo de ENGINE, e precisa ser
|
|
97
|
-
// alcançável também por `game/`, que não pode importar de `ui/`. Ver o cabeçalho de lá.
|
|
98
|
-
/** Verbatim das nove perguntas que o `setPhase` do game.js fazia à fase, agora feitas de uma vez só. */
|
|
28
|
+
// NO I/O ON IMPORT: the module body only declares data and pure functions. Every effect goes through `initShell`.
|
|
29
|
+
// GUARDS: every DOM lookup is null-guarded, which is what lets the `node` project run it with a fake `$` returning `null`.
|
|
30
|
+
import { PAD_DESIGNS, PAD_GLYPH_SPOKEN } from '../input/devices.js'; // a DATA leaf module (zero deps) — imported, not injected
|
|
31
|
+
// ONE constant, not a repeated selector: the pause card has more than one list (ADR-0044 item 5), and whoever scans raw
|
|
32
|
+
// `.pm-btn` also sees the hidden ones.
|
|
33
|
+
import { PM_VISIBLE_ITEMS } from './pause-icons.js';
|
|
34
|
+
import { keepInView } from './menu-items.js';
|
|
35
|
+
// `SceneFacts` lives in `core/scenes`, beside the stack that produces them — it is an ENGINE type.
|
|
36
|
+
/** Every question the scene change asks of the scene, asked at once. */
|
|
99
37
|
export function phaseView(f) {
|
|
100
38
|
return {
|
|
101
|
-
titleOverlayHidden: !f.
|
|
102
|
-
screenPauseHidden: !f.
|
|
103
|
-
masterMuted: !f.
|
|
104
|
-
hideTouchControls: !f.
|
|
105
|
-
pausePressed: f.
|
|
106
|
-
focus: f.
|
|
39
|
+
titleOverlayHidden: !f.titleScreen,
|
|
40
|
+
screenPauseHidden: !f.pauseMenu,
|
|
41
|
+
masterMuted: !f.worldRunning,
|
|
42
|
+
hideTouchControls: !f.worldRunning,
|
|
43
|
+
pausePressed: f.pauseMenu,
|
|
44
|
+
focus: f.worldRunning ? 'game-region' : f.pauseMenu ? 'pause-menu' : 'title-button',
|
|
107
45
|
};
|
|
108
46
|
}
|
|
109
47
|
/**
|
|
110
|
-
*
|
|
111
|
-
*
|
|
48
|
+
* The ONE part of a scene change with memory: hide the touch controls on pause (recording that they were on) and give them
|
|
49
|
+
* back on resume. Pure, so it can be pinned without a browser.
|
|
112
50
|
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
51
|
+
* The state that arrives here is the one from BEFORE `hideTouchControls()` — the caller reads first and hides after.
|
|
52
|
+
* The other order never records `wasOn` (the plan sees the pad already off), and resuming on a phone would not give the
|
|
53
|
+
* virtual d-pad back.
|
|
116
54
|
*/
|
|
117
55
|
export function touchControlsPlan(f, st, screens) {
|
|
118
|
-
if (f.
|
|
56
|
+
if (f.pauseMenu) {
|
|
119
57
|
if (!st.hidden)
|
|
120
|
-
return { hidden: true, wasOn: true }; //
|
|
121
|
-
return st; //
|
|
58
|
+
return { hidden: true, wasOn: true }; // record that it was on, and hide
|
|
59
|
+
return st; // already hidden: nothing changes (not even `wasOn`)
|
|
122
60
|
}
|
|
123
|
-
if (f.
|
|
61
|
+
if (f.worldRunning) {
|
|
124
62
|
return { hidden: st.wasOn && screens <= 1 ? false : st.hidden, wasOn: false };
|
|
125
63
|
}
|
|
126
|
-
return { hidden: true, wasOn: false }; //
|
|
64
|
+
return { hidden: true, wasOn: false }; // the title (or any scene that is neither play nor pause): hide and forget
|
|
127
65
|
}
|
|
128
66
|
// ---------------------------------------------------------------------------------------------------------
|
|
129
|
-
//
|
|
67
|
+
// THE TITLE LEGEND — the pure part (building the two rows of chips from the chosen glyphs)
|
|
130
68
|
// ---------------------------------------------------------------------------------------------------------
|
|
131
|
-
/**
|
|
69
|
+
/** One legend «chip»: the glyph (with an optional background colour) followed by the word it stands for. */
|
|
132
70
|
export function chip(txt, col, word) {
|
|
133
71
|
return `<span class="lg"><span class="lg-ico"${col ? ` style="background:${col}"` : ''}>${txt}</span>${word ? ' ' + word : ''}</span>`;
|
|
134
72
|
}
|
|
135
73
|
/**
|
|
136
|
-
*
|
|
74
|
+
* The SPOKEN name of a controller glyph. A glyph that already reads as a word passes untouched.
|
|
137
75
|
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* cada chamada, com o idioma vigente naquele instante.
|
|
76
|
+
* `PAD_GLYPH_SPOKEN` in `input/devices` holds KEYS, not text, because it is a module `const` evaluated once on import —
|
|
77
|
+
* resolved text would freeze the language at boot. It is resolved here, on each call, in the language of that moment.
|
|
141
78
|
*/
|
|
142
|
-
export function
|
|
79
|
+
export function spokenGlyph(t, g) {
|
|
143
80
|
const k = PAD_GLYPH_SPOKEN[g];
|
|
144
81
|
return k ? t(k) : g;
|
|
145
82
|
}
|
|
146
83
|
/**
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
* Ela dizia qual botão confirma e qual volta, e carregava `aria-hidden="true"` — ou seja, era invisível
|
|
150
|
-
* justamente para quem não pode ver o glifo. A XAG 106 manda narrar exatamente isto ("A to Select").
|
|
84
|
+
* THE PAUSE LEGEND — two layers in the same place (ADR-0044 item 4).
|
|
151
85
|
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
86
|
+
* It says which button confirms and which goes back, and XAG 106 asks for exactly this to be narrated ("A to Select").
|
|
87
|
+
* The CHIPS stay visible and silent — a screen reader would read `✕` as a multiplication sign — and beside them a single
|
|
88
|
+
* sentence exists for screen readers only, with the glyphs already turned into words. Two readings of the same
|
|
89
|
+
* information, each in the sense that reaches it.
|
|
156
90
|
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
91
|
+
* Takes the `[glyph, colour]` pairs of the pad's design by position: yes is the south button (A · ✕ · B) and no the east one
|
|
92
|
+
* (B · ◯ · A) on every design — no design swaps them (the Dev's association, ADR-0013 erratum).
|
|
159
93
|
*/
|
|
160
|
-
export function pauseLegendHtml(sim,
|
|
161
|
-
const
|
|
162
|
-
const
|
|
163
|
-
return
|
|
94
|
+
export function pauseLegendHtml(t, sim, no) {
|
|
95
|
+
const silentLegend = (g, word) => `<span class="lg" aria-hidden="true"><span class="lg-ico" style="background:${g[1]}">${g[0]}</span> ${word}</span>`;
|
|
96
|
+
const spoken = t('menu.legendSpoken', { sim: spokenGlyph(t, sim[0]), nao: spokenGlyph(t, no[0]) });
|
|
97
|
+
return silentLegend(sim, t('menu.yes')) + silentLegend(no, t('menu.no')) + `<span class="sr-only">${spoken}</span>`;
|
|
164
98
|
}
|
|
165
99
|
/**
|
|
166
|
-
*
|
|
100
|
+
* Legend row 1: the d-pad and START/Enter. The same for touch and gamepad; the keyboard overrides the labels.
|
|
167
101
|
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
102
|
+
* The words come from `legend.*` and are resolved HERE, on each call — not in a module table, which would freeze the
|
|
103
|
+
* language at boot. The SHORT register on purpose: this row sits under a glyph and has no room for the longer wording the
|
|
104
|
+
* remapping list uses.
|
|
171
105
|
*/
|
|
172
|
-
export function legendRow1(dirTxt, pauseTxt) {
|
|
106
|
+
export function legendRow1(t, dirTxt, pauseTxt) {
|
|
173
107
|
return chip(dirTxt, null, t('legend.move')) + chip(pauseTxt, null, t('legend.pause'));
|
|
174
108
|
}
|
|
175
109
|
/**
|
|
176
|
-
*
|
|
110
|
+
* Legend row 2: the action buttons, in glyph order.
|
|
177
111
|
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
* especial, correr e trocar, nessa ordem. Agora `rotulo` é perguntado ao jogo (a versão CURTA, ver
|
|
181
|
-
* `ActionWord.short`), e uma posição que o jogo não nomeia não vira ficha nenhuma.
|
|
112
|
+
* The words are asked of the GAME (`wordFor`, the SHORT version — see `ActionWord.short`): the engine does not assume
|
|
113
|
+
* every game has jump, special, run and swap. A position the game does not name becomes no chip at all.
|
|
182
114
|
*/
|
|
183
|
-
export function legendRow2(g,
|
|
184
|
-
const
|
|
185
|
-
return
|
|
186
|
-
const
|
|
187
|
-
return
|
|
115
|
+
export function legendRow2(g, wordFor) {
|
|
116
|
+
const GLYPH_ORDER = ['action2', 'action3', 'action1', 'action4'];
|
|
117
|
+
return GLYPH_ORDER.map((a) => {
|
|
118
|
+
const word = wordFor(a);
|
|
119
|
+
return word ? chip(g[a][0], g[a][1], word) : '';
|
|
188
120
|
}).join('');
|
|
189
121
|
}
|
|
190
|
-
/**
|
|
122
|
+
/** The final innerHTML of `#title-legend`: two `.lg-row`. */
|
|
191
123
|
export function legendHtml(l1, l2) {
|
|
192
124
|
return `<span class="lg-row">${l1}</span><span class="lg-row">${l2}</span>`;
|
|
193
125
|
}
|
|
194
126
|
/**
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
*
|
|
127
|
+
* The glyphs of a PHYSICAL pad. `layout` comes from `padLayoutFromId` (only when `mapping === 'standard'`; off-standard it
|
|
128
|
+
* is always 'generic'), and `custom` is the wizard's map (only consulted OFF the standard). A button with no entry in the
|
|
129
|
+
* custom map falls back to its default index ('0'..'3'), and an index the design does not know becomes the pair
|
|
130
|
+
* `[index, '#3a4a6a']` — the fallback grey.
|
|
199
131
|
*/
|
|
200
132
|
export function padActionGlyphs(layout, custom) {
|
|
201
133
|
const set = PAD_DESIGNS[layout] || PAD_DESIGNS.generic;
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
//
|
|
134
|
+
// The `typeof b === 'object'` is not ceremony: a `PadMap` admits a `boolean` besides a `PadBinding` — the mapping
|
|
135
|
+
// wizard's `_skip: true` sentinel. The four keys read here are never it, so nothing changes at run time; what changes is
|
|
136
|
+
// that the read ASKS instead of assuming.
|
|
205
137
|
const bOf = (k, def) => {
|
|
206
138
|
const b = custom && custom[k];
|
|
207
139
|
return b && typeof b === 'object' && typeof b.b === 'number' ? String(b.b) : def;
|
|
@@ -209,14 +141,14 @@ export function padActionGlyphs(layout, custom) {
|
|
|
209
141
|
const gy = (k) => set[k] || [k, '#3a4a6a'];
|
|
210
142
|
return { action2: gy(bOf('action2', '0')), action3: gy(bOf('action3', '1')), action1: gy(bOf('action1', '2')), action4: gy(bOf('action4', '3')) };
|
|
211
143
|
}
|
|
212
|
-
/**
|
|
144
|
+
/** The glyphs of the VIRTUAL (touch) pad: always the 'generic' design (0/1/2/3), no custom map. */
|
|
213
145
|
export function touchActionGlyphs() {
|
|
214
146
|
return padActionGlyphs('generic', null);
|
|
215
147
|
}
|
|
216
148
|
/**
|
|
217
|
-
*
|
|
218
|
-
*
|
|
219
|
-
*
|
|
149
|
+
* Chooses WHICH gamepad the legend describes: Player 1's, if they have one (`players[0].pad`); otherwise the first one
|
|
150
|
+
* connected. With `p1pad >= 0` and no pad of that index present, the result is `null` (the legend falls back to the
|
|
151
|
+
* keyboard) rather than picking another.
|
|
220
152
|
*/
|
|
221
153
|
export function pickLegendPad(pads, p1pad) {
|
|
222
154
|
let gp = null;
|
|
@@ -235,54 +167,57 @@ export function pickLegendPad(pads, p1pad) {
|
|
|
235
167
|
return gp;
|
|
236
168
|
}
|
|
237
169
|
export function initShell(ctx) {
|
|
238
|
-
|
|
239
|
-
|
|
170
|
+
const { t } = ctx;
|
|
171
|
+
/* ===================== the title legend ===================== */
|
|
172
|
+
/** Rows 1 and 2 when there is neither touch nor a gamepad: Player 1's ACTUALLY configured keys. */
|
|
240
173
|
function keyboardLegend() {
|
|
241
174
|
const m = ctx.kbFor(0);
|
|
242
175
|
const K = (a) => ctx.keyName((m[a] || [])[0] || '?');
|
|
243
|
-
const l1 = legendRow1(`${K('up')} ${K('left')} ${K('down')} ${K('right')}`, 'Enter');
|
|
244
|
-
const l2 = legendRow2({ action2: [K('action2'), null], action3: [K('action3'), null], action1: [K('action1'), null], action4: [K('action4'), null] }, ctx.
|
|
176
|
+
const l1 = legendRow1(t, `${K('up')} ${K('left')} ${K('down')} ${K('right')}`, 'Enter');
|
|
177
|
+
const l2 = legendRow2({ action2: [K('action2'), null], action3: [K('action3'), null], action1: [K('action1'), null], action4: [K('action4'), null] }, ctx.shortLabel);
|
|
245
178
|
return [l1, l2];
|
|
246
179
|
}
|
|
247
180
|
function updateTitleLegend() {
|
|
248
181
|
const el = ctx.$('#title-legend');
|
|
249
182
|
if (!el)
|
|
250
|
-
return; // 2
|
|
183
|
+
return; // 2 ROWS, with what is CONFIGURED for the screen's player
|
|
251
184
|
let l1, l2;
|
|
252
|
-
if (ctx.isTouchMode()) { //
|
|
253
|
-
l1 = legendRow1('✜', 'START');
|
|
254
|
-
l2 = legendRow2(touchActionGlyphs(), ctx.
|
|
185
|
+
if (ctx.isTouchMode()) { // VIRTUAL pad: 0/1/2/3 + START
|
|
186
|
+
l1 = legendRow1(t, '✜', 'START');
|
|
187
|
+
l2 = legendRow2(touchActionGlyphs(), ctx.shortLabel);
|
|
255
188
|
}
|
|
256
189
|
else {
|
|
257
190
|
const p0 = ctx.getPlayers()[0];
|
|
258
191
|
const p1pad = p0 && typeof p0.pad === 'number' && p0.pad >= 0 ? p0.pad : -1;
|
|
259
192
|
const gp = pickLegendPad(ctx.getGamepads(), p1pad);
|
|
260
|
-
if (gp) { //
|
|
193
|
+
if (gp) { // PHYSICAL pad: the model's design + the wizard's custom map
|
|
261
194
|
const layout = gp.mapping === 'standard' ? ctx.padLayoutFromId(gp.id) : 'generic';
|
|
262
195
|
const custom = gp.mapping !== 'standard' ? ctx.padMapFor(gp.id) : null;
|
|
263
|
-
l1 = legendRow1('✜', 'START');
|
|
264
|
-
l2 = legendRow2(padActionGlyphs(layout, custom), ctx.
|
|
196
|
+
l1 = legendRow1(t, '✜', 'START');
|
|
197
|
+
l2 = legendRow2(padActionGlyphs(layout, custom), ctx.shortLabel);
|
|
265
198
|
}
|
|
266
199
|
else {
|
|
267
|
-
[l1, l2] = keyboardLegend(); //
|
|
200
|
+
[l1, l2] = keyboardLegend(); // KEYBOARD: the configured keys (remap honoured)
|
|
268
201
|
}
|
|
269
202
|
}
|
|
270
203
|
el.innerHTML = legendHtml(l1, l2);
|
|
271
204
|
const w = ctx.$('#title-wait');
|
|
272
205
|
if (w)
|
|
273
|
-
w.hidden = ctx.getNumPlayers() <= 1; //
|
|
206
|
+
w.hidden = ctx.getNumPlayers() <= 1; // multiplayer: the «wait for Player 1» notice
|
|
274
207
|
}
|
|
275
|
-
/* =====================
|
|
208
|
+
/* ===================== selection and Print ===================== */
|
|
276
209
|
function pauseSelect() {
|
|
277
210
|
ctx.getPauseScreens().forEach((sp) => {
|
|
278
|
-
const items = [...sp.querySelectorAll(
|
|
211
|
+
const items = [...sp.querySelectorAll(PM_VISIBLE_ITEMS)];
|
|
279
212
|
items.forEach((b) => b.classList.remove('pm-sel'));
|
|
280
|
-
if (items[0])
|
|
281
|
-
items[0].classList.add('pm-sel');
|
|
213
|
+
if (items[0]) {
|
|
214
|
+
items[0].classList.add('pm-sel');
|
|
215
|
+
keepInView(items[0]);
|
|
216
|
+
} // the 1st item (Continue), and in view (issue #134)
|
|
282
217
|
});
|
|
283
218
|
}
|
|
284
219
|
function printMode() {
|
|
285
|
-
ctx.getPauseScreens().forEach((sp) => { sp.hidden = true; }); //
|
|
220
|
+
ctx.getPauseScreens().forEach((sp) => { sp.hidden = true; }); // see the screen clean; any button brings them back
|
|
286
221
|
const back = (e) => {
|
|
287
222
|
if (e && e.preventDefault) {
|
|
288
223
|
try {
|
|
@@ -292,41 +227,40 @@ export function initShell(ctx) {
|
|
|
292
227
|
}
|
|
293
228
|
ctx.win.removeEventListener('keydown', back, true);
|
|
294
229
|
ctx.win.removeEventListener('pointerdown', back, true);
|
|
295
|
-
if (ctx.
|
|
230
|
+
if (ctx.sceneFacts().pauseMenu) {
|
|
296
231
|
ctx.getPauseScreens().forEach((sp) => { sp.hidden = false; });
|
|
297
232
|
pauseSelect();
|
|
298
233
|
}
|
|
299
234
|
};
|
|
300
|
-
//
|
|
235
|
+
// An 80 ms delay: the very event that TRIGGERED Print must not be the one that undoes it.
|
|
301
236
|
ctx.win.setTimeout(() => {
|
|
302
237
|
ctx.win.addEventListener('keydown', back, true);
|
|
303
238
|
ctx.win.addEventListener('pointerdown', back, true);
|
|
304
239
|
}, 80);
|
|
305
240
|
ctx.srSay(t('sr.print.on'));
|
|
306
241
|
}
|
|
307
|
-
/* =====================
|
|
308
|
-
/**
|
|
242
|
+
/* ===================== the scene change ===================== */
|
|
243
|
+
/** The IMPURE half: takes the ready projection and stamps it on the document. */
|
|
309
244
|
function applyPhaseView(v) {
|
|
310
|
-
//
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
t.hidden = v.titleOverlayHidden;
|
|
245
|
+
// There is no global pause overlay to look for — see the note in `PhaseView`.
|
|
246
|
+
const title = ctx.$('#title-overlay');
|
|
247
|
+
if (title)
|
|
248
|
+
title.hidden = v.titleOverlayHidden;
|
|
315
249
|
ctx.getPauseScreens().forEach((sp) => { sp.hidden = v.screenPauseHidden; });
|
|
316
250
|
}
|
|
317
|
-
/**
|
|
251
|
+
/** The state of `#touch-controls` BEFORE anything in this scene change touches it. */
|
|
318
252
|
function readTouchControls() {
|
|
319
253
|
const tc = ctx.$('#touch-controls');
|
|
320
254
|
return tc ? { hidden: tc.hidden, wasOn: tc.dataset.wasOn === '1' } : null;
|
|
321
255
|
}
|
|
322
|
-
/**
|
|
256
|
+
/** The IMPURE half of the touch plan: receives the state read BEFORE the hide and writes the plan back. */
|
|
323
257
|
function applyTouchControls(f, before) {
|
|
324
258
|
const tc = ctx.$('#touch-controls');
|
|
325
259
|
if (!tc || !before)
|
|
326
260
|
return;
|
|
327
261
|
const after = touchControlsPlan(f, before, ctx.getNumPlayers());
|
|
328
|
-
//
|
|
329
|
-
//
|
|
262
|
+
// Writes only what CHANGED: on pause with the pad already hidden nothing is touched, and removing a flag that was
|
|
263
|
+
// never set is not attempted.
|
|
330
264
|
if (after.hidden !== before.hidden)
|
|
331
265
|
tc.hidden = after.hidden;
|
|
332
266
|
if (after.wasOn !== before.wasOn) {
|
|
@@ -354,29 +288,26 @@ export function initShell(ctx) {
|
|
|
354
288
|
b.focus();
|
|
355
289
|
}
|
|
356
290
|
/**
|
|
357
|
-
*
|
|
358
|
-
*
|
|
359
|
-
* projeta só precisa dos três fatos.
|
|
291
|
+
* Projects the scene on top onto the document. Called by the root AFTER it changes the stack — the shell neither pushes
|
|
292
|
+
* nor pops: whoever changes scenes knows their names, whoever projects only needs the three facts.
|
|
360
293
|
*/
|
|
361
|
-
function
|
|
362
|
-
const f = ctx.
|
|
294
|
+
function projectScene() {
|
|
295
|
+
const f = ctx.sceneFacts();
|
|
363
296
|
const v = phaseView(f);
|
|
364
|
-
//
|
|
365
|
-
//
|
|
366
|
-
|
|
367
|
-
// direcional e retomar não o devolvia.
|
|
368
|
-
const antesDoHide = readTouchControls();
|
|
297
|
+
// READ BEFORE HIDING: `hideTouchControls()` below already sets `tc.hidden`, and a plan that read after it would see the
|
|
298
|
+
// pad as already off, never record `wasOn`, and never give the d-pad back on resume.
|
|
299
|
+
const touchStateBeforeHiding = readTouchControls();
|
|
369
300
|
if (v.hideTouchControls)
|
|
370
|
-
ctx.hideTouchControls(); // menu
|
|
371
|
-
// GAG:
|
|
301
|
+
ctx.hideTouchControls(); // an active menu (title or pause) = no virtual controller
|
|
302
|
+
// GAG: on pause, ALL the game's sound goes quiet (ambient and rain loops included) — it comes back on resume.
|
|
372
303
|
ctx.setMasterMuted(v.masterMuted);
|
|
373
304
|
applyPhaseView(v);
|
|
374
|
-
applyTouchControls(f,
|
|
375
|
-
//
|
|
305
|
+
applyTouchControls(f, touchStateBeforeHiding); // the state from BEFORE the hide — see above
|
|
306
|
+
// `aria-pressed` comes AFTER the touch block.
|
|
376
307
|
//
|
|
377
|
-
//
|
|
378
|
-
//
|
|
379
|
-
//
|
|
308
|
+
// On the TITLE the attribute is REMOVED rather than set to `false`. There the button means «start», and
|
|
309
|
+
// `aria-pressed` on a button that toggles nothing makes a screen reader announce a state that does not exist — worse
|
|
310
|
+
// than announcing nothing. `titleOverlayHidden` is true outside the title.
|
|
380
311
|
const pb = ctx.$('#touch-start');
|
|
381
312
|
if (pb) {
|
|
382
313
|
if (v.titleOverlayHidden)
|
|
@@ -386,18 +317,18 @@ export function initShell(ctx) {
|
|
|
386
317
|
}
|
|
387
318
|
applyFocus(v.focus);
|
|
388
319
|
}
|
|
389
|
-
/* =====================
|
|
390
|
-
//
|
|
391
|
-
//
|
|
320
|
+
/* ===================== the pause card's table ===================== */
|
|
321
|
+
// The pause card's actions (shared by the per-screen cards). Opening an accessibility panel scopes it to the player who
|
|
322
|
+
// acted (pauseActor) — the panel opens on their tab.
|
|
392
323
|
const pauseActs = {
|
|
393
|
-
resume: () => ctx.
|
|
394
|
-
//
|
|
395
|
-
//
|
|
396
|
-
//
|
|
397
|
-
caa: () => ctx.
|
|
398
|
-
nivel: () => ctx.setQuizLevel(ctx.getQuizLevel() % 5 + 1, true), //
|
|
324
|
+
resume: () => ctx.resumeGame(),
|
|
325
|
+
// The door to the Augmentative and Alternative Communication menu (ADR-0028). DISABLED while no pictogram set is
|
|
326
|
+
// licensed (ADR-0233 erratum): `ui/pause-icons` locks the `caa` item and `ui/settings-aac`'s `open` refuses, both
|
|
327
|
+
// saying only «menu disabled».
|
|
328
|
+
caa: () => ctx.openAac(),
|
|
329
|
+
nivel: () => ctx.setQuizLevel(ctx.getQuizLevel() % 5 + 1, true), // cycles 1..5
|
|
399
330
|
tipo: () => ctx.openTypo(),
|
|
400
|
-
//
|
|
331
|
+
// Only ever ADDS a player (never removes); the new screen WAITS for its player to press a button
|
|
401
332
|
addplayer: () => {
|
|
402
333
|
const n = ctx.getNumPlayers();
|
|
403
334
|
if (n >= 4) {
|
|
@@ -413,11 +344,11 @@ export function initShell(ctx) {
|
|
|
413
344
|
const p = ctx.getPlayers()[ctx.getNumPlayers() - 1];
|
|
414
345
|
p.waiting = true;
|
|
415
346
|
ctx.showWaitingBadge(p.i);
|
|
416
|
-
ctx.
|
|
347
|
+
ctx.resumeGame();
|
|
417
348
|
ctx.srAlert(t('sr.player.pressToJoin', { n: p.i + 1 }));
|
|
418
349
|
},
|
|
419
350
|
audio: () => ctx.openAudio(),
|
|
420
|
-
motora: () => { ctx.
|
|
351
|
+
motora: () => { ctx.setMobilityPlayer(ctx.getPauseActor()); ctx.openMovement(); },
|
|
421
352
|
anim: () => { ctx.setMotionPlayer(ctx.getPauseActor()); ctx.openMotion(); },
|
|
422
353
|
visual: () => { ctx.setSelVizPlayer(ctx.getPauseActor()); ctx.openVisual(); },
|
|
423
354
|
empatia: () => { ctx.setSelVizPlayer(ctx.getPauseActor()); ctx.openEmpathy(); },
|
|
@@ -425,5 +356,5 @@ export function initShell(ctx) {
|
|
|
425
356
|
quit: () => ctx.quitGame(),
|
|
426
357
|
ajuda: () => ctx.openHelp(),
|
|
427
358
|
};
|
|
428
|
-
return {
|
|
359
|
+
return { applyScene: projectScene, pauseSelect, printMode, updateTitleLegend, pauseActs };
|
|
429
360
|
}
|