@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,72 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
import type { CenarioTema, TemaMorros, TemaPredios, FaixaDePredios } from './cenario-data.js';
|
|
3
|
-
/** Um sol baixo com leque de raios, assado na textura do céu. Ver `pintarSol`. */
|
|
4
|
-
export interface Sol {
|
|
5
|
-
cor: string;
|
|
6
|
-
x: number;
|
|
7
|
-
y: number;
|
|
8
|
-
}
|
|
9
|
-
/** Hill silhouette height at column `x` (v3 drawHillBand: double sine). `near` = the front (taller) band. */
|
|
10
|
-
export declare function hillHeight(x: number, near: boolean): number;
|
|
11
|
-
/** City placeholder backdrop (the 4 v3 themes have their own sky/hills below). */
|
|
12
|
-
export declare function parallaxPlaceholder(i: number): unknown;
|
|
13
|
-
/** Largura da textura do céu. 64 basta para um gradiente (ele é constante em x); um SOL precisa da tela toda. */
|
|
14
|
-
export declare function larguraDoCeu(T: CenarioTema): number;
|
|
15
|
-
/**
|
|
16
|
-
* Onde cada cor do céu cai, em PIXELS de altura. Separado do desenho porque é a parte que se pode AFERIR: o
|
|
17
|
-
* desenho precisa de um canvas, esta conta não, e é ela que decide se o vermelho do pôr do sol vai parar na
|
|
18
|
-
* linha do horizonte ou atrás dos morros.
|
|
19
|
-
*/
|
|
20
|
-
export declare function paradasDoCeu(cores: readonly string[], h?: number): {
|
|
21
|
-
y: number;
|
|
22
|
-
cor: string;
|
|
23
|
-
}[];
|
|
24
|
-
/**
|
|
25
|
-
* Sol baixo e leque de raios, DENTRO da textura do céu (e não numa camada própria).
|
|
26
|
-
*
|
|
27
|
-
* Aqui e não em `render/scene-sky` de propósito: o sol pertence ao FUNDO mais distante, e é na textura do céu
|
|
28
|
-
* que ele herda de graça as duas coisas que o fazem parecer distante — a rolagem de fator 0,10 (ele quase não
|
|
29
|
-
* anda) e o recolor de alto contraste (viz-setters repinta a textura crua; um sol desenhado por fora ficaria
|
|
30
|
-
* de fora do recolor e brilharia em amarelo no modo de contraste, que é exatamente o que a opção existe para
|
|
31
|
-
* eliminar).
|
|
32
|
-
*
|
|
33
|
-
* O leque aponta para CIMA, com abertura de ±35°, e cada raio desbota até zero por um gradiente radial. As
|
|
34
|
-
* duas coisas juntas mantêm o desenho longe das bordas da textura: um raio cortado na borda reapareceria do
|
|
35
|
-
* outro lado a cada repetição do azulejo, e essa emenda é o defeito mais visível que um céu pode ter.
|
|
36
|
-
*/
|
|
37
|
-
export declare function pintarSol(c: CanvasRenderingContext2D, w: number, h: number, sol: Sol): void;
|
|
38
|
-
/** Theme sky: vertical gradient over `T.sky` (evenly spaced stops), plus the theme's sun when it has one. */
|
|
39
|
-
export declare function themeSkyTexture(T: CenarioTema): unknown;
|
|
40
|
-
/** Ruído reprodutível em [0,1) a partir de um inteiro. Substitui `Math.random` onde a arte precisa variar. */
|
|
41
|
-
export declare function hash01(n: number): number;
|
|
42
|
-
/** Desenha UM elemento de silhueta. `topo` é a linha do morro naquele x; tudo cresce para cima a partir dela. */
|
|
43
|
-
type Elemento = (c: CanvasRenderingContext2D, x: number, topo: number, alt: number) => void;
|
|
44
|
-
interface Silhueta {
|
|
45
|
-
el: Elemento;
|
|
46
|
-
passo: number;
|
|
47
|
-
alt: [number, number];
|
|
48
|
-
}
|
|
49
|
-
export declare const SILHUETAS: Readonly<Record<string, {
|
|
50
|
-
far?: Silhueta;
|
|
51
|
-
near?: Silhueta;
|
|
52
|
-
}>>;
|
|
53
|
-
/**
|
|
54
|
-
* Uma camada inteira: a banda do FUNDO (tom claro, mais alta, mais simples) e a da FRENTE por cima.
|
|
55
|
-
*
|
|
56
|
-
* As duas profundidades são o que o original tem e a primeira versão não tinha — sem elas a camada é uma
|
|
57
|
-
* fileira só, e a cidade perde o ar de cidade.
|
|
58
|
-
*
|
|
59
|
-
* Exportada para o teste: o contexto entra por parâmetro, como em `pintarSol`, e um contexto falso que grava
|
|
60
|
-
* os `fillRect` deixa afirmar as propriedades da faixa sem navegador nenhum.
|
|
61
|
-
*/
|
|
62
|
-
export declare function desenharPredios(c: CanvasRenderingContext2D, w: number, h: number, faixa: FaixaDePredios, semente: number): void;
|
|
63
|
-
/**
|
|
64
|
-
* Camada 0 da Cidade: o céu inteiro E os prédios distantes assados nele.
|
|
65
|
-
*
|
|
66
|
-
* É a única camada OPACA das três, e é assim no original — o `c4.png` não tinha transparência nenhuma.
|
|
67
|
-
*/
|
|
68
|
-
export declare function themeCitySkyTexture(T: TemaPredios): unknown;
|
|
69
|
-
/** Camadas 1 e 2 da Cidade: prédios sobre TRANSPARÊNCIA, para o céu da camada 0 aparecer atrás. */
|
|
70
|
-
export declare function themeSkylineTexture(faixa: FaixaDePredios, semente: number): unknown;
|
|
71
|
-
export declare function themeHillsTexture(T: TemaMorros, near: boolean, tema?: string): unknown;
|
|
72
|
-
export {};
|
|
@@ -1,426 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
// render/scene-parallax — parallax background TEXTURE generators (Estágio 4, Tier 2). Pure builders: given a
|
|
3
|
-
// theme (or a city-placeholder index) they return a PIXI texture. Formulas verbatim from game.js (v3 drawBackdrop
|
|
4
|
-
// / drawHillBand). The per-frame scroll (`updateParallax`) stays in game.js — it is render-graph glue (moves the
|
|
5
|
-
// TilingSprites + the sky-deco layers). See docs/5-Refactoring/plano-modularizacao-mapa.md.
|
|
6
|
-
import { makeCanvas, tex } from './canvas.js';
|
|
7
|
-
import { LOGICAL_W, LOGICAL_H } from '../core/constants.js';
|
|
8
|
-
// `ParallaxTheme` SAIU (ADR-0039). Era uma redescrição de `CenarioTema` — a terceira vítima do mesmo padrão
|
|
9
|
-
// no repositório —, e ela NARROWED em vez de generalizar: declarava `sky` e `hills` obrigatórios enquanto o
|
|
10
|
-
// dono os tinha opcionais, então o tema real não entrava na função que existia para desenhá-lo, e o erro
|
|
11
|
-
// caía no `main.ts` falando de duas funções em vez da causa. O dono agora é uma união discriminada e este
|
|
12
|
-
// módulo a importa: quem desenha morro pede `TemaMorros`, quem desenha prédio pede `FaixaDePredios`, e o
|
|
13
|
-
// compilador cobra o `fundo` no ponto de chamada.
|
|
14
|
-
/** Hill silhouette height at column `x` (v3 drawHillBand: double sine). `near` = the front (taller) band. */
|
|
15
|
-
export function hillHeight(x, near) {
|
|
16
|
-
const amp = near ? 9 : 5, freq = near ? 0.013 : 0.018, phase = near ? 0 : 140;
|
|
17
|
-
return Math.sin((x + phase) * freq) * amp + Math.sin((x + phase) * freq * 2.3 + 1.7) * amp * 0.4;
|
|
18
|
-
}
|
|
19
|
-
/** City placeholder backdrop (the 4 v3 themes have their own sky/hills below). */
|
|
20
|
-
export function parallaxPlaceholder(i) {
|
|
21
|
-
const w = LOGICAL_W, h = LOGICAL_H, cv = makeCanvas(w, h), c = cv.getContext('2d');
|
|
22
|
-
const pal = [['#0a1024', '#1b2350'], ['#13284a', '#22406e'], ['#1d3a52', '#356a86']][i];
|
|
23
|
-
const g = c.createLinearGradient(0, 0, 0, h);
|
|
24
|
-
g.addColorStop(0, pal[0]);
|
|
25
|
-
g.addColorStop(1, pal[1]);
|
|
26
|
-
c.fillStyle = g;
|
|
27
|
-
c.fillRect(0, 0, w, h);
|
|
28
|
-
c.fillStyle = pal[1];
|
|
29
|
-
for (let x = 0; x < w; x += 44 + i * 14) {
|
|
30
|
-
const hh = 24 + ((x * 7 + i * 29) % (46 + i * 22));
|
|
31
|
-
c.fillRect(x, h - hh, 30 + i * 6, hh);
|
|
32
|
-
}
|
|
33
|
-
c.fillStyle = 'rgba(255,255,255,.18)';
|
|
34
|
-
for (let k = 0; k < 8; k++)
|
|
35
|
-
c.fillRect((k * 53 + i * 17) % w, (k * 23 + i * 11) % (h - 40), 2, 2);
|
|
36
|
-
return tex(cv);
|
|
37
|
-
}
|
|
38
|
-
/* ===================== o céu ===================== */
|
|
39
|
-
//
|
|
40
|
-
// O CÉU ERA DUAS CORES, e isso bastava enquanto todo tema era um céu liso. A Floresta pedida pelo Dev não é:
|
|
41
|
-
// é um PÔR DO SOL — vermelho junto ao horizonte, laranja acima, raios amarelos e nuvens brancas. Um gradiente
|
|
42
|
-
// de duas paradas não consegue dizer isso: interpolar do topo direto ao horizonte dá UMA transição, e um pôr
|
|
43
|
-
// do sol são três ou quatro empilhadas.
|
|
44
|
-
//
|
|
45
|
-
// Então `sky` virou uma LISTA de paradas em vez de um par, distribuídas por igual do topo ao rodapé. Duas
|
|
46
|
-
// paradas continuam significando exatamente o que significavam — é por isso que os outros três temas não
|
|
47
|
-
// mudaram de aparência nem de linha. Com N paradas, a de índice i fica em `i/(N-1)`, e como a textura tem a
|
|
48
|
-
// altura do viewport (180), a conta de onde uma cor cai é direta: y = 180 · i/(N-1). É essa previsibilidade
|
|
49
|
-
// que permite ESCOLHER a altura de uma cor pela quantidade de paradas, e é assim que o vermelho da Floresta
|
|
50
|
-
// foi posto na linha do horizonte (y=90) em vez de no rodapé invisível.
|
|
51
|
-
/** `'#rrggbb'` → o mesmo tom com alfa ZERO. É o fim de todo gradiente radial daqui — ver `pintarSol`. */
|
|
52
|
-
function rgba0(hex) {
|
|
53
|
-
const n = parseInt(hex.slice(1), 16);
|
|
54
|
-
return 'rgba(' + ((n >> 16) & 255) + ',' + ((n >> 8) & 255) + ',' + (n & 255) + ',0)';
|
|
55
|
-
}
|
|
56
|
-
/** Largura da textura do céu. 64 basta para um gradiente (ele é constante em x); um SOL precisa da tela toda. */
|
|
57
|
-
export function larguraDoCeu(T) { return T.sol ? LOGICAL_W : 64; }
|
|
58
|
-
/**
|
|
59
|
-
* Onde cada cor do céu cai, em PIXELS de altura. Separado do desenho porque é a parte que se pode AFERIR: o
|
|
60
|
-
* desenho precisa de um canvas, esta conta não, e é ela que decide se o vermelho do pôr do sol vai parar na
|
|
61
|
-
* linha do horizonte ou atrás dos morros.
|
|
62
|
-
*/
|
|
63
|
-
export function paradasDoCeu(cores, h = LOGICAL_H) {
|
|
64
|
-
const n = cores.length;
|
|
65
|
-
return cores.map((cor, i) => ({ y: n === 1 ? 0 : (h * i) / (n - 1), cor }));
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Sol baixo e leque de raios, DENTRO da textura do céu (e não numa camada própria).
|
|
69
|
-
*
|
|
70
|
-
* Aqui e não em `render/scene-sky` de propósito: o sol pertence ao FUNDO mais distante, e é na textura do céu
|
|
71
|
-
* que ele herda de graça as duas coisas que o fazem parecer distante — a rolagem de fator 0,10 (ele quase não
|
|
72
|
-
* anda) e o recolor de alto contraste (viz-setters repinta a textura crua; um sol desenhado por fora ficaria
|
|
73
|
-
* de fora do recolor e brilharia em amarelo no modo de contraste, que é exatamente o que a opção existe para
|
|
74
|
-
* eliminar).
|
|
75
|
-
*
|
|
76
|
-
* O leque aponta para CIMA, com abertura de ±35°, e cada raio desbota até zero por um gradiente radial. As
|
|
77
|
-
* duas coisas juntas mantêm o desenho longe das bordas da textura: um raio cortado na borda reapareceria do
|
|
78
|
-
* outro lado a cada repetição do azulejo, e essa emenda é o defeito mais visível que um céu pode ter.
|
|
79
|
-
*/
|
|
80
|
-
export function pintarSol(c, w, h, sol) {
|
|
81
|
-
const sx = w * sol.x, sy = h * sol.y, alcance = h * 0.85;
|
|
82
|
-
// O fim do gradiente é A MESMA COR com alfa 0, e não `transparent`/branco transparente: o canvas interpola
|
|
83
|
-
// os quatro canais, então desbotar para branco-transparente passa por um branco leitoso a meio caminho — um
|
|
84
|
-
// halo pálido em volta do sol, que é o oposto do que um pôr do sol faz.
|
|
85
|
-
const halo = c.createRadialGradient(sx, sy, 0, sx, sy, alcance);
|
|
86
|
-
halo.addColorStop(0, sol.cor);
|
|
87
|
-
halo.addColorStop(1, rgba0(sol.cor));
|
|
88
|
-
c.save();
|
|
89
|
-
c.globalAlpha = 0.10;
|
|
90
|
-
c.fillStyle = halo;
|
|
91
|
-
for (let i = 0; i < 9; i++) {
|
|
92
|
-
// Larguras alternadas (largo/estreito): raios de mesma espessura em leque regular leem como uma roda de
|
|
93
|
-
// bicicleta. A irregularidade é o que os faz parecer luz atravessando nuvem.
|
|
94
|
-
const meio = -Math.PI / 2 + (i - 4) * (Math.PI * 70 / 180) / 8, meia = (i % 2 ? 0.9 : 2.2) * Math.PI / 180;
|
|
95
|
-
c.beginPath();
|
|
96
|
-
c.moveTo(sx, sy);
|
|
97
|
-
c.lineTo(sx + Math.cos(meio - meia) * alcance, sy + Math.sin(meio - meia) * alcance);
|
|
98
|
-
c.lineTo(sx + Math.cos(meio + meia) * alcance, sy + Math.sin(meio + meia) * alcance);
|
|
99
|
-
c.closePath();
|
|
100
|
-
c.fill();
|
|
101
|
-
}
|
|
102
|
-
// Brilho em volta do disco e o disco: é o disco que ancora os raios: sem ele o leque não tem de onde sair.
|
|
103
|
-
const brilho = c.createRadialGradient(sx, sy, 0, sx, sy, 26);
|
|
104
|
-
brilho.addColorStop(0, sol.cor);
|
|
105
|
-
brilho.addColorStop(1, rgba0(sol.cor));
|
|
106
|
-
c.globalAlpha = 0.55;
|
|
107
|
-
c.fillStyle = brilho;
|
|
108
|
-
c.beginPath();
|
|
109
|
-
c.arc(sx, sy, 26, 0, Math.PI * 2);
|
|
110
|
-
c.fill();
|
|
111
|
-
c.globalAlpha = 1;
|
|
112
|
-
c.fillStyle = sol.cor;
|
|
113
|
-
c.beginPath();
|
|
114
|
-
c.arc(sx, sy, 8, 0, Math.PI * 2);
|
|
115
|
-
c.fill();
|
|
116
|
-
c.restore();
|
|
117
|
-
}
|
|
118
|
-
/** Theme sky: vertical gradient over `T.sky` (evenly spaced stops), plus the theme's sun when it has one. */
|
|
119
|
-
export function themeSkyTexture(T) {
|
|
120
|
-
const w = larguraDoCeu(T), h = LOGICAL_H, cv = makeCanvas(w, h), c = cv.getContext('2d');
|
|
121
|
-
const g = c.createLinearGradient(0, 0, 0, h);
|
|
122
|
-
for (const p of paradasDoCeu(T.sky, h))
|
|
123
|
-
g.addColorStop(p.y / h, p.cor);
|
|
124
|
-
c.fillStyle = g;
|
|
125
|
-
c.fillRect(0, 0, w, h);
|
|
126
|
-
if (T.sol)
|
|
127
|
-
pintarSol(c, w, h, T.sol);
|
|
128
|
-
return tex(cv);
|
|
129
|
-
}
|
|
130
|
-
/* ===================== silhuetas por tema ===================== */
|
|
131
|
-
//
|
|
132
|
-
// AS DUAS FAIXAS DE MORRO ERAM LISAS. Elas já parallaxavam — o que faltava era CONTEÚDO: uma floresta e um
|
|
133
|
-
// cemitério tinham exatamente o mesmo desenho, só que em cores diferentes. Isto acrescenta a silhueta que
|
|
134
|
-
// distingue um do outro, na MESMA cor da faixa: é recorte contra o céu, não pintura.
|
|
135
|
-
//
|
|
136
|
-
// PURO E DETERMINÍSTICO, e isso não é preferência. Sem `Math.random`, a mesma fase desenha o mesmo horizonte
|
|
137
|
-
// em toda partida e em toda máquina — o que a torna testável (dá para AFERIR a silhueta) e o que impede a
|
|
138
|
-
// arte de tremer entre dois quadros do mesmo cenário. A variação vem de `hash(x)`, que é sujeira reprodutível.
|
|
139
|
-
/** Ruído reprodutível em [0,1) a partir de um inteiro. Substitui `Math.random` onde a arte precisa variar. */
|
|
140
|
-
export function hash01(n) {
|
|
141
|
-
let h = (n ^ 0x9e3779b9) >>> 0;
|
|
142
|
-
h = Math.imul(h ^ (h >>> 15), 0x85ebca6b) >>> 0;
|
|
143
|
-
h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35) >>> 0;
|
|
144
|
-
return ((h ^ (h >>> 16)) >>> 0) / 4294967296;
|
|
145
|
-
}
|
|
146
|
-
/** Conífera: tronco fino e três saias triangulares. Lê como "mata fechada" mesmo com 6 px de largura. */
|
|
147
|
-
const conifera = (c, x, topo, alt) => {
|
|
148
|
-
c.fillRect(x - 1, topo - alt * 0.25, 2, alt * 0.25);
|
|
149
|
-
for (let i = 0; i < 3; i++) {
|
|
150
|
-
const y = topo - alt * (0.25 + i * 0.25), meia = (alt * 0.30) * (1 - i * 0.22);
|
|
151
|
-
c.beginPath();
|
|
152
|
-
c.moveTo(x, y - alt * 0.30);
|
|
153
|
-
c.lineTo(x + meia, y);
|
|
154
|
-
c.lineTo(x - meia, y);
|
|
155
|
-
c.closePath();
|
|
156
|
-
c.fill();
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
/** Árvore redonda: tronco curto e copa em bloco arredondado — o campo, não a mata. */
|
|
160
|
-
const frondosa = (c, x, topo, alt) => {
|
|
161
|
-
c.fillRect(x - 1, topo - alt * 0.45, 2, alt * 0.45);
|
|
162
|
-
c.beginPath();
|
|
163
|
-
c.arc(x, topo - alt * 0.68, alt * 0.34, 0, Math.PI * 2);
|
|
164
|
-
c.fill();
|
|
165
|
-
};
|
|
166
|
-
/** Poste de cerca com duas travessas — dá escala humana ao campo, que é o que o diferencia da mata. */
|
|
167
|
-
const cerca = (c, x, topo, alt) => {
|
|
168
|
-
c.fillRect(x - 1, topo - alt, 2, alt);
|
|
169
|
-
c.fillRect(x - 1, topo - alt * 0.75, 14, 1);
|
|
170
|
-
c.fillRect(x - 1, topo - alt * 0.45, 14, 1);
|
|
171
|
-
};
|
|
172
|
-
/**
|
|
173
|
-
* O MESMO CAMPO EM TRÊS HORAS DO DIA. `campo`, `cemiterio` e `espaco` são "Dia no Campo", "Amanhecer no Campo"
|
|
174
|
-
* e "Noite no Campo" — é o que a criança lê, e é a decisão do Dev. Os IDS MENTEM: sobraram de quando os temas
|
|
175
|
-
* eram cemitério e espaço, e ninguém que leia só o código adivinha isso. (Eu quase plantei lápides num
|
|
176
|
-
* amanhecer por causa deles; a correção veio do Dev, não do arquivo.) Renomear os ids é migração de dado
|
|
177
|
-
* persistido — `incl_cenario` e as gravações de demonstração guardam esses nomes —, então fica para uma
|
|
178
|
-
* rodada própria, e este comentário é a rede até lá.
|
|
179
|
-
*
|
|
180
|
-
* Consequência de desenho, e ela simplifica: os três compartilham A MESMA SILHUETA, porque é a mesma terra.
|
|
181
|
-
* O que muda entre o dia, o amanhecer e a noite é a LUZ, e a luz já está nas cores que cada tema declara.
|
|
182
|
-
* Silhuetas diferentes fariam parecer três lugares; iguais, fazem parecer um lugar e três horários.
|
|
183
|
-
*
|
|
184
|
-
* `passo` é o espaçamento médio; `alt` a faixa de altura em px. A faixa da FRENTE leva elementos maiores e
|
|
185
|
-
* mais juntos — é a que passa mais rápido, e esse contraste de densidade é o que dá profundidade sem custar
|
|
186
|
-
* uma terceira camada.
|
|
187
|
-
*/
|
|
188
|
-
const CAMPO = { far: { el: frondosa, passo: 96, alt: [10, 16] },
|
|
189
|
-
near: { el: cerca, passo: 46, alt: [7, 9] } };
|
|
190
|
-
export const SILHUETAS = {
|
|
191
|
-
campo: CAMPO, // Dia no Campo
|
|
192
|
-
cemiterio: CAMPO, // Amanhecer no Campo — mesmo campo, outra luz
|
|
193
|
-
espaco: CAMPO, // Noite no Campo — idem
|
|
194
|
-
// AJUSTADO DEPOIS DE VER NA TELA. Os números antigos (far 14–22, near 22–34) faziam as DUAS faixas
|
|
195
|
-
// terminarem no mesmo y: com `baseY` 12 px mais baixo na da frente, as duas silhuetas encostavam no mesmo
|
|
196
|
-
// topo e liam como UMA. A conta confirmou o que a imagem mostrou — topo 72 nas duas.
|
|
197
|
-
// Agora a de trás é uma MATA FECHADA distante (baixa e densa) e a da frente são TRONCOS individuais
|
|
198
|
-
// (altos e esparsos). A profundidade vem do contraste entre parede e indivíduo, não de 12 px de deslocamento.
|
|
199
|
-
floresta: { far: { el: conifera, passo: 18, alt: [8, 13] }, near: { el: conifera, passo: 46, alt: [30, 46] } },
|
|
200
|
-
};
|
|
201
|
-
/**
|
|
202
|
-
* O vocabulário de topos, como TABELA — mesma forma do `SILHUETAS` dos morros.
|
|
203
|
-
*
|
|
204
|
-
* A distribuição importa mais que os desenhos: `reto` precisa ser o comum, senão a linha do horizonte vira
|
|
205
|
-
* uma serra de brinquedo. Ver `TELHADO_POR_SORTE` abaixo.
|
|
206
|
-
*/
|
|
207
|
-
const TELHADOS = {
|
|
208
|
-
/** Laje. O caso comum, e é ele que faz os outros lerem como evento. */
|
|
209
|
-
reto: () => { },
|
|
210
|
-
/** Recuo: um bloco mais estreito em cima. O prédio afina no último terço. */
|
|
211
|
-
recuo: (c, x, larg, topo, r) => {
|
|
212
|
-
const ins = 2 + Math.floor(r(1) * 3);
|
|
213
|
-
if (larg - ins * 2 < 4)
|
|
214
|
-
return;
|
|
215
|
-
const alt = 5 + Math.floor(r(2) * 9);
|
|
216
|
-
c.fillRect(x + ins, topo - alt, larg - ins * 2, alt);
|
|
217
|
-
},
|
|
218
|
-
/** Escada: dois a quatro degraus estreitando para cima — o topo piramidal do art déco. */
|
|
219
|
-
escada: (c, x, larg, topo, r) => {
|
|
220
|
-
let ins = 0, y = topo;
|
|
221
|
-
const degraus = 2 + Math.floor(r(3) * 3), passo = Math.max(1, Math.round(larg * 0.13));
|
|
222
|
-
for (let i = 0; i < degraus; i++) {
|
|
223
|
-
ins += passo;
|
|
224
|
-
const lg = larg - ins * 2;
|
|
225
|
-
if (lg < 2)
|
|
226
|
-
break;
|
|
227
|
-
const alt = 2 + Math.floor(r(4 + i) * 3);
|
|
228
|
-
c.fillRect(x + ins, y - alt, lg, alt);
|
|
229
|
-
y -= alt;
|
|
230
|
-
}
|
|
231
|
-
},
|
|
232
|
-
/** Mastro: a agulha fina, às vezes com travessa. É o evento mais alto da silhueta. */
|
|
233
|
-
mastro: (c, x, larg, topo, r) => {
|
|
234
|
-
const alt = 9 + Math.floor(r(5) * 15), mx = x + Math.floor(larg / 2);
|
|
235
|
-
c.fillRect(mx, topo - alt, 1, alt);
|
|
236
|
-
if (r(6) < 0.5)
|
|
237
|
-
c.fillRect(mx - 2, topo - alt + 3 + Math.floor(r(7) * 4), 5, 1);
|
|
238
|
-
},
|
|
239
|
-
/** Antenas: duas ou três hastes de alturas diferentes, agrupadas. */
|
|
240
|
-
antenas: (c, x, larg, topo, r) => {
|
|
241
|
-
const n = 2 + Math.floor(r(8) * 2);
|
|
242
|
-
for (let i = 0; i < n; i++) {
|
|
243
|
-
const ax = x + 2 + Math.floor(r(9 + i) * Math.max(1, larg - 4));
|
|
244
|
-
const alt = 4 + Math.floor(r(12 + i) * 9);
|
|
245
|
-
c.fillRect(ax, topo - alt, 1, alt);
|
|
246
|
-
}
|
|
247
|
-
},
|
|
248
|
-
/** Caixa de água: a caixinha sobre pernas, deslocada do centro. */
|
|
249
|
-
caixa: (c, x, larg, topo, r) => {
|
|
250
|
-
const cl = 4 + Math.floor(r(15) * 4), ca = 3 + Math.floor(r(16) * 3);
|
|
251
|
-
if (larg < cl + 4)
|
|
252
|
-
return;
|
|
253
|
-
const cx = x + 2 + Math.floor(r(17) * (larg - cl - 3));
|
|
254
|
-
c.fillRect(cx, topo - ca - 2, cl, ca);
|
|
255
|
-
c.fillRect(cx + 1, topo - 2, 1, 2);
|
|
256
|
-
c.fillRect(cx + cl - 2, topo - 2, 1, 2);
|
|
257
|
-
},
|
|
258
|
-
/** Cúpula: fatias estreitando, arredondando a laje. */
|
|
259
|
-
domo: (c, x, larg, topo, r) => {
|
|
260
|
-
const raio = Math.min(5, Math.floor(larg / 3));
|
|
261
|
-
void r;
|
|
262
|
-
if (raio < 2)
|
|
263
|
-
return;
|
|
264
|
-
for (let i = 0; i < raio; i++) {
|
|
265
|
-
c.fillRect(x + Math.floor(larg / 2) - (raio - i), topo - 1 - i, (raio - i) * 2, 1);
|
|
266
|
-
}
|
|
267
|
-
},
|
|
268
|
-
};
|
|
269
|
-
/**
|
|
270
|
-
* A sorte para o estilo. `reto` fica com 44% porque a linha do horizonte precisa de descanso entre eventos;
|
|
271
|
-
* `mastro` e `domo` são raros de propósito — são os que a vista procura, e um a cada dez prédios já lê como
|
|
272
|
-
* "aquela torre".
|
|
273
|
-
*/
|
|
274
|
-
const TELHADO_POR_SORTE = [
|
|
275
|
-
[0.44, 'reto'], [0.62, 'recuo'], [0.74, 'escada'], [0.84, 'caixa'], [0.93, 'antenas'], [0.97, 'mastro'], [1.01, 'domo'],
|
|
276
|
-
];
|
|
277
|
-
function telhadoDe(sorte) {
|
|
278
|
-
for (const [ate, nome] of TELHADO_POR_SORTE)
|
|
279
|
-
if (sorte < ate)
|
|
280
|
-
return TELHADOS[nome];
|
|
281
|
-
return TELHADOS.reto;
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* UMA BANDA de prédios — uma profundidade dentro de uma camada de parallax.
|
|
285
|
-
*
|
|
286
|
-
* DUAS COISAS AQUI VIERAM DE OLHAR A TELA, não de medir o arquivo, e é honesto dizer qual é qual:
|
|
287
|
-
*
|
|
288
|
-
* · A TORRE MARCANTE. Uma em cada onze sobe MUITO acima da multidão e ganha um topo dramático. O original
|
|
289
|
-
* tem três ou quatro dessas — a agulha, a torre escalonada, a cúpula —, e são elas que a vista procura.
|
|
290
|
-
* Sem isso a linha do horizonte fica plana mesmo com os topos variando, que foi o que a 2a versão fez.
|
|
291
|
-
* · O PAINEL DE JANELAS. As janelas do original não cobrem a fachada: formam BLOCOS pequenos e densos, em
|
|
292
|
-
* parte dos prédios. Espalhar luz por toda a fachada com probabilidade baixa dá ruído; concentrá-la em
|
|
293
|
-
* painéis dá prédio. A 2a versão fez o primeiro e virou parede de luz.
|
|
294
|
-
*/
|
|
295
|
-
function desenharBanda(c, w, h, cor, topos, largs, base, semente, luz, aceso) {
|
|
296
|
-
// A LINHA SÓLIDA, de uma vez só e ANTES dos prédios: abaixo dela o original não tem vão nenhum — é onde a
|
|
297
|
-
// cidade some na bruma do chão. Desenhá-la por prédio, como a versão anterior fazia, tapava os vãos e
|
|
298
|
-
// matava a profundidade que eles dão.
|
|
299
|
-
c.fillStyle = cor;
|
|
300
|
-
c.fillRect(0, base, w, h - base);
|
|
301
|
-
const [topoAlto, topoBaixo] = topos;
|
|
302
|
-
const [largMin, largMax] = largs;
|
|
303
|
-
let x = 0;
|
|
304
|
-
while (x < w) {
|
|
305
|
-
const r = (k) => hash01(x * 131 + k * 7919 + semente);
|
|
306
|
-
const marcante = r(35) < 0.09;
|
|
307
|
-
const larg = Math.round(largMin + r(0) * (largMax - largMin));
|
|
308
|
-
const largura = x + larg > w - largMin ? w - x : larg;
|
|
309
|
-
const topo = marcante
|
|
310
|
-
? Math.max(6, Math.round(topoAlto - 8 - r(36) * 26))
|
|
311
|
-
: Math.round(topoAlto + r(30) * (topoBaixo - topoAlto));
|
|
312
|
-
c.fillStyle = cor;
|
|
313
|
-
c.fillRect(x, topo, largura, h - topo);
|
|
314
|
-
// A torre marcante nunca recebe laje reta: ela existe para ser o evento da silhueta.
|
|
315
|
-
telhadoDe(marcante ? 0.74 + r(37) * 0.27 : r(31))(c, x, largura, topo, r);
|
|
316
|
-
if (luz && luz.length > 0)
|
|
317
|
-
desenharPaineis(c, h, x, largura, topo, base, semente, luz, aceso, r);
|
|
318
|
-
// O VÃO, e ele é o que separa prédio de parede. A versão anterior encostava tudo, e por isso a fileira
|
|
319
|
-
// da frente cobria a de trás por inteiro: abaixo da metade a camada virava um bloco só, com as janelas
|
|
320
|
-
// boiando nele. A medição do original diz o contrário — em `c2.png`, na linha y=148, a fileira da frente
|
|
321
|
-
// ocupa 279 das 400 colunas, a de trás aparece em 76 e 45 ficam vazias. É por esses vãos que a cidade
|
|
322
|
-
// ganha profundidade.
|
|
323
|
-
x += largura + (r(38) < 0.55 ? 0 : 3 + Math.floor(r(39) * 10));
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Os PAINÉIS de janela de um prédio: de zero a três blocos densos, e não uma fachada peneirada.
|
|
328
|
-
*
|
|
329
|
-
* Dentro de um painel a maioria das células acende — é assim que o original lê, e é o que faz um prédio
|
|
330
|
-
* parecer um prédio com gente dentro em vez de uma textura.
|
|
331
|
-
*/
|
|
332
|
-
function desenharPaineis(c, h, x, largura, topo, base, semente, luz, aceso, r) {
|
|
333
|
-
if (largura < 8)
|
|
334
|
-
return;
|
|
335
|
-
// A DENSIDADE É CALIBRADA, não escolhida: a fração de pixel QUENTE de cada camada do original foi medida
|
|
336
|
-
// (5,41% na de perto, 0,28% na do meio, 0,04% na bruma) e `aceso` é ajustado até a textura gerada bater.
|
|
337
|
-
// A primeira calibragem saiu INVERTIDA — luz demais nas distantes e de menos na de perto —, e uma cidade
|
|
338
|
-
// com o brilho no lugar errado perde a profundidade inteira, que é o que a luz está ali para dar.
|
|
339
|
-
const quantos = aceso <= 0.06
|
|
340
|
-
? (r(40) < aceso * 14 ? 1 : 0) // bruma e camada média: um painel raro, ou nenhum
|
|
341
|
-
: 1 + Math.floor(r(40) * (1 + aceso * 4)); // de perto: um a quatro
|
|
342
|
-
const ja = 3 + Math.floor(r(41) * 3); // 3..5 px de altura, como no original
|
|
343
|
-
const passoX = 4 + Math.floor(r(42) * 2); // 4 ou 5 — muda por prédio
|
|
344
|
-
const passoY = ja + 2;
|
|
345
|
-
const colunas = Math.floor((largura - 4) / passoX);
|
|
346
|
-
if (colunas < 1)
|
|
347
|
-
return;
|
|
348
|
-
for (let p = 0; p < quantos; p++) {
|
|
349
|
-
const cw = 1 + Math.floor(r(43 + p) * Math.min(colunas, 1 + aceso * 7));
|
|
350
|
-
const ch = 2 + Math.floor(r(46 + p) * (2 + aceso * 9));
|
|
351
|
-
const c0 = Math.floor(r(49 + p) * (colunas - cw + 1));
|
|
352
|
-
const topoPainel = Math.max(topo + 3, base - 58);
|
|
353
|
-
const linhas = Math.max(1, Math.floor((h - 4 - topoPainel) / passoY));
|
|
354
|
-
const l0 = Math.floor(r(52 + p) * Math.max(1, linhas - ch + 1));
|
|
355
|
-
// Densidade ALTA dentro do painel: é o contrário de espalhar pouca luz por toda a fachada.
|
|
356
|
-
const densidade = 0.55 + r(55 + p) * 0.4;
|
|
357
|
-
for (let l = l0; l < Math.min(l0 + ch, linhas); l++) {
|
|
358
|
-
for (let k = c0; k < Math.min(c0 + cw, colunas); k++) {
|
|
359
|
-
const jx = x + 2 + k * passoX, jy = topoPainel + l * passoY;
|
|
360
|
-
if (jy + ja > h - 2)
|
|
361
|
-
continue;
|
|
362
|
-
if (hash01(jx * 3571 + jy * 97 + semente) >= densidade)
|
|
363
|
-
continue;
|
|
364
|
-
c.fillStyle = luz[Math.floor(hash01(jx * 17 + jy * 31 + semente) * luz.length) % luz.length];
|
|
365
|
-
c.fillRect(jx, jy, 2, ja);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
/**
|
|
371
|
-
* Uma camada inteira: a banda do FUNDO (tom claro, mais alta, mais simples) e a da FRENTE por cima.
|
|
372
|
-
*
|
|
373
|
-
* As duas profundidades são o que o original tem e a primeira versão não tinha — sem elas a camada é uma
|
|
374
|
-
* fileira só, e a cidade perde o ar de cidade.
|
|
375
|
-
*
|
|
376
|
-
* Exportada para o teste: o contexto entra por parâmetro, como em `pintarSol`, e um contexto falso que grava
|
|
377
|
-
* os `fillRect` deixa afirmar as propriedades da faixa sem navegador nenhum.
|
|
378
|
-
*/
|
|
379
|
-
export function desenharPredios(c, w, h, faixa, semente) {
|
|
380
|
-
desenharBanda(c, w, h, faixa.corpo[0], faixa.topoFundo, faixa.largura, faixa.base, semente + 4517, faixa.luz, (faixa.aceso ?? 0) * 0.45);
|
|
381
|
-
desenharBanda(c, w, h, faixa.corpo[1], faixa.topo, faixa.largura, faixa.base, semente, faixa.luz, faixa.aceso ?? 0);
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Camada 0 da Cidade: o céu inteiro E os prédios distantes assados nele.
|
|
385
|
-
*
|
|
386
|
-
* É a única camada OPACA das três, e é assim no original — o `c4.png` não tinha transparência nenhuma.
|
|
387
|
-
*/
|
|
388
|
-
export function themeCitySkyTexture(T) {
|
|
389
|
-
const w = 1280, h = LOGICAL_H, cv = makeCanvas(w, h), c = cv.getContext('2d');
|
|
390
|
-
const g = c.createLinearGradient(0, 0, 0, h);
|
|
391
|
-
for (const p of paradasDoCeu(T.sky, h))
|
|
392
|
-
g.addColorStop(p.y / h, p.cor);
|
|
393
|
-
c.fillStyle = g;
|
|
394
|
-
c.fillRect(0, 0, w, h);
|
|
395
|
-
desenharPredios(c, w, h, T.predios[0], 311);
|
|
396
|
-
return tex(cv);
|
|
397
|
-
}
|
|
398
|
-
/** Camadas 1 e 2 da Cidade: prédios sobre TRANSPARÊNCIA, para o céu da camada 0 aparecer atrás. */
|
|
399
|
-
export function themeSkylineTexture(faixa, semente) {
|
|
400
|
-
const w = 1280, h = LOGICAL_H, cv = makeCanvas(w, h), c = cv.getContext('2d');
|
|
401
|
-
desenharPredios(c, w, h, faixa, semente);
|
|
402
|
-
return tex(cv);
|
|
403
|
-
}
|
|
404
|
-
export function themeHillsTexture(T, near, tema = '') {
|
|
405
|
-
const w = 1280, h = LOGICAL_H, cv = makeCanvas(w, h), c = cv.getContext('2d');
|
|
406
|
-
const horizon = Math.round(h * 0.5), baseY = horizon + (near ? 16 : 4);
|
|
407
|
-
const linha = (x) => Math.round(baseY - hillHeight(x, near));
|
|
408
|
-
c.fillStyle = T.hills[near ? 1 : 0];
|
|
409
|
-
for (let x = 0; x < w; x++) {
|
|
410
|
-
const top = linha(x);
|
|
411
|
-
c.fillRect(x, top, 1, h - top);
|
|
412
|
-
}
|
|
413
|
-
const sil = SILHUETAS[tema]?.[near ? 'near' : 'far'];
|
|
414
|
-
if (!sil)
|
|
415
|
-
return tex(cv);
|
|
416
|
-
// Planta na MESMA cor da faixa: o elemento não é um objeto pintado, é o próprio morro subindo.
|
|
417
|
-
for (let x = 0; x < w; x += sil.passo) {
|
|
418
|
-
const r = hash01(x + (near ? 977 : 131));
|
|
419
|
-
const px = Math.round(x + r * sil.passo * 0.6);
|
|
420
|
-
if (px < 4 || px > w - 20)
|
|
421
|
-
continue; // margem: nada atravessa a emenda do azulejo horizontal
|
|
422
|
-
const alt = sil.alt[0] + hash01(px * 31 + (near ? 7 : 3)) * (sil.alt[1] - sil.alt[0]);
|
|
423
|
-
sil.el(c, px, linha(px) + 1, alt);
|
|
424
|
-
}
|
|
425
|
-
return tex(cv);
|
|
426
|
-
}
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
-
import type { Desenho, Camada } from './port.js';
|
|
3
|
-
import type { CriarSprite } from './port.js';
|
|
4
|
-
/**
|
|
5
|
-
* Posição horizontal de uma nuvem à deriva, com wrap SUB-PIXEL e pelo CORPO INTEIRO. Corrige #21:
|
|
6
|
-
* (a) NÃO arredonda → deriva suave mesmo a <1px/frame; (b) só reentra quando a nuvem inteira saiu.
|
|
7
|
-
* @param phase distância de deriva acumulada (float; cresce → direita, decresce → esquerda)
|
|
8
|
-
* @param enterAt x de (re)entrada — passe `-larguraDaNuvem` p/ reentrar TOTALMENTE fora da tela
|
|
9
|
-
* @param span período do wrap — passe `larguraDaTela + larguraDaNuvem` p/ só reentrar depois de sair inteira
|
|
10
|
-
*/
|
|
11
|
-
export declare function cloudWrapX(phase: number, enterAt: number, span: number): number;
|
|
12
|
-
/** Uma nuvem de tela neste quadro. `esc` multiplica o desenho base; `alpha`, a opacidade. */
|
|
13
|
-
export interface NuvemDeTela {
|
|
14
|
-
x: number;
|
|
15
|
-
y: number;
|
|
16
|
-
esc: number;
|
|
17
|
-
alpha: number;
|
|
18
|
-
}
|
|
19
|
-
/** Largura e altura do cúmulo base, antes de `esc`. Quem mede cobertura precisa das duas. */
|
|
20
|
-
export declare const NUVEM_W = 26, NUVEM_H = 13;
|
|
21
|
-
/**
|
|
22
|
-
* Onde estão as `n` nuvens de tela neste instante.
|
|
23
|
-
*
|
|
24
|
-
* Os fatores 37, 13, 7 e 5 são PRIMOS COM 3 de propósito: a fileira é `i % 3`, e qualquer variação tirada de
|
|
25
|
-
* `i` com um fator múltiplo de 3 sairia CONSTANTE dentro de uma fileira — a fileira 0, que é a que se vê no
|
|
26
|
-
* tempo bom, teria todas as nuvens do mesmo tamanho, à mesma velocidade e na mesma altura. Já aconteceu.
|
|
27
|
-
*
|
|
28
|
-
* @param t relógio de efeitos (0 congela a deriva — movimento reduzido)
|
|
29
|
-
* @param vw largura do viewport
|
|
30
|
-
* @param n quantas nuvens no total (a fileira 0, ~n/3, é a que aparece no tempo bom)
|
|
31
|
-
* @param junta 0 = poucas e altas (o pôr do sol aparece) · 1 = as três fileiras cobrindo o céu inteiro
|
|
32
|
-
*/
|
|
33
|
-
export declare function nuvensDeTela(t: number, vw: number, n: number, junta: number): NuvemDeTela[];
|
|
34
|
-
type Gfx = Desenho;
|
|
35
|
-
interface Sprite {
|
|
36
|
-
x: number;
|
|
37
|
-
y: number;
|
|
38
|
-
alpha: number;
|
|
39
|
-
texture: unknown;
|
|
40
|
-
scale: {
|
|
41
|
-
x: number;
|
|
42
|
-
};
|
|
43
|
-
_v?: number;
|
|
44
|
-
destroy(): void;
|
|
45
|
-
}
|
|
46
|
-
type Layer = Camada;
|
|
47
|
-
interface Bird {
|
|
48
|
-
s: Sprite;
|
|
49
|
-
dir: number;
|
|
50
|
-
f: number;
|
|
51
|
-
t: number;
|
|
52
|
-
}
|
|
53
|
-
interface Flora {
|
|
54
|
-
base: string;
|
|
55
|
-
top: string;
|
|
56
|
-
bDk: string;
|
|
57
|
-
bLt: string;
|
|
58
|
-
petals: string[];
|
|
59
|
-
center: string;
|
|
60
|
-
}
|
|
61
|
-
interface Theme {
|
|
62
|
-
v3?: boolean;
|
|
63
|
-
decor?: string[];
|
|
64
|
-
cloud?: [string, string];
|
|
65
|
-
nuvens?: number;
|
|
66
|
-
}
|
|
67
|
-
interface Pl {
|
|
68
|
-
x: number;
|
|
69
|
-
y: number;
|
|
70
|
-
quit?: boolean;
|
|
71
|
-
}
|
|
72
|
-
export interface SceneSkyCtx {
|
|
73
|
-
skyLayer: Layer;
|
|
74
|
-
starsG: Gfx;
|
|
75
|
-
skyDecoG: Gfx;
|
|
76
|
-
fogG: Gfx;
|
|
77
|
-
grassG: Gfx;
|
|
78
|
-
themeFxG: Gfx;
|
|
79
|
-
themeFxBackG: Gfx;
|
|
80
|
-
/** A MANTA de nuvens, e ela tem camada PRÓPRIA por causa da ordem-z: fica na frente do céu (por isso
|
|
81
|
-
* esconde o sol) e ATRÁS das duas bandas de morro (por isso as árvores do fundo passam à frente dela).
|
|
82
|
-
* `skyDecoG`, onde moram os pássaros e as nuvens dos outros temas, está à frente dos morros e não serve. */
|
|
83
|
-
nuvemG: Gfx;
|
|
84
|
-
CLOUD_TEX: unknown[];
|
|
85
|
-
BIRD_TEX: unknown[];
|
|
86
|
-
criarSprite: CriarSprite<Sprite>;
|
|
87
|
-
hexN: (s: string) => number;
|
|
88
|
-
rnd: () => number;
|
|
89
|
-
randInt: (a: number, b: number) => number;
|
|
90
|
-
WORLD_PX_W: number;
|
|
91
|
-
WORLD_PX_H: number;
|
|
92
|
-
WORLD_W: number;
|
|
93
|
-
WORLD_H: number;
|
|
94
|
-
TILE: number;
|
|
95
|
-
LOGICAL_W: number;
|
|
96
|
-
LOGICAL_H: number;
|
|
97
|
-
BOX: {
|
|
98
|
-
h: number;
|
|
99
|
-
};
|
|
100
|
-
CENARIOS: Record<string, Theme>;
|
|
101
|
-
THEME_FLORA: Record<string, Flora | undefined>;
|
|
102
|
-
DIRECT_CFG: Record<string, unknown>;
|
|
103
|
-
solidAt: (x: number, y: number) => boolean;
|
|
104
|
-
tileAt: (x: number, y: number) => number;
|
|
105
|
-
getCenario: () => string;
|
|
106
|
-
getVizMode: () => string;
|
|
107
|
-
getPlayers: () => Pl[];
|
|
108
|
-
getFxClock: () => number;
|
|
109
|
-
getRm: () => {
|
|
110
|
-
decor?: boolean;
|
|
111
|
-
parallax?: boolean;
|
|
112
|
-
};
|
|
113
|
-
/** 0..1 — o quanto as nuvens estão fechadas neste quadro (render/weather.getAglomeracao). Um só relógio
|
|
114
|
-
* para a chuva e para as nuvens: dois desandariam um do outro depois de alguns minutos. */
|
|
115
|
-
getAglomeracao: () => number;
|
|
116
|
-
getGrassDensity: () => number;
|
|
117
|
-
getDecorSeed: () => number;
|
|
118
|
-
}
|
|
119
|
-
export interface SceneSky {
|
|
120
|
-
stepSky: (dt: number) => void;
|
|
121
|
-
stepV3Decor: () => void;
|
|
122
|
-
getClouds: () => Sprite[];
|
|
123
|
-
getBirds: () => Bird[];
|
|
124
|
-
}
|
|
125
|
-
export declare function createSceneSky(ctx: SceneSkyCtx): SceneSky;
|
|
126
|
-
export {};
|