@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,127 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- /** Grama e flores de um tema `v3` (render/scene-sky.drawV3Grass). Cores em '#rrggbb'. */
3
- export interface Flora {
4
- base: string;
5
- top: string;
6
- bLt: string;
7
- bDk: string;
8
- center: string;
9
- petals: string[];
10
- }
11
- /**
12
- * Um cenário.
13
- *
14
- * O CAMPO `v3` FOI SEPARADO EM DOIS (2026-08-25), e o motivo é um pedido que ele não conseguia atender.
15
- * Ele significava três coisas ao mesmo tempo — "meu fundo é gerado das cores", "tenho céu vivo compartilhado"
16
- * e "tenho flora" — e isso funcionava enquanto só existiam dois tipos de tema: a Cidade (PNG, cena própria,
17
- * sem flora) e os quatro gerados (cores, céu vivo, flora).
18
- *
19
- * O Dev pediu FUNDO RASTER PARA A FLORESTA, mantendo a floresta como floresta. Isso é uma combinação nova —
20
- * PNG **com** flora e céu vivo — e ela não cabia num booleano só: virar `v3` para false teria tirado a grama,
21
- * as flores e as borboletas dela junto com o fundo gerado.
22
- *
23
- * Agora são duas perguntas independentes, e cada leitor faz a sua:
24
- * · `fundo` — de onde vêm as três camadas de parallax. Lido por render/parallax.
25
- * · `decor` — que decoração viva o céu recebe. Lido por render/scene-sky, pela PRESENÇA, não por rótulo.
26
- * A flora segue a mesma regra: quem tem entrada em THEME_FLORA tem flora, e ponto.
27
- */
28
- /**
29
- * UMA FAIXA DE PRÉDIOS de uma camada de parallax — o skyline da Cidade, como DADO (ADR-0042).
30
- *
31
- * TODO NÚMERO AQUI FOI MEDIDO nos três PNG que esta faixa substitui, não escolhido. O ADR-0042 registra por
32
- * que eles não podiam ser reproduzidos: os fundos precisam de 11.382 retângulos de cor uniforme (2.065 +
33
- * 2.899 + 6.418, cobertura gulosa 2D), duas a três ordens de grandeza acima do que a pipeline estimava,
34
- * porque 400×180 com 171 cores é arte desenhada à mão e não geometria.
35
- *
36
- * O que se salva medindo, então, não é o pixel — é a REGRA: onde a faixa fica sólida, quanto os topos
37
- * variam, quais são os dois tons do corpo e os dois da janela. Isso a torna RECOLORÍVEL, que é o que o
38
- * pilar 1 existe para comprar: o alto contraste repinta um dado e não repinta um PNG. E a Cidade é a maior
39
- * superfície da tela — sob PNG, era a única coisa que o modo de alto contraste jamais alcançava.
40
- */
41
- export interface FaixaDePredios {
42
- /** y a partir do qual a faixa é SÓLIDA: abaixo desta linha é tudo prédio, sem buraco. */
43
- base: number;
44
- /**
45
- * Os DOIS TONS DE PROFUNDIDADE, `[fundo, frente]`, desenhados nessa ordem.
46
- *
47
- * Cada camada de parallax tem duas fileiras no original, não uma — é o que dá o ar de cidade. A primeira
48
- * versão deste gerador tinha só uma, e por isso a Cidade saiu chapada.
49
- */
50
- corpo: readonly [string, string];
51
- /** Topos possíveis da fileira da FRENTE, `[mais alto, mais baixo]` — em y, o primeiro é o MENOR. */
52
- topo: readonly [number, number];
53
- /** Idem para a fileira do FUNDO, que é mais alta e mais simples. */
54
- topoFundo: readonly [number, number];
55
- /** As larguras possíveis de um prédio, em px. */
56
- largura: readonly [number, number];
57
- /**
58
- * As cores da LUZ — janela ACESA, e só ela.
59
- *
60
- * ⚠️ NÃO EXISTE COR DE JANELA APAGADA, e essa foi a lição mais cara desta arte: a apagada é a parede. A
61
- * primeira versão declarava um par "acesa/apagada" com dois tons quase idênticos, pintava TODA célula, e
62
- * o resultado foi um quadriculado cinza. Pior: os dois tons que ela chamava de janela eram, na verdade, o
63
- * segundo tom de MASSA — os prédios de trás.
64
- *
65
- * As luzes são QUENTES (R > B). Ausente = distante demais para acender.
66
- */
67
- luz?: readonly string[];
68
- /** Fração média de janelas acesas. Varia por prédio em torno dela — uns quase escuros, outros cheios. */
69
- aceso?: number;
70
- }
71
- /** O que todo tema tem, independentemente de como o fundo dele nasce. */
72
- interface TemaBase {
73
- /** CHAVE i18n do nome exibido. Chave e não texto: tabela de módulo resolvida no import congelaria o idioma
74
- * no boot (ver a nota em input/devices). Quem exibe resolve com `t()`. */
75
- nome: string;
76
- /** Paradas do gradiente vertical do céu, do TOPO ao rodapé, distribuídas por igual. DUAS ou MAIS: com N
77
- * paradas, a de índice i cai em y = 180·i/(N-1) — é assim que se escolhe a ALTURA de uma cor. */
78
- sky: readonly string[];
79
- cloud?: [string, string];
80
- /** Sol baixo com leque de raios, assado na textura do céu. Ausente = céu de puro gradiente. */
81
- sol?: {
82
- cor: string;
83
- x: number;
84
- y: number;
85
- };
86
- /** Este tema tem CHUVA (ciclo do clima em render/weather). Ausente = sempre seco. */
87
- chuva?: true;
88
- /** Quantos cúmulos na MANTA de tela, que fecha e abre com a chuva. Múltiplo de 3 (são 3 fileiras), e só a
89
- * de cima aparece no tempo bom. Ausente = as 3 lajes fixas da v3. */
90
- nuvens?: number;
91
- decor?: string[];
92
- }
93
- /** Fundo de MORROS: céu em gradiente + duas bandas de morro. Os quatro temas da v3. */
94
- export interface TemaMorros extends TemaBase {
95
- fundo: 'morros';
96
- /** As duas bandas de morro: `[fundo, frente]`. */
97
- hills: readonly [string, string];
98
- }
99
- /** Fundo de PRÉDIOS: céu em gradiente + três faixas de skyline. A Cidade, e só ela por enquanto. */
100
- export interface TemaPredios extends TemaBase {
101
- fundo: 'predios';
102
- /** Uma faixa por camada de parallax, do mais distante ao mais próximo. */
103
- predios: readonly [FaixaDePredios, FaixaDePredios, FaixaDePredios];
104
- }
105
- /**
106
- * O tema, e ele é uma UNIÃO DISCRIMINADA de propósito.
107
- *
108
- * Antes eram `fundo: 'gerado' | 'png'` com `sky?` e `hills?` opcionais, e o invariante de verdade — *quem é
109
- * gerado TEM céu e morros* — não morava em lugar nenhum: era uma frase num comentário e um `if` em
110
- * `render/parallax`. Quem lesse o tipo via quatro campos que podiam faltar; quem lesse o código via que
111
- * nunca faltavam. Agora o compilador cobra, e `render/scene-parallax` deixou de precisar redescrever isto
112
- * como `ParallaxTheme` — o que era o defeito do ADR-0039 outra vez, numa terceira vítima.
113
- */
114
- export type CenarioTema = TemaMorros | TemaPredios;
115
- /** O tema para o qual todo valor desconhecido cai. */
116
- export declare const CENARIO_PADRAO = "cidade";
117
- export declare const CENARIOS: Record<string, CenarioTema>;
118
- /** v3 exato — grama/flores por tema. SÓ dos temas `v3`: a Cidade não tem flora (por isso o `| undefined`). */
119
- export declare const THEME_FLORA: Record<string, Flora | undefined>;
120
- /** '#rrggbb' → 0xrrggbb, para o `beginFill` do PIXI. Verbatim do `hexN` do game.js. */
121
- export declare const hexN: (s: string) => number;
122
- /**
123
- * A validação de `setCenario`, sem o efeito: tema conhecido passa, o resto vira 'cidade'.
124
- * ⚠️ Cópia FIEL do monólito, herança do `Object.prototype` inclusive — ver o cabeçalho.
125
- */
126
- export declare function normalizarCenario(theme: string): string;
127
- export {};
@@ -1,145 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // render/cenario-data — O CATÁLOGO DE CENÁRIOS: os quatro temas do jogo como DADO, e nada além disso.
3
- //
4
- // Este é o módulo-FOLHA da etapa D2-b: zero imports, zero PIXI, zero DOM, zero I/O. Ele responde a uma única
5
- // pergunta — "quais são os cenários, e de que cor é cada um?" — e é justamente por não responder a mais
6
- // nenhuma que ele pode ser lido, importado e testado por qualquer um dos seus consumidores sem arrastar meio
7
- // motor junto.
8
- //
9
- // ======================= POR QUE A FRONTEIRA CAIU AQUI =======================
10
- // `CENARIOS` e `THEME_FLORA` são as duas tabelas mais LIDAS e menos PROTEGIDAS do monólito. Antes desta
11
- // extração elas eram `const` no meio do `game.js` e chegavam aos módulos por INJEÇÃO — `render/scene-sky.ts`
12
- // as recebe inteiras no `SceneSkyCtx` (`CENARIOS`, `THEME_FLORA`), `game/attract.ts` recebe `CENARIOS` para
13
- // sortear o tema da demo, o splash recebe a lista reduzida a `{id,nome}`, e `setCenario` as consulta para
14
- // validar e para pintar. Cinco leitores, nenhum teste, e nenhum lugar onde a FORMA de um tema estivesse
15
- // escrita: cada leitor descobria por acidente que `T.cloud` só existe quando `T.v3` é verdadeiro, e que
16
- // `THEME_FLORA` não tem entrada para 'cidade'.
17
- //
18
- // Separar o dado da máquina que o consome é o corte mais barato e mais duradouro desta região: um tema novo
19
- // (uma estação, um bioma) passa a ser uma linha AQUI, e as invariantes que os leitores presumem viram
20
- // asserção em `tests/cenario-data.node.test.js` — em particular a mais silenciosa de todas, "todo tema `v3`
21
- // tem `sky`, `cloud`, `hills`, `decor` E uma entrada em `THEME_FLORA`". Quebrar essa correspondência não
22
- // derruba nada: `scene-sky` faz `const fl = THEME_FLORA[cenario]` e simplesmente não desenha grama. O tema
23
- // novo nasceria careca, e ninguém saberia dizer por quê.
24
- //
25
- // ======================= O QUE ESTÁ AQUI, E POR QUÊ ESTÁ JUNTO =======================
26
- // · `CENARIOS` — os quatro temas + a Cidade. `v3:false` (Cidade) significa "meu fundo vem de PNG e eu
27
- // tenho o céu/tráfego próprios de render/scene-city"; `v3:true` significa "meu fundo é
28
- // GERADO pelas fórmulas da v3.1.100 (render/scene-parallax) a partir destas cores".
29
- // Nenhum tema tem chuva — chuva é da Cidade, e é decisão de render/weather.
30
- // · `THEME_FLORA` — grama e flores por tema. Tabela IRMÃ da de cima e SÓ dos temas `v3`: a Cidade não tem
31
- // flora. Fica no mesmo arquivo porque as duas descrevem O MESMO tema por chaves iguais e
32
- // precisam ser editadas no mesmo gesto; separá-las convidaria exatamente a divergência
33
- // que o teste de correspondência existe para pegar.
34
- // · `hexN` — '#rrggbb' → número, o tradutor entre o dado (string, legível na tabela acima) e o PIXI
35
- // (`beginFill` quer inteiro). Ele vivia solto no meio do bloco de parallax do game.js e
36
- // tinha UM chamador: o `SceneSkyCtx`. É função da TABELA, não do parallax — todas as
37
- // cores que ele converte estão neste arquivo — e por isso veio para cá, e não para
38
- // render/parallax.
39
- // · `normalizarCenario` — a validação de `setCenario` ("tema desconhecido → 'cidade'"), isolada do efeito.
40
- //
41
- // ======================= O QUE NÃO VEIO =======================
42
- // · As FÓRMULAS que transformam estas cores em pixel (`themeSkyTexture`, `themeHillsTexture`,
43
- // `parallaxPlaceholder`, `hillHeight`) já moram em render/scene-parallax.ts desde o Estágio 4. Este
44
- // arquivo é a entrada delas, não a implementação.
45
- // · O desenho da flora (`drawV3Grass`) e da decoração viva é de render/scene-sky.ts. Aqui só a paleta.
46
- // · Os FATORES de profundidade das 3 camadas (`PARALLAX`) NÃO estão aqui, apesar de também serem dado: eles
47
- // não variam por tema — descrevem a GEOMETRIA do fundo, e vivem ao lado da conta que os usa, em
48
- // render/parallax.ts. Uma tabela de tema aqui, uma tabela de câmera lá.
49
- //
50
- // ======================= ⚠️ COMPORTAMENTO PRESERVADO: `normalizarCenario` ACEITA CHAVE HERDADA =======================
51
- // O monólito valida com `if(!CENARIOS[theme])theme='cidade'`. `CENARIOS` é um objeto literal, logo herda de
52
- // `Object.prototype`: `CENARIOS['toString']` é uma FUNÇÃO, e portanto truthy, e portanto 'toString' passa na
53
- // validação como se fosse um tema. O `setCenario` então persiste 'toString' em `incl_cenario`, tenta baixar
54
- // `assets/cenarios/toString/c4.png` e o jogo fica sem fundo. Só é alcançável por um valor forjado (chave de
55
- // localStorage adulterada; `window.__incl.setCenario('constructor')`), nunca pela UI — que monta o seletor a
56
- // partir de `Object.keys(CENARIOS)`.
57
- // ISTO É O COMPORTAMENTO ATUAL E FOI COPIADO TAL E QUAL, de propósito: esta etapa é uma EXTRAÇÃO, e trocar a
58
- // checagem por `hasOwnProperty` aqui seria consertar às escondidas, dentro de um movimento cuja garantia é
59
- // justamente "nada mudou". O teste PREGA a falha (`normalizarCenario('toString') === 'toString'`), para que o
60
- // conserto — quando vier — seja uma mudança visível de asserção e não uma surpresa.
61
- //
62
- // SEM I/O NO IMPORT: o corpo do módulo só declara literais. Não há `init`, não há factory, não há efeito —
63
- // e por isso não há armadilha de ordem de boot: importar este arquivo é sempre seguro, em qualquer ponto.
64
- // Ver docs/5-Refactoring/plano-modularizacao-mapa.md (D2-b).
65
- /** O tema para o qual todo valor desconhecido cai. */
66
- export const CENARIO_PADRAO = 'cidade';
67
- /* L6 (REFEITO — fiel à v3.1.100): os 4 temas usam EXATAMENTE o céu, as nuvens, as montanhas, a grama
68
- e a decoração viva de lá (fórmulas copiadas). BLOCOS = Clarity SEM recolor (a v3 não recoloria tiles
69
- por tema). A CHUVA deixou de ser privilégio da Cidade: é o campo `chuva` abaixo que a concede, e a
70
- Floresta também a tem (decisão do Dev, 2026-08-25). */
71
- // ⚠️ TRÊS IDS MENTEM, e o rótulo é que está certo. `cemiterio` é "Amanhecer no Campo" e `espaco` é "Noite no
72
- // Campo" (ver `cen.*` nos dicionários): os temas mudaram, os ids ficaram. Com `campo` = "Dia no Campo", os três
73
- // são o MESMO lugar em três horas do dia, e é por isso que compartilham a silhueta em render/scene-parallax.
74
- // Renomear os ids é migração de dado persistido (`incl_cenario` e as gravações de demonstração os guardam),
75
- // então fica para uma rodada própria — e este aviso é a rede até lá. Quem ler só o id planta a arte errada;
76
- // foi o que quase aconteceu.
77
- //
78
- // SE UM DIA HOUVER TEMA DE ESPAÇO OU DE HALLOWEEN (decisão do Dev, 2026-08-25): no de espaço, os BLOCOS do
79
- // nível viram partes de estação espacial — não é só trocar o céu. E o de Halloween é uma FESTA de Halloween,
80
- // não um cemitério: abóboras, fantasias e doces, não túmulos.
81
- export const CENARIOS = {
82
- // `chuva` estava ESCRITA NO CÓDIGO do clima, como `cenario === 'cidade'`. Era verdade e virou mentira no dia
83
- // em que o Dev pediu chuva na Floresta — e o pior de uma condição dessas é que ela não avisa: quem lê
84
- // `render/weather` não tem como saber que existe uma lista de temas, porque não existe lista, existe um `if`.
85
- // Aqui a capacidade é DADO, e um tema novo declara a sua ao nascer.
86
- // A CIDADE (ADR-0042), medida nos três PNG que ela substitui — e MEDIDA DE NOVO depois que a primeira
87
- // versão saiu chapada na tela. O que a segunda medição corrigiu:
88
- //
89
- // · as cores que eu tinha listado como "janela acesa/apagada" eram o SEGUNDO TOM DE MASSA (os prédios
90
- // de trás). Separando por temperatura, a luz é o que tem R > B — e ela é rara: 5,4% da área na
91
- // camada próxima, 0,28% na média, 0,04% na distante;
92
- // · cada camada tem DUAS fileiras de profundidade, não uma;
93
- // · as janelas são 2 px de largura por 3 a 5 de altura (263 na camada próxima), não pontos 2x2.
94
- cidade: {
95
- nome: 'cen.cidade', fundo: 'predios', chuva: true,
96
- sky: ['#5d6f8e', '#5d6f8e', '#5d6f8e', '#374866'],
97
- predios: [
98
- // Camada 0 — a bruma. Duas profundidades quase iguais ao céu, e quase nenhuma luz.
99
- { base: 144, topo: [96, 128], topoFundo: [71, 108], largura: [16, 40],
100
- corpo: ['#4a5c7c', '#374866'], luz: ['#a5ac93', '#adb599'], aceso: 0.006 },
101
- // Camada 1 — o meio. Os de trás são visivelmente mais claros (#6b7e98).
102
- { base: 139, topo: [64, 122], topoFundo: [44, 100], largura: [14, 38],
103
- corpo: ['#6b7e98', '#465164'], luz: ['#c2c0be', '#baada6', '#bfbdb9'], aceso: 0.022 },
104
- // Camada 2 — a de perto, e a que carrega a cidade acesa. `base` 158 é a linha em que o original fica
105
- // 100% sólido; acima dela a fileira da frente cobre ~70% das colunas e o resto é vão e fileira de trás.
106
- { base: 158, topo: [88, 134], topoFundo: [66, 108], largura: [18, 44],
107
- corpo: ['#637980', '#2b3e49'], luz: ['#c8c3b7', '#bdac8e', '#ccc4b5', '#d0ccc9'], aceso: 0.85 },
108
- ],
109
- },
110
- campo: { nome: 'cen.campo', fundo: 'morros', sky: ['#86c5e8', '#cfeecb'], cloud: ['#ffffff', '#d4e6f5'], hills: ['#9fd47e', '#6fb84e'], decor: ['nuvens', 'passaros', 'borboletas'] },
111
- cemiterio: { nome: 'cen.cemiterio', fundo: 'morros', sky: ['#2b2540', '#5a4f6b'], cloud: ['#d9c4dd', '#a98fb6'], hills: ['#4a5f55', '#33473d'], decor: ['nuvens', 'passaros', 'sparkles', 'minhocas', 'nevoa'] },
112
- espaco: { nome: 'cen.espaco', fundo: 'morros', sky: ['#05030f', '#161033'], cloud: ['#3a3550', '#262238'], hills: ['#1e3030', '#142024'], decor: ['nuvens', 'sparkles', 'vagalumes'] },
113
- // A FLORESTA É UM PÔR DO SOL, e antes era um céu VERDE (`#3f6b50`→`#8fbf73`) com nuvens verdes por cima.
114
- // Verde no céu não é só feio: com os morros em `#2f5e35`, a silhueta das coníferas ficava a um passo da cor
115
- // do fundo e sumia — plantei árvores que ninguém via, e só depois de ver na tela é que a causa apareceu.
116
- //
117
- // As sete paradas caem de 30 em 30 px (y = 180·i/6), e é por isso que são sete: é o que põe o AMARELO em
118
- // y=60 e o VERMELHO em y=90, que é a linha do horizonte. O laranja entre eles não é declarado — ele nasce da
119
- // interpolação, como o violeta nasce entre o índigo do topo e o rosa. As três últimas paradas ficam ATRÁS
120
- // dos morros; existem para o degradê não terminar num corte seco na beira da tela.
121
- floresta: { nome: 'cen.floresta', fundo: 'morros',
122
- sky: ['#231a52', '#a34a6e', '#ffd166', '#e0392c', '#8e2320', '#5a1a1c', '#3a1418'],
123
- sol: { cor: '#ffe9a8', x: 0.30, y: 0.46 },
124
- cloud: ['#ffffff', '#e9a06a'], // corpo branco, sombra alaranjada: é a luz baixa batendo por baixo
125
- chuva: true, nuvens: 27, // 3 fileiras de 9: a de cima sempre, as outras duas ao fechar o tempo
126
- hills: ['#2f5e35', '#1f4226'], decor: ['nuvens', 'passaros', 'borboletas'] },
127
- };
128
- /** v3 exato — grama/flores por tema. SÓ dos temas `v3`: a Cidade não tem flora (por isso o `| undefined`). */
129
- export const THEME_FLORA = {
130
- campo: { base: '#52933c', top: '#7cc35a', bLt: '#8fd968', bDk: '#46822f', center: '#ffe14d', petals: ['#ffe14d', '#ff7eb6', '#ffffff', '#ff6b6b'] },
131
- cemiterio: { base: '#46624f', top: '#5e7d68', bLt: '#6f9079', bDk: '#3a5244', center: '#f0e6d0', petals: ['#c9b6e8', '#e7c9dd', '#b6c9e8'] },
132
- espaco: { base: '#2d4650', top: '#40606a', bLt: '#557f88', bDk: '#26404a', center: '#fff6c0', petals: ['#d6ecff', '#ffffff', '#cfffe8'] },
133
- floresta: { base: '#3a7a34', top: '#5fa84a', bLt: '#6fc255', bDk: '#2f6329', center: '#ffe14d', petals: ['#c98ce0', '#ffffff', '#ffd166', '#ff7eb6'] },
134
- };
135
- /** '#rrggbb' → 0xrrggbb, para o `beginFill` do PIXI. Verbatim do `hexN` do game.js. */
136
- export const hexN = (s) => parseInt(String(s).slice(1), 16);
137
- /**
138
- * A validação de `setCenario`, sem o efeito: tema conhecido passa, o resto vira 'cidade'.
139
- * ⚠️ Cópia FIEL do monólito, herança do `Object.prototype` inclusive — ver o cabeçalho.
140
- */
141
- export function normalizarCenario(theme) {
142
- if (!CENARIOS[theme])
143
- return CENARIO_PADRAO;
144
- return theme;
145
- }
@@ -1,63 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import { tex, type PixelPainter } from './canvas.js';
3
- type Tex = ReturnType<typeof tex>;
4
- /** O par de quadros do ciclo de 2 tempos que TODA figura da rua usa. */
5
- export type TexPair = [Tex, Tex];
6
- /** Índice do quadro: 0 e 1, os dois tempos do ciclo. */
7
- export type Frame = 0 | 1;
8
- /** Pombo no chão 7×6 — corpo cinza, bico laranja, pés. f alterna cabeça alta ↔ bicando. */
9
- export declare const paintPombo: (f: Frame) => PixelPainter;
10
- /** Pombo em revoada 8×7 — mesmo corpo, asa batendo. */
11
- export declare const paintPomboFly: (f: Frame) => PixelPainter;
12
- /** Gato 12×8 — corpo/cabeça/orelhas/rabo escuros, olho verde; f alterna as patas. */
13
- export declare const paintGato: (f: Frame) => PixelPainter;
14
- /** Cão 13×9 — corpo marrom, focinho escuro, orelha; f alterna as patas. */
15
- export declare const paintCao: (f: Frame) => PixelPainter;
16
- /** Catálogo dos bichos: tamanho do canvas + painter por quadro. Fonte única que `createCityTextures` percorre
17
- * e que o teste de regressão de arte itera — as chaves são as MESMAS que `game/life` lê em `LifeTexAtlas`. */
18
- export declare const CREATURE_ART: {
19
- readonly pombo: {
20
- readonly w: 7;
21
- readonly h: 6;
22
- readonly paint: (f: Frame) => PixelPainter;
23
- };
24
- readonly pomboFly: {
25
- readonly w: 8;
26
- readonly h: 7;
27
- readonly paint: (f: Frame) => PixelPainter;
28
- };
29
- readonly gato: {
30
- readonly w: 12;
31
- readonly h: 8;
32
- readonly paint: (f: Frame) => PixelPainter;
33
- };
34
- readonly cao: {
35
- readonly w: 13;
36
- readonly h: 9;
37
- readonly paint: (f: Frame) => PixelPainter;
38
- };
39
- };
40
- export type CreatureKey = keyof typeof CREATURE_ART;
41
- /** Tamanho da silhueta — casado com o do personagem jogável (render/sprites). */
42
- export declare const ADULT_W = 16, ADULT_H = 32;
43
- /** Cor única de toda silhueta (era o `const col` fora do `mk` no main.js). */
44
- export declare const ADULT_COL = "#262b38";
45
- /** As 6 silhuetas — 3 masculinas + 3 femininas, todas 16×32. A ordem é a do original (M1, M2, M3, F1, F2, F3);
46
- * `game/life` sorteia por índice, então reordenar troca qual silhueta cada sorteio produz. */
47
- export declare const ADULT_SHAPES: ((f: Frame) => PixelPainter)[];
48
- /** Tamanho do carro — 3× NATIVO (detalhado, sem upscale); `game/traffic` conta com os 78px de largura. */
49
- export declare const CAR_W = 78, CAR_H = 36;
50
- /** As 4 pinturas de fábrica: `[lataria, sombra, teto]`. */
51
- export declare const CAR_PALETTES: readonly (readonly [string, string, string])[];
52
- /** Um carro 78×36 na paleta dada. Vidros, brilhos, farol e lanterna são fixos (não seguem a lataria). */
53
- export declare const paintCar: (body: string, dark: string, top: string) => PixelPainter;
54
- /** O que o main.js injeta em `game/life` e `game/traffic` — nomes iguais aos campos dos respectivos `Ctx`. */
55
- export interface CityTextures {
56
- lifeTex: Record<CreatureKey, TexPair>;
57
- adultTex: TexPair[];
58
- carTex: Tex[];
59
- }
60
- /** Assa TODA a arte da rua de uma vez. TOCA `document` — chame só no boot do navegador, nunca no import.
61
- * Não memoiza de propósito: é chamada uma vez pelo main.js; um cache aqui só esconderia uma segunda chamada. */
62
- export declare function createCityTextures(): CityTextures;
63
- export {};
@@ -1,228 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // render/city-tex — a ARTE PROCEDURAL DA RUA: os bichos, os pedestres e os carros do cenário Cidade.
3
- //
4
- // Três blocos que viviam soltos no main.js (`LIFE_TEX`, `ADULT_TEX`, `CAR_TEX`) e que são a MESMA coisa vista
5
- // de três ângulos: retângulos coloridos carimbados num canvas offscreen que vira PIXI.Texture. Por isso caem
6
- // juntos aqui, e não em três módulos: o que os une não é o assunto (bicho ≠ carro), é a TÉCNICA e o CONSUMIDOR
7
- // — quem os pede é a Cidade, e só ela. `render/props` (moeda, árvore) e `render/world-tex` (o nível inteiro)
8
- // ficam onde estão: props é decoração de QUALQUER cenário, world-tex é o mapa, não a rua.
9
- //
10
- // A DUPLICAÇÃO QUE ESTA EXTRAÇÃO CUROU: cada um dos três blocos declarava o SEU `mk` e o SEU `px`, com
11
- // assinaturas que não conversavam — `mk(w,h,paint)` com `px(x,y,w,h,cor)`; `mk(paint)` de 16×32 fixo com
12
- // `px(x,y,w,h)` e a cor presa numa `const` de fora; `mk(body,dark,top)` de 78×36 fixo com `px(x,y,w,h,cl)`.
13
- // Três grafias para "pinte um retângulo". Agora existe uma só, `pixelCanvas`/`pixelTexture` em render/canvas.
14
- // EFEITO COLATERAL ACEITO: as silhuetas de adulto passaram a receber a cor em CADA chamada (`ADULT_COL`) em vez
15
- // de um `fillStyle` único antes do laço. O bitmap resultante é idêntico ao byte — só o número de atribuições de
16
- // `fillStyle` muda —, e em troca some a última assinatura divergente.
17
- //
18
- // SEM I/O NO IMPORT — este é o ponto mais importante do arquivo. As texturas de origem nasciam em IIFE no corpo
19
- // do main.js, o que funciona lá porque o main.js só roda no navegador; um módulo em `render/` é importado pelo
20
- // project `node` do Vitest, onde `makeCanvas` toca `document` e explode. Por isso NÃO há constante pronta aqui:
21
- // há `createCityTextures()`, chamada uma vez pelo main.js no boot. Mesmo precedente de `render/textures`
22
- // (caches preenchidos por `initTextures`) e `render/viewports` (`initViewports`).
23
- //
24
- // A FRONTEIRA COM O JOGO NÃO SE MEXE: `game/life` e `game/traffic` continuam recebendo as texturas por INJEÇÃO
25
- // (`initLife({ lifeTex, adultTex, … })`, `initTraffic({ CAR_TEX, … })`) — eles nunca importaram este módulo e
26
- // continuam sem importar, para seguirem testáveis em `node` com texturas de mentira. O main.js é que passou a
27
- // buscar aqui o que antes fabricava em casa. Quem cria as CAMADAS (`lifeLayer`, `carLayer`) e solda o z-order
28
- // segue sendo o main.js: z-order é composição de cena, não arte.
29
- //
30
- // ARMADILHAS AO MEXER NA ARTE:
31
- // · Os comentários de arte (`// cabeça alta / bicando`, `// M2: magro, de boné`, `// coluna B + retrovisor`)
32
- // são a ÚNICA documentação de qual retângulo é qual parte da figura. Não os apague ao editar coordenadas.
33
- // · A silhueta F2 NÃO chama `arms` — é verbatim do original, não esquecimento: os dois retângulos altos do
34
- // cabelo longo (`2,4,3,13` e `11,4,3,13`) ocupam exatamente onde os braços iriam. Se um dia isso for
35
- // "consertado", a F2 muda de forma no jogo.
36
- // · Os carros são 3× NATIVOS (78×36 desenhados, sem upscale) porque a rua fica na camada da frente, perto da
37
- // câmera; os bichos são 1× (7×6 … 13×9). Não normalize as escalas: `game/traffic` conta com os 78px.
38
- // · Dois quadros por figura, sempre na ordem `[f0, f1]`: `game/life` alterna por índice (`f = f ? 0 : 1`).
39
- // Inverter o par não quebra nenhum tipo — quebra a animação, em silêncio.
40
- import { pixelTexture } from './canvas.js';
41
- /* ===================== bichos: pombo, pombo voando, gato, cão ===================== */
42
- /** Pombo no chão 7×6 — corpo cinza, bico laranja, pés. f alterna cabeça alta ↔ bicando. */
43
- export const paintPombo = (f) => (px) => {
44
- px(1, 2, 4, 2, '#9aa3b2');
45
- px(0, 3, 2, 1, '#7d8695');
46
- if (f === 0) {
47
- px(4, 1, 2, 2, '#b9c2d0');
48
- px(6, 2, 1, 1, '#e0a23c');
49
- }
50
- else {
51
- px(4, 3, 2, 2, '#b9c2d0');
52
- px(6, 4, 1, 1, '#e0a23c');
53
- } // cabeça alta / bicando
54
- px(2, 5, 1, 1, '#c96a2e');
55
- px(4, 5, 1, 1, '#c96a2e');
56
- };
57
- /** Pombo em revoada 8×7 — mesmo corpo, asa batendo. */
58
- export const paintPomboFly = (f) => (px) => {
59
- px(2, 3, 4, 2, '#9aa3b2');
60
- px(6, 2, 2, 2, '#b9c2d0');
61
- px(7, 3, 1, 1, '#e0a23c');
62
- if (f === 0)
63
- px(1, 0, 4, 2, '#c8d0dc');
64
- else
65
- px(1, 5, 4, 2, '#c8d0dc'); // asa cima/baixo
66
- };
67
- /** Gato 12×8 — corpo/cabeça/orelhas/rabo escuros, olho verde; f alterna as patas. */
68
- export const paintGato = (f) => (px) => {
69
- px(1, 3, 8, 3, '#454b58');
70
- px(8, 1, 3, 3, '#454b58');
71
- px(8, 0, 1, 1, '#454b58');
72
- px(10, 0, 1, 1, '#454b58');
73
- px(0, 2, 1, 3, '#454b58');
74
- px(9, 2, 1, 1, '#9fe07a');
75
- if (f === 0) {
76
- px(2, 6, 1, 2, '#454b58');
77
- px(7, 6, 1, 2, '#454b58');
78
- }
79
- else {
80
- px(3, 6, 1, 2, '#454b58');
81
- px(6, 6, 1, 2, '#454b58');
82
- }
83
- };
84
- /** Cão 13×9 — corpo marrom, focinho escuro, orelha; f alterna as patas. */
85
- export const paintCao = (f) => (px) => {
86
- px(1, 3, 9, 4, '#8a6a44');
87
- px(9, 1, 4, 4, '#8a6a44');
88
- px(12, 2, 1, 2, '#3a2d1c');
89
- px(9, 0, 2, 2, '#6d5334');
90
- px(0, 2, 1, 3, '#8a6a44');
91
- if (f === 0) {
92
- px(2, 7, 1, 2, '#6d5334');
93
- px(8, 7, 1, 2, '#6d5334');
94
- }
95
- else {
96
- px(3, 7, 1, 2, '#6d5334');
97
- px(7, 7, 1, 2, '#6d5334');
98
- }
99
- };
100
- /** Catálogo dos bichos: tamanho do canvas + painter por quadro. Fonte única que `createCityTextures` percorre
101
- * e que o teste de regressão de arte itera — as chaves são as MESMAS que `game/life` lê em `LifeTexAtlas`. */
102
- export const CREATURE_ART = {
103
- pombo: { w: 7, h: 6, paint: paintPombo },
104
- pomboFly: { w: 8, h: 7, paint: paintPomboFly },
105
- gato: { w: 12, h: 8, paint: paintGato },
106
- cao: { w: 13, h: 9, paint: paintCao },
107
- };
108
- /* ===================== adultos: 6 silhuetas 16×32 ===================== */
109
- // Adultos = SILHUETAS 16×32 (mesma proporção/tamanho do personagem), formatos distintos M/F (pedido do José)
110
- /** Tamanho da silhueta — casado com o do personagem jogável (render/sprites). */
111
- export const ADULT_W = 16, ADULT_H = 32;
112
- /** Cor única de toda silhueta (era o `const col` fora do `mk` no main.js). */
113
- export const ADULT_COL = '#262b38';
114
- /** Pernas: calça (duas colunas alternando o passo) ou saia + pernas curtas. */
115
- const legs = (px, f, skirt) => {
116
- if (skirt) {
117
- px(4, 20, 8, 6, ADULT_COL);
118
- if (f === 0) {
119
- px(5, 26, 2, 6, ADULT_COL);
120
- px(9, 26, 2, 6, ADULT_COL);
121
- }
122
- else {
123
- px(4, 26, 2, 6, ADULT_COL);
124
- px(10, 26, 2, 6, ADULT_COL);
125
- }
126
- }
127
- else {
128
- if (f === 0) {
129
- px(5, 20, 3, 12, ADULT_COL);
130
- px(9, 20, 3, 11, ADULT_COL);
131
- }
132
- else {
133
- px(4, 20, 3, 11, ADULT_COL);
134
- px(10, 20, 3, 12, ADULT_COL);
135
- }
136
- }
137
- };
138
- /** Braços pendentes, defasados entre os quadros (dá o balanço da caminhada). */
139
- const arms = (px, f) => {
140
- if (f === 0) {
141
- px(2, 10, 2, 8, ADULT_COL);
142
- px(12, 10, 2, 8, ADULT_COL);
143
- }
144
- else {
145
- px(2, 11, 2, 7, ADULT_COL);
146
- px(12, 9, 2, 8, ADULT_COL);
147
- }
148
- };
149
- /** As 6 silhuetas — 3 masculinas + 3 femininas, todas 16×32. A ordem é a do original (M1, M2, M3, F1, F2, F3);
150
- * `game/life` sorteia por índice, então reordenar troca qual silhueta cada sorteio produz. */
151
- export const ADULT_SHAPES = [
152
- (f) => (px) => { px(4, 0, 8, 6, ADULT_COL); px(3, 6, 10, 14, ADULT_COL); arms(px, f); legs(px, f, false); }, // M1: ombros largos
153
- (f) => (px) => { px(5, 0, 6, 5, ADULT_COL); px(3, 1, 10, 2, ADULT_COL); px(5, 5, 6, 15, ADULT_COL); arms(px, f); legs(px, f, false); }, // M2: magro, de boné
154
- (f) => (px) => { px(4, 1, 8, 5, ADULT_COL); px(2, 6, 12, 14, ADULT_COL); arms(px, f); legs(px, f, false); }, // M3: troncudo
155
- (f) => (px) => { px(4, 0, 8, 6, ADULT_COL); px(11, 3, 3, 10, ADULT_COL); px(4, 6, 8, 10, ADULT_COL); px(3, 16, 10, 5, ADULT_COL); arms(px, f); legs(px, f, true); }, // F1: rabo de cavalo + saia
156
- (f) => (px) => { px(3, 0, 10, 6, ADULT_COL); px(2, 4, 3, 13, ADULT_COL); px(11, 4, 3, 13, ADULT_COL); px(5, 6, 6, 10, ADULT_COL); px(4, 16, 8, 5, ADULT_COL); legs(px, f, true); }, // F2: cabelo longo + vestido (sem `arms` — ver o cabeçalho)
157
- (f) => (px) => { px(3, 0, 10, 7, ADULT_COL); px(4, 7, 8, 9, ADULT_COL); px(3, 16, 10, 5, ADULT_COL); arms(px, f); legs(px, f, true); }, // F3: chanel + saia
158
- ];
159
- /* ===================== carros: 4 cores, 78×36 (3× nativo) ===================== */
160
- /** Tamanho do carro — 3× NATIVO (detalhado, sem upscale); `game/traffic` conta com os 78px de largura. */
161
- export const CAR_W = 78, CAR_H = 36;
162
- /** As 4 pinturas de fábrica: `[lataria, sombra, teto]`. */
163
- export const CAR_PALETTES = [
164
- ['#c8452e', '#7d2717', '#a03a24'], // vermelho
165
- ['#2e6fc8', '#193f7d', '#2757a0'], // azul
166
- ['#3aa15b', '#1f6336', '#2f8a4c'], // verde
167
- ['#c8a12e', '#7d641a', '#a8862a'], // amarelo
168
- ];
169
- /* ===================== A RODA É REDONDA, E ISSO PRECISOU SER DITO =====================
170
- * A primeira versão do carro (portada verbatim do monólito) fazia o pneu com UM retângulo de 14×11. Numa
171
- * arte de retângulos carimbados, a roda é o único elemento que o olho sabe de cor que é redondo — e é o
172
- * primeiro que denuncia o desenho inteiro. O Dev, olhando a rua: "melhore os carros, estão muito feios com
173
- * as rodas quadradas."
174
- *
175
- * O jeito de ter círculo aqui é o de sempre em pixel art: uma TABELA de linhas, cada uma com o recuo e a
176
- * largura daquela altura. Não é aproximação de matemática em tempo de execução — é o desenho, escrito. */
177
- /** Pneu Ø14: `[recuo, largura]` por linha, de cima para baixo. */
178
- const PNEU = [
179
- [5, 4], [3, 8], [2, 10], [1, 12], [1, 12], [0, 14], [0, 14],
180
- [0, 14], [0, 14], [1, 12], [1, 12], [2, 10], [3, 8], [5, 4],
181
- ];
182
- /** Aro Ø8, no mesmo formato — desenhado dentro do pneu. */
183
- const ARO = [
184
- [2, 4], [1, 6], [0, 8], [0, 8], [0, 8], [0, 8], [1, 6], [2, 4],
185
- ];
186
- /** Um carro 78×36 na paleta dada. Vidros, brilhos, farol e lanterna são fixos (não seguem a lataria). */
187
- export const paintCar = (body, dark, top) => (px) => {
188
- px(3, 14, 72, 13, body);
189
- px(3, 25, 72, 2, dark); // corpo + saia escura
190
- px(1, 16, 2, 8, dark);
191
- px(75, 16, 2, 8, dark); // para-choques
192
- // Cabine com o teto AFUNILADO: eram 40px de bloco reto, e teto reto num carro de perfil lê como caixa.
193
- px(17, 4, 36, 2, top);
194
- px(15, 6, 40, 9, top);
195
- px(17, 6, 36, 9, body);
196
- px(19, 7, 14, 7, '#bcd6ee');
197
- px(37, 7, 14, 7, '#bcd6ee'); // vidros
198
- px(20, 8, 4, 2, '#eef6ff');
199
- px(38, 8, 4, 2, '#eef6ff'); // brilho dos vidros
200
- px(34, 7, 3, 7, top);
201
- px(53, 10, 4, 4, dark); // coluna B + retrovisor
202
- px(3, 14, 72, 1, 'rgba(255,255,255,.28)'); // realce superior da lataria
203
- px(35, 15, 1, 10, dark); // frisa entre as duas portas
204
- px(0, 17, 3, 5, '#ffd9a0');
205
- px(75, 17, 3, 5, '#ff6a5a'); // farol / lanterna
206
- const wheel = (wx) => {
207
- px(wx + 1, 20, 12, 2, dark);
208
- px(wx - 1, 21, 16, 1, dark); // caixa de roda, em arco
209
- PNEU.forEach(([dx, w], i) => px(wx + dx, 22 + i, w, 1, '#10131a')); // pneu
210
- ARO.forEach(([dx, w], i) => px(wx + 3 + dx, 25 + i, w, 1, '#2b3140')); // aro
211
- px(wx + 6, 28, 2, 2, '#8a93a8'); // cubo
212
- };
213
- wheel(11);
214
- wheel(53);
215
- };
216
- /** Assa TODA a arte da rua de uma vez. TOCA `document` — chame só no boot do navegador, nunca no import.
217
- * Não memoiza de propósito: é chamada uma vez pelo main.js; um cache aqui só esconderia uma segunda chamada. */
218
- export function createCityTextures() {
219
- const pair = (w, h, paint) => [pixelTexture(w, h, paint(0)), pixelTexture(w, h, paint(1))]; // ordem [f0, f1] — game/life alterna por índice
220
- const lifeTex = {};
221
- for (const k of Object.keys(CREATURE_ART)) {
222
- const a = CREATURE_ART[k];
223
- lifeTex[k] = pair(a.w, a.h, a.paint);
224
- }
225
- const adultTex = ADULT_SHAPES.map((v) => pair(ADULT_W, ADULT_H, v));
226
- const carTex = CAR_PALETTES.map(([body, dark, top]) => pixelTexture(CAR_W, CAR_H, paintCar(body, dark, top)));
227
- return { lifeTex, adultTex, carTex };
228
- }
@@ -1,11 +0,0 @@
1
- // SPDX-License-Identifier: AGPL-3.0-or-later
2
- import { type PixelPainter } from './canvas.js';
3
- /** O TILE do miolo da parede: alvenaria em fiada alternada. 51 retângulos, 9 cores, fiel ao pixel. */
4
- export declare const paintTileFill: PixelPainter;
5
- /** O TILE do TOPO da plataforma: mesma alvenaria com a borda superior iluminada. 62 retângulos, 23 cores. */
6
- export declare const paintTileSurface: PixelPainter;
7
- /** Os dois tiles como canvas 16×16 — a forma que `worldCanvas` consumia das imagens carregadas. */
8
- export declare function cityTiles(): {
9
- fill: HTMLCanvasElement;
10
- surface: HTMLCanvasElement;
11
- };