@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,152 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // render/player-anim.ts — A ESCOLHA DO QUADRO do personagem: dado o estado do jogador, QUAL textura desenhar.
3
- // Extraída verbatim da segunda metade do `stepPlayer` do game.js (o trecho E15/E16/E17/E19/E20, de
4
- // `const COYOTE=5` até `pl._tx=tx`). Ela morava dentro da função de física por acidente histórico — mas não é
5
- // física: não move ninguém, não colide, não lê o mundo. É uma DECISÃO PURA a partir do estado já simulado,
6
- // e é por isso que ela é render e mora aqui, ao lado de render/sprites (quem cria as texturas) e de
7
- // render/viewports (quem as recolore por modo de visão).
8
- //
9
- // POR QUE A FRONTEIRA CAIU EXATAMENTE AQUI
10
- // O `stepPlayer` do monólito fazia quatro coisas em sequência: (1) física, (2) coleta de moeda/quiz,
11
- // (3) power-ups + chave/portão, (4) animação. A (1) já saiu para game/physics.ts (B1), que devolve
12
- // `{ran, dir}` — e `dir` existe justamente porque a animação lê a DIREÇÃO DO INPUT, não `vx` (a colisão zera
13
- // `vx` por quadros inteiros e isso reiniciava o ciclo de passos; só apareciam 2 dos 8 quadros). As (2) e (3)
14
- // são LÓGICA DE JOGO — dependem de `coins`, `powerups`, `gate`, do quiz e do HUD — e continuam no game.js;
15
- // não vieram junto de propósito, porque arrastá-las para cá traria de volta metade do monólito.
16
- // O corte começa em `const COYOTE=5` e termina em `pl._tx=tx`. A ÚLTIMA linha do original,
17
- // `if(pl.sprite) pl.sprite.texture=playerVizTex(tx, pl.viz)`, NÃO está aqui: ela toca um sprite do PIXI e o
18
- // recolor por modo de visão. Ela vive em render/draw.ts (`animatePlayer`), que é quem já lida com PIXI.
19
- // Assim este arquivo fica sem PIXI, sem DOM e sem estado de módulo — testável quadro a quadro no project
20
- // `node` do Vitest.
21
- //
22
- // O QUE É "PURO" AQUI (e o que não é)
23
- // A função é DETERMINÍSTICA dado `(pl, env)` e não faz I/O nenhum. Ela ESCREVE em `pl`, e isso é contrato,
24
- // não efeito colateral escondido: os relógios de animação (`anim`, `walkAnim`, `idleTime`, `flavorT`),
25
- // o quadro congelado da ventosa (`climbFrame`), o estado da gracinha (`flavor`) e as flags que o RESTO do
26
- // jogo lê (`walking`/`running`, que a bengala do modo cego consome em draw; `idleNow`; `_tx`, o quadro-base
27
- // em cor que o multi-tela recolore por viewport) moram no objeto do jogador desde o v3. Mover esses campos
28
- // para dentro do módulo criaria um segundo lugar de verdade sobre o jogador — o oposto do que a
29
- // modularização quer. O teste, por isso, sonda `pl` depois da chamada tanto quanto o valor de retorno.
30
- //
31
- // INJEÇÃO: `held` E `rnd` ENTRAM PELO `env`, NÃO POR IMPORT — e isso é um DESVIO CONSCIENTE do precedente de
32
- // game/physics.ts, que importa os dois. Lá a âncora de regressão são as 14 trajetórias-ouro, que exigem o
33
- // singleton de input e o RNG semeado reais; aqui não há trajetória-ouro nenhuma, e o valor da extração é
34
- // poder atravessar a cadeia de prioridade ramo a ramo. Com `held` injetado, um teste liga "Correr" sem
35
- // montar `keys`+`ctrl`+`padCur`; com `rnd` injetado, a gracinha sorteada é ESCOLHIDA em vez de descoberta.
36
- // O game.js passa exatamente os mesmos `held` (input/state) e `rnd` (core/rng), então a ordem de consumo da
37
- // semente — de que o attract-mode/replay depende — fica idêntica à do monólito.
38
- // As texturas também entram pelo `env` (`env.tex`): os `TEX_*` de render/sprites são bindings VIVOS que só
39
- // `initCharacterSprites()` preenche, e importá-los aqui amarraria o módulo ao boot do PIXI justamente na
40
- // parte que queremos testar sem ele. `ANIM` (as cadências) é constante pura → import normal.
41
- //
42
- // ARMADILHA DE ORDEM DE BOOT: nenhuma. O módulo não tem estado próprio nem toca nada no import.
43
- import { ANIM } from '../core/constants.js';
44
- /**
45
- * Coyote-time da ANIMAÇÃO (E16), em quadros. Existe para matar o flicker walk↔jump no pouso: `onGround`
46
- * pisca por 1 quadro ao repousar, e sem essa folga o personagem alternava entre andar e pular ao aterrissar.
47
- * É o coyote do RENDER e é independente do coyote da física (game/physics) — mudar um não muda o outro.
48
- */
49
- export const COYOTE = 5;
50
- /**
51
- * Escolhe o quadro do jogador para ESTE tick e adianta os relógios de animação.
52
- *
53
- * Cadeia de prioridade E17, do mais específico ao mais genérico — a ORDEM é a regra, não um detalhe:
54
- * ventosa → escada → água → voo → aéreo(pulo) → andando → idle
55
- * Estar na água DENTRO de uma escada mostra escada; grudado na parede dentro d'água mostra ventosa.
56
- *
57
- * Também escreve em `pl` (ver AnimPlayer): `walking`/`running` (bengala), `idleNow`, os relógios e `_tx`.
58
- *
59
- * @returns o quadro escolhido (o mesmo valor que fica em `pl._tx`).
60
- */
61
- export function choosePlayerFrame(pl, env) {
62
- const { dt, dir, tex, wheelchair } = env;
63
- const held = env.held, rnd = env.rnd;
64
- // E16: estado aéreo ESTÁVEL — subindo (vy<0) entra na hora; cair/sair de borda só após o coyote-time.
65
- const grounded = pl.airTime <= COYOTE;
66
- const airborne = !pl.clinging && ((pl.vy < 0 && !pl.onGround) || !grounded);
67
- // 'moving' baseado no INPUT (direção segurada), NÃO em vx — a colisão zera vx por quadros e isso resetava
68
- // o ciclo (só apareciam 2 dos 8 quadros). Assim os 8 quadros tocam contínuos.
69
- const moving = (dir !== 0) && grounded && !pl.clinging;
70
- pl.walking = moving && !pl.inWater && !pl.onLadder && !pl.flying; // p/ a bengala: só aparece andando
71
- pl.running = pl.walking && held(pl, 'action1') && !!pl.runCane; // correndo: só com a bengala de corrida
72
- pl.anim += dt; // idle (clock contínuo)
73
- pl.walkAnim += dt; // clock do passo NUNCA reseta → ciclo de 8 sem reinício
74
- const II = tex.idle;
75
- const wcFreeze = wheelchair || !!pl.rmWalk; // cadeirante: pernas paradas — mesma via do movimento reduzido
76
- let tx;
77
- pl.idleNow = false;
78
- if (pl.clinging) {
79
- const ceil = (pl.clingN === 'U'); // E18f: teto e parede usam ciclos distintos
80
- const CL = ceil ? tex.clingCeil : tex.clingWall;
81
- if (!pl.rmWalk && (pl.vx !== 0 || pl.vy !== 0))
82
- pl.climbFrame = (Math.floor(pl.walkAnim / ANIM.clingHold)) % CL.length; // só avança ao mover; parado MANTÉM o quadro
83
- tx = CL[(pl.rmWalk ? 0 : (pl.climbFrame || 0)) % CL.length];
84
- }
85
- else if (pl.onLadder) {
86
- const CB = tex.climb;
87
- if (wheelchair) {
88
- tx = II[0];
89
- } // ELEVADOR cadeirante: pose PARADA (idle), não de escada
90
- else {
91
- const climbing = (pl.vy !== 0) && !pl.rmWalk;
92
- tx = climbing ? CB[Math.floor(pl.walkAnim / ANIM.climbHold) % CB.length] : CB[0];
93
- }
94
- }
95
- else if (pl.inWater) {
96
- const stroking = ((dir !== 0) || held(pl, 'action2')) && !wcFreeze; // movendo = braçada; parado/congelado = pernas paradas
97
- const SW = stroking ? tex.swim : tex.swimIdle;
98
- tx = wcFreeze ? SW[0] : SW[Math.floor(pl.walkAnim / ANIM.swimHold) % SW.length];
99
- }
100
- else if (pl.flying) {
101
- tx = tex.fly;
102
- }
103
- else if (airborne) {
104
- if (wcFreeze)
105
- tx = wheelchair ? II[0] : tex.jumpUp; // cadeirante caindo = pose neutra sentado; congelado = pulo num quadro
106
- else
107
- tx = pl.vy < 0 ? tex.jumpUp : tex.jumpDown; // subindo: pernas recolhidas / caindo: estendidas
108
- }
109
- else if (moving) {
110
- if (wcFreeze) {
111
- tx = II[0];
112
- } // cadeirante/movimento reduzido: anda sem ciclo de passos
113
- else {
114
- const running = held(pl, 'action1'); // E19: correr ≠ andar — passada/cadência distintas
115
- const M = running ? tex.run : tex.walk;
116
- const hold = running ? ANIM.runHold : ANIM.walkHold;
117
- tx = M[Math.floor(pl.walkAnim / hold) % M.length];
118
- }
119
- }
120
- else {
121
- pl.idleNow = true;
122
- pl.idleTime += dt; // E20: parado → respira; após flavorDelay, uma gracinha
123
- if (!pl.rmFlavor) { // gracinhas (toggle próprio — há quem se incomode)
124
- if (pl.flavor < 0 && pl.idleTime > ANIM.flavorDelay) {
125
- pl.flavor = Math.floor(rnd() * tex.flavors.length);
126
- pl.flavorT = 0;
127
- }
128
- if (pl.flavor >= 0) {
129
- const F = tex.flavors[pl.flavor];
130
- const step = Math.floor(pl.flavorT / F.hold);
131
- pl.flavorT += dt;
132
- if (step >= F.seq.length) {
133
- pl.flavor = -1;
134
- pl.idleTime = 0;
135
- }
136
- else {
137
- tx = F.tex[F.seq[step]];
138
- }
139
- }
140
- }
141
- else
142
- pl.flavor = -1;
143
- if (pl.flavor < 0)
144
- tx = pl.rmBreath ? II[0] : II[Math.floor(pl.anim / ANIM.idleHold) % II.length]; // respiração: congela ou cicla
145
- }
146
- if (!pl.idleNow) {
147
- pl.idleTime = 0;
148
- pl.flavor = -1;
149
- } // saiu do idle → zera gracinha
150
- pl._tx = tx; // quadro base (cor) p/ recolor por viewport
151
- return tx;
152
- }
@@ -1,48 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import type { PixelPainter } from './canvas.js';
3
- export type Material = 'papel' | 'plastico' | 'metal' | 'vidro';
4
- export type Lixeira = 'azul' | 'vermelha' | 'amarela' | 'verde';
5
- /** Latinha de alumínio 6×9 — corpo prateado, tampa e base mais escuras, brilho de uma coluna. */
6
- export declare const paintLatinha: PixelPainter;
7
- /** Garrafa PET 6×11 — gargalo estreito, tampa, corpo translúcido esverdeado. */
8
- export declare const paintGarrafaPet: PixelPainter;
9
- /** Pote de vidro 8×9 — boca larga, tampa metálica, corpo azulado transparente. */
10
- export declare const paintPoteDeVidro: PixelPainter;
11
- /** Caixa de papelão 10×9 — papelão liso, aba superior e fita no meio. */
12
- export declare const paintCaixaDePapelao: PixelPainter;
13
- /** Catálogo dos objetos: tamanho do canvas + pintor. As chaves são os `Material` de `game/recycling`. */
14
- export declare const LIXO_ART: Readonly<Record<Material, {
15
- w: number;
16
- h: number;
17
- paint: PixelPainter;
18
- }>>;
19
- export declare const LIXEIRA_W = 12, LIXEIRA_H = 15;
20
- /** A cor de cada lixeira, na CONAMA 275/2001. Corpo e um tom escuro para tampa, aro e sombra. */
21
- export declare const COR_DA_LIXEIRA: Readonly<Record<Lixeira, {
22
- corpo: string;
23
- escuro: string;
24
- }>>;
25
- /**
26
- * Uma lixeira 12×15 — corpo levemente cônico, tampa saliente, alça e o símbolo da reciclagem em três traços.
27
- *
28
- * ⚠️ O SÍMBOLO É CLARO SOBRE O CORPO, e não uma quinta cor: em alto contraste e nos filtros de daltonismo, o que
29
- * distingue as quatro lixeiras é a cor do corpo, e um símbolo colorido competiria com ela. Claro sobre escuro
30
- * sobrevive a qualquer um dos dezesseis modos de visão.
31
- */
32
- export declare const paintLixeira: (cor: Lixeira) => PixelPainter;
33
- export declare const PLACA_W = 20, PLACA_H = 28;
34
- /**
35
- * A placa 20×28: disco vermelho vazado, a pessoa jogando lixo em preto, a barra da proibição e o poste.
36
- *
37
- * Ela é o rosto de uma regra que o jogo NÃO pune (ver `game/recycling`): quem carrega lixo simplesmente não
38
- * passa daqui. A placa existe para que a criança saiba POR QUE não passou — sem ela, a barreira seria um bug
39
- * aos olhos de quem joga.
40
- */
41
- export declare const paintPlaca: PixelPainter;
42
- export interface RecyclingTextures {
43
- lixo: Record<Material, unknown>;
44
- lixeira: Record<Lixeira, unknown>;
45
- placa: unknown;
46
- }
47
- /** Assa tudo uma vez. Chamada pela raiz de composição no boot — nunca no import (ver o cabeçalho). */
48
- export declare function createRecyclingTextures(): RecyclingTextures;
@@ -1,164 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // render/recycling-tex — a ARTE PROCEDURAL do lixo reciclável e das quatro lixeiras.
3
- //
4
- // Mesma técnica de `render/city-tex` (retângulos carimbados por `pixelCanvas`), e por isso mesmo um módulo à
5
- // parte e não um bloco lá dentro: `city-tex` é a arte DA RUA — bichos, pedestres, carros —, e o seu cabeçalho
6
- // diz com todas as letras que "props é decoração de QUALQUER cenário" e fica fora. Lixo e lixeira aparecem em
7
- // qualquer tema, então seguem a regra que aquele arquivo escreveu para si.
8
- //
9
- // SEM I/O NO IMPORT, pelo mesmo motivo que lá: `makeCanvas` toca `document`, e um módulo de `render/` é
10
- // importado pelo project `node` do Vitest. Não há constante pronta aqui — há `createRecyclingTextures()`, que a
11
- // raiz de composição chama uma vez no boot.
12
- //
13
- // ========================= POR QUE PROCEDURAL, E NÃO PNG =========================
14
- // O pilar diz "arte = dados: nenhum PNG embutido no jogo" (ADR-0010/0018). Quatro objetos e quatro lixeiras em
15
- // PNG seriam oito arquivos a versionar, precachear e recolorir à mão em cada modo de visão. Como retângulos,
16
- // eles são LIDOS pelo alto contraste e pelos filtros de daltonismo como o resto do mundo, sem exceção e sem
17
- // arquivo `_hc` paralelo — que é a dívida que o atlas de sprites do personagem ainda carrega.
18
- //
19
- // ========================= AS CORES SÃO CONTEÚDO =========================
20
- // As lixeiras seguem a Resolução CONAMA 275/2001, que é o padrão da rua brasileira: AZUL papel, VERMELHA
21
- // plástico, AMARELA metal, VERDE vidro. A criança que aprende a cor aqui reconhece a de fora — trocar uma por
22
- // gosto ensina errado. O gate compara este arquivo com `game/recycling`, que é quem decide o acerto, para que
23
- // as duas listas não possam divergir em silêncio.
24
- import { pixelTexture } from './canvas.js';
25
- /* ===================== os quatro objetos ===================== */
26
- // Miúdos de propósito: ficam no chão, ao lado de moedas, num mundo de 320×180. Grandes demais viram obstáculo
27
- // visual; pequenos demais somem para quem tem baixa visão — a faixa útil aqui é 6 a 11 px de largura.
28
- /** Latinha de alumínio 6×9 — corpo prateado, tampa e base mais escuras, brilho de uma coluna. */
29
- export const paintLatinha = (px) => {
30
- px(1, 1, 4, 7, '#b9c2cc'); // corpo
31
- px(1, 0, 4, 1, '#8b949e'); // tampa
32
- px(1, 8, 4, 1, '#8b949e'); // base
33
- px(2, 2, 1, 5, '#e6ecf2'); // brilho
34
- px(0, 2, 1, 5, '#8b949e'); // sombra do lado
35
- };
36
- /** Garrafa PET 6×11 — gargalo estreito, tampa, corpo translúcido esverdeado. */
37
- export const paintGarrafaPet = (px) => {
38
- px(2, 0, 2, 1, '#2f6fd0'); // tampa azul
39
- px(2, 1, 2, 2, '#bfe6d8'); // gargalo
40
- px(1, 3, 4, 7, '#a8dcc9'); // corpo
41
- px(2, 4, 1, 5, '#dcf3ea'); // brilho
42
- px(1, 10, 4, 1, '#7fbfa8'); // base
43
- };
44
- /** Pote de vidro 8×9 — boca larga, tampa metálica, corpo azulado transparente. */
45
- export const paintPoteDeVidro = (px) => {
46
- px(1, 0, 6, 1, '#8b949e'); // tampa
47
- px(1, 1, 6, 1, '#6f7883'); // aro
48
- px(1, 2, 6, 6, '#a9cfe0'); // corpo
49
- px(2, 3, 1, 4, '#e2f2f8'); // brilho
50
- px(1, 8, 6, 1, '#7fa8ba'); // base
51
- };
52
- /** Caixa de papelão 10×9 — papelão liso, aba superior e fita no meio. */
53
- export const paintCaixaDePapelao = (px) => {
54
- px(0, 1, 10, 8, '#c39a63'); // corpo
55
- px(0, 0, 10, 1, '#a37f4f'); // aba de cima
56
- px(4, 0, 2, 9, '#d9bb90'); // fita vertical
57
- px(0, 4, 10, 1, '#a37f4f'); // vinco
58
- };
59
- /** Catálogo dos objetos: tamanho do canvas + pintor. As chaves são os `Material` de `game/recycling`. */
60
- export const LIXO_ART = Object.freeze({
61
- metal: { w: 6, h: 9, paint: paintLatinha },
62
- plastico: { w: 6, h: 11, paint: paintGarrafaPet },
63
- vidro: { w: 8, h: 9, paint: paintPoteDeVidro },
64
- papel: { w: 10, h: 9, paint: paintCaixaDePapelao },
65
- });
66
- /* ===================== as quatro lixeiras ===================== */
67
- export const LIXEIRA_W = 12, LIXEIRA_H = 15;
68
- /** A cor de cada lixeira, na CONAMA 275/2001. Corpo e um tom escuro para tampa, aro e sombra. */
69
- export const COR_DA_LIXEIRA = Object.freeze({
70
- azul: { corpo: '#2f6fd0', escuro: '#1e4a8c' },
71
- vermelha: { corpo: '#c8372d', escuro: '#8d251e' },
72
- amarela: { corpo: '#e0b423', escuro: '#a07d13' },
73
- verde: { corpo: '#2f9e52', escuro: '#1d6b36' },
74
- });
75
- /**
76
- * Uma lixeira 12×15 — corpo levemente cônico, tampa saliente, alça e o símbolo da reciclagem em três traços.
77
- *
78
- * ⚠️ O SÍMBOLO É CLARO SOBRE O CORPO, e não uma quinta cor: em alto contraste e nos filtros de daltonismo, o que
79
- * distingue as quatro lixeiras é a cor do corpo, e um símbolo colorido competiria com ela. Claro sobre escuro
80
- * sobrevive a qualquer um dos dezesseis modos de visão.
81
- */
82
- export const paintLixeira = (cor) => (px) => {
83
- const { corpo, escuro } = COR_DA_LIXEIRA[cor];
84
- px(1, 3, 10, 11, corpo); // corpo
85
- px(0, 1, 12, 2, escuro); // tampa
86
- px(5, 0, 2, 1, escuro); // alça
87
- px(1, 14, 10, 1, escuro); // base
88
- px(2, 4, 1, 9, escuro); // vinco esquerdo
89
- px(9, 4, 1, 9, escuro); // vinco direito
90
- px(4, 6, 4, 1, '#f2f5f7'); // símbolo: traço de cima
91
- px(4, 8, 4, 1, '#f2f5f7'); // símbolo: traço do meio
92
- px(4, 10, 4, 1, '#f2f5f7'); // símbolo: traço de baixo
93
- };
94
- /* ===================== a placa de proibido jogar lixo =====================
95
- *
96
- * ⚠️ SEGUNDA VERSÃO, e a primeira era pequena demais para dizer o que dizia. Tinha 11×16 e resolvia o disco
97
- * de proibição com quatro retângulos — na tela virava um quadradinho vermelho com um risco branco, que a
98
- * criança lê como "algum objeto", não como "aqui não". O Dev mandou a referência da placa de verdade (o
99
- * pictograma da pessoa jogando lixo dentro do círculo cortado) e pediu: "a placa deveria ser grande, com o
100
- * símbolo identificável da pessoa jogando coisas e o sinal de proibido."
101
- *
102
- * Agora são 20×28: prancha de 20×20 e poste de 8. O círculo vem de TABELA DE LINHAS, como a roda do carro —
103
- * é o mesmo problema, e pela mesma razão: numa arte de retângulos, o que o olho já sabe que é redondo
104
- * denuncia o desenho inteiro se sair quadrado.
105
- *
106
- * ⚠️ E A LEITURA É EM TRÊS CAMADAS, na ordem em que a criança precisa delas: a prancha clara separa a placa
107
- * do fundo; o pictograma PRETO sobre claro é o contraste mais alto que existe e sobrevive aos dezesseis
108
- * modos de visão; a barra vermelha vem por último, por cima de tudo, porque é ela que transforma "uma pessoa
109
- * jogando lixo" em "não jogue lixo". Trocar essa ordem inverte o sentido do desenho. */
110
- export const PLACA_W = 20, PLACA_H = 28;
111
- /** Disco Ø18: `[recuo, largura]` por linha. Mesma técnica da roda do carro. */
112
- const DISCO = [
113
- [6, 6], [4, 10], [3, 12], [2, 14], [1, 16], [1, 16], [0, 18], [0, 18], [0, 18],
114
- [0, 18], [0, 18], [0, 18], [1, 16], [1, 16], [2, 14], [3, 12], [4, 10], [6, 6],
115
- ];
116
- /** Miolo Ø14, no mesmo formato — abre o vazio claro dentro do aro vermelho. */
117
- const MIOLO = [
118
- [5, 4], [3, 8], [2, 10], [1, 12], [1, 12], [0, 14], [0, 14],
119
- [0, 14], [0, 14], [1, 12], [1, 12], [2, 10], [3, 8], [5, 4],
120
- ];
121
- const VERMELHO = '#d42a1e', CLARO = '#f2f5f7', PRETO = '#1a1d24', POSTE = '#6f7883';
122
- /**
123
- * A placa 20×28: disco vermelho vazado, a pessoa jogando lixo em preto, a barra da proibição e o poste.
124
- *
125
- * Ela é o rosto de uma regra que o jogo NÃO pune (ver `game/recycling`): quem carrega lixo simplesmente não
126
- * passa daqui. A placa existe para que a criança saiba POR QUE não passou — sem ela, a barreira seria um bug
127
- * aos olhos de quem joga.
128
- */
129
- export const paintPlaca = (px) => {
130
- px(1, 0, 18, 20, CLARO); // prancha
131
- px(0, 0, 20, 1, PRETO);
132
- px(0, 19, 20, 1, PRETO); // moldura: topo e base
133
- px(0, 1, 1, 18, PRETO);
134
- px(19, 1, 1, 18, PRETO); // moldura: laterais
135
- DISCO.forEach(([dx, w], i) => px(1 + dx, 1 + i, w, 1, VERMELHO));
136
- MIOLO.forEach(([dx, w], i) => px(3 + dx, 3 + i, w, 1, CLARO));
137
- // O pictograma, dentro do miolo (x 3..16, y 3..16): cabeça, tronco, braço estendido e as pernas.
138
- px(7, 5, 3, 3, PRETO); // cabeça
139
- px(7, 8, 3, 5, PRETO); // tronco
140
- px(10, 9, 3, 1, PRETO); // braço que joga
141
- px(7, 13, 1, 3, PRETO);
142
- px(9, 13, 1, 3, PRETO); // pernas
143
- px(13, 11, 1, 1, PRETO);
144
- px(14, 13, 1, 1, PRETO);
145
- px(12, 14, 1, 1, PRETO); // o lixo caindo
146
- // A barra da proibição POR ÚLTIMO: é ela que faz o desenho dizer "não".
147
- for (let k = 0; k < 12; k++)
148
- px(4 + k, 4 + k, 3, 2, VERMELHO);
149
- px(9, 20, 2, 7, POSTE);
150
- px(7, 27, 6, 1, POSTE); // poste e pé
151
- };
152
- /** Assa tudo uma vez. Chamada pela raiz de composição no boot — nunca no import (ver o cabeçalho). */
153
- export function createRecyclingTextures() {
154
- const lixo = {};
155
- for (const m of Object.keys(LIXO_ART)) {
156
- const a = LIXO_ART[m];
157
- lixo[m] = pixelTexture(a.w, a.h, a.paint);
158
- }
159
- const lixeira = {};
160
- for (const c of Object.keys(COR_DA_LIXEIRA)) {
161
- lixeira[c] = pixelTexture(LIXEIRA_W, LIXEIRA_H, paintLixeira(c));
162
- }
163
- return { lixo, lixeira, placa: pixelTexture(PLACA_W, PLACA_H, paintPlaca) };
164
- }
@@ -1,77 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import type { Desenho, Visivel } from './port.js';
3
- type Gfx = Desenho & Visivel;
4
- type VisibleLayer = Visivel;
5
- interface DarkRegion {
6
- set: Set<string>;
7
- }
8
- interface Pl {
9
- x: number;
10
- y: number;
11
- quit?: boolean;
12
- }
13
- export interface SceneCityCtx {
14
- cityDecoG: Gfx;
15
- abandonG: Gfx;
16
- lavaFxG: Gfx;
17
- waterFxG: Gfx;
18
- skyLayer: VisibleLayer;
19
- darkRegions: DarkRegion[];
20
- solidAt: (x: number, y: number) => boolean;
21
- tileAt: (x: number, y: number) => number;
22
- lifeSurfaceAt: (tx: number) => number;
23
- WORLD_W: number;
24
- WORLD_H: number;
25
- TILE: number;
26
- WORLD_PX_W: number;
27
- WORLD_PX_H: number;
28
- LOGICAL_W: number;
29
- LOGICAL_H: number;
30
- BOX: {
31
- h: number;
32
- };
33
- DIRECT_CFG: Record<string, unknown>;
34
- getCenario: () => string;
35
- getVizMode: () => string;
36
- getPlayers: () => Pl[];
37
- getFxClock: () => number;
38
- getRm: () => {
39
- decor?: boolean;
40
- };
41
- onCenarioChange?: (city: boolean) => void;
42
- }
43
- export interface SceneCity {
44
- buildCityDeco: () => void;
45
- applyCenarioVida: () => void;
46
- stepTileFx: () => void;
47
- }
48
- /** Coluna com poste de luz na fachada (a cada 11 tiles). */
49
- export declare function isStreetlampColumn(tx: number): boolean;
50
- /** Coluna com letreiro na fachada (a cada 9 tiles, exige parede 3 tiles acima — checado pelo chamador). */
51
- export declare function isSignageColumn(tx: number): boolean;
52
- export declare const SIGNAGE_COLORS: readonly [3656096, 16747610, 6598911, 16765503];
53
- /** Cor do letreiro daquela coluna (4 variações, cíclicas por tx). */
54
- export declare function signageColor(tx: number): number;
55
- /** Tipo de decoração da célula abandonada (entulho/viga/pichação/vazio) — hash determinístico em tx,ty. */
56
- export declare function abandonedDecorKind(tx: number, ty: number): number;
57
- export declare const GRAFFITI_COLORS: readonly [13193174, 5232250, 14076239];
58
- /** Cor da pichação daquela coluna (3 variações, cíclicas por tx). */
59
- export declare function graffitiColor(tx: number): number;
60
- /** Deriva horizontal (0..3) dos tracinhos de lava — avança 1 tile a cada 8 ticks do fxClock. */
61
- export declare function lavaStreakOffset(fxClock: number, worldX: number): number;
62
- /** Hash determinístico por coluna, usado p/ escolher o "leito" da água (coral/algas/vazio). */
63
- export declare function waterBedHash(tx: number): number;
64
- /** Tipo de leito da coluna: 0=coral, 1=algas, 2=vazio. */
65
- export declare function waterBedKind(tx: number): number;
66
- export declare const CORAL_COLORS: readonly [15234107, 15909198, 9187129];
67
- /** Cor do coral daquela coluna (3 variações, derivadas do mesmo hash do leito). */
68
- export declare function coralColor(tx: number): number;
69
- /** Hash determinístico por célula, usado p/ decidir se há peixe nadando ali (água aberta). */
70
- export declare function fishHash(tx: number, ty: number): number;
71
- /** ~1/7 das células de água aberta recebe um peixe. */
72
- export declare function fishSpawnsAt(tx: number, ty: number): boolean;
73
- export declare const FISH_COLORS: readonly [15026253, 3829413, 4763754];
74
- /** Cor do peixe daquela célula (3 variações, derivadas do hash de peixe). */
75
- export declare function fishColor(tx: number, ty: number): number;
76
- export declare function initSceneCity(ctx: SceneCityCtx): SceneCity;
77
- export {};
@@ -1,181 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // render/scene-city — city scenario decoration: sidewalk/streetlamp/signage facade band, water-tank walls,
3
- // abandoned-interior clutter (darkRegions, drawn under the darkness layer), and the live water/lava tile fx
4
- // (waves/coral/algae/fish, lava streaks). Extracted from game.js. The layers (cityDecoG/abandonG/lavaFxG/
5
- // waterFxG/skyLayer) are CREATED in game.js — z-order stays soldered there — and INJECTED here; we move only
6
- // the LOGIC. Formulas copied verbatim. `applyCenarioVida` is the thin scenario-toggle orchestrator: it flips
7
- // only this module's own layers and calls an injected hook so the coordinator can wire game/life and
8
- // game/traffic's own scenario reactions (see the module boundary note in the extraction report).
9
- // ---- Seleção de tile/decoração por posição (lógica pura, determinística — hash em tx/ty, sem PIXI) ----
10
- /** Coluna com poste de luz na fachada (a cada 11 tiles). */
11
- export function isStreetlampColumn(tx) { return tx % 11 === 4; }
12
- /** Coluna com letreiro na fachada (a cada 9 tiles, exige parede 3 tiles acima — checado pelo chamador). */
13
- export function isSignageColumn(tx) { return tx % 9 === 2; }
14
- export const SIGNAGE_COLORS = [0x37c9a0, 0xff8c5a, 0x64b0ff, 0xffd23f];
15
- /** Cor do letreiro daquela coluna (4 variações, cíclicas por tx). */
16
- export function signageColor(tx) { return SIGNAGE_COLORS[tx % 4]; }
17
- /** Tipo de decoração da célula abandonada (entulho/viga/pichação/vazio) — hash determinístico em tx,ty. */
18
- export function abandonedDecorKind(tx, ty) { return (tx * 13 + ty * 7) % 10; }
19
- export const GRAFFITI_COLORS = [0xc94fd6, 0x4fd67a, 0xd6c94f];
20
- /** Cor da pichação daquela coluna (3 variações, cíclicas por tx). */
21
- export function graffitiColor(tx) { return GRAFFITI_COLORS[tx % 3]; }
22
- /** Deriva horizontal (0..3) dos tracinhos de lava — avança 1 tile a cada 8 ticks do fxClock. */
23
- export function lavaStreakOffset(fxClock, worldX) { return (Math.floor(fxClock / 8) + worldX) % 4; }
24
- /** Hash determinístico por coluna, usado p/ escolher o "leito" da água (coral/algas/vazio). */
25
- export function waterBedHash(tx) { return (tx * 2654435761) >>> 0; }
26
- /** Tipo de leito da coluna: 0=coral, 1=algas, 2=vazio. */
27
- export function waterBedKind(tx) { return waterBedHash(tx) % 3; }
28
- export const CORAL_COLORS = [0xe8743b, 0xf2c14e, 0x8c2f39];
29
- /** Cor do coral daquela coluna (3 variações, derivadas do mesmo hash do leito). */
30
- export function coralColor(tx) { return CORAL_COLORS[(waterBedHash(tx) >>> 3) % 3]; }
31
- /** Hash determinístico por célula, usado p/ decidir se há peixe nadando ali (água aberta). */
32
- export function fishHash(tx, ty) { return (tx * 40503 + ty * 12289) >>> 0; }
33
- /** ~1/7 das células de água aberta recebe um peixe. */
34
- export function fishSpawnsAt(tx, ty) { return fishHash(tx, ty) % 7 === 0; }
35
- export const FISH_COLORS = [0xe5484d, 0x3a6ea5, 0x48b06a];
36
- /** Cor do peixe daquela célula (3 variações, derivadas do hash de peixe). */
37
- export function fishColor(tx, ty) { return FISH_COLORS[fishHash(tx, ty) % 3]; }
38
- export function initSceneCity(ctx) {
39
- // buildCityDeco v3: desenhado UMA vez (mapa é estático) — calçada+postes+letreiros na fachada mais baixa,
40
- // paredes/linha d'água da caixa d'água (bounding box dos tiles de água, tipo 3), e entulho/viga/pichação
41
- // sob a escuridão das áreas secretas (abandonG, camada abaixo de darkLayer no game.js).
42
- function buildCityDeco() {
43
- const g = ctx.cityDecoG;
44
- g.clear();
45
- const a = ctx.abandonG;
46
- a.clear();
47
- const TILE = ctx.TILE;
48
- // ---- FACHADA (banda mais baixa, por onde o personagem anda): calçada + postes + letreiros.
49
- // Placas de PARE ficam na rua da frente (game/traffic), junto dos carros.
50
- const BASE_TY = ctx.WORLD_H - 9;
51
- for (let tx = 1; tx < ctx.WORLD_W - 1; tx++) {
52
- const ty = ctx.lifeSurfaceAt(tx);
53
- if (ty < BASE_TY)
54
- continue;
55
- const X = tx * TILE, y = ty * TILE;
56
- g.beginFill(0x9aa0ad, 0.9).drawRect(X, y, TILE, 2).endFill(); // calçada clara
57
- g.beginFill(0x565e70, 1).drawRect(X, y + 2, TILE, 1).endFill(); // meio-fio
58
- if (isStreetlampColumn(tx)) {
59
- g.beginFill(0x3a4152).drawRect(X + 7, y - 30, 2, 30).endFill();
60
- g.beginFill(0x3a4152).drawRect(X + 7, y - 30, 8, 2).endFill(); // poste + braço
61
- g.beginFill(0xffe9a8, 1).drawRect(X + 13, y - 29, 3, 3).endFill();
62
- g.beginFill(0xffe9a8, 0.18).drawRect(X + 9, y - 31, 11, 8).endFill(); // lâmpada + halo FIXO (sem piscar)
63
- }
64
- if (isSignageColumn(tx) && ctx.solidAt(tx, ty - 3)) {
65
- const c = signageColor(tx); // letreiro na fachada
66
- g.beginFill(0x141824).drawRect(X + 2, y - 3.5 * TILE, 12, 6).endFill();
67
- g.beginFill(c, 1).drawRect(X + 3, y - 3.5 * TILE + 1, 10, 4).endFill();
68
- g.beginFill(c, 0.15).drawRect(X, y - 3.5 * TILE - 2, 16, 10).endFill(); // brilho estável
69
- }
70
- }
71
- // ---- CAIXA D'ÁGUA: paredes metálicas nas bordas do corpo d'água (tile 3) + linha d'água no topo
72
- let wx0 = 1e9, wx1 = -1, wy0 = 1e9, wy1 = -1;
73
- for (let ty = 0; ty < ctx.WORLD_H; ty++)
74
- for (let tx = 0; tx < ctx.WORLD_W; tx++) {
75
- if (ctx.tileAt(tx, ty) === 3) {
76
- wx0 = Math.min(wx0, tx);
77
- wx1 = Math.max(wx1, tx);
78
- wy0 = Math.min(wy0, ty);
79
- wy1 = Math.max(wy1, ty);
80
- }
81
- }
82
- if (wx1 >= 0) {
83
- const X0 = wx0 * TILE, X1 = (wx1 + 1) * TILE, Y0 = wy0 * TILE, Y1 = (wy1 + 1) * TILE;
84
- g.beginFill(0x6a7486, 0.85).drawRect(X0 - 3, Y0 - 6, 3, Y1 - Y0 + 6).drawRect(X1, Y0 - 6, 3, Y1 - Y0 + 6).endFill(); // paredes do tanque
85
- for (let ry = Y0; ry < Y1; ry += 12) {
86
- g.beginFill(0x49515f).drawRect(X0 - 3, ry, 3, 2).drawRect(X1, ry, 3, 2).endFill();
87
- } // rebites
88
- g.beginFill(0xbfe6ff, 0.5).drawRect(X0, Y0, X1 - X0, 1.5).endFill(); // linha d'água
89
- }
90
- // ---- ABANDONADO (darkRegions): entulho, viga e pichação — desenhado sob a escuridão
91
- for (const reg of ctx.darkRegions) {
92
- for (const key of reg.set) {
93
- const [tx, ty] = key.split(',').map(Number);
94
- const X = tx * TILE, Y = ty * TILE, h = abandonedDecorKind(tx, ty);
95
- if (ctx.solidAt(tx, ty + 1) && h < 3) {
96
- a.beginFill(0x555b66).drawRect(X + 2, Y + TILE - 5, 7, 5).endFill();
97
- a.beginFill(0x434955).drawRect(X + 7, Y + TILE - 3, 6, 3).endFill();
98
- } // entulho
99
- else if (h === 4) {
100
- a.beginFill(0x6b4e2e, 0.9).drawRect(X, Y + 3, TILE, 3).endFill();
101
- } // viga exposta
102
- else if (h === 7) {
103
- const c = graffitiColor(tx);
104
- a.beginFill(c, 0.55).drawRect(X + 3, Y + 6, 9, 2).drawRect(X + 5, Y + 9, 6, 2).endFill();
105
- } // pichação
106
- }
107
- }
108
- }
109
- // applyCenarioVida: orquestrador FINO do troca-de-cenário. Só liga/desliga as camadas que este módulo possui
110
- // (deco da cidade + o céu procedural da cidade); trânsito (carLayer + cars) e vida (criaturas) são de outros
111
- // dois módulos e reagem via onCenarioChange — nunca tocados diretamente daqui.
112
- function applyCenarioVida() {
113
- const city = ctx.getCenario() === 'cidade';
114
- ctx.cityDecoG.visible = city;
115
- ctx.skyLayer.visible = city; // deco/céu da cidade SÓ na Cidade
116
- ctx.onCenarioChange?.(city);
117
- }
118
- // stepTileFx v3: água (ondas de superfície + leito coral/algas + peixes esparsos) e lava (tracinhos claros à
119
- // deriva) — só perto de cada jogador (câmera), com dedupe por célula entre jogadores em tela dividida.
120
- function stepTileFx() {
121
- ctx.lavaFxG.clear();
122
- ctx.waterFxG.clear();
123
- if (ctx.DIRECT_CFG[ctx.getVizMode()] || ctx.getRm().decor)
124
- return; // HC repinta o mundo; viewDecor off na v3 = só a base estática
125
- const TILE = ctx.TILE, t = ctx.getFxClock(), seen = new Set();
126
- for (const pl of ctx.getPlayers()) {
127
- if (pl.quit)
128
- continue;
129
- const camX = Math.max(0, Math.min(pl.x - ctx.LOGICAL_W / 2, ctx.WORLD_PX_W - ctx.LOGICAL_W));
130
- const camY = Math.max(0, Math.min((pl.y - ctx.BOX.h / 2) - ctx.LOGICAL_H / 2, ctx.WORLD_PX_H - ctx.LOGICAL_H));
131
- const tx0 = Math.max(0, Math.floor(camX / TILE) - 1), tx1 = Math.min(ctx.WORLD_W - 1, Math.floor((camX + ctx.LOGICAL_W) / TILE) + 1);
132
- const ty0 = Math.max(0, Math.floor(camY / TILE) - 1), ty1 = Math.min(ctx.WORLD_H - 1, Math.floor((camY + ctx.LOGICAL_H) / TILE) + 1);
133
- for (let ty = ty0; ty <= ty1; ty++)
134
- for (let tx = tx0; tx <= tx1; tx++) {
135
- const tt = ctx.tileAt(tx, ty);
136
- if (tt !== 3 && tt !== 9)
137
- continue; // só água(3)/lava(9)
138
- const k = tx + ',' + ty;
139
- if (seen.has(k))
140
- continue;
141
- seen.add(k);
142
- const X = tx * TILE, Y = ty * TILE;
143
- if (tt === 9) {
144
- const off = lavaStreakOffset(t, X); // lava v3: tracinhos claros que derivam
145
- ctx.lavaFxG.beginFill(0xff7755).drawRect(X + off, Y + 3, 3, 1).drawRect(X + ((off + 6) % TILE), Y + 8, 3, 1).endFill();
146
- continue;
147
- }
148
- // ÁGUA v3: ondulação verde sutil que deriva
149
- ctx.waterFxG.beginFill(0x46a078, 0.12).drawRect(X, Y + 7 + Math.round(2 * Math.sin(tx * 1.3 + t * 0.04)), TILE, 2).endFill();
150
- if (ctx.tileAt(tx, ty - 1) !== 3) {
151
- const off = Math.sin(t * 0.05 + X * 0.1) > 0 ? 1 : 0; // linha de superfície SÓ na borda de cima
152
- ctx.waterFxG.beginFill(0xffffff, 0.35).drawRect(X + off, Y + 1, TILE - off, 1).endFill();
153
- }
154
- if (ctx.solidAt(tx, ty + 1)) {
155
- const kind = waterBedKind(tx); // leito: coral / algas (determinísticos por coluna)
156
- if (kind === 0) {
157
- ctx.waterFxG.beginFill(coralColor(tx))
158
- .drawRect(X + 6, Y + 9, 2, 7).drawRect(X + 4, Y + 10, 2, 4).drawRect(X + 9, Y + 8, 2, 5).drawRect(X + 3, Y + 12, 1, 2).drawRect(X + 11, Y + 11, 1, 2).endFill();
159
- }
160
- else if (kind === 1) {
161
- ctx.waterFxG.beginFill(0x3fae6a);
162
- const sway = 2 * Math.sin(t * 0.06 + tx); // algas balançando
163
- for (let a2 = 0; a2 < 9; a2++) {
164
- ctx.waterFxG.drawRect(X + 7 + Math.round(sway * (a2 / 9)), Y + 15 - a2, 1, 1);
165
- if (a2 % 2 === 0)
166
- ctx.waterFxG.drawRect(X + 9 + Math.round(sway * (a2 / 9)), Y + 15 - a2, 1, 1);
167
- }
168
- ctx.waterFxG.endFill();
169
- }
170
- }
171
- else if (fishSpawnsAt(tx, ty)) { // água aberta: peixinho esparso nadando (com olho!)
172
- const fx2 = X + 6 + Math.round(5 * Math.sin(t * 0.04 + tx + ty)), fy2 = Y + 7 + Math.round(2 * Math.sin(t * 0.07 + ty));
173
- const dir = Math.cos(t * 0.04 + tx + ty) >= 0 ? 1 : -1;
174
- ctx.waterFxG.beginFill(fishColor(tx, ty)).drawRect(fx2, fy2, 3, 2).drawRect(fx2 - dir, fy2, 1, 2).endFill();
175
- ctx.waterFxG.beginFill(0xffffff, 1).drawRect(fx2 + (dir > 0 ? 2 : 0), fy2, 1, 1).endFill();
176
- }
177
- }
178
- }
179
- }
180
- return { buildCityDeco, applyCenarioVida, stepTileFx };
181
- }