@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,177 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// platform/pesados-catalogo.ts — O QUE É PESADO, DE ONDE VEM, E QUANTO PESA.
|
|
3
|
-
//
|
|
4
|
-
// 📌 SEPARADO DO BUSCADOR de propósito: a lista é DADO e muda por decisão registada; o buscador é regra e
|
|
5
|
-
// muda por defeito encontrado. Juntos, cada correcção de uma URL mexeria no ficheiro que decide a ordem das
|
|
6
|
-
// descargas, e cada correcção da ordem mexeria na lista que um registo governa.
|
|
7
|
-
//
|
|
8
|
-
// ========================= 🔴 A PRIMEIRA VERSÃO DESTE FICHEIRO COMETEU O DEFEITO QUE ELE SERVE =========================
|
|
9
|
-
// Ela escrevia o host à mão (`const HF = 'https://huggingface.co/…'`), a lista das quatro vozes outra vez, e
|
|
10
|
-
// uma segunda derivação do caminho `idioma/locale/nome/qualidade/…`. As três coisas JÁ EXISTEM no
|
|
11
|
-
// `platform/voice-plan.ts`, que o ADR-0114 designou como o sítio ÚNICO onde o host é nomeado — e cujo próprio
|
|
12
|
-
// comentário nomeia as três vezes que este repositório pagou por tabelas duplicadas (o `DomQuery`, os rótulos
|
|
13
|
-
// de movimento reduzido, as chaves de armazenamento).
|
|
14
|
-
//
|
|
15
|
-
// 📏 QUEM APANHOU FOI O INVENTÁRIO, e não pela duplicação: o `nada-vem-de-fora` recusou uma URL nova sem razão
|
|
16
|
-
// escrita. A URL era só a PROVA; declará-la teria feito o gate ficar verde com a duplicação lá dentro. ⚠️ É a
|
|
17
|
-
// razão de a saída ser APAGAR a cópia e não desculpá-la — declarar duas vezes o mesmo endereço é precisamente
|
|
18
|
-
// a cláusula que o `nada-de-cdn-a-mao` conta com um número.
|
|
19
|
-
import { VOZES_NEURAIS, urlDoModelo, urlDaConfig } from './voice-plan.js';
|
|
20
|
-
/** O nome da Cache Storage. Versionado: mudar o conteúdo do catálogo não deve servir bytes velhos. */
|
|
21
|
-
export const CACHE_PESADOS = 'incl-pesados-v1';
|
|
22
|
-
/**
|
|
23
|
-
* O PESO DE CADA VOZ, MEDIDO EM 2026-09-09 e não estimado — `Content-Length` do modelo e corpo da configuração.
|
|
24
|
-
*
|
|
25
|
-
* 📌 O PESO MORA AQUI E O ENDEREÇO MORA NO `voice-plan`, e a divisão não é arrumação: o `voice-plan` responde
|
|
26
|
-
* «que vozes a engine garante e onde estão», que é decisão do ADR-0110; isto responde «quanto custa descê-las
|
|
27
|
-
* hoje», que é uma medição com data e que muda quando o fornecedor recomprime um ficheiro.
|
|
28
|
-
*
|
|
29
|
-
* ⚠️ UMA VOZ NOVA NO `voice-plan` SEM MEDIÇÃO AQUI FICA SEM `bytes`, e o aviso de «faltam N MB» passaria a
|
|
30
|
-
* sub-reportar em silêncio. É por isso que o gate exige `bytes > 0` em toda entrada de voz COM url: o buraco
|
|
31
|
-
* é pequeno e mudo, que é a forma de defeito que este repositório persegue.
|
|
32
|
-
*/
|
|
33
|
-
const PESO_MEDIDO = Object.freeze({
|
|
34
|
-
'pt_BR-faber-medium': { modelo: 63_201_294, config: 4_855 },
|
|
35
|
-
'en_US-ryan-medium': { modelo: 63_201_294, config: 4_883 },
|
|
36
|
-
'en_US-amy-medium': { modelo: 63_201_294, config: 4_882 },
|
|
37
|
-
'es_MX-claude-high': { modelo: 63_122_309, config: 4_963 },
|
|
38
|
-
});
|
|
39
|
-
/**
|
|
40
|
-
* ⚠️ O `urlDoModelo` devolve `null` para um identificador que não se deixe ler, e a razão viaja com a entrada
|
|
41
|
-
* em vez de a entrada desaparecer. Uma URL inventada dá 404 na escola; um `null` COM razão dá para reportar
|
|
42
|
-
* antes de sair de casa, que é a regra que o `voice-plan` já escreve na própria função.
|
|
43
|
-
*/
|
|
44
|
-
const RAZAO_ID_TORTO = 'o identificador da voz não tem a forma `locale-nome-qualidade`, então o caminho no '
|
|
45
|
-
+ 'fornecedor não se deixa derivar. Corrija o identificador no `platform/voice-plan.ts`.';
|
|
46
|
-
/**
|
|
47
|
-
* AS DUAS ENTRADAS DE UMA VOZ. ⚠️ SÃO DUAS E NÃO UMA: o `.onnx` é o modelo e o `.onnx.json` é a configuração,
|
|
48
|
-
* e o piper recusa-se a falar sem a segunda. Um catálogo que só trouxesse a primeira produziria uma voz
|
|
49
|
-
* «baixada» que não fala — que é pior do que uma voz em falta, porque a primeira parece resolvida.
|
|
50
|
-
*/
|
|
51
|
-
function entradasDaVoz(v) {
|
|
52
|
-
const peso = PESO_MEDIDO[v.voice];
|
|
53
|
-
return [
|
|
54
|
-
{ id: `voz:${v.voice}`, url: urlDoModelo(v), bytes: peso?.modelo, porQueNaoTemFonte: RAZAO_ID_TORTO },
|
|
55
|
-
{ id: `voz:${v.voice}:cfg`, url: urlDaConfig(v), bytes: peso?.config, porQueNaoTemFonte: RAZAO_ID_TORTO },
|
|
56
|
-
];
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* O RUNTIME DE VISÃO — **MediaPipe**, decidido pelo Dev em 2026-09-09 (ADR-0124): «piper-tts, mediapipe
|
|
60
|
-
* (webgazer não), e LPCP: devem acompanhar a engine».
|
|
61
|
-
*
|
|
62
|
-
* 🔴 ESTA ENTRADA DIZIA «a #129 ainda não escolheu o fornecedor» DEPOIS DE ELE TER ESCOLHIDO, e a linha
|
|
63
|
-
* sobreviveu ao registo que a contradizia. Não era só trabalho em falta: era uma afirmação FALSA a dirigir
|
|
64
|
-
* quem a lesse para uma issue já fechada. O Dev teve de perguntar três vezes.
|
|
65
|
-
*
|
|
66
|
-
* 📏 MEDIDO EM 2026-09-09, como as vozes e no mesmo minuto: os três ficheiros respondem 200 em jsDelivr com
|
|
67
|
-
* `Access-Control-Allow-Origin: *`, na versão FIXADA — 155 439 + 323 377 + 11 756 954 bytes.
|
|
68
|
-
*
|
|
69
|
-
* ⚠️ CDN FIXADA É PERMITIDA E O ADR-0116 DIZ PORQUÊ: o que o pilar 8 proíbe é depender da rede DEPOIS do
|
|
70
|
-
* primeiro dia. Isto desce na INSTALAÇÃO, com o resto — e é a diferença inteira para o WebGazer, que busca
|
|
71
|
-
* quando a criança liga o controle por olhar, logo a máquina que nunca o ligou fica sem ele para sempre.
|
|
72
|
-
* 📌 A versão vai na URL, que é o que o `check:precache` exige de qualquer entrada externa: bytes diferentes
|
|
73
|
-
* chegam por endereço diferente, e uma entrada fixada nunca congela.
|
|
74
|
-
*
|
|
75
|
-
* 🎯 SÃO OS TRÊS FICHEIROS E NÃO SÓ O `.wasm`: o `vision_bundle.mjs` é quem o carrega e o
|
|
76
|
-
* `vision_wasm_internal.js` é a cola do Emscripten. Baixar o wasm sozinho é a mesma armadilha do `.onnx` sem
|
|
77
|
-
* o `.onnx.json` — uma coisa «baixada» que não corre.
|
|
78
|
-
*
|
|
79
|
-
* ⬜ O que continua por fazer é a FIAÇÃO (issue #11): estes bytes descem e ainda ninguém os lê. O
|
|
80
|
-
* `tests/o-que-desce-tem-quem-leia.node.test.js` é onde essa dívida está declarada.
|
|
81
|
-
*/
|
|
82
|
-
const MP = 'https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@1.0.1';
|
|
83
|
-
const MP_MODELOS = 'https://storage.googleapis.com/mediapipe-models';
|
|
84
|
-
/**
|
|
85
|
-
* 🔴 A PRIMEIRA VERSÃO DESTA LISTA TRAZIA O RUNTIME E NENHUM MODELO, e o Dev apanhou-o ao perguntar o que
|
|
86
|
-
* tinha ficado de fora. 11,7 MB de WebAssembly sem um `.task` não reconhecem coisa nenhuma — é o `.onnx` sem
|
|
87
|
-
* o `.onnx.json` outra vez, no ficheiro que escreve essa lição doze linhas acima.
|
|
88
|
-
*
|
|
89
|
-
* 📏 MEDIDOS EM 2026-09-09, todos 200 com CORS aberto. `float16` e não `float32`: metade do peso, e a precisão
|
|
90
|
-
* que se perde é irrelevante para dizer onde está um íris num ecrã de 320×180.
|
|
91
|
-
*/
|
|
92
|
-
const MEDIAPIPE = Object.freeze([
|
|
93
|
-
{ id: 'visao:runtime', url: `${MP}/vision_bundle.mjs`, bytes: 155_439 },
|
|
94
|
-
{ id: 'visao:runtime:cola', url: `${MP}/wasm/vision_wasm_internal.js`, bytes: 323_377 },
|
|
95
|
-
{ id: 'visao:runtime:wasm', url: `${MP}/wasm/vision_wasm_internal.wasm`, bytes: 11_756_954 },
|
|
96
|
-
{ id: 'visao:modelo:rosto', url: `${MP_MODELOS}/face_landmarker/face_landmarker/float16/1/face_landmarker.task`, bytes: 3_758_596 },
|
|
97
|
-
{ id: 'visao:modelo:gestos', url: `${MP_MODELOS}/gesture_recognizer/gesture_recognizer/float16/1/gesture_recognizer.task`, bytes: 8_373_440 },
|
|
98
|
-
{ id: 'visao:modelo:maos', url: `${MP_MODELOS}/hand_landmarker/hand_landmarker/float16/1/hand_landmarker.task`, bytes: 7_819_105 },
|
|
99
|
-
]);
|
|
100
|
-
/**
|
|
101
|
-
* O WEBGAZER — **volta em 2026-09-09, ao lado do MediaPipe** (ADR-0132): «Traga o WebGazer de volta. Vamos
|
|
102
|
-
* usar ambos.»
|
|
103
|
-
*
|
|
104
|
-
* 🎯 ELES NÃO SE SOBREPÕEM ONDE IMPORTA, e é essa medição que produziu a decisão: o MediaPipe diz ONDE O ÍRIS
|
|
105
|
-
* ESTÁ — `FACE_LANDMARKS_LEFT_IRIS` são conjuntos de conexões sobre marcos —, e o WebGazer diz PARA ONDE A
|
|
106
|
-
* CRIANÇA OLHA NO ECRÃ, que é um modelo de regressão com calibração. Nenhuma das quinze tarefas do
|
|
107
|
-
* `tasks-vision` faz a segunda.
|
|
108
|
-
*
|
|
109
|
-
* ⚠️ E O DEFEITO DELE NUNCA FOI O FORNECEDOR: era ser PREGUIÇOSO. Buscado quando a criança liga o controle
|
|
110
|
-
* por olhar, a máquina que nunca o ligou fica sem ele, e numa escola sem rede não acontece nada — sem erro e
|
|
111
|
-
* sem explicação. Aqui desce na INSTALAÇÃO com tudo o resto, e o defeito desaparece com a capacidade intacta.
|
|
112
|
-
* 📌 Fica a dívida que o ADR-0132 nomeia: o `<script src>` do `ui/webcam.ts` tem de sair no mesmo commit em
|
|
113
|
-
* que a fiação o ler daqui, senão passam a existir dois caminhos para o mesmo ficheiro.
|
|
114
|
-
*/
|
|
115
|
-
const WEBGAZER = Object.freeze([
|
|
116
|
-
{ id: 'visao:olhar', url: 'https://webgazer.cs.brown.edu/webgazer.js', bytes: 1_895_169 },
|
|
117
|
-
]);
|
|
118
|
-
/**
|
|
119
|
-
* O RUNTIME DE VOZ — **piper**, decidido no ADR-0127, e o Dev disse para que serve: «PiperTTS é o que será
|
|
120
|
-
* usado para ler para o usuário. Precisa ser carregado com a engine».
|
|
121
|
-
*
|
|
122
|
-
* 🔴 ATÉ AQUI ELE SÓ CHEGAVA PELA PORTA DO CARTUCHO (ADR-0094), e três dos seis jogos não a declaram — nesses,
|
|
123
|
-
* a engine descarregava 241 MB de modelos e não tinha com que os tocar. Descer os modelos sem o motor é a
|
|
124
|
-
* mesma armadilha do `.onnx` sem o `.onnx.json`, um nível acima.
|
|
125
|
-
*
|
|
126
|
-
* 📏 MEDIDO EM 2026-09-09 em jsDelivr, versões FIXADAS, todos 200 com `Access-Control-Allow-Origin: *`.
|
|
127
|
-
* ⚠️ SÃO CINCO FICHEIROS E NÃO UM: o `piper-tts-web.js` é só a entrada (23 KB) — os dois pedaços com hash no
|
|
128
|
-
* nome são o corpo e a tabela de vozes, e o `onnxruntime-web` é quem corre o modelo. Trazer só a entrada dá
|
|
129
|
-
* um módulo que importa o que não está lá.
|
|
130
|
-
* 📌 `ort-wasm-simd-threaded` e não o `jsep`: o jsep é o caminho WebGPU e pesa 21,7 MB contra 11,2 — e o
|
|
131
|
-
* hardware do pilar 1 não é onde a WebGPU se ganha.
|
|
132
|
-
*/
|
|
133
|
-
const PP = 'https://cdn.jsdelivr.net/npm/@mintplex-labs/piper-tts-web@1.0.5/dist';
|
|
134
|
-
const ORT = 'https://cdn.jsdelivr.net/npm/onnxruntime-web@1.20.1/dist';
|
|
135
|
-
const PIPER = Object.freeze([
|
|
136
|
-
{ id: 'voz:runtime', url: `${PP}/piper-tts-web.js`, bytes: 23_646 },
|
|
137
|
-
{ id: 'voz:runtime:corpo', url: `${PP}/piper-o91UDS6e.js`, bytes: 158_217 },
|
|
138
|
-
{ id: 'voz:runtime:tabela', url: `${PP}/voices_static-D_OtJDHM.js`, bytes: 147_377 },
|
|
139
|
-
{ id: 'voz:runtime:ort', url: `${ORT}/ort.min.js`, bytes: 446_284 },
|
|
140
|
-
{ id: 'voz:runtime:ort-wasm', url: `${ORT}/ort-wasm-simd-threaded.wasm`, bytes: 11_246_032 },
|
|
141
|
-
]);
|
|
142
|
-
export const PESADOS = Object.freeze([
|
|
143
|
-
...VOZES_NEURAIS.flatMap(entradasDaVoz),
|
|
144
|
-
...PIPER,
|
|
145
|
-
/*
|
|
146
|
-
* 🔴 O RUNTIME DE VISÃO — decidido e SEM FONTE, e a ausência é medida.
|
|
147
|
-
*
|
|
148
|
-
* A issue #11 diz «MediaPipe» e o `ui/webcam.ts` faz WebGazer, buscado de `webgazer.cs.brown.edu` por um
|
|
149
|
-
* `<script src>` com preguiça no PRIMEIRO USO — sem SRI, sem `crossorigin`, e a falhar em silêncio numa
|
|
150
|
-
* escola sem rede. `git grep -i mediapipe` em `app/js` devolve ZERO (ADR-0119).
|
|
151
|
-
*
|
|
152
|
-
* ⚠️ NÃO PONHO AQUI A URL DO WEBGAZER. Trocar o fornecedor é decisão da #129, e escrevê-la aqui seria
|
|
153
|
-
* decidi-la de lado — a mesma coisa que o ADR-0119 apanhou: um subsistema que a engine DECLARA possuir e
|
|
154
|
-
* que na prática é outra coisa.
|
|
155
|
-
*/
|
|
156
|
-
...MEDIAPIPE,
|
|
157
|
-
...WEBGAZER,
|
|
158
|
-
/*
|
|
159
|
-
* 🔴 O ACERVO DE ARTE — a quarta coisa pesada do ADR-0119, e a única SEM FONTE. Medido: `art/` tem DOIS
|
|
160
|
-
* ficheiros — um README e um `ATTRIBUTION.csv` de 40 bytes, só o cabeçalho. Zero arte.
|
|
161
|
-
*
|
|
162
|
-
* ⚠️ ATÉ 2026-09-09 ESTA LINHA CULPAVA A COISA ERRADA. Dizia que a quarentena estava vazia e que a arte
|
|
163
|
-
* era CC BY-SA 3.0 com autoria por recurso — descrevendo o Liberated Pixel Cup, que o ADR-0133 recusou:
|
|
164
|
-
* os dois braços dele são share-alike ou GPL, e nenhum está na lista fechada de quatro licenças.
|
|
165
|
-
*
|
|
166
|
-
* 📌 A razão de continuar sem fonte MUDOU e é mais simples: não há acervo escolhido. A arte entra sob
|
|
167
|
-
* CC0, CC BY 3.0, CC BY 4.0 ou OGA-BY, com uma linha de livro por recurso e a URL da origem — e nada
|
|
168
|
-
* disso é uma URL única que um buscador possa pedir. A fonte desta linha é o dia em que houver acervo.
|
|
169
|
-
*/
|
|
170
|
-
{
|
|
171
|
-
id: 'arte:acervo',
|
|
172
|
-
url: null,
|
|
173
|
-
porQueNaoTemFonte: 'não há acervo escolhido: `art/` tem só README e cabeçalho do CSV. O ADR-0133 fechou '
|
|
174
|
-
+ 'a lista em CC0, CC BY 3.0/4.0 e OGA-BY, e a arte entra recurso a recurso com autoria e URL de '
|
|
175
|
-
+ 'origem — não por uma URL solta que este buscador possa pedir.',
|
|
176
|
-
},
|
|
177
|
-
]);
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
import { CACHE_PESADOS, PESADOS, type Pesado } from './pesados-catalogo.js';
|
|
3
|
-
export { CACHE_PESADOS, PESADOS };
|
|
4
|
-
export type { Pesado };
|
|
5
|
-
/** O que aconteceu com cada entrada, para quem chama poder dizê-lo a uma pessoa. */
|
|
6
|
-
export interface RelatorioPesado {
|
|
7
|
-
readonly id: string;
|
|
8
|
-
readonly estado: 'ja-tinha' | 'baixado' | 'falhou' | 'sem-fonte';
|
|
9
|
-
readonly bytes?: number;
|
|
10
|
-
readonly erro?: string;
|
|
11
|
-
}
|
|
12
|
-
export interface OpcoesDosPesados {
|
|
13
|
-
/** `caches` do navegador. Injectado para o gate não precisar de um. */
|
|
14
|
-
readonly cacheStorage?: CacheStorage;
|
|
15
|
-
/** `fetch`. Injectado pela mesma razão. */
|
|
16
|
-
readonly buscar?: typeof fetch;
|
|
17
|
-
/** Chamado a cada entrada resolvida — é o que deixa a interface dizer o que está a acontecer. */
|
|
18
|
-
readonly aoProgredir?: (r: RelatorioPesado) => void;
|
|
19
|
-
/** Só estas ids, se dado. Serve ao consumidor que quer as vozes e não o resto. */
|
|
20
|
-
readonly apenas?: readonly string[];
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* BAIXA O QUE FALTA, UM DE CADA VEZ, E DEVOLVE O QUE ACONTECEU COM CADA UM.
|
|
24
|
-
*
|
|
25
|
-
* ⚠️ AS ENTRADAS SEM `url` NÃO SÃO SALTADAS EM SILÊNCIO — devolvem `sem-fonte`. É a diferença entre «este
|
|
26
|
-
* subsistema ainda não tem de onde vir» e «este subsistema está tratado», e é exactamente a distinção que o
|
|
27
|
-
* ADR-0119 mediu em falta: a engine PROMETIA quatro coisas e entregava uma, sem nada a dizê-lo.
|
|
28
|
-
*/
|
|
29
|
-
export declare function baixarPesados(opcoes?: OpcoesDosPesados): Promise<RelatorioPesado[]>;
|
|
30
|
-
/** O peso do que ainda falta, em bytes — para um aviso poder dizer «faltam 241 MB» antes de começar. */
|
|
31
|
-
export declare function pesoPorBaixar(relatorio: readonly RelatorioPesado[]): number;
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// platform/pesados.ts — AS COISAS PESADAS, BAIXADAS NO PRIMEIRO CARREGAMENTO (ADR-0110, ADR-0116, ADR-0119).
|
|
3
|
-
//
|
|
4
|
-
// ========================= O QUE ISTO É =========================
|
|
5
|
-
// O pilar 8 diz «PWA no primeiro dia ONLINE, depois OFFLINE-FIRST», e o ADR-0116 tirou a contradição que
|
|
6
|
-
// travava isto: instalar já é um acto de rede, logo buscar na instalação não viola nada. O que faltava era
|
|
7
|
-
// alguém a buscar.
|
|
8
|
-
//
|
|
9
|
-
// 📏 MEDIDO EM 2026-09-09, e é o estado que este ficheiro existe para mudar: das quatro coisas pesadas que a
|
|
10
|
-
// engine promete (fontes · voz neural · runtime de visão · arte do LCP), só as FONTES viajavam de verdade.
|
|
11
|
-
// As vozes eram porta do cartucho, o runtime de visão era um `<script src>` de CDN buscado com preguiça no
|
|
12
|
-
// PRIMEIRO USO, e a arte do LCP não existe.
|
|
13
|
-
//
|
|
14
|
-
// ⚠️ E ISTO NÃO BLOQUEIA O JOGO. A criança joga enquanto os 241 MB descem; o que não pode acontecer é ela
|
|
15
|
-
// chegar ao segundo dia, sem rede, e descobrir que a voz nunca foi buscada.
|
|
16
|
-
//
|
|
17
|
-
// ========================= AS TRÊS REGRAS QUE A FORMA IMPÕE =========================
|
|
18
|
-
// 1. **UM DE CADA VEZ.** Quatro descargas de 60 MB em paralelo num link de escola disputam a mesma banda e
|
|
19
|
-
// nenhuma acaba primeiro — e o jogo, que precisa da rede para as próprias imagens, fica atrás delas.
|
|
20
|
-
// 2. **NUNCA LANÇA.** Uma falha de rede é REPORTADA e a lista continua. Um `throw` aqui derrubaria o
|
|
21
|
-
// arranque de um jogo por causa de um recurso que ele nem usa hoje.
|
|
22
|
-
// 3. **IDEMPOTENTE.** O que já está na Cache Storage não é buscado outra vez — é o que torna isto seguro de
|
|
23
|
-
// chamar em todo arranque em vez de só «no primeiro», que ninguém sabe detectar com honestidade.
|
|
24
|
-
import { CACHE_PESADOS, PESADOS } from './pesados-catalogo.js';
|
|
25
|
-
export { CACHE_PESADOS, PESADOS };
|
|
26
|
-
/**
|
|
27
|
-
* BAIXA O QUE FALTA, UM DE CADA VEZ, E DEVOLVE O QUE ACONTECEU COM CADA UM.
|
|
28
|
-
*
|
|
29
|
-
* ⚠️ AS ENTRADAS SEM `url` NÃO SÃO SALTADAS EM SILÊNCIO — devolvem `sem-fonte`. É a diferença entre «este
|
|
30
|
-
* subsistema ainda não tem de onde vir» e «este subsistema está tratado», e é exactamente a distinção que o
|
|
31
|
-
* ADR-0119 mediu em falta: a engine PROMETIA quatro coisas e entregava uma, sem nada a dizê-lo.
|
|
32
|
-
*/
|
|
33
|
-
export async function baixarPesados(opcoes = {}) {
|
|
34
|
-
const cs = opcoes.cacheStorage ?? (typeof caches !== 'undefined' ? caches : undefined);
|
|
35
|
-
const buscar = opcoes.buscar ?? (typeof fetch !== 'undefined' ? fetch : undefined);
|
|
36
|
-
const alvos = opcoes.apenas
|
|
37
|
-
? PESADOS.filter((p) => opcoes.apenas.includes(p.id))
|
|
38
|
-
: PESADOS;
|
|
39
|
-
const out = [];
|
|
40
|
-
const conta = (r) => { out.push(r); opcoes.aoProgredir?.(r); };
|
|
41
|
-
if (!cs || !buscar) {
|
|
42
|
-
for (const p of alvos)
|
|
43
|
-
conta({ id: p.id, estado: 'falhou', erro: 'sem Cache Storage ou sem fetch' });
|
|
44
|
-
return out;
|
|
45
|
-
}
|
|
46
|
-
const cache = await cs.open(CACHE_PESADOS);
|
|
47
|
-
for (const p of alvos) {
|
|
48
|
-
if (!p.url) {
|
|
49
|
-
conta({ id: p.id, estado: 'sem-fonte', erro: p.porQueNaoTemFonte });
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
try {
|
|
53
|
-
if (await cache.match(p.url)) {
|
|
54
|
-
conta({ id: p.id, estado: 'ja-tinha' });
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
const resp = await buscar(p.url);
|
|
58
|
-
if (!resp.ok) {
|
|
59
|
-
conta({ id: p.id, estado: 'falhou', erro: `HTTP ${resp.status}` });
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
await cache.put(p.url, resp.clone());
|
|
63
|
-
conta({ id: p.id, estado: 'baixado', bytes: p.bytes });
|
|
64
|
-
}
|
|
65
|
-
catch (e) {
|
|
66
|
-
conta({ id: p.id, estado: 'falhou', erro: e instanceof Error ? e.message : String(e) });
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return out;
|
|
70
|
-
}
|
|
71
|
-
/** O peso do que ainda falta, em bytes — para um aviso poder dizer «faltam 241 MB» antes de começar. */
|
|
72
|
-
export function pesoPorBaixar(relatorio) {
|
|
73
|
-
const feitos = new Set(relatorio.filter((r) => r.estado === 'ja-tinha' || r.estado === 'baixado').map((r) => r.id));
|
|
74
|
-
return PESADOS.filter((p) => p.url && !feitos.has(p.id)).reduce((s, p) => s + (p.bytes ?? 0), 0);
|
|
75
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
import { type EstadosDasVozes, type VozNeural } from './voice-plan.js';
|
|
3
|
-
import type { RelatorioPesado } from './pesados.js';
|
|
4
|
-
/**
|
|
5
|
-
* O ESTADO DE CADA VOZ A PARTIR DO QUE O BUSCADOR RELATOU.
|
|
6
|
-
*
|
|
7
|
-
* ⚠️ `emCurso` NÃO É COSMÉTICA, E É O QUE IMPEDE ESTA PONTE DE MENTIR NOS DOIS SENTIDOS. O relatório só
|
|
8
|
-
* contém o que JÁ resolveu, logo uma voz por relatar é ambígua: pode estar a caminho ou nunca ter sido
|
|
9
|
-
* pedida. O `voice-plan` recusa-se a confundir as duas por escrito — «ausente não se disfarça de a buscar»,
|
|
10
|
-
* porque isso esconderia um buscador que nunca arrancou atrás de uma frase tranquilizadora — e a única coisa
|
|
11
|
-
* que desfaz a ambiguidade é quem chamou saber se a descarga ainda corre.
|
|
12
|
-
*
|
|
13
|
-
* 📌 E o par contrário importa igualmente: com a descarga TERMINADA, uma voz por relatar é `ausente` e nunca
|
|
14
|
-
* `a-buscar`, senão a interface prometeria para sempre uma coisa que já não vem.
|
|
15
|
-
*/
|
|
16
|
-
export declare function estadosDasVozes(relatorio: readonly RelatorioPesado[], opcoes?: {
|
|
17
|
-
readonly emCurso?: boolean;
|
|
18
|
-
}, catalogo?: readonly VozNeural[]): EstadosDasVozes;
|
|
19
|
-
/**
|
|
20
|
-
* AS IDS DAS COISAS PESADAS QUE SÃO VOZ — para quem queira descê-las primeiro, sem adivinhar o formato da id.
|
|
21
|
-
*
|
|
22
|
-
* ⚠️ Existe porque a alternativa é o consumidor escrever `p.id.startsWith('voz:')` no ponto de uso, e aí o
|
|
23
|
-
* formato da id passa a ser contrato público sem nunca ter sido decidido como tal.
|
|
24
|
-
*/
|
|
25
|
-
export declare const idsDasVozes: (catalogo?: readonly VozNeural[]) => string[];
|
|
26
|
-
/** Reexportado para quem faz a ponte não ter de importar de dois sítios para responder a uma pergunta. */
|
|
27
|
-
export { vozEmUso, estadoDe } from './voice-plan.js';
|
|
28
|
-
export type { VozEmUso, EstadosDasVozes } from './voice-plan.js';
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// platform/vozes-prontas.ts — A PONTE ENTRE O QUE DESCEU E O QUE A CRIANÇA OUVE (ADR-0110, gates 3 e 4).
|
|
3
|
-
//
|
|
4
|
-
// ========================= POR QUE ESTE MÓDULO EXISTE =========================
|
|
5
|
-
// 📏 MEDIDO EM 2026-09-09: `vozEmUso` — a função que o ADR-0110 chama «o gate 3 em forma de código» — tinha
|
|
6
|
-
// ZERO leitores em produção, e NADA no repositório produzia um `EstadosDasVozes`. O buscador que nasceu hoje
|
|
7
|
-
// relata `RelatorioPesado[]`. São DUAS linguagens para o mesmo facto, e nenhuma falava com a outra.
|
|
8
|
-
//
|
|
9
|
-
// ⚠️ ISSO NÃO É UM ENCAIXE QUE FALTAVA, É A FORMA DE DEFEITO QUE ESTE REPOSITÓRIO PERSEGUE: um modelo aferido
|
|
10
|
-
// e correcto, sem ninguém a lê-lo, ao lado de um mecanismo que produz a mesma verdade noutro vocabulário. O
|
|
11
|
-
// `render/viz-axes` esteve exactamente assim — «é ÓRFÃO» — e o que isso custou foi a composição dos dois eixos
|
|
12
|
-
// visuais a existir no papel e não na tela.
|
|
13
|
-
//
|
|
14
|
-
// ========================= 🎯 A REGRA QUE ESTE MÓDULO CARREGA, E É UMA SÓ =========================
|
|
15
|
-
// **UMA VOZ SÓ ESTÁ PRONTA QUANDO OS DOIS FICHEIROS DESCERAM.** O piper recusa-se a falar sem o `.onnx.json`,
|
|
16
|
-
// então uma voz com o modelo e sem a configuração é uma voz que NÃO FALA — e marcá-la `pronta` faria a engine
|
|
17
|
-
// anunciar «voz neural» e ficar muda. É pior do que a voz em falta, porque a primeira parece resolvida, e é
|
|
18
|
-
// literalmente a família do `reflectTTS` que o ADR-0110 nomeia ao pedir o gate 3.
|
|
19
|
-
import { VOZES_NEURAIS } from './voice-plan.js';
|
|
20
|
-
/** As duas ids que o catálogo dá a uma voz. Derivadas, não tabeladas — a tabela vive no catálogo. */
|
|
21
|
-
const idsDe = (v) => [`voz:${v.voice}`, `voz:${v.voice}:cfg`];
|
|
22
|
-
/**
|
|
23
|
-
* O ESTADO DE CADA VOZ A PARTIR DO QUE O BUSCADOR RELATOU.
|
|
24
|
-
*
|
|
25
|
-
* ⚠️ `emCurso` NÃO É COSMÉTICA, E É O QUE IMPEDE ESTA PONTE DE MENTIR NOS DOIS SENTIDOS. O relatório só
|
|
26
|
-
* contém o que JÁ resolveu, logo uma voz por relatar é ambígua: pode estar a caminho ou nunca ter sido
|
|
27
|
-
* pedida. O `voice-plan` recusa-se a confundir as duas por escrito — «ausente não se disfarça de a buscar»,
|
|
28
|
-
* porque isso esconderia um buscador que nunca arrancou atrás de uma frase tranquilizadora — e a única coisa
|
|
29
|
-
* que desfaz a ambiguidade é quem chamou saber se a descarga ainda corre.
|
|
30
|
-
*
|
|
31
|
-
* 📌 E o par contrário importa igualmente: com a descarga TERMINADA, uma voz por relatar é `ausente` e nunca
|
|
32
|
-
* `a-buscar`, senão a interface prometeria para sempre uma coisa que já não vem.
|
|
33
|
-
*/
|
|
34
|
-
export function estadosDasVozes(relatorio, opcoes = {}, catalogo = VOZES_NEURAIS) {
|
|
35
|
-
const porId = new Map(relatorio.map((r) => [r.id, r]));
|
|
36
|
-
const saida = {};
|
|
37
|
-
for (const v of catalogo) {
|
|
38
|
-
const partes = idsDe(v).map((id) => porId.get(id));
|
|
39
|
-
if (partes.some((p) => p && (p.estado === 'falhou' || p.estado === 'sem-fonte'))) {
|
|
40
|
-
// 📌 UMA METADE FALHADA CHEGA PARA A VOZ INTEIRA FALHAR, e é o mesmo argumento da regra do cabeçalho
|
|
41
|
-
// visto do outro lado: sem os dois ficheiros não há fala nenhuma, logo não há meia voz para oferecer.
|
|
42
|
-
saida[v.voice] = 'falhou';
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
if (partes.every((p) => p && (p.estado === 'baixado' || p.estado === 'ja-tinha'))) {
|
|
46
|
-
saida[v.voice] = 'pronta';
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
saida[v.voice] = opcoes.emCurso ? 'a-buscar' : 'ausente';
|
|
50
|
-
}
|
|
51
|
-
return Object.freeze(saida);
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* AS IDS DAS COISAS PESADAS QUE SÃO VOZ — para quem queira descê-las primeiro, sem adivinhar o formato da id.
|
|
55
|
-
*
|
|
56
|
-
* ⚠️ Existe porque a alternativa é o consumidor escrever `p.id.startsWith('voz:')` no ponto de uso, e aí o
|
|
57
|
-
* formato da id passa a ser contrato público sem nunca ter sido decidido como tal.
|
|
58
|
-
*/
|
|
59
|
-
export const idsDasVozes = (catalogo = VOZES_NEURAIS) => catalogo.flatMap((v) => [...idsDe(v)]);
|
|
60
|
-
/** Reexportado para quem faz a ponte não ter de importar de dois sítios para responder a uma pergunta. */
|
|
61
|
-
export { vozEmUso, estadoDe } from './voice-plan.js';
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
/** Um tamanho em pixels de mundo ou de tela. Só isto: a câmera não precisa saber de mais nada. */
|
|
3
|
-
export interface Tamanho {
|
|
4
|
-
w: number;
|
|
5
|
-
h: number;
|
|
6
|
-
}
|
|
7
|
-
/** Onde a câmera está, ANTES de arredondar. O arredondamento é do desenho, não da conta — ver `prender`. */
|
|
8
|
-
export interface Camera {
|
|
9
|
-
camX: number;
|
|
10
|
-
camY: number;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Prende a câmera dentro do mundo.
|
|
14
|
-
*
|
|
15
|
-
* ⚠️ MUNDO MENOR QUE A TELA: `mundo.w - tela.w` fica NEGATIVO, o `min` devolve esse negativo e o `max(0, …)`
|
|
16
|
-
* o zera — a câmera encosta no canto superior esquerdo e sobra vazio à direita e abaixo. É o comportamento
|
|
17
|
-
* que já existia e está preservado de propósito; o mapa de hoje (896×992 contra 320×180) nunca chega lá, mas
|
|
18
|
-
* uma fase pequena chegaria, e é melhor que o caso esteja escrito do que descoberto.
|
|
19
|
-
*/
|
|
20
|
-
export declare function prender(cam: Camera, mundo: Tamanho, tela: Tamanho): Camera;
|
|
21
|
-
/** Põe `(alvoX, alvoY)` no CENTRO da tela e prende no mundo. O alvo é um ponto — quem tem corpo o converte. */
|
|
22
|
-
export declare function enquadrar(alvoX: number, alvoY: number, mundo: Tamanho, tela: Tamanho): Camera;
|
|
23
|
-
/**
|
|
24
|
-
* Aplica o tremor (JUICE) e PRENDE DE NOVO.
|
|
25
|
-
*
|
|
26
|
-
* A segunda prisão não é zelo: sem ela o tremor empurra a câmera para fora do mundo na beirada da fase e a
|
|
27
|
-
* criança vê o vazio atrás do cenário — justamente no momento em que alguma coisa explodiu e ela está olhando.
|
|
28
|
-
*
|
|
29
|
-
* @param amp amplitude em px (0 = sem tremor; `render/fx.shakeAmp`, que decai linearmente)
|
|
30
|
-
* @param rx deslocamento horizontal já sorteado, em [-1, 1]
|
|
31
|
-
* @param ry idem, vertical
|
|
32
|
-
*/
|
|
33
|
-
export declare function tremer(cam: Camera, mundo: Tamanho, tela: Tamanho, amp: number, rx: number, ry: number): Camera;
|
|
34
|
-
/** A zona-morta, em pixels de TELA. `{w:0,h:0}` = sem zona: a câmera cola no alvo, que é o de hoje. */
|
|
35
|
-
export interface ZonaMorta {
|
|
36
|
-
readonly w: number;
|
|
37
|
-
readonly h: number;
|
|
38
|
-
}
|
|
39
|
-
export interface CameraObj {
|
|
40
|
-
/** Onde a câmera está, sem tremor, pré-arredondamento. */
|
|
41
|
-
readonly base: Camera;
|
|
42
|
-
/** Segue o alvo respeitando a zona-morta e prende no mundo. Devolve a base nova. */
|
|
43
|
-
seguir(alvoX: number, alvoY: number): Camera;
|
|
44
|
-
/** Centra no alvo AGORA, ignorando a zona-morta: nascimento, renascimento, troca de fase. */
|
|
45
|
-
pular(alvoX: number, alvoY: number): Camera;
|
|
46
|
-
/** Base + tremor, preso no mundo. NÃO altera a base — ver o cabeçalho. */
|
|
47
|
-
quadro(amp: number, rx: number, ry: number): Camera;
|
|
48
|
-
/** Mundo e/ou tela mudaram (fase nova, viewport dividido). Reprende a base no que passou a valer. */
|
|
49
|
-
redimensionar(mundo?: Tamanho, tela?: Tamanho): Camera;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Cria uma câmera com alvo, zona-morta, prisão no mundo e tremor.
|
|
53
|
-
*
|
|
54
|
-
* ⚠️ ZONA ZERO É O COMPORTAMENTO DE HOJE, e não por coincidência: com `w = h = 0` a correção de `seguir` vira
|
|
55
|
-
* `alvo - tela/2`, que é `enquadrar` letra por letra. É o que permite trocar o `placeCam` por esta câmera sem
|
|
56
|
-
* mudar um pixel do que a criança vê, e escolher um valor de zona depois, como decisão separada.
|
|
57
|
-
*/
|
|
58
|
-
export declare function criarCamera(mundo: Tamanho, tela: Tamanho, zona?: ZonaMorta): CameraObj;
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// render/camera — ONDE A CÂMERA FICA. Item 22 (ADR-0027 passo 7), opção M1: a conta sai de dentro do efeito.
|
|
3
|
-
//
|
|
4
|
-
// ========================= POR QUE ISTO É UM MÓDULO, E POR QUE SÓ AGORA =========================
|
|
5
|
-
// `placeCam` morava dentro de `render/draw.ts`, e o comentário do main.js registrava o motivo com honestidade:
|
|
6
|
-
// "placeCam NÃO ganha envólucro: fora do próprio draw ele não tinha chamador nenhum". Era verdade — e deixou
|
|
7
|
-
// de ser no dia em que o item 22 pediu uma câmera. O que muda não é o número de chamadores: é que a posição da
|
|
8
|
-
// câmera passou a ser uma coisa que se DECIDE (zona-morta? uma por viewport? quem ela segue?), e uma decisão
|
|
9
|
-
// enterrada dentro de uma função de 300 linhas de desenho não pode ser discutida nem aferida.
|
|
10
|
-
//
|
|
11
|
-
// Aqui não há decisão nova nenhuma. As fórmulas são as do `placeCam`, VERBATIM, na mesma ordem — enquadra,
|
|
12
|
-
// prende, treme, prende de novo. É de propósito: M1 é o PREFIXO COMUM de todas as alternativas de câmera que
|
|
13
|
-
// estão na mesa (extrair · zona-morta · uma por viewport), e nenhuma delas o dispensa. Extrair sem mudar é o
|
|
14
|
-
// que torna a extração reversível e o que deixa a escolha inteira nas mãos do Dev.
|
|
15
|
-
//
|
|
16
|
-
// ========================= O QUE A EXTRAÇÃO TIRA DE CIMA DA MESA =========================
|
|
17
|
-
// Duas coisas que `placeCam` sabia e não devia:
|
|
18
|
-
//
|
|
19
|
-
// 1. `BOX.h / 2` — a metade da CAIXA DE COLISÃO do jogador de plataforma, usada para converter "o y do pé"
|
|
20
|
-
// em "o y do meio do corpo". É conhecimento de gênero: um top-down não ancora no pé, um quiz não tem
|
|
21
|
-
// corpo. Agora quem chama passa o PONTO a enquadrar, e a conversão fica onde o corpo existe.
|
|
22
|
-
// 2. `LOGICAL_W`/`LOGICAL_H` — o tamanho da tela lido de uma constante de módulo. O multiplayer já desenha N
|
|
23
|
-
// viewports; no dia em que cada um tiver a sua câmera, o tamanho tem de ENTRAR, não ser lido de fora.
|
|
24
|
-
//
|
|
25
|
-
// ========================= SEM I/O, SEM PIXI, SEM ALEATÓRIO =========================
|
|
26
|
-
// Nenhuma função daqui toca sprite, container ou `Math.random`. O tremor recebe os dois deslocamentos JÁ
|
|
27
|
-
// SORTEADOS (`rx`, `ry`), e é isso que o torna testável: a mesma entrada dá a mesma câmera, sempre. Quem
|
|
28
|
-
// sorteia é `render/draw`, com o `rnd` compartilhado de core/rng — a semente continua sendo uma só.
|
|
29
|
-
/**
|
|
30
|
-
* Prende a câmera dentro do mundo.
|
|
31
|
-
*
|
|
32
|
-
* ⚠️ MUNDO MENOR QUE A TELA: `mundo.w - tela.w` fica NEGATIVO, o `min` devolve esse negativo e o `max(0, …)`
|
|
33
|
-
* o zera — a câmera encosta no canto superior esquerdo e sobra vazio à direita e abaixo. É o comportamento
|
|
34
|
-
* que já existia e está preservado de propósito; o mapa de hoje (896×992 contra 320×180) nunca chega lá, mas
|
|
35
|
-
* uma fase pequena chegaria, e é melhor que o caso esteja escrito do que descoberto.
|
|
36
|
-
*/
|
|
37
|
-
export function prender(cam, mundo, tela) {
|
|
38
|
-
return {
|
|
39
|
-
camX: Math.max(0, Math.min(cam.camX, mundo.w - tela.w)),
|
|
40
|
-
camY: Math.max(0, Math.min(cam.camY, mundo.h - tela.h)),
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
/** Põe `(alvoX, alvoY)` no CENTRO da tela e prende no mundo. O alvo é um ponto — quem tem corpo o converte. */
|
|
44
|
-
export function enquadrar(alvoX, alvoY, mundo, tela) {
|
|
45
|
-
return prender({ camX: alvoX - tela.w / 2, camY: alvoY - tela.h / 2 }, mundo, tela);
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Aplica o tremor (JUICE) e PRENDE DE NOVO.
|
|
49
|
-
*
|
|
50
|
-
* A segunda prisão não é zelo: sem ela o tremor empurra a câmera para fora do mundo na beirada da fase e a
|
|
51
|
-
* criança vê o vazio atrás do cenário — justamente no momento em que alguma coisa explodiu e ela está olhando.
|
|
52
|
-
*
|
|
53
|
-
* @param amp amplitude em px (0 = sem tremor; `render/fx.shakeAmp`, que decai linearmente)
|
|
54
|
-
* @param rx deslocamento horizontal já sorteado, em [-1, 1]
|
|
55
|
-
* @param ry idem, vertical
|
|
56
|
-
*/
|
|
57
|
-
export function tremer(cam, mundo, tela, amp, rx, ry) {
|
|
58
|
-
if (!(amp > 0))
|
|
59
|
-
return cam;
|
|
60
|
-
return prender({ camX: cam.camX + rx * amp, camY: cam.camY + ry * amp }, mundo, tela);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Cria uma câmera com alvo, zona-morta, prisão no mundo e tremor.
|
|
64
|
-
*
|
|
65
|
-
* ⚠️ ZONA ZERO É O COMPORTAMENTO DE HOJE, e não por coincidência: com `w = h = 0` a correção de `seguir` vira
|
|
66
|
-
* `alvo - tela/2`, que é `enquadrar` letra por letra. É o que permite trocar o `placeCam` por esta câmera sem
|
|
67
|
-
* mudar um pixel do que a criança vê, e escolher um valor de zona depois, como decisão separada.
|
|
68
|
-
*/
|
|
69
|
-
export function criarCamera(mundo, tela, zona = { w: 0, h: 0 }) {
|
|
70
|
-
let m = mundo, t = tela;
|
|
71
|
-
let base = { camX: 0, camY: 0 };
|
|
72
|
-
/** Quanto a câmera precisa andar num eixo para o alvo voltar para dentro da zona. Zero se já está dentro. */
|
|
73
|
-
const correcao = (alvo, cam, telaLado, zonaLado) => {
|
|
74
|
-
const meia = Math.max(0, zonaLado) / 2;
|
|
75
|
-
const d = alvo - (cam + telaLado / 2); // distância do alvo ao CENTRO da tela
|
|
76
|
-
if (Math.abs(d) <= meia)
|
|
77
|
-
return 0;
|
|
78
|
-
return d - Math.sign(d) * meia; // anda o mínimo: o alvo pousa na BORDA da zona, não no centro
|
|
79
|
-
};
|
|
80
|
-
return {
|
|
81
|
-
get base() { return base; },
|
|
82
|
-
seguir(alvoX, alvoY) {
|
|
83
|
-
base = prender({
|
|
84
|
-
camX: base.camX + correcao(alvoX, base.camX, t.w, zona.w),
|
|
85
|
-
camY: base.camY + correcao(alvoY, base.camY, t.h, zona.h),
|
|
86
|
-
}, m, t);
|
|
87
|
-
return base;
|
|
88
|
-
},
|
|
89
|
-
pular(alvoX, alvoY) {
|
|
90
|
-
base = enquadrar(alvoX, alvoY, m, t);
|
|
91
|
-
return base;
|
|
92
|
-
},
|
|
93
|
-
quadro(amp, rx, ry) {
|
|
94
|
-
return tremer(base, m, t, amp, rx, ry);
|
|
95
|
-
},
|
|
96
|
-
redimensionar(novoMundo, novaTela) {
|
|
97
|
-
if (novoMundo)
|
|
98
|
-
m = novoMundo;
|
|
99
|
-
if (novaTela)
|
|
100
|
-
t = novaTela;
|
|
101
|
-
base = prender(base, m, t);
|
|
102
|
-
return base;
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
}
|