@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,295 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // render/scene-sky — céu de tela: deriva de nuvens (math pura + bug #21) + trilha viva da v3 (nuvens/pássaros do mundo,
3
- // estrelas/névoa, grama/minhocas/vagalumes/borboletas). Extraído do game.js (#43). As 6 CAMADAS (skyLayer/starsG/
4
- // skyDecoG/fogG/grassG/themeFxG) continuam sendo CRIADAS no game.js — a ordem-z delas está soldada na montagem do
5
- // render-graph (parallax/worldSprite/lifeLayer/carLayer) — e são INJETADAS aqui; movemos só a LÓGICA. Fórmulas copiadas
6
- // verbatim da v3.1.100. Injeção por closure. Ver docs/5-Refactoring/plano-modularizacao-mapa.md (#43).
7
- /**
8
- * Posição horizontal de uma nuvem à deriva, com wrap SUB-PIXEL e pelo CORPO INTEIRO. Corrige #21:
9
- * (a) NÃO arredonda → deriva suave mesmo a <1px/frame; (b) só reentra quando a nuvem inteira saiu.
10
- * @param phase distância de deriva acumulada (float; cresce → direita, decresce → esquerda)
11
- * @param enterAt x de (re)entrada — passe `-larguraDaNuvem` p/ reentrar TOTALMENTE fora da tela
12
- * @param span período do wrap — passe `larguraDaTela + larguraDaNuvem` p/ só reentrar depois de sair inteira
13
- */
14
- export function cloudWrapX(phase, enterAt, span) {
15
- return ((phase % span) + span) % span + enterAt;
16
- }
17
- /** Largura e altura do cúmulo base, antes de `esc`. Quem mede cobertura precisa das duas. */
18
- export const NUVEM_W = 26, NUVEM_H = 13;
19
- /** Quantas fileiras a manta fechada tem. É o que a faz cobrir do topo ao horizonte em vez de só o topo. */
20
- const FILEIRAS = 3;
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 function nuvensDeTela(t, vw, n, junta) {
34
- const j = Math.max(0, Math.min(1, junta)), nuvens = [];
35
- for (let i = 0; i < n; i++) {
36
- const sp = 0.05 + ((i * 7) % 4) * 0.021; // velocidades diferentes: elas se alcançam e se abrem
37
- const esc = (1.15 + ((i * 37) % 5) * 0.18) * (1 + 0.6 * j); // crescem ao fechar até uma encostar na outra
38
- const larg = NUVEM_W * esc;
39
- const x = cloudWrapX(t * sp + (i * (vw + larg)) / Math.max(1, n), -larg, vw + larg);
40
- const aberto = 4 + ((i * 37) % 26); // altura de repouso: a faixa alta do céu
41
- const fechado = (i % FILEIRAS) * 27 + ((i * 13) % 7); // altura de manta: a fileira desta nuvem
42
- // A fileira 0 é permanente; as outras entram entre 0,15 e 0,65 de aglomeração — antes da chuva, portanto.
43
- const surge = i % FILEIRAS === 0 ? 1 : Math.max(0, Math.min(1, (j - 0.15) / 0.5));
44
- nuvens.push({ x, y: (1 - j) * aberto + j * fechado, esc, alpha: (0.72 + 0.28 * j) * surge });
45
- }
46
- return nuvens;
47
- }
48
- /**
49
- * Um cúmulo em retângulos: laje de base e três lóbulos de alturas diferentes. Retângulos e não arcos porque é
50
- * o que o `Gfx` do PIXI oferece aqui e porque é o que combina com o resto — a nuvem é pixel art, não um
51
- * desenho vetorial reduzido. `[x, y, w, h]` no espaço da nuvem base (NUVEM_W×NUVEM_H), multiplicado por `esc`.
52
- */
53
- const CUMULO = [
54
- [0, 8, 26, 4], [2, 5, 9, 3], [3, 3, 6, 2], [4, 2, 4, 1],
55
- [9, 4, 9, 4], [11, 2, 6, 2], [12, 1, 4, 1],
56
- [17, 5, 7, 3], [18, 3, 4, 2],
57
- ];
58
- /** A sombra sob a base — uma linha só. Na Floresta ela é alaranjada: a luz baixa bate por baixo. */
59
- const CUMULO_SOMBRA = [1, 12, 24, 1];
60
- export function createSceneSky(ctx) {
61
- const clouds = [];
62
- let birds = [];
63
- let _birdT = 500;
64
- // seedClouds v3: 7 nuvens à deriva no céu do MUNDO (skyLayer)
65
- for (let i = 0; i < 7; i++) {
66
- const s = ctx.criarSprite(ctx.CLOUD_TEX[i % 2]);
67
- s.alpha = 0.5 + ((i * 37) % 30) / 100;
68
- s.x = (i * 173) % ctx.WORLD_PX_W;
69
- s.y = 8 + ((i * 61) % Math.floor(ctx.WORLD_PX_H * 0.30));
70
- s._v = 0.02 + ((i * 13) % 10) / 300;
71
- ctx.skyLayer.addChild(s);
72
- clouds.push(s);
73
- }
74
- function stepSky(dt) {
75
- if (ctx.getRm().decor) {
76
- if (birds.length) {
77
- birds.forEach((b) => { ctx.skyLayer.removeChild(b.s); b.s.destroy(); });
78
- birds = [];
79
- }
80
- return;
81
- }
82
- for (const c of clouds) {
83
- c.x += (c._v || 0) * dt;
84
- if (c.x > ctx.WORLD_PX_W + 50)
85
- c.x = -50;
86
- }
87
- if (birds.length < 3 && ++_birdT >= 520) {
88
- _birdT = ctx.randInt(0, 300);
89
- const dir = ctx.rnd() < 0.5 ? 1 : -1;
90
- const s = ctx.criarSprite(ctx.BIRD_TEX[0]);
91
- s.scale.x = dir;
92
- s.x = dir > 0 ? -10 : ctx.WORLD_PX_W + 10;
93
- s.y = 12 + ctx.rnd() * ctx.WORLD_PX_H * 0.25;
94
- ctx.skyLayer.addChild(s);
95
- birds.push({ s, dir, f: 0, t: 0 });
96
- }
97
- for (let i = birds.length - 1; i >= 0; i--) {
98
- const b = birds[i];
99
- b.s.x += b.dir * 0.7 * dt;
100
- b.t += dt;
101
- if (b.t >= 8) {
102
- b.t = 0;
103
- b.f = 1 - b.f;
104
- b.s.texture = ctx.BIRD_TEX[b.f];
105
- }
106
- if (b.s.x < -16 || b.s.x > ctx.WORLD_PX_W + 16) {
107
- ctx.skyLayer.removeChild(b.s);
108
- b.s.destroy();
109
- birds.splice(i, 1);
110
- }
111
- }
112
- }
113
- function drawV3Cloud(g, x, y, col) {
114
- g.beginFill(ctx.hexN(col[0])).drawRect(x, y + 6, 24, 6).drawRect(x + 2, y + 4, 8, 4).drawRect(x + 3, y + 2, 6, 2)
115
- .drawRect(x + 8, y + 2, 12, 6).drawRect(x + 10, y, 8, 2).drawRect(x + 16, y + 4, 8, 4).endFill();
116
- g.beginFill(ctx.hexN(col[1])).drawRect(x + 1, y + 11, 22, 1).endFill();
117
- }
118
- function drawCumulo(g, nv, col) {
119
- const e = nv.esc, R = (r) => {
120
- g.drawRect(Math.round(nv.x + r[0] * e), Math.round(nv.y + r[1] * e), Math.round(r[2] * e), Math.round(r[3] * e));
121
- };
122
- g.beginFill(ctx.hexN(col[0]), nv.alpha);
123
- for (const r of CUMULO)
124
- R(r);
125
- g.endFill();
126
- g.beginFill(ctx.hexN(col[1]), nv.alpha);
127
- R(CUMULO_SOMBRA);
128
- g.endFill();
129
- }
130
- function drawV3Grass(g, tx, ty, fl, t) {
131
- const TILE = ctx.TILE, x = tx * TILE, y = ty * TILE, wind = ctx.getRm().decor ? 0 : Math.sin(t * 0.045 + tx * 0.6);
132
- g.beginFill(ctx.hexN(fl.base)).drawRect(x, y, TILE, 2).endFill();
133
- g.beginFill(ctx.hexN(fl.top)).drawRect(x, y, TILE, 1).endFill();
134
- const seed = (tx * 1103515245 + 12345) >>> 0;
135
- for (let i = 0; i < 6; i++) {
136
- const bx = (seed >> (i * 4)) & 15, bh = 2 + ((seed >> (i * 4 + 4)) & 1);
137
- g.beginFill(ctx.hexN((i & 1) ? fl.bDk : fl.bLt));
138
- for (let h = 0; h < bh; h++) {
139
- const dx = Math.round(wind * (h / Math.max(1, bh - 1)) * 1.5);
140
- g.drawRect(x + bx + dx, y - 1 - h, 1, 1);
141
- }
142
- g.endFill();
143
- }
144
- if ((seed >> 9) % 7 === 0) {
145
- const fx = x + 4 + (seed % 7), sh = 4, cy = y - sh - 2;
146
- g.beginFill(ctx.hexN(fl.bDk));
147
- let topDx = 0;
148
- for (let h = 0; h < sh; h++) {
149
- topDx = Math.round(wind * (h / sh) * 2.4);
150
- g.drawRect(fx + topDx, y - 1 - h, 1, 1);
151
- }
152
- g.endFill();
153
- const bxC = fx + topDx;
154
- g.beginFill(ctx.hexN(fl.petals[(seed >>> 17) % fl.petals.length])).drawRect(bxC - 1, cy + 1, 3, 1).drawRect(bxC, cy, 1, 3).endFill(); // >>> (v3 usava >> e o canvas engolia o índice; PIXI lança)
155
- g.beginFill(ctx.hexN(fl.center)).drawRect(bxC, cy + 1, 1, 1).endFill();
156
- }
157
- }
158
- function stepV3Decor() {
159
- const T = ctx.CENARIOS[ctx.getCenario()] || {};
160
- ctx.starsG.clear();
161
- ctx.skyDecoG.clear();
162
- ctx.nuvemG.clear();
163
- ctx.fogG.clear();
164
- ctx.grassG.clear();
165
- ctx.themeFxG.clear();
166
- ctx.themeFxBackG.clear();
167
- // A pergunta é "este tema tem decoração viva?", e ela se responde OLHANDO A DECORAÇÃO. Antes era
168
- // `!T.v3`, que respondia "este tema não é a Cidade" — o mesmo resultado por acidente, enquanto a Cidade
169
- // era o único tema sem céu vivo. Um tema de fundo raster COM borboletas quebrava aquilo; este não.
170
- if (!T.decor?.length || ctx.DIRECT_CFG[ctx.getVizMode()])
171
- return; // alto contraste dispensa decor
172
- const t = ctx.getFxClock(), d = T.decor || [], vw = ctx.LOGICAL_W, vh = ctx.LOGICAL_H, reduzido = !!ctx.getRm().decor;
173
- // TELA: estrelas (sparkles v3) — cintilam a ~0,3Hz
174
- if (!reduzido && d.includes('sparkles')) {
175
- const top = Math.max(1, Math.floor(vh * 0.7));
176
- for (let i = 0; i < 22; i++) {
177
- const a = 0.3 + 0.35 * Math.sin(t * 0.03 + i * 1.3);
178
- if (a <= 0.05)
179
- continue;
180
- ctx.starsG.beginFill(0xffffff, a).drawRect((i * 73) % vw, (i * 49) % top, 1, 1).endFill();
181
- }
182
- }
183
- // TELA: nuvens. Dois caminhos, e a diferença é DADO, não gosto:
184
- // · tema com `nuvens: N` (hoje só a Floresta) — manta viva de N cúmulos que fecha e abre com a chuva;
185
- // · os outros três — as 3 lajes da v3, derivas 0.08/0.05/0.11, VERBATIM. Não passaram por aqui de graça:
186
- // o Dev pediu o céu novo para a Floresta, e mudar a aparência dos outros três de carona seria alargar
187
- // o pedido por conta própria. Quando ele quiser, é trocar um número na tabela de cenários.
188
- if (d.includes('nuvens') && T.cloud && T.nuvens) {
189
- const col = T.cloud, junta = reduzido ? 0 : ctx.getAglomeracao();
190
- // `nuvemG` e não `skyDecoG`: a manta fica ATRÁS das bandas de morro (ver a nota no ctx).
191
- for (const nv of nuvensDeTela(reduzido ? 0 : t, vw, T.nuvens, junta))
192
- drawCumulo(ctx.nuvemG, nv, col);
193
- }
194
- else if (d.includes('nuvens') && T.cloud) {
195
- const col = T.cloud, defs = [{ y: 6, sp: 0.08, off: 0 }, { y: 20, sp: 0.05, off: 130 }, { y: 12, sp: 0.11, off: 250 }];
196
- for (const c0 of defs) {
197
- const x = cloudWrapX((reduzido ? 0 : t) * c0.sp + c0.off, -44, vw + 64);
198
- drawV3Cloud(ctx.skyDecoG, x, c0.y, col);
199
- }
200
- }
201
- if (!reduzido && d.includes('passaros')) {
202
- ctx.skyDecoG.beginFill(0x282837, 0.7);
203
- for (let i = 0; i < 3; i++) {
204
- const bx = ((t * (0.25 + i * 0.07) + i * 90) % (vw + 20)) - 10, by = 14 + i * 9 + Math.sin(t * 0.04 + i) * 2, f = Math.sin(t * 0.2 + i) > 0 ? 1 : 2;
205
- const X = Math.round(bx), Y = Math.round(by);
206
- ctx.skyDecoG.drawRect(X - 2, Y + f, 2, 1).drawRect(X + 1, Y + f, 2, 1).drawRect(X, Y, 1, 1);
207
- }
208
- ctx.skyDecoG.endFill();
209
- }
210
- // TELA: névoa do amanhecer (3 camadas onduladas) — v3 exato, na FRENTE
211
- if (d.includes('nevoa')) {
212
- const base = Math.floor(vh * 0.72);
213
- const Ls = [{ y: base, drift: 0.30, amp: 3, op: 0.06, freq: 0.080 }, { y: base + 6, drift: 0.55, amp: 4, op: 0.08, freq: 0.060 }, { y: base + 13, drift: 0.85, amp: 5, op: 0.10, freq: 0.050 }];
214
- for (const L of Ls) {
215
- ctx.fogG.beginFill(0xdee2ec, L.op);
216
- for (let x = 0; x < vw; x += 2) {
217
- const top = L.y + Math.round(L.amp * Math.sin((x + (reduzido ? 0 : t) * L.drift) * L.freq));
218
- ctx.fogG.drawRect(x, top, 2, vh - top);
219
- }
220
- ctx.fogG.endFill();
221
- }
222
- }
223
- // MUNDO (culled por jogador, dedupe): grama em TODA superfície + minhocas/vagalumes/borboletas
224
- const fl = ctx.THEME_FLORA[ctx.getCenario()], seen = new Set();
225
- for (const pl of ctx.getPlayers()) {
226
- if (pl.quit)
227
- continue;
228
- const camX = Math.max(0, Math.min(pl.x - vw / 2, ctx.WORLD_PX_W - vw)), camY = Math.max(0, Math.min((pl.y - ctx.BOX.h / 2) - vh / 2, ctx.WORLD_PX_H - vh));
229
- // Margem de recorte = 3 tiles em TODAS as direções: cobre a flutuação da fauna (borboleta sobe ~34px ≈ 2 tiles,
230
- // deriva ~19px) E reduz pop-in do decor na beirada ao mover a câmera → mais fluido (José). (#69)
231
- const tx0 = Math.max(0, Math.floor(camX / ctx.TILE) - 3), tx1 = Math.min(ctx.WORLD_W - 1, Math.floor((camX + vw) / ctx.TILE) + 3);
232
- const ty0 = Math.max(0, Math.floor(camY / ctx.TILE) - 3), ty1 = Math.min(ctx.WORLD_H - 1, Math.floor((camY + vh) / ctx.TILE) + 3);
233
- for (let tx = tx0; tx <= tx1; tx++) {
234
- for (let ty = ty0; ty <= ty1; ty++) {
235
- const st = ctx.tileAt(tx, ty); // flora/fauna SÓ em PEDRA(2)/parede(6) — nunca em trampolim(5), lava(9) ou escada(4). #69
236
- if (!((st === 2 || st === 6) && !ctx.solidAt(tx, ty - 1) && ctx.tileAt(tx, ty - 1) !== 3 && ctx.tileAt(tx, ty - 1) !== 9))
237
- continue;
238
- const k = tx + ',' + ty;
239
- if (seen.has('g' + k))
240
- continue;
241
- seen.add('g' + k);
242
- // densidade: só uma FRAÇÃO das superfícies recebe flora (getGrassDensity), escolhidas por hash+semente da fase.
243
- if (fl && ((tx * 668265263 ^ ty * 2246822519 ^ ctx.getDecorSeed()) >>> 0) % 1000 < ctx.getGrassDensity() * 1000)
244
- drawV3Grass(ctx.grassG, tx, ty, fl, t);
245
- // #69: fauna distribuída POR SUPERFÍCIE (hash de tx,ty), não "1 por coluna no topo" — aparece em todas as
246
- // alturas, inclusive perto do player em corredores baixos / junto à lava (antes ancorava só na superfície + alta).
247
- if (d.includes('minhocas') && ((tx * 668265263 ^ ty * 374761393) >>> 0) % 6 === 0 && !seen.has('w' + k)) {
248
- seen.add('w' + k); // ~1/6 das superfícies
249
- ctx.themeFxG.beginFill(0xc47b8a);
250
- const bx = tx * ctx.TILE + 5, by = ty * ctx.TILE + 4;
251
- for (let s2 = 0; s2 < 5; s2++)
252
- ctx.themeFxG.drawRect(bx + s2, by + Math.round(reduzido ? 0 : Math.sin(t * 0.15 + tx * 0.7 + s2 * 0.8)), 1, 1);
253
- ctx.themeFxG.endFill();
254
- }
255
- const bh = (tx * 374761393 ^ ty * 668265263) >>> 0; // hash por superfície (cor + lado + gate)
256
- if (!reduzido && d.includes('borboletas') && bh % 7 === 0 && !seen.has('b' + k)) {
257
- seen.add('b' + k); // ~1/7 das superfícies
258
- const cols = [0xff8c42, 0xffd166, 0xef476f, 0xfca5d4, 0xf4a261, 0xe9c46a];
259
- const groundY = ty * ctx.TILE, wx = tx * ctx.TILE + 8 + 14 * Math.sin(t * 0.015 + tx + ty) + 5 * Math.cos(t * 0.04 + tx);
260
- const rise = 8 + 26 * (0.5 + 0.5 * Math.sin(t * 0.012 + tx * 1.3 + ty)), wy = groundY - rise + 4 * Math.sin(t * 0.05 + tx);
261
- const flap = Math.abs(Math.sin(t * 0.4 + tx * 0.7 + ty)), w = 1 + Math.round(flap * 2), X = Math.round(wx), Y = Math.round(wy);
262
- const bfg = (bh & 1) ? ctx.themeFxG : ctx.themeFxBackG; // metade ATRÁS / metade À FRENTE do player — #69
263
- bfg.beginFill(cols[bh % cols.length]).drawRect(X - w, Y, w, 2).drawRect(X + 2, Y, w, 2).endFill();
264
- bfg.beginFill(0x3a2a1a).drawRect(X, Y, 2, 2).endFill();
265
- }
266
- // (sem break: grama em TODAS as superfícies expostas da coluna, não só a mais alta — senão some perto do player. #69)
267
- }
268
- }
269
- if (!reduzido && d.includes('vagalumes')) {
270
- const cell = 64; // drawFireflies v3: grade hash fixa no mundo, só no ar
271
- const cx0 = Math.floor(camX / cell) - 1, cx1 = Math.floor((camX + vw) / cell) + 1, cy0 = Math.floor(camY / cell) - 1, cy1 = Math.floor((camY + vh) / cell) + 1;
272
- for (let cyi = cy0; cyi <= cy1; cyi++)
273
- for (let cxi = cx0; cxi <= cx1; cxi++) {
274
- const h = ((cxi * 73856093) ^ (cyi * 19349663)) >>> 0;
275
- if (h % 3 !== 0)
276
- continue;
277
- const k = 'f' + cxi + ',' + cyi;
278
- if (seen.has(k))
279
- continue;
280
- seen.add(k);
281
- const ph = ((h >> 4) % 628) / 100;
282
- const wx = cxi * cell + 8 + (h % (cell - 16)) + 8 * Math.sin(t * 0.013 + ph), wy = cyi * cell + 8 + ((h >> 9) % (cell - 16)) + 6 * Math.cos(t * 0.017 + ph * 1.3);
283
- const a = 0.45 + 0.45 * Math.sin(t * 0.05 + ph);
284
- if (a <= 0.06)
285
- continue;
286
- if (ctx.solidAt(Math.floor(wx / ctx.TILE), Math.floor(wy / ctx.TILE)))
287
- continue;
288
- ctx.themeFxBackG.beginFill(0xfff096, a * 0.35).drawRect(wx - 1, wy - 1, 3, 3).endFill(); // vaga-lumes ao FUNDO (atrás do player) — #69
289
- ctx.themeFxBackG.beginFill(0xffffbe, a).drawRect(wx, wy, 1, 1).endFill();
290
- }
291
- }
292
- }
293
- }
294
- return { stepSky, stepV3Decor, getClouds: () => clouds, getBirds: () => birds };
295
- }
@@ -1,54 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import { type CenarioTema } from './cenario-data.js';
3
- import type { Tileset } from './world-tex.js';
4
- /** `HTMLImageElement`, reduzido ao que o carregamento usa. */
5
- /** O tileset de um tema: interior + topo. Corresponde ao `Tileset` de render/world-tex. */
6
- /**
7
- * Os dois tiles do tema. `Tileset` vem de `render/world-tex`, que é o dono — ele os desenha, e por isso
8
- * sabe que são `CanvasImageSource`. A versão que estava aqui dizia `unknown` nos dois campos: uma
9
- * descrição que apenas SE PARECE com a real, que é o que o ADR-0039 proíbe. O `unknown` não protegia
10
- * nada — só empurrava a conversão para quem recebesse.
11
- */
12
- export type TilesDoTema = Tileset;
13
- /** `worldSprite` — só a troca de textura. */
14
- interface SpriteComTextura {
15
- texture: unknown;
16
- }
17
- /**
18
- * Baixa `tile_fill.png` + `tile_surface.png` do tema. Resolve com os dois, ou com `null` se QUALQUER um falhar.
19
- *
20
- * Verbatim do `loadTileImages` do monólito, `fail` inclusive: quando uma das imagens erra, o `res(null)` sai na
21
- * hora e a outra, ao chegar, encontra `fail` ligado e não resolve por cima. A promessa nunca REJEITA — tema sem
22
- * arte é um caminho normal (a Cidade não tem tileset próprio), não um erro, e uma rejeição aqui derrubaria a
23
- * troca de cenário inteira. Nunca pendura: os dois lados de cada imagem estão cobertos.
24
- */
25
- export interface SetCenarioCtx {
26
- setCenarioValue: (theme: string) => void;
27
- getCenario: () => string;
28
- aplicarTemaParallax: (theme: string, T: CenarioTema) => void;
29
- /**
30
- * Os tiles do tema, SÍNCRONOS. Eram dois PNG baixados por `carregarTilesDoTema`; hoje a Cidade os desenha
31
- * (render/city-tiles) e os outros temas devolvem `null`, que é o caminho dos blocos v3 — o mesmo `null` de
32
- * antes, agora imediato em vez de prometido.
33
- */
34
- getTiles: (tema: string) => TilesDoTema | null;
35
- /** Builder da canvas do nível. `HTMLCanvasElement` e não `unknown`: é o que o `render/world-tex`
36
- * devolve, e o `unknown` só adiava a conversão até o `main.ts`, onde ela virava erro (ADR-0039). */
37
- worldCanvas: (tiles: TilesDoTema | null) => HTMLCanvasElement;
38
- tex: (canvas: HTMLCanvasElement) => unknown;
39
- clearWorldTexCache: () => void;
40
- /** Escreve `worldCanvasNormal`/`worldTexNormal` (os dois `let` do composition root), sempre em par. A
41
- * TEXTURA segue `unknown` de propósito — é objeto do PixiJS, e este módulo roda no project `node`. */
42
- setWorldTextures: (canvas: HTMLCanvasElement, textura: unknown) => void;
43
- isVizReady: () => boolean;
44
- reapplyVizAll: () => void;
45
- getWorldSprite: () => SpriteComTextura | null | undefined;
46
- isVidaReady: () => boolean;
47
- applyCenarioVida: () => void;
48
- }
49
- export interface SetCenarioApi {
50
- /** Troca o cenário. Valida, persiste, repinta o fundo, refaz o mundo e avisa quem depende. */
51
- setCenario(theme: string): void;
52
- }
53
- export declare function createSetCenario(ctx: SetCenarioCtx): SetCenarioApi;
54
- export {};
@@ -1,103 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // render/set-cenario — TROCAR DE CENÁRIO: a única porta por onde o jogo muda de mundo visual.
3
- //
4
- // `setCenario(tema)` é chamado de quatro lugares muito diferentes — o splash (a criança escolhe antes de
5
- // começar), a demonstração automática (game/attract.ts sorteia), o console de testes (`window.__incl`) e o
6
- // BOOT (restauração do tema salvo em `incl_cenario`) — e sempre faz a mesma sequência de cinco passos. Esta
7
- // função é ORQUESTRAÇÃO: ela não desenha nada, não gera textura nenhuma e não sabe fórmula alguma. Ela decide
8
- // QUEM é avisado, EM QUE ORDEM, e o que fazer quando a resposta demora.
9
- //
10
- // ======================= POR QUE ISTO É UM MÓDULO, E NÃO FIAÇÃO NO game.js =======================
11
- // A tentação era deixá-la no monólito como cola: quase toda linha dela chama alguém de fora, e o contexto
12
- // injetado aqui é largo. Três coisas decidiram o contrário, e nenhuma delas é estética:
13
- //
14
- // 1. A GUARDA DE CORRIDA. Os tiles do tema (`tile_fill.png`/`tile_surface.png`) chegam quando chegarem, e
15
- // entre o pedido e a chegada a pessoa pode ter trocado de cenário de novo — no splash isso é UM segundo
16
- // de distância, e na demonstração automática o troca-troca é o comportamento normal. Por isso o `.then`
17
- // abre com `if (getCenario() !== theme) return`: um tileset atrasado do Campo não pode repintar o chão da
18
- // Floresta. É a espécie de defeito que aparece uma vez a cada cem trocas, some quando alguém vai olhar, e
19
- // não tem como ser reproduzido de mão com confiança. Fora de um módulo, ele não tem como ter teste.
20
- // 2. A ORDEM DOS AVISOS. `setCenarioValue` (core/state.js — valor, persistência e evento) vem ANTES de
21
- // qualquer trabalho de textura, e é isso que faz a guarda de corrida do item 1 funcionar: quem compara
22
- // `getCenario() !== theme` está comparando com o valor que ESTA chamada gravou. Inverter as duas linhas
23
- // não quebra nada visível e desarma a guarda inteira, silenciosamente.
24
- // 3. A VALIDAÇÃO. "Tema desconhecido → 'cidade'" é a rede que segura um `incl_cenario` de uma versão antiga
25
- // (e o boot ainda migra a chave 'noite' → 'espaco', do lado do game.js). Ela virou
26
- // `normalizarCenario` em render/cenario-data.ts, com o comportamento atual PREGADO por teste, defeito de
27
- // herança de protótipo incluído — ver o cabeçalho de lá.
28
- //
29
- // ======================= OS CINCO PASSOS, E POR QUE NESTA ORDEM =======================
30
- // 1. valida o tema → `normalizarCenario`
31
- // 2. grava e persiste → `setCenarioValue` (core/state.js). ANTES do resto: arma as guardas de corrida.
32
- // 3. veste o FUNDO → `aplicarTemaParallax` (render/parallax.ts) — síncrono nos temas v3, PNG na Cidade
33
- // 4. pede os TILES do tema → assíncrono; ao chegar, refaz a textura do MUNDO e reaplica os modos de visão
34
- // 5. avisa quem depende → vida ambiente da Cidade (síncrono) e alto contraste (síncrono)
35
- // O passo 5 roda ANTES de o passo 4 terminar, e isso é de propósito: a vida ambiente e o recolor não esperam
36
- // download nenhum. O passo 4 reaplica o recolor DE NOVO quando os tiles chegam, porque aí a textura do mundo
37
- // mudou — os dois `reapplyVizAll` não são duplicação, são dois momentos.
38
- //
39
- // ======================= O QUE FICOU DE FORA, E POR QUÊ =======================
40
- // · O DADO dos temas → render/cenario-data.ts (folha, sem dependência). Importado aqui, não injetado: é um
41
- // módulo sem efeito nenhum, então importá-lo não cria risco de ordem de boot.
42
- // · A geometria e a pintura das 3 camadas de fundo → render/parallax.ts. Este módulo só chama
43
- // `aplicarTemaParallax` e não sabe o que é `tilePosition`.
44
- // · As FÓRMULAS de céu/morros/placeholder → render/scene-parallax.ts (desde o Estágio 4).
45
- // · O BUILDER da textura do mundo (`worldCanvas`) → render/world-tex.ts. Aqui só entra o resultado.
46
- // · A migração da chave antiga ('noite' → 'espaco') e o `try/catch` do boot FICAM no game.js: são política de
47
- // persistência e rede de segurança do arranque, não regra de cenário.
48
- // · `worldCanvasNormal`/`worldTexNormal` continuam sendo `let` do game.js — são lidos por
49
- // render/high-contrast (por getter) e pelo render estático. Este módulo os ESCREVE por um único
50
- // `setWorldTextures(canvas, textura)`, para que a dupla nunca fique meio trocada.
51
- //
52
- // ======================= ⚠️ A ARMADILHA DE BOOT DESTA REGIÃO =======================
53
- // O `setCenario` do boot é chamado MUITO cedo — logo depois de `initViewports`, e antes de metade do jogo
54
- // existir. O monólito o embrulha num `try/catch` que cai para 'cidade' EM SILÊNCIO, e é por isso que uma
55
- // dependência ausente aqui não vira erro: vira "o tema que a criança escolheu não voltou, e ninguém sabe por
56
- // quê". Todas as dependências que ainda não existem naquele instante entram por GETTER ou por CALLBACK, nunca
57
- // por valor, exatamente para que a montagem do ctx não toque em `const` em TDZ:
58
- // · `isVizReady`/`reapplyVizAll` — `vizReady` só vira `true` lá no fim do boot; no arranque as duas voltas
59
- // de `reapplyVizAll` são puladas, e quem pinta é o `else if (worldSprite)` do passo 4.
60
- // · `getWorldSprite` — o sprite do mundo nasce DEPOIS deste ponto no game.js. Só é tocado dentro do `.then`,
61
- // que é assíncrono, mas o getter garante que a montagem do ctx não o dereferencie.
62
- // · `isVidaReady`/`applyCenarioVida` — `sceneCity` nasce centenas de linhas depois; `_vidaReady` é `false`
63
- // no boot justamente para que esta chamada seja pulada, e o game.js chama `applyCenarioVida()` uma vez, à
64
- // mão, quando a cena da cidade fica pronta.
65
- // · `clearWorldTexCache` vem de render/high-contrast, que é um módulo de verdade e já existe no import.
66
- //
67
- // SEM I/O NO IMPORT, e agora sem I/O NENHUM: `carregarTilesDoTema` (a carga assíncrona dos PNG de tile, com a
68
- // guarda de corrida que ela exigia) foi APAGADA no item 17 — os tiles da Cidade viraram dados em
69
- // `render/city-tiles`. O corpo do módulo não pede nada, e a troca de cenário virou síncrona.
70
- // Ver docs/5-Refactoring/plano-modularizacao-mapa.md (D2-b).
71
- import { CENARIOS, normalizarCenario } from './cenario-data.js';
72
- export function createSetCenario(ctx) {
73
- function setCenario(theme) {
74
- const tema = normalizarCenario(theme);
75
- ctx.setCenarioValue(tema); // ANTES do trabalho de textura: é o valor com que as guardas de corrida comparam
76
- const T = CENARIOS[tema];
77
- ctx.aplicarTemaParallax(tema, T); // as 3 camadas de fundo (render/parallax.ts)
78
- // TILES do tema: SÍNCRONOS. v3: blocos Clarity SEM recolor (o `worldCanvas` cai no desenho da v3 com null).
79
- //
80
- // A GUARDA DE CORRIDA MORREU JUNTO COM A CORRIDA. Havia um `if (getCenario() !== tema) return` aqui, e ele
81
- // estava certo enquanto os tiles chegavam por `Promise`: trocar de cenário durante o download deixava a
82
- // resposta antiga pintar por cima da nova. Sem download não há "durante", e guarda contra corrida que não
83
- // existe mais é código que só pode confundir quem o ler depois.
84
- const tiles = ctx.getTiles(tema);
85
- const cv = ctx.worldCanvas(tiles), t = ctx.tex(cv);
86
- ctx.setWorldTextures(cv, t);
87
- ctx.clearWorldTexCache();
88
- if (ctx.isVizReady())
89
- ctx.reapplyVizAll();
90
- else {
91
- const sprite = ctx.getWorldSprite(); // no boot o recolor ainda não existe: pinta o sprite direto
92
- if (sprite)
93
- sprite.texture = t;
94
- }
95
- // (o Cenário saiu do menu de pausa — a escolha é do J1 no splash, antes de começar)
96
- if (ctx.isVidaReady())
97
- ctx.applyCenarioVida(); // liga/desliga carros/deco da cidade e semeia o tema
98
- if (ctx.isVizReady())
99
- ctx.reapplyVizAll(); // reaplica o cenário recolorido (só após o init montar tudo)
100
- // incl_cenario é persistido por setCenarioValue (core/state.js)
101
- }
102
- return { setCenario };
103
- }
@@ -1,75 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import { tex } from './canvas.js';
3
- type Tex = ReturnType<typeof tex>;
4
- /** Alto-contraste plumbing this module needs but does not own — game.js keeps the mutable source of truth
5
- * (world/coin/tree/parallax texture pipelines share the same DIRECT_CFG/directSpriteCanvas; `disp` also
6
- * serves quiz rendering outside textures). Call once at boot, before the first letterTexture/pupTexFor. */
7
- export interface TexturesCtx {
8
- /**
9
- * IDS DAS FORMAS a pré-desenhar. Eram importados de `game/activity-content` (as dez formas da atividade de
10
- * soma e subtração) — uma aresta de importação da ENGINE para o JOGO por causa de UMA linha do `initTextures`.
11
- *
12
- * O ADR-0027 conta essas arestas porque elas decidem o que um pacote arrasta: um módulo de render que importa
13
- * conteúdo de matemática não se empacota sem levar o currículo junto. E o custo escondido era maior que a
14
- * aresta — esta era também a única razão de `render/viz-setters` arrastar `game/`, por transitividade.
15
- *
16
- * Só os IDS, e não a lista de formas: este módulo desenha por id (`shapeTexture(id)`) e nunca leu o nome em
17
- * português. Pedir a estrutura inteira seria pedir mais do que se usa, que é como uma aresta volta.
18
- */
19
- shapes: readonly string[];
20
- /**
21
- * OS PODERES a pré-desenhar, com a arte pronta. Mesma razão de `shapes`, um passo adiante: além da lista,
22
- * entra o CANVAS de cada um — porque o ícone de voo, o de ventosa e o da bengala de corrida são arte deste
23
- * jogo, e não geometria que a engine saiba desenhar sozinha.
24
- *
25
- * Era `PUP_KINDS` cravado aqui + `import { powerupCanvas } from './props.js'`. A arte mudou de camada no
26
- * item 19 (`game/props`), e esta era a única aresta que a mudança criaria — some por injeção, e não por
27
- * mudança de endereço.
28
- */
29
- powerups: readonly {
30
- readonly kind: string;
31
- readonly canvas: HTMLCanvasElement;
32
- }[];
33
- disp: (s: string) => string;
34
- directCfg: Record<string, {
35
- off: number;
36
- mul: number;
37
- bgMul: number;
38
- }>;
39
- directSpriteCanvas: (src: HTMLCanvasElement, mode: string) => HTMLCanvasElement;
40
- }
41
- /** Vertex list for the polygon shapes (PURE — no canvas). null = drawn via an arc/ellipse/rect primitive instead. */
42
- export declare function shapePoints(id: string, cx: number, cy: number, r: number): [number, number][] | null;
43
- /** 16×16 icon for a soma/subtração shape id (cyan fill + dark outline). */
44
- export declare function shapeTexture(id: string): Tex;
45
- /** Cache keyed by shape id — filled by initTextures (the injected id list never changes at runtime). */
46
- export declare const SHAPE_TEX: Record<string, Tex>;
47
- /** 16×16 rounded-square tile with a single letter (uses the injected `disp`, which honors letterCase). */
48
- export declare function letterTexture(ch: string): Tex;
49
- /** Normal-mode cache — filled by initTextures. */
50
- export declare const PUP_TEX: Record<string, Tex>;
51
- /** Power-up texture for `mode` (normal or alto-contraste-direto). Cached per mode×kind. */
52
- export declare function pupTexFor(kind: string, mode: string): Tex;
53
- /** Drops the alto-contraste power-up cache — game.js's _rebakeDirect clears world/coin/pup/player caches
54
- * together whenever outline thickness or role colors change. Call it from there instead of touching a private. */
55
- export declare function resetPupTexCache(): void;
56
- /** Fills SHAPE_TEX/PUP_TEX (+ wires the alto-contraste deps). Call ONCE at boot, before the first rebuildCoins/
57
- * rebuildExtras — mirrors game.js's old eager `const SHAPE_TEX=...; SOMASUB_SHAPES.forEach(...)` / PUP_CANVAS
58
- * forEach, just deferred past import time so this module stays side-effect-free to import (node tests included). */
59
- export declare function initTextures(ctx: TexturesCtx): void;
60
- export declare const PIP_W = 24, PIP_H = 32;
61
- export declare const PIP_PAL: string[];
62
- export declare const PIP_IDLE: string[];
63
- export declare const PIP_WALK: string[][];
64
- /** Valid palette digit (7 = transparent background, skipped); robust to short/ragged rows. */
65
- export declare const isPix: (ch: string) => boolean;
66
- export declare function indexedToCanvas(rows: string[]): HTMLCanvasElement;
67
- export declare function silhouetteCanvasIdx(rows: string[]): HTMLCanvasElement;
68
- export declare const PLAYER_IDLE: string[];
69
- export declare const PLAYER_WALK: string[];
70
- export declare const PLAYER_CLIMB: string[];
71
- export declare const PLAYER_HURT: string[];
72
- /** Verbatim reproduction of game.js's old eager `const TEX={idle:tex(spriteToCanvas(PLAYER_IDLE)),...}` — never
73
- * auto-run (see header note above). Unused today; kept callable in case a future caller resurfaces. */
74
- export declare function buildLegacyPlayerTex(): Record<string, Tex>;
75
- export {};