@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.
Files changed (532) hide show
  1. package/README.md +120 -78
  2. package/app/css/style.css +761 -377
  3. package/app/public/vendor/fonts/playwrite-cu.woff2 +0 -0
  4. package/app/public/vendor/fonts/playwrite-es-deco.woff2 +0 -0
  5. package/app/public/vendor/fonts/playwrite-es.woff2 +0 -0
  6. package/app/public/vendor/fonts/playwrite-gb-j.woff2 +0 -0
  7. package/app/public/vendor/fonts/playwrite-gb-s.woff2 +0 -0
  8. package/app/public/vendor/fonts/playwrite-pe.woff2 +0 -0
  9. package/app/public/vendor/fonts/playwrite-pt.woff2 +0 -0
  10. package/app/public/vendor/fonts-licences/NOTICE.txt +166 -0
  11. package/app/public/vendor/fonts-licences/OFL-1.1.txt +86 -0
  12. package/app/public/vendor/fonts.css +36 -84
  13. package/dist-pkg/boot/create-game.d.ts +499 -219
  14. package/dist-pkg/boot/create-game.js +3944 -562
  15. package/dist-pkg/core/a11y-sr.d.ts +25 -3
  16. package/dist-pkg/core/a11y-sr.js +38 -19
  17. package/dist-pkg/core/accessible-label.d.ts +17 -0
  18. package/dist-pkg/core/accessible-label.js +37 -0
  19. package/dist-pkg/core/accommodation-subjects.d.ts +26 -0
  20. package/dist-pkg/core/accommodation-subjects.js +32 -0
  21. package/dist-pkg/core/accommodations.d.ts +125 -0
  22. package/dist-pkg/core/accommodations.js +195 -0
  23. package/dist-pkg/core/actions.d.ts +108 -55
  24. package/dist-pkg/core/actions.js +122 -71
  25. package/dist-pkg/core/calm-mode.d.ts +31 -0
  26. package/dist-pkg/core/calm-mode.js +47 -0
  27. package/dist-pkg/core/camera-cycle.d.ts +15 -0
  28. package/dist-pkg/core/camera-cycle.js +7 -0
  29. package/dist-pkg/core/caption-duration.d.ts +15 -0
  30. package/dist-pkg/core/caption-duration.js +19 -0
  31. package/dist-pkg/core/cartridge-problems.d.ts +34 -0
  32. package/dist-pkg/core/cartridge-problems.js +53 -0
  33. package/dist-pkg/core/constants.d.ts +0 -54
  34. package/dist-pkg/core/constants.js +9 -76
  35. package/dist-pkg/core/contract.d.ts +142 -164
  36. package/dist-pkg/core/contract.js +222 -208
  37. package/dist-pkg/core/dom-query.d.ts +4 -4
  38. package/dist-pkg/core/dom-query.js +12 -20
  39. package/dist-pkg/core/entity.d.ts +62 -77
  40. package/dist-pkg/core/entity.js +18 -32
  41. package/dist-pkg/core/escape-html.d.ts +9 -10
  42. package/dist-pkg/core/escape-html.js +16 -20
  43. package/dist-pkg/core/flash-threshold.d.ts +17 -0
  44. package/dist-pkg/core/flash-threshold.js +113 -0
  45. package/dist-pkg/core/game-speed.d.ts +11 -0
  46. package/dist-pkg/core/game-speed.js +16 -0
  47. package/dist-pkg/core/genres.d.ts +20 -0
  48. package/dist-pkg/core/genres.js +44 -0
  49. package/dist-pkg/core/i18n.d.ts +71 -60
  50. package/dist-pkg/core/i18n.js +186 -200
  51. package/dist-pkg/core/loop.d.ts +17 -6
  52. package/dist-pkg/core/loop.js +26 -26
  53. package/dist-pkg/core/pause-icon-catalogue.d.ts +15 -0
  54. package/dist-pkg/core/pause-icon-catalogue.js +54 -0
  55. package/dist-pkg/core/ring.d.ts +17 -0
  56. package/dist-pkg/core/ring.js +29 -0
  57. package/dist-pkg/core/rng.d.ts +7 -12
  58. package/dist-pkg/core/rng.js +23 -53
  59. package/dist-pkg/core/route.d.ts +26 -26
  60. package/dist-pkg/core/route.js +126 -121
  61. package/dist-pkg/core/scenes.d.ts +37 -40
  62. package/dist-pkg/core/scenes.js +41 -43
  63. package/dist-pkg/core/screens.d.ts +4 -4
  64. package/dist-pkg/core/screens.js +11 -16
  65. package/dist-pkg/core/session-clock.d.ts +23 -0
  66. package/dist-pkg/core/session-clock.js +37 -0
  67. package/dist-pkg/core/setting-defaults.d.ts +61 -0
  68. package/dist-pkg/core/setting-defaults.js +66 -0
  69. package/dist-pkg/core/speech-rate.d.ts +29 -0
  70. package/dist-pkg/core/speech-rate.js +47 -0
  71. package/dist-pkg/core/state.d.ts +118 -118
  72. package/dist-pkg/core/state.js +322 -297
  73. package/dist-pkg/core/visual-cycles.d.ts +30 -0
  74. package/dist-pkg/core/visual-cycles.js +52 -0
  75. package/dist-pkg/core/visual-state.d.ts +13 -0
  76. package/dist-pkg/core/visual-state.js +6 -0
  77. package/dist-pkg/educational/activities-registry.d.ts +1 -1
  78. package/dist-pkg/educational/activities-registry.js +9 -8
  79. package/dist-pkg/educational/adaptive-engine.d.ts +11 -11
  80. package/dist-pkg/educational/adaptive-engine.js +17 -17
  81. package/dist-pkg/educational/segment-bar.d.ts +12 -12
  82. package/dist-pkg/educational/segment-bar.js +9 -9
  83. package/dist-pkg/i18n/en.js +324 -223
  84. package/dist-pkg/i18n/es.js +323 -223
  85. package/dist-pkg/i18n/pt.js +348 -226
  86. package/dist-pkg/input/default-bindings.d.ts +37 -38
  87. package/dist-pkg/input/default-bindings.js +127 -144
  88. package/dist-pkg/input/devices.d.ts +7 -7
  89. package/dist-pkg/input/devices.js +17 -16
  90. package/dist-pkg/input/edges.d.ts +23 -32
  91. package/dist-pkg/input/edges.js +23 -28
  92. package/dist-pkg/input/empathy-filter.d.ts +22 -0
  93. package/dist-pkg/input/empathy-filter.js +34 -0
  94. package/dist-pkg/input/face-map.d.ts +96 -0
  95. package/dist-pkg/input/face-map.js +255 -0
  96. package/dist-pkg/input/face-signals.d.ts +40 -0
  97. package/dist-pkg/input/face-signals.js +48 -0
  98. package/dist-pkg/input/gamepad.d.ts +195 -145
  99. package/dist-pkg/input/gamepad.js +383 -556
  100. package/dist-pkg/input/gaze-cycle.d.ts +64 -0
  101. package/dist-pkg/input/gaze-cycle.js +133 -0
  102. package/dist-pkg/input/gaze-relative.d.ts +68 -0
  103. package/dist-pkg/input/gaze-relative.js +142 -0
  104. package/dist-pkg/input/hand-map.d.ts +28 -0
  105. package/dist-pkg/input/hand-map.js +142 -0
  106. package/dist-pkg/input/input-cooldown.d.ts +17 -0
  107. package/dist-pkg/input/input-cooldown.js +39 -0
  108. package/dist-pkg/input/key-default.d.ts +30 -0
  109. package/dist-pkg/input/key-default.js +60 -0
  110. package/dist-pkg/input/keyboard-runtime.d.ts +15 -21
  111. package/dist-pkg/input/keyboard-runtime.js +23 -27
  112. package/dist-pkg/input/keyboard.d.ts +68 -63
  113. package/dist-pkg/input/keyboard.js +83 -105
  114. package/dist-pkg/input/keydown.d.ts +123 -137
  115. package/dist-pkg/input/keydown.js +284 -289
  116. package/dist-pkg/input/latch-edge.d.ts +33 -21
  117. package/dist-pkg/input/latch-edge.js +34 -35
  118. package/dist-pkg/input/latch-scope.d.ts +51 -50
  119. package/dist-pkg/input/latch-scope.js +61 -82
  120. package/dist-pkg/input/latch-store.d.ts +26 -30
  121. package/dist-pkg/input/latch-store.js +42 -50
  122. package/dist-pkg/input/latch-sync.d.ts +29 -29
  123. package/dist-pkg/input/latch-sync.js +25 -25
  124. package/dist-pkg/input/latch.d.ts +14 -17
  125. package/dist-pkg/input/latch.js +29 -37
  126. package/dist-pkg/input/pad-defaults.d.ts +13 -16
  127. package/dist-pkg/input/pad-defaults.js +21 -28
  128. package/dist-pkg/input/pad-reading.d.ts +76 -0
  129. package/dist-pkg/input/pad-reading.js +169 -0
  130. package/dist-pkg/input/pad-wizard.d.ts +99 -0
  131. package/dist-pkg/input/pad-wizard.js +256 -0
  132. package/dist-pkg/input/pointer-space.d.ts +19 -20
  133. package/dist-pkg/input/pointer-space.js +27 -32
  134. package/dist-pkg/input/pointer.d.ts +39 -40
  135. package/dist-pkg/input/pointer.js +42 -45
  136. package/dist-pkg/input/state.d.ts +101 -89
  137. package/dist-pkg/input/state.js +54 -134
  138. package/dist-pkg/input/switch-scan.d.ts +59 -0
  139. package/dist-pkg/input/switch-scan.js +67 -0
  140. package/dist-pkg/input/synthetic-source.d.ts +42 -0
  141. package/dist-pkg/input/synthetic-source.js +57 -0
  142. package/dist-pkg/input/touch-bindings.d.ts +127 -116
  143. package/dist-pkg/input/touch-bindings.js +158 -173
  144. package/dist-pkg/input/touch.d.ts +147 -72
  145. package/dist-pkg/input/touch.js +362 -126
  146. package/dist-pkg/input/transport-in-use.d.ts +107 -0
  147. package/dist-pkg/input/transport-in-use.js +130 -0
  148. package/dist-pkg/input/transports.d.ts +90 -117
  149. package/dist-pkg/input/transports.js +104 -106
  150. package/dist-pkg/input/virtual-controller.d.ts +82 -0
  151. package/dist-pkg/input/virtual-controller.js +69 -0
  152. package/dist-pkg/input/vocabulary-migration.d.ts +50 -49
  153. package/dist-pkg/input/vocabulary-migration.js +80 -79
  154. package/dist-pkg/input/voice-map.d.ts +59 -0
  155. package/dist-pkg/input/voice-map.js +123 -0
  156. package/dist-pkg/platform/audio-ambient.d.ts +13 -2
  157. package/dist-pkg/platform/audio-ambient.js +14 -14
  158. package/dist-pkg/platform/audio-earcons.d.ts +20 -19
  159. package/dist-pkg/platform/audio-earcons.js +51 -42
  160. package/dist-pkg/platform/audio-jingles.js +9 -10
  161. package/dist-pkg/platform/audio-mixer.d.ts +14 -2
  162. package/dist-pkg/platform/audio-mixer.js +31 -39
  163. package/dist-pkg/platform/audio-sonar.d.ts +49 -152
  164. package/dist-pkg/platform/audio-sonar.js +124 -302
  165. package/dist-pkg/platform/audio.d.ts +62 -19
  166. package/dist-pkg/platform/audio.js +193 -168
  167. package/dist-pkg/platform/choose-by-voice.d.ts +70 -0
  168. package/dist-pkg/platform/choose-by-voice.js +157 -0
  169. package/dist-pkg/platform/flash-sampler.d.ts +19 -0
  170. package/dist-pkg/platform/flash-sampler.js +79 -0
  171. package/dist-pkg/platform/font-library.d.ts +77 -0
  172. package/dist-pkg/platform/font-library.js +98 -0
  173. package/dist-pkg/platform/font-library.json +721 -0
  174. package/dist-pkg/platform/heavy-catalogue.d.ts +77 -0
  175. package/dist-pkg/platform/heavy-catalogue.js +256 -0
  176. package/dist-pkg/platform/heavy-mirror.d.ts +20 -0
  177. package/dist-pkg/platform/heavy-mirror.js +73 -0
  178. package/dist-pkg/platform/heavy.d.ts +136 -0
  179. package/dist-pkg/platform/heavy.js +324 -0
  180. package/dist-pkg/platform/interruptible-speech.d.ts +23 -16
  181. package/dist-pkg/platform/interruptible-speech.js +77 -54
  182. package/dist-pkg/platform/kokoro-port.d.ts +27 -0
  183. package/dist-pkg/platform/kokoro-port.js +50 -0
  184. package/dist-pkg/platform/kokoro-runtime.d.ts +20 -0
  185. package/dist-pkg/platform/kokoro-runtime.js +52 -0
  186. package/dist-pkg/platform/kokoro.d.ts +70 -0
  187. package/dist-pkg/platform/kokoro.js +133 -0
  188. package/dist-pkg/platform/listener-scope.d.ts +12 -0
  189. package/dist-pkg/platform/listener-scope.js +90 -0
  190. package/dist-pkg/platform/locale-host.d.ts +14 -0
  191. package/dist-pkg/platform/locale-host.js +45 -0
  192. package/dist-pkg/platform/microphone.d.ts +51 -0
  193. package/dist-pkg/platform/microphone.js +118 -0
  194. package/dist-pkg/platform/onnx-runtime.d.ts +34 -0
  195. package/dist-pkg/platform/onnx-runtime.js +42 -0
  196. package/dist-pkg/platform/reading-in-worker.d.ts +64 -0
  197. package/dist-pkg/platform/reading-in-worker.js +125 -0
  198. package/dist-pkg/platform/reading-model.d.ts +94 -0
  199. package/dist-pkg/platform/reading-model.js +272 -0
  200. package/dist-pkg/platform/reading-runtime.d.ts +24 -0
  201. package/dist-pkg/platform/reading-runtime.js +164 -0
  202. package/dist-pkg/platform/reading-worker.d.ts +41 -0
  203. package/dist-pkg/platform/reading-worker.js +58 -0
  204. package/dist-pkg/platform/reading.d.ts +80 -0
  205. package/dist-pkg/platform/reading.js +136 -0
  206. package/dist-pkg/platform/speech-recognition.d.ts +60 -0
  207. package/dist-pkg/platform/speech-recognition.js +104 -0
  208. package/dist-pkg/platform/speech.d.ts +23 -1
  209. package/dist-pkg/platform/speech.js +29 -18
  210. package/dist-pkg/platform/storage-keys.d.ts +96 -0
  211. package/dist-pkg/platform/storage-keys.js +106 -0
  212. package/dist-pkg/platform/storage.d.ts +46 -111
  213. package/dist-pkg/platform/storage.js +104 -169
  214. package/dist-pkg/platform/tts.d.ts +85 -39
  215. package/dist-pkg/platform/tts.js +447 -127
  216. package/dist-pkg/platform/vision-loop.d.ts +23 -0
  217. package/dist-pkg/platform/vision-loop.js +56 -0
  218. package/dist-pkg/platform/vision.d.ts +132 -0
  219. package/dist-pkg/platform/vision.js +117 -0
  220. package/dist-pkg/platform/voice-listener.d.ts +40 -0
  221. package/dist-pkg/platform/voice-listener.js +88 -0
  222. package/dist-pkg/platform/voice-plan.d.ts +15 -98
  223. package/dist-pkg/platform/voice-plan.js +56 -143
  224. package/dist-pkg/platform/vosk-runtime.d.ts +96 -0
  225. package/dist-pkg/platform/vosk-runtime.js +151 -0
  226. package/dist-pkg/platform/vosk-vocabulary.d.ts +6 -0
  227. package/dist-pkg/platform/vosk-vocabulary.js +178 -0
  228. package/dist-pkg/render/canvas.d.ts +13 -7
  229. package/dist-pkg/render/canvas.js +13 -13
  230. package/dist-pkg/render/crt.d.ts +48 -12
  231. package/dist-pkg/render/crt.js +78 -80
  232. package/dist-pkg/render/cvd-matrices.d.ts +22 -18
  233. package/dist-pkg/render/cvd-matrices.js +37 -38
  234. package/dist-pkg/render/hc-role-data.d.ts +7 -7
  235. package/dist-pkg/render/hc-role-data.js +14 -14
  236. package/dist-pkg/render/high-contrast.d.ts +67 -56
  237. package/dist-pkg/render/high-contrast.js +226 -217
  238. package/dist-pkg/render/low-vision-drawing.d.ts +5 -0
  239. package/dist-pkg/render/low-vision-drawing.js +46 -0
  240. package/dist-pkg/render/lq-filter.d.ts +32 -20
  241. package/dist-pkg/render/lq-filter.js +59 -65
  242. package/dist-pkg/render/port.d.ts +86 -88
  243. package/dist-pkg/render/port.js +17 -23
  244. package/dist-pkg/render/screen-pipeline.d.ts +42 -42
  245. package/dist-pkg/render/screen-pipeline.js +80 -87
  246. package/dist-pkg/render/sprite-fx.d.ts +2 -1
  247. package/dist-pkg/render/sprite-fx.js +16 -14
  248. package/dist-pkg/render/viewports.d.ts +20 -15
  249. package/dist-pkg/render/viewports.js +83 -114
  250. package/dist-pkg/render/viz-axes-labels.d.ts +47 -0
  251. package/dist-pkg/render/viz-axes-labels.js +88 -0
  252. package/dist-pkg/render/viz-axes.d.ts +89 -86
  253. package/dist-pkg/render/viz-axes.js +128 -116
  254. package/dist-pkg/render/viz-modes.d.ts +28 -29
  255. package/dist-pkg/render/viz-modes.js +40 -45
  256. package/dist-pkg/render/viz-refusal.d.ts +32 -0
  257. package/dist-pkg/render/viz-refusal.js +57 -0
  258. package/dist-pkg/render/viz-setters.d.ts +104 -66
  259. package/dist-pkg/render/viz-setters.js +182 -191
  260. package/dist-pkg/ui/aac-sets.d.ts +45 -0
  261. package/dist-pkg/ui/aac-sets.js +41 -0
  262. package/dist-pkg/ui/audio-choices.d.ts +68 -0
  263. package/dist-pkg/ui/audio-choices.js +98 -0
  264. package/dist-pkg/ui/audio-rows-that-apply.d.ts +12 -0
  265. package/dist-pkg/ui/audio-rows-that-apply.js +43 -0
  266. package/dist-pkg/ui/camera-control.d.ts +53 -0
  267. package/dist-pkg/ui/camera-control.js +48 -0
  268. package/dist-pkg/ui/changed-mark.d.ts +9 -8
  269. package/dist-pkg/ui/changed-mark.js +22 -53
  270. package/dist-pkg/ui/control-choices.d.ts +37 -0
  271. package/dist-pkg/ui/control-choices.js +84 -0
  272. package/dist-pkg/ui/debug-panel.d.ts +59 -43
  273. package/dist-pkg/ui/debug-panel.js +68 -69
  274. package/dist-pkg/ui/declared-words.d.ts +21 -0
  275. package/dist-pkg/ui/declared-words.js +66 -0
  276. package/dist-pkg/ui/dom.d.ts +10 -14
  277. package/dist-pkg/ui/dom.js +10 -47
  278. package/dist-pkg/ui/drawing-problems.d.ts +25 -0
  279. package/dist-pkg/ui/drawing-problems.js +94 -0
  280. package/dist-pkg/ui/eye-control.d.ts +36 -0
  281. package/dist-pkg/ui/eye-control.js +178 -0
  282. package/dist-pkg/ui/face-control.d.ts +25 -0
  283. package/dist-pkg/ui/face-control.js +183 -0
  284. package/dist-pkg/ui/focus-trap.d.ts +39 -49
  285. package/dist-pkg/ui/focus-trap.js +56 -65
  286. package/dist-pkg/ui/fonts.d.ts +157 -68
  287. package/dist-pkg/ui/fonts.js +305 -115
  288. package/dist-pkg/ui/footer-scroll-driver.d.ts +14 -0
  289. package/dist-pkg/ui/footer-scroll-driver.js +201 -0
  290. package/dist-pkg/ui/footer-scroll.d.ts +38 -0
  291. package/dist-pkg/ui/footer-scroll.js +55 -0
  292. package/dist-pkg/ui/game-options.d.ts +47 -0
  293. package/dist-pkg/ui/game-options.js +158 -0
  294. package/dist-pkg/ui/gaze-overlay.d.ts +64 -0
  295. package/dist-pkg/ui/gaze-overlay.js +165 -0
  296. package/dist-pkg/ui/hand-control.d.ts +25 -0
  297. package/dist-pkg/ui/hand-control.js +143 -0
  298. package/dist-pkg/ui/help-panel.d.ts +87 -0
  299. package/dist-pkg/ui/help-panel.js +242 -0
  300. package/dist-pkg/ui/hud-bands.d.ts +62 -0
  301. package/dist-pkg/ui/hud-bands.js +146 -0
  302. package/dist-pkg/ui/hud-row.d.ts +34 -0
  303. package/dist-pkg/ui/hud-row.js +80 -0
  304. package/dist-pkg/ui/hud.d.ts +73 -73
  305. package/dist-pkg/ui/hud.js +94 -98
  306. package/dist-pkg/ui/item-announcement.d.ts +13 -12
  307. package/dist-pkg/ui/item-announcement.js +25 -26
  308. package/dist-pkg/ui/layout.d.ts +103 -28
  309. package/dist-pkg/ui/layout.js +117 -99
  310. package/dist-pkg/ui/libras-avatar-clip.d.ts +30 -0
  311. package/dist-pkg/ui/libras-avatar-clip.js +86 -0
  312. package/dist-pkg/ui/libras-avatar-load.d.ts +52 -0
  313. package/dist-pkg/ui/libras-avatar-load.js +134 -0
  314. package/dist-pkg/ui/libras-avatar-plan.d.ts +102 -0
  315. package/dist-pkg/ui/libras-avatar-plan.js +211 -0
  316. package/dist-pkg/ui/libras-avatar-player.d.ts +28 -0
  317. package/dist-pkg/ui/libras-avatar-player.js +226 -0
  318. package/dist-pkg/ui/libras-avatar-stage.d.ts +37 -0
  319. package/dist-pkg/ui/libras-avatar-stage.js +208 -0
  320. package/dist-pkg/ui/libras-glosses.d.ts +28 -0
  321. package/dist-pkg/ui/libras-glosses.js +161 -0
  322. package/dist-pkg/ui/locale-flags.d.ts +16 -0
  323. package/dist-pkg/ui/locale-flags.js +30 -0
  324. package/dist-pkg/ui/loop-crash.d.ts +17 -17
  325. package/dist-pkg/ui/loop-crash.js +33 -62
  326. package/dist-pkg/ui/menu-intent.d.ts +61 -0
  327. package/dist-pkg/ui/menu-intent.js +88 -0
  328. package/dist-pkg/ui/menu-items.d.ts +20 -0
  329. package/dist-pkg/ui/menu-items.js +51 -0
  330. package/dist-pkg/ui/menu-nav.d.ts +98 -92
  331. package/dist-pkg/ui/menu-nav.js +398 -286
  332. package/dist-pkg/ui/mobility-choices.d.ts +26 -0
  333. package/dist-pkg/ui/mobility-choices.js +41 -0
  334. package/dist-pkg/ui/motion-choices.d.ts +31 -0
  335. package/dist-pkg/ui/motion-choices.js +68 -0
  336. package/dist-pkg/ui/motion-scene.d.ts +24 -19
  337. package/dist-pkg/ui/motion-scene.js +29 -61
  338. package/dist-pkg/ui/mount-panel.d.ts +81 -0
  339. package/dist-pkg/ui/mount-panel.js +61 -0
  340. package/dist-pkg/ui/panel-shell.d.ts +65 -31
  341. package/dist-pkg/ui/panel-shell.js +92 -66
  342. package/dist-pkg/ui/panel-widgets.d.ts +150 -0
  343. package/dist-pkg/ui/panel-widgets.js +294 -0
  344. package/dist-pkg/ui/pause-buttons.d.ts +35 -0
  345. package/dist-pkg/ui/pause-buttons.js +66 -0
  346. package/dist-pkg/ui/pause-icons.d.ts +261 -347
  347. package/dist-pkg/ui/pause-icons.js +671 -601
  348. package/dist-pkg/ui/pause-markup.d.ts +86 -0
  349. package/dist-pkg/ui/pause-markup.js +125 -0
  350. package/dist-pkg/ui/reach-notice.d.ts +22 -23
  351. package/dist-pkg/ui/reach-notice.js +55 -58
  352. package/dist-pkg/ui/scan-overlay.d.ts +23 -0
  353. package/dist-pkg/ui/scan-overlay.js +50 -0
  354. package/dist-pkg/ui/screen-text.d.ts +25 -0
  355. package/dist-pkg/ui/screen-text.js +152 -0
  356. package/dist-pkg/ui/session-clock.d.ts +32 -0
  357. package/dist-pkg/ui/session-clock.js +67 -0
  358. package/dist-pkg/ui/settings-aac.d.ts +70 -0
  359. package/dist-pkg/ui/settings-aac.js +208 -0
  360. package/dist-pkg/ui/settings-audio.d.ts +97 -114
  361. package/dist-pkg/ui/settings-audio.js +493 -425
  362. package/dist-pkg/ui/settings-controls.d.ts +53 -96
  363. package/dist-pkg/ui/settings-controls.js +143 -215
  364. package/dist-pkg/ui/settings-empathy.d.ts +39 -30
  365. package/dist-pkg/ui/settings-empathy.js +53 -60
  366. package/dist-pkg/ui/settings-mobility.d.ts +192 -0
  367. package/dist-pkg/ui/settings-mobility.js +332 -0
  368. package/dist-pkg/ui/settings-motion.d.ts +91 -70
  369. package/dist-pkg/ui/settings-motion.js +287 -198
  370. package/dist-pkg/ui/settings-panel.d.ts +58 -45
  371. package/dist-pkg/ui/settings-panel.js +189 -94
  372. package/dist-pkg/ui/settings-typo.d.ts +29 -78
  373. package/dist-pkg/ui/settings-typo.js +158 -129
  374. package/dist-pkg/ui/settings-visual.d.ts +29 -87
  375. package/dist-pkg/ui/settings-visual.js +240 -193
  376. package/dist-pkg/ui/shell.d.ts +112 -135
  377. package/dist-pkg/ui/shell.js +148 -217
  378. package/dist-pkg/ui/simulation-list.d.ts +27 -0
  379. package/dist-pkg/ui/simulation-list.js +76 -0
  380. package/dist-pkg/ui/simulation-over-the-world.d.ts +23 -0
  381. package/dist-pkg/ui/simulation-over-the-world.js +131 -0
  382. package/dist-pkg/ui/simulation-refusal.d.ts +5 -31
  383. package/dist-pkg/ui/simulation-refusal.js +8 -56
  384. package/dist-pkg/ui/switchable-control.d.ts +11 -0
  385. package/dist-pkg/ui/switchable-control.js +19 -0
  386. package/dist-pkg/ui/title.d.ts +3 -12
  387. package/dist-pkg/ui/title.js +49 -18
  388. package/dist-pkg/ui/top-band.d.ts +26 -0
  389. package/dist-pkg/ui/top-band.js +96 -0
  390. package/dist-pkg/ui/typo-choices.d.ts +71 -0
  391. package/dist-pkg/ui/typo-choices.js +85 -0
  392. package/dist-pkg/ui/visual-axes-panel.d.ts +11 -47
  393. package/dist-pkg/ui/visual-axes-panel.js +12 -94
  394. package/dist-pkg/ui/visual-choices.d.ts +77 -0
  395. package/dist-pkg/ui/visual-choices.js +107 -0
  396. package/dist-pkg/ui/vlibras.d.ts +77 -10
  397. package/dist-pkg/ui/vlibras.js +130 -81
  398. package/dist-pkg/ui/voice-control.d.ts +68 -0
  399. package/dist-pkg/ui/voice-control.js +276 -0
  400. package/dist-pkg/ui/voice-settings.d.ts +95 -0
  401. package/dist-pkg/ui/voice-settings.js +352 -0
  402. package/dist-pkg/ui/where-the-child-is.d.ts +31 -0
  403. package/dist-pkg/ui/where-the-child-is.js +70 -0
  404. package/docs/CREDITS.md +300 -44
  405. package/docs/LICENSES.md +189 -145
  406. package/package.json +51 -27
  407. package/scripts/check-cartridge.mjs +78 -0
  408. package/scripts/game-build.d.mts +25 -0
  409. package/scripts/game-build.mjs +144 -0
  410. package/scripts/heavy-into-the-delivery.mjs +388 -0
  411. package/scripts/libras-avatar.json +680 -0
  412. package/scripts/libras-avatar.mjs +246 -0
  413. package/scripts/libras-glosses/gloss.py +95 -0
  414. package/scripts/libras-glosses/pyproject.toml +32 -0
  415. package/scripts/libras-glosses/uv.lock +781 -0
  416. package/scripts/libras-glosses.mjs +351 -0
  417. package/scripts/licences/Apache-2.0.txt +176 -0
  418. package/scripts/licences/GPL-3.0.txt +674 -0
  419. package/scripts/licences/MIT.txt +17 -0
  420. package/scripts/licences/OFL-1.1.txt +86 -0
  421. package/scripts/licences/UFL-1.0.txt +96 -0
  422. package/scripts/licences/fonts.mjs +389 -0
  423. package/scripts/licences/third-party.mjs +301 -0
  424. package/scripts/licences/vosk-browser.NOTICE.txt +268 -0
  425. package/app/public/vendor/fonts/comicneue-400.woff2 +0 -0
  426. package/app/public/vendor/fonts/comicneue-700.woff2 +0 -0
  427. package/app/public/vendor/fonts/fondamento-400-ext.woff2 +0 -0
  428. package/app/public/vendor/fonts/fondamento-400.woff2 +0 -0
  429. package/app/public/vendor/fonts/inter-400.woff2 +0 -0
  430. package/app/public/vendor/fonts/inter-700.woff2 +0 -0
  431. package/app/public/vendor/fonts/lato-400.woff2 +0 -0
  432. package/app/public/vendor/fonts/lato-700.woff2 +0 -0
  433. package/app/public/vendor/fonts/literata-400.woff2 +0 -0
  434. package/app/public/vendor/fonts/literata-700.woff2 +0 -0
  435. package/app/public/vendor/fonts/newsreader-400.woff2 +0 -0
  436. package/app/public/vendor/fonts/newsreader-700.woff2 +0 -0
  437. package/app/public/vendor/fonts/opendyslexic-400.woff2 +0 -0
  438. package/app/public/vendor/fonts/opensans-400.woff2 +0 -0
  439. package/app/public/vendor/fonts/opensans-700.woff2 +0 -0
  440. package/app/public/vendor/fonts/pinyon-400.woff2 +0 -0
  441. package/app/public/vendor/fonts/pressstart-400.woff2 +0 -0
  442. package/app/public/vendor/fonts/quattro-400.woff2 +0 -0
  443. package/app/public/vendor/fonts/quattro-700.woff2 +0 -0
  444. package/app/public/vendor/fonts/sourcesans-400.woff2 +0 -0
  445. package/app/public/vendor/fonts/sourcesans-700.woff2 +0 -0
  446. package/app/public/vendor/fonts/sourceserif-400.woff2 +0 -0
  447. package/app/public/vendor/fonts/sourceserif-700.woff2 +0 -0
  448. package/app/public/vendor/fonts/ufmag-400.woff2 +0 -0
  449. package/dist-pkg/core/anel.d.ts +0 -17
  450. package/dist-pkg/core/anel.js +0 -31
  451. package/dist-pkg/core/collision.d.ts +0 -21
  452. package/dist-pkg/core/collision.js +0 -62
  453. package/dist-pkg/core/layers.d.ts +0 -63
  454. package/dist-pkg/core/layers.js +0 -95
  455. package/dist-pkg/core/letter-grid.d.ts +0 -55
  456. package/dist-pkg/core/letter-grid.js +0 -116
  457. package/dist-pkg/core/password.d.ts +0 -34
  458. package/dist-pkg/core/password.js +0 -205
  459. package/dist-pkg/core/rotulo-acessivel.d.ts +0 -17
  460. package/dist-pkg/core/rotulo-acessivel.js +0 -41
  461. package/dist-pkg/core/run-state.d.ts +0 -115
  462. package/dist-pkg/core/run-state.js +0 -40
  463. package/dist-pkg/core/tiles.d.ts +0 -12
  464. package/dist-pkg/core/tiles.js +0 -61
  465. package/dist-pkg/core/world.d.ts +0 -4
  466. package/dist-pkg/core/world.js +0 -58
  467. package/dist-pkg/input/origem-sintetica.d.ts +0 -44
  468. package/dist-pkg/input/origem-sintetica.js +0 -60
  469. package/dist-pkg/input/transporte-em-uso.d.ts +0 -101
  470. package/dist-pkg/input/transporte-em-uso.js +0 -130
  471. package/dist-pkg/platform/audio-nav.d.ts +0 -51
  472. package/dist-pkg/platform/audio-nav.js +0 -99
  473. package/dist-pkg/platform/guide-intensity.d.ts +0 -40
  474. package/dist-pkg/platform/guide-intensity.js +0 -73
  475. package/dist-pkg/platform/pesados-catalogo.d.ts +0 -14
  476. package/dist-pkg/platform/pesados-catalogo.js +0 -177
  477. package/dist-pkg/platform/pesados.d.ts +0 -31
  478. package/dist-pkg/platform/pesados.js +0 -75
  479. package/dist-pkg/platform/vozes-prontas.d.ts +0 -28
  480. package/dist-pkg/platform/vozes-prontas.js +0 -61
  481. package/dist-pkg/render/camera.d.ts +0 -58
  482. package/dist-pkg/render/camera.js +0 -105
  483. package/dist-pkg/render/cenario-data.d.ts +0 -127
  484. package/dist-pkg/render/cenario-data.js +0 -145
  485. package/dist-pkg/render/city-tex.d.ts +0 -63
  486. package/dist-pkg/render/city-tex.js +0 -228
  487. package/dist-pkg/render/city-tiles.d.ts +0 -11
  488. package/dist-pkg/render/city-tiles.js +0 -140
  489. package/dist-pkg/render/draw.d.ts +0 -149
  490. package/dist-pkg/render/draw.js +0 -231
  491. package/dist-pkg/render/fx.d.ts +0 -63
  492. package/dist-pkg/render/fx.js +0 -123
  493. package/dist-pkg/render/minimap.d.ts +0 -11
  494. package/dist-pkg/render/minimap.js +0 -94
  495. package/dist-pkg/render/parallax.d.ts +0 -85
  496. package/dist-pkg/render/parallax.js +0 -158
  497. package/dist-pkg/render/player-anim.d.ts +0 -71
  498. package/dist-pkg/render/player-anim.js +0 -152
  499. package/dist-pkg/render/recycling-tex.d.ts +0 -48
  500. package/dist-pkg/render/recycling-tex.js +0 -164
  501. package/dist-pkg/render/scene-city.d.ts +0 -77
  502. package/dist-pkg/render/scene-city.js +0 -181
  503. package/dist-pkg/render/scene-parallax.d.ts +0 -72
  504. package/dist-pkg/render/scene-parallax.js +0 -426
  505. package/dist-pkg/render/scene-sky.d.ts +0 -126
  506. package/dist-pkg/render/scene-sky.js +0 -295
  507. package/dist-pkg/render/set-cenario.d.ts +0 -54
  508. package/dist-pkg/render/set-cenario.js +0 -103
  509. package/dist-pkg/render/textures.d.ts +0 -75
  510. package/dist-pkg/render/textures.js +0 -240
  511. package/dist-pkg/render/title-scene.d.ts +0 -46
  512. package/dist-pkg/render/title-scene.js +0 -75
  513. package/dist-pkg/render/weather.d.ts +0 -96
  514. package/dist-pkg/render/weather.js +0 -171
  515. package/dist-pkg/render/wheelchair-sprites.d.ts +0 -32
  516. package/dist-pkg/render/wheelchair-sprites.js +0 -69
  517. package/dist-pkg/render/world-tex.d.ts +0 -18
  518. package/dist-pkg/render/world-tex.js +0 -87
  519. package/dist-pkg/ui/activities-menu.d.ts +0 -258
  520. package/dist-pkg/ui/activities-menu.js +0 -648
  521. package/dist-pkg/ui/caa-sets.d.ts +0 -39
  522. package/dist-pkg/ui/caa-sets.js +0 -65
  523. package/dist-pkg/ui/latch-refusal.d.ts +0 -32
  524. package/dist-pkg/ui/latch-refusal.js +0 -60
  525. package/dist-pkg/ui/map-hub.d.ts +0 -56
  526. package/dist-pkg/ui/map-hub.js +0 -138
  527. package/dist-pkg/ui/settings-caa.d.ts +0 -45
  528. package/dist-pkg/ui/settings-caa.js +0 -137
  529. package/dist-pkg/ui/settings-motor.d.ts +0 -175
  530. package/dist-pkg/ui/settings-motor.js +0 -342
  531. package/dist-pkg/ui/webcam.d.ts +0 -7
  532. 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 {};