@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
@@ -4,14 +4,25 @@ type Ticker = {
4
4
  deltaTime: number;
5
5
  remove?: (fn: () => void) => void;
6
6
  };
7
- export interface OpcoesDoLaco {
7
+ export interface LoopOptions {
8
8
  /**
9
- * Chamado UMA vez, com o erro, quando o quadro lança. É o canal de quem não enxerga a tela parar.
9
+ * THE GAME SPEED the child chose (ADR-0180): 1 is 100%, down to 0.5. Read EACH FRAME, so a change is felt on the next
10
+ * one. A game beside `createGame` passes `engine.gameSpeed`; a game that is its own root passes
11
+ * `() => state.gameSpeed`.
10
12
  *
11
- * A raiz de composição liga isto ao `srAlert` e a uma mensagem visível. Opcional de propósito: um consumidor
12
- * que monte o laço sem casca (um teste, o quiz) continua parando — o anúncio é opcional, **parar não é**.
13
+ * 🔴 REQUIRED (ADR-0232 D2c erratum; ADR-0224/0227's precedent): the loop no longer reads the settings store by import,
14
+ * and an optional port defaulting to 100% would ignore the child's choice in every game that forgot it — silently.
13
15
  */
14
- aoFalhar?: (erro: unknown) => void;
16
+ speed: () => number;
17
+ /**
18
+ * Called ONCE, with the error, when the frame throws. It is the channel of whoever cannot see the screen stop.
19
+ *
20
+ * A game beside `createGame` passes `engine.onFailure` (the screen reader, the narration and a visible message); a game
21
+ * that is its own root passes its own. 🔴 REQUIRED (ADR-0232 D4; the D2b erratum rejected the registration shape): the
22
+ * root used to register a default notice in this module, which was module state a second root overwrote, and an optional
23
+ * port is one more field a game forgets — a frame that stopped in silence is what a blind child cannot tell from a pause.
24
+ */
25
+ onFailure: (failure: unknown) => void;
15
26
  }
16
- export declare function startLoop(ticker: Ticker, frame: (dt: number) => void, maxDt?: number, opcoes?: OpcoesDoLaco): void;
27
+ export declare function startLoop(ticker: Ticker, frame: (dt: number) => void, maxDt: number | undefined, options: LoopOptions): void;
17
28
  export {};
@@ -1,36 +1,36 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // core/loop.ts — driver do loop de jogo. Registra a função de frame num "ticker" (o app.ticker do PixiJS, ou
3
- // qualquer objeto com .add(fn) e .deltaTime) e passa o dt CLAMPADO (evita saltos gigantes após a aba ficar em
4
- // segundo plano). Módulo-folha. Mantém a cadência ATUAL (não muda o timing) — o fixed-timestep determinístico
5
- // fica para depois, pois mudaria a física.
2
+ // core/loop.ts — the game loop driver. Registers the frame function on a "ticker" (PixiJS's app.ticker, or any object
3
+ // with .add(fn) and .deltaTime) and passes a CLAMPED dt (no giant jump after the tab was in the background). A leaf
4
+ // module. It keeps the CURRENT cadence — a deterministic fixed timestep would change the physics, so it waits.
6
5
  //
7
- // ========================= O BOUNDARY DE ERRO (D16), E POR QUE ELE FALHA ALTO =========================
8
- // Sem ele, um quadro que lança lança OUTRA VEZ no quadro seguinte, para sempre: tela congelada, console cheio, e
9
- // nada na tela dizendo o que houve. A spec do `demos` pede isto por escala — "across 383 games, one bad game has
10
- // to be distinguishable from a broken engine". A razão daqui é mais urgente: **criança cega não vê tela
11
- // congelada.** Sem anúncio, o modo cego não distingue "travou" de "está pensando".
6
+ // ========================= THE ERROR BOUNDARY (D16), AND WHY IT FAILS LOUD =========================
7
+ // Without it, a frame that throws throws AGAIN on the next frame, forever: a frozen screen, a full console, and nothing
8
+ // on screen saying what happened. The `demos` spec asks for it by scale — "across 383 games, one bad game has to be
9
+ // distinguishable from a broken engine". The reason here is more urgent: **a blind child does not see a frozen
10
+ // screen.** Without an announcement, blind mode cannot tell "it froze" from "it is thinking".
12
11
  //
13
- // ⚠️ E A TENTAÇÃO É O CONTRÁRIO DO CONSERTO. `try { frame() } catch { /* segue */ }` é pior que o defeito: vira
14
- // jogo silenciosamente errado, rodando para sempre computando lixo. A regra aqui é a mesma que o ADR-0047 aplicou
15
- // ao CRT — pega UMA vez, PARA, e ANUNCIA.
16
- export function startLoop(ticker, frame, maxDt = 2, opcoes = {}) {
17
- let parado = false;
18
- const passo = () => {
19
- if (parado)
20
- return; // ticker sem `remove` não desregistra — a trava é o que faz o laço parar mesmo assim
12
+ // ⚠️ AND THE TEMPTATION IS THE OPPOSITE OF THE FIX. `try { frame() } catch { /* carry on */ }` is worse than the defect:
13
+ // it becomes a silently wrong game, computing garbage forever. The rule is the one ADR-0047 applied to the CRT — catch
14
+ // ONCE, STOP, and ANNOUNCE.
15
+ export function startLoop(ticker, frame, maxDt = 2, options) {
16
+ let stopped = false;
17
+ const step = () => {
18
+ if (stopped)
19
+ return; // a ticker without `remove` cannot unregister — this latch is what stops the loop anyway
21
20
  try {
22
- frame(Math.min(ticker.deltaTime, maxDt));
21
+ // the game speed (ADR-0180) applies to the clamped time, read each frame: a change is felt on the next one
22
+ frame(Math.min(ticker.deltaTime, maxDt) * options.speed());
23
23
  }
24
- catch (erro) {
25
- parado = true;
26
- ticker.remove?.(passo); // some do ticker quando dá: callback que roda 60×/s para nada custa em hardware fraco
27
- // O anúncio não pode ressuscitar o problema. Se o próprio aviso quebrar — sem leitor de tela, sem DOM —,
28
- // uma exceção aqui voltaria a ser invisível dentro do ticker, que é exatamente o defeito que isto fecha.
24
+ catch (failure) {
25
+ stopped = true;
26
+ ticker.remove?.(step); // leave the ticker when possible: a callback running 60×/s for nothing costs on weak hardware
27
+ // The announcement must not revive the problem. If the notice itself breaks — no screen reader, no DOM — an
28
+ // exception here would be invisible inside the ticker again, which is exactly the defect this closes.
29
29
  try {
30
- opcoes.aoFalhar?.(erro);
30
+ options.onFailure(failure);
31
31
  }
32
- catch { /* noop: o aviso falhou; o laço já parou, que é o essencial */ }
32
+ catch { /* noop: the notice failed; the loop already stopped, which is what matters */ }
33
33
  }
34
34
  };
35
- ticker.add(passo);
35
+ ticker.add(step);
36
36
  }
@@ -0,0 +1,15 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ export interface PauseIcon {
3
+ /** `data-pi` key — the dispatch key of iconAct/iconLabel/reflectIconBtn. */
4
+ k: string;
5
+ /** The emoji glyph rendered inside the button. */
6
+ e: string;
7
+ /** i18n KEY of the base name; also the `aria-label` when the icon carries no state. */
8
+ n: string;
9
+ }
10
+ /** The accessibility shortcut bar at the top of every pause screen (and of the splash `#title-icons`).
11
+ * Sound-bound icons (blind/TTS) require a private audio output; the webcam and the voice require the device to have one.
12
+ * The order and behaviour came verbatim from the monolith, which left with the cartridge (#111); the names became
13
+ * i18n keys in the Phase-5 pass. */
14
+ export declare const PAUSE_ICONS: readonly PauseIcon[];
15
+ export declare function pauseIcon(k: string): PauseIcon | undefined;
@@ -0,0 +1,54 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // core/pause-icon-catalogue — WHICH ICONS THE ACCESSIBILITY BAR HAS, and in what order (ADR-0221; issue #203).
3
+ //
4
+ // The list, what each entry declares, and the lookup by key. 🔴 It left `ui/pause-icons` because that module had grown to 666
5
+ // lines and 122 decision nodes, and because this is DATA: it draws nothing, listens to nothing, stores nothing. A leaf module
6
+ // with zero imports, which is why the bar's contents can be read without mounting a document.
7
+ //
8
+ // ⚠️ AND IT LEFT FIRST FOR A REASON OF DIRECTION, not of size: the next cut is the MARKUP, and the markup needs the catalogue.
9
+ // With both in the same file, extracting the markup alone would make the two modules import each other — the cycle ADR-0173
10
+ // forbids. Data at the bottom, drawing above it.
11
+ //
12
+ // 📌 THE ORDER IS THE INTERFACE. A child who navigates the bar by keyboard has learnt where each icon is, and inserting one in
13
+ // the middle displaces every other — the same cost §2 of ADR-0044 refuses to pay in the pause card. A new icon goes at the END.
14
+ //
15
+ // 📌 What this module does NOT decide: which icons the bar actually mounts. That is `iconsThatAct` in `ui/pause-icons`, by the
16
+ // rule of ADR-0106 §5 — an icon exists only where something acts on it.
17
+ /** The accessibility shortcut bar at the top of every pause screen (and of the splash `#title-icons`).
18
+ * Sound-bound icons (blind/TTS) require a private audio output; the webcam and the voice require the device to have one.
19
+ * The order and behaviour came verbatim from the monolith, which left with the cartridge (#111); the names became
20
+ * i18n keys in the Phase-5 pass. */
21
+ // `n` is the i18n KEY of the icon's name (the emoji `e` is NOT translated — it is the same glyph in every language).
22
+ export const PAUSE_ICONS = [
23
+ // FIRST, the menus (the Dev, 2026-09-16: «Menu deve ser o primeiro ícone»): the SELECT door as an icon, for a hand with no
24
+ // SELECT under it. Mounted only where there is a card to open (`abrirMenus`).
25
+ { k: 'menu', e: '☰', n: 'icon.menu' },
26
+ { k: 'blind', e: '🦯', n: 'icon.blind' },
27
+ { k: 'tts', e: '🗨️', n: 'icon.tts' },
28
+ { k: 'libras', e: '🦻', n: 'icon.libras' }, // 🦻 (the Dev, 2026-09-16): 🤟 is playing by hand gestures
29
+ { k: 'tea', e: '🧩', n: 'icon.tea' },
30
+ { k: 'altmove', e: '☝️', n: 'icon.altmove' }, // ☝️ and not 🦾 (the Dev): the gesture is ONE FINGER pressing, which is what toggling asks for
31
+ { k: 'contrast', e: '🌗', n: 'icon.contrast' },
32
+ { k: 'cvd', e: '🚥', n: 'icon.cvd' },
33
+ // playing through the webcam, ONE icon (ADR-0215): off · hands · face · eyes, each with its lines; where 🧑 and 👀 were
34
+ { k: 'camera', e: '📷', n: 'icon.camera' },
35
+ // playing by SPEAKING (ADR-0189, issue #184): it left «em construção» on 2026-09-21, when the words, the recogniser, the
36
+ // microphone and the wiring existed — not a day before, because an icon that announces itself and changes nothing is the
37
+ // defect ADR-0106 §5 names.
38
+ { k: 'voice', e: '👄', n: 'icon.voice' },
39
+ /*
40
+ * THE ELEVENTH (ADR-0149 §1), at the END for the reason of order written in this file's header, not of importance.
41
+ *
42
+ * 📌 A CYCLE AND NOT A DOOR. The typography panel still exists in the Settings with its thirty faces; this button is the
43
+ * choice a child makes WITHOUT leaving the screen, in one press, and that is why it is a short curated list and not a menu.
44
+ */
45
+ { k: 'tipografia', e: '🔤', n: 'icon.tipografia' },
46
+ // THE TWELFTH (ADR-0180): the game speed, its own button beside toggle keys, at the end for the same reason as the eleventh.
47
+ // An hourglass and no animal: a snail, a turtle or a hare can read as an insult to the child who needs the slower game.
48
+ { k: 'velocidade', e: '⏳', n: 'icon.velocidade' },
49
+ // THE LAST BUTTON, the language (the Dev, 2026-09-16): Brazil → United States → Mexico, each press; menus, the footer, speech and
50
+ // recognition follow it. Its glyph is a DRAWN flag (`ui/locale-flags`), since flag emoji show as letters on Windows.
51
+ { k: 'idioma', e: '🇧🇷', n: 'icon.idioma' },
52
+ ];
53
+ const ICON_BY_KEY = new Map(PAUSE_ICONS.map((ic) => [ic.k, ic]));
54
+ export function pauseIcon(k) { return ICON_BY_KEY.get(k); }
@@ -0,0 +1,17 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ /**
3
+ * TAKES ONE STEP ROUND A RING — past the last comes the first, and before the first is the last.
4
+ *
5
+ * It was `clampIndex`, which stuck at the ends. ADR-0044 overturned that for a reason of use, not taste: with ONE MENU
6
+ * PER SCREEN every list can be a ring, and the least wanted item (`quit`) is ONE key from the most urgent (`resume`)
7
+ * without sitting next to it. A child who cannot see does not sweep the list looking for its end — they ask "and
8
+ * before the first?" and get an answer.
9
+ *
10
+ * XAG 106 allows the ring exactly for a LINEAR menu and forbids it for a 2-D grid of blocks, where "back to the first"
11
+ * has no spatial meaning.
12
+ *
13
+ * ⚠️ WALKING A LIST IS A RING; ADJUSTING A VALUE IS A LIMIT. The select and range steps stay pinned at their ends, and
14
+ * the difference is real: jumping from the loudest volume to the quietest with one key is a fright, not a convenience —
15
+ * and in a game with audio cues for blindness, a volume fright is harm.
16
+ */
17
+ export declare function stepInRing(len: number, idx: number, delta: number): number;
@@ -0,0 +1,29 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // core/ring — THE RING ARITHMETIC, and nothing else.
3
+ //
4
+ // It lived in `ui/menu-nav` and left when item 7 of ADR-0044 made `ui/pause-icons` need it too: `menu-nav` already
5
+ // imported `pause-icons`, and the way back would close an import CYCLE. A cycle in ESM does not blow up at once — it
6
+ // blows up at boot, in the TDZ, when one of the two reads the other during evaluation: the kind of defect that shows
7
+ // once, in production, and vanishes when investigated.
8
+ //
9
+ // A leaf module on purpose: no dependencies, one function, no I/O.
10
+ /**
11
+ * TAKES ONE STEP ROUND A RING — past the last comes the first, and before the first is the last.
12
+ *
13
+ * It was `clampIndex`, which stuck at the ends. ADR-0044 overturned that for a reason of use, not taste: with ONE MENU
14
+ * PER SCREEN every list can be a ring, and the least wanted item (`quit`) is ONE key from the most urgent (`resume`)
15
+ * without sitting next to it. A child who cannot see does not sweep the list looking for its end — they ask "and
16
+ * before the first?" and get an answer.
17
+ *
18
+ * XAG 106 allows the ring exactly for a LINEAR menu and forbids it for a 2-D grid of blocks, where "back to the first"
19
+ * has no spatial meaning.
20
+ *
21
+ * ⚠️ WALKING A LIST IS A RING; ADJUSTING A VALUE IS A LIMIT. The select and range steps stay pinned at their ends, and
22
+ * the difference is real: jumping from the loudest volume to the quietest with one key is a fright, not a convenience —
23
+ * and in a game with audio cues for blindness, a volume fright is harm.
24
+ */
25
+ export function stepInRing(len, idx, delta) {
26
+ if (len <= 0)
27
+ return 0;
28
+ return ((idx + delta) % len + len) % len; // the extra `+ len`: `%` of a negative in JS is negative
29
+ }
@@ -1,20 +1,15 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- /** Uma corrente de números pseudoaleatórios independente de qualquer outra. */
2
+ /** A stream of pseudo-random numbers independent of any other. */
3
3
  export interface Rng {
4
4
  /** [0, 1). */
5
5
  readonly rnd: () => number;
6
- /** Inteiro em [lo, hi], ambos inclusive. */
6
+ /** An integer in [lo, hi], both inclusive. */
7
7
  readonly randInt: (lo: number, hi: number) => number;
8
- /** Cópia baralhada (Fisher-Yates); não toca no original. */
8
+ /** A shuffled copy (Fisher-Yates); the original is untouched. */
9
9
  readonly shuffle: <T>(arr: readonly T[]) => T[];
10
- /** Reposiciona ESTA corrente. Não alcança nenhuma outra. */
10
+ /** Repositions THIS stream. Reaches no other. */
11
11
  readonly reseed: (s: number) => void;
12
12
  }
13
- /** A semente do jogo próprio da engine. Um consumidor externo escolhe a sua. */
14
- export declare const SEMENTE_PADRAO = 20260601;
15
- export declare const createRng: (semente?: number) => Rng;
16
- export declare const reseed: (s: number) => void;
17
- export declare const rnd: () => number;
18
- export declare const randInt: (lo: number, hi: number) => number;
19
- export declare const shuffle: <T>(arr: readonly T[]) => T[];
20
- export declare const rngDecoracao: Rng;
13
+ /** The seed of the engine's own game. An outside consumer picks its own. */
14
+ export declare const DEFAULT_SEED = 20260601;
15
+ export declare const createRng: (seed?: number) => Rng;
@@ -1,34 +1,31 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
- // core/rng.ts — RNG semeado (LCG determinístico) p/ reprodutibilidade (coin placement / testes estáveis).
3
- // Módulo-folha PURO, ZERO deps.
2
+ // core/rng.ts — a seeded RNG (deterministic LCG) for reproducibility (placement, stable tests).
3
+ // A PURE leaf module, no dependencies.
4
4
  //
5
- // ⚠️ DUAS COISAS MUDARAM AQUI NA MESMA MIGRAÇÃO, E ISSO É DE PROPÓSITO (issue #107).
5
+ // ⚠️ TWO THINGS ARE HERE ON PURPOSE (issue #107).
6
6
  //
7
- // 1. `createRng(semente)` existe. A regra D13 do ADR-0038 — «um módulo que guarda estado exporta uma
8
- // fábrica `createX()`» — nomeava este módulo desde sempre e a conversão nunca aconteceu. O preço foi
9
- // medido pelo `game-15puzzle`, o segundo consumidor externo: com uma única corrente compartilhada por
10
- // doze módulos (`game/*`, `render/fx`, `render/weather`, `render/draw`), «embaralhamento determinístico
11
- // a partir da semente S» só é reproduzível numa página onde mais nada desenha — e a engine existe
12
- // justamente para que o jogo NÃO esteja sozinho na página. Cada consumidor faz a sua corrente.
7
+ // 1. `createRng(seed)`. ADR-0038's D13 — "a module that keeps state exports a `createX()` factory" — named this
8
+ // module. With one stream shared by every consumer, "a deterministic shuffle from seed S" is reproducible only on a
9
+ // page where nothing else draws — and the engine exists precisely so the game is NOT alone on the page. Each
10
+ // consumer makes its own stream.
11
+ // 📌 And the module holds NO stream of its own (ADR-0232 D4, issue #207): the shared `rnd`/`randInt`/`shuffle`/`reseed`
12
+ // and the decoration stream were module state a second game on the page shared. A game that wants ornament apart from
13
+ // its draws builds a second stream with another seed — the platformer's is `createRng(DEFAULT_SEED ^ 0x5eed)` — because
14
+ // particles drawn from the game's stream would move the game's draw.
13
15
  //
14
- // 2. A aritmética do LCG estava a perder precisão. `_seed * 1103515245` com `_seed` perto de 2³¹ chega a
15
- // ~2,37×10¹⁸, acima de 2⁵³: os bits BAIXOS — exatamente os que o `& 0x7fffffff` guarda — eram
16
- // arredondados fora antes de a máscara correr. `Math.imul` faz a multiplicação em 32 bits, que é o que
17
- // um LCG de 32 bits sempre quis dizer.
16
+ // 2. `Math.imul`, not `*`. `_seed * 1103515245` with `_seed` near 2³¹ reaches ~2.37×10¹⁸, above 2⁵³: the LOW bits —
17
+ // exactly the ones `& 0x7fffffff` keeps — were rounded away before the mask ran. `Math.imul` multiplies in 32 bits,
18
+ // which is what a 32-bit LCG always meant.
18
19
  //
19
- // ⚠️ POR QUE AS DUAS JUNTAS. Cada uma sozinha muda a sequência semeada. Fazer uma hoje e a outra depois
20
- // mudaria as sequências DUAS vezes, e da segunda vez ninguém se lembraria do porquê — o defeito ficaria a
21
- // parecer regressão. Uma migração, uma mudança de sequência, uma explicação.
22
- //
23
- // ⚠️ O QUE NÃO MUDA: continua determinístico. A aritmética antiga também era reprodutível (ponto flutuante
24
- // é determinístico), e foi por isso que o defeito nunca apareceu: não era aleatoriedade errada, era um
25
- // gerador PIOR do que o que foi escrito. Fixtures que dependiam dos valores concretos mudam de valor.
26
- /** A semente do jogo próprio da engine. Um consumidor externo escolhe a sua. */
27
- export const SEMENTE_PADRAO = 20260601;
28
- export const createRng = (semente = SEMENTE_PADRAO) => {
29
- let _seed = semente >>> 0;
30
- // `Math.imul` e não `*`: ver o cabeçalho. O `+ 12345` cabe em segurança porque `imul` já devolveu
31
- // um inteiro de 32 bits com sinal, e a máscara `& 0x7fffffff` desfaz o sinal.
20
+ // ⚠️ Both changed the seeded sequence, so they landed together: one migration, one sequence change, one explanation.
21
+ // The old arithmetic was reproducible too (floating point is deterministic), which is why the defect never showed:
22
+ // not wrong randomness, a WORSE generator than the one written.
23
+ /** The seed of the engine's own game. An outside consumer picks its own. */
24
+ export const DEFAULT_SEED = 20260601;
25
+ export const createRng = (seed = DEFAULT_SEED) => {
26
+ let _seed = seed >>> 0;
27
+ // `Math.imul` and not `*`: see the header. The `+ 12345` fits safely because `imul` already returned a signed 32-bit
28
+ // integer, and the `& 0x7fffffff` mask undoes the sign.
32
29
  const rnd = () => (_seed = (Math.imul(_seed, 1103515245) + 12345) & 0x7fffffff) / 0x7fffffff;
33
30
  const randInt = (lo, hi) => lo + Math.floor(rnd() * (hi - lo + 1));
34
31
  const shuffle = (arr) => {
@@ -42,30 +39,3 @@ export const createRng = (semente = SEMENTE_PADRAO) => {
42
39
  const reseed = (s) => { _seed = s >>> 0; };
43
40
  return { rnd, randInt, shuffle, reseed };
44
41
  };
45
- // ⚠️ ESTE BLOCO TINHA DATA DE MORTE ESCRITA, E ELA NÃO CHEGOU — A PREMISSA É QUE MORREU.
46
- // Dizia: «Existe porque `game/` ainda vive aqui dentro (issue #111). Quando `game/` sair, isto sai com ele.»
47
- // O `game/` saiu em 2026-09-07 — e saiu para OUTRO REPOSITÓRIO, onde continua a consumir estes quatro pelo
48
- // pacote. Medido no dia: `@the-inclusionist/game-platformer` importa `rnd`, `randInt` e `shuffle` em OITO
49
- // módulos (`quiz`, `physics`, `life`, `traffic`, `fractions`, `coins`, `coin-spawning`,
50
- // `literacy-distractors`) mais o `main.ts`.
51
- //
52
- // Ou seja, o que se previu como «sai junto» virou o oposto: saindo, o cartucho tornou-os SUPERFÍCIE
53
- // PÚBLICA de um pacote publicado. Removê-los agora é quebra de contrato maior, não limpeza.
54
- //
55
- // ⚠️ E A ADVERTÊNCIA CONTINUA VERDADEIRA, o que é o incómodo: são estado partilhado de módulo, que é
56
- // exatamente o defeito que a fábrica acima conserta. Um segundo jogo na mesma página divide esta corrente
57
- // com o primeiro. O caminho de saída é o consumidor passar a `createRng(suaSemente)` — e isso é migração
58
- // dele, com aviso e um major, não uma remoção unilateral daqui.
59
- const _padrao = createRng(SEMENTE_PADRAO);
60
- export const reseed = _padrao.reseed;
61
- export const rnd = _padrao.rnd;
62
- export const randInt = _padrao.randInt;
63
- export const shuffle = _padrao.shuffle;
64
- // ⚠️ A CORRENTE DA DECORAÇÃO, separada da de cima porque a mistura era o defeito CONCRETO.
65
- // `render/fx` tira um número por partícula, `render/weather` por gota, `render/draw` dois por tremor de
66
- // câmara — dezenas por quadro. Saindo da mesma corrente das moedas, «semeie com S e o mapa sai igual»
67
- // passava a depender de quantas partículas a tela desenhou antes, o que ninguém controla nem repara.
68
- // Enfeite NÃO pode mover o sorteio do jogo. São dois assuntos, e agora são duas correntes.
69
- // A semente é outra de propósito: se fosse a mesma, as duas correntes andariam em paralelo e o enfeite
70
- // ficaria correlacionado com o mapa — determinístico, mas visivelmente repetitivo.
71
- export const rngDecoracao = createRng(SEMENTE_PADRAO ^ 0x5eed);
@@ -1,42 +1,42 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-or-later
2
2
  import type { Role, Spot, Topology } from './contract.js';
3
3
  /**
4
- * Os papéis que uma rota atravessa. Leitura do `core/contract`, com o `hazard` de fora por decisão declarada
5
- * no cabeçalho — e `goal` de fora porque ele entra pela regra do último passo, não pela do meio.
4
+ * The roles a route crosses. A reading of `core/contract`, with `hazard` left out by the decision declared in the
5
+ * header — and `goal` left out because it comes in by the last-step rule, not the in-between one.
6
6
  */
7
- export declare const PAPEIS_ATRAVESSAVEIS: ReadonlySet<Role>;
8
- /** Este papel deixa passar? */
9
- export declare function atravessavel(papel: Role): boolean;
7
+ export declare const WALKABLE_ROLES: ReadonlySet<Role>;
8
+ /** Does this role let one through? */
9
+ export declare function isWalkable(role: Role): boolean;
10
10
  export interface RouteCtx {
11
- /** Campo 1 do contrato. A métrica decide QUANTOS vizinhos um ponto tem. */
11
+ /** Field 1 of the contract. The metric decides HOW MANY neighbours a spot has. */
12
12
  readonly topology: Topology;
13
- /** Campo 2 do contrato: o que há neste ponto. Obrigatório na `GameDeclaration`, logo sempre disponível. */
13
+ /** Field 2 of the contract: what is at this spot. Mandatory in `GameDeclaration`, so always available. */
14
14
  readonly roleAt: (at: Spot) => Role;
15
15
  /**
16
- * Teto de pontos visitados. Estourou → `null`, que é «não sei».
16
+ * Ceiling of visited spots. Hit → `null`, which is "I cannot say".
17
17
  *
18
- * 4096 é ~64×64 numa grade e cobre com folga os tabuleiros que existem hoje; num mapa de plataforma grande
19
- * ele corta antes de a busca custar um quadro. O número é PARÂMETRO porque o custo aceitável é de quem
20
- * chama: uma pista por quadro tolera muito menos do que um cálculo ao carregar a fase.
18
+ * 4096 is ~64×64 on a grid and covers today's boards with room to spare; on a large platform map it cuts before the
19
+ * search costs a frame. The number is a PARAMETER because the acceptable cost belongs to the caller: a cue every
20
+ * frame tolerates far less than a calculation when a level loads.
21
21
  */
22
- readonly orcamento?: number;
22
+ readonly budget?: number;
23
23
  }
24
- export interface Rota {
25
- /** O PRÓXIMO ponto a pisar — a um passo de onde se está. É isto que uma pista aponta. */
26
- readonly proximo: Spot;
27
- /** Qual dos alvos a rota alcançou. Pode não ser o mais próximo em linha reta, e é esse o ponto. */
28
- readonly ate: Spot;
29
- /** Quantos passos ao longo do caminho. ⚠️ NÃO é `distance()`, que mede a reta que atravessa parede. */
30
- readonly passos: number;
24
+ export interface Route {
25
+ /** The NEXT spot to step on — one step from where one is. This is what a cue points at. */
26
+ readonly next: Spot;
27
+ /** Which target the route reached. It may not be the nearest in a straight line, and that is the point. */
28
+ readonly reached: Spot;
29
+ /** How many steps along the path. ⚠️ NOT `distance()`, which measures the straight line through walls. */
30
+ readonly steps: number;
31
31
  }
32
32
  /**
33
- * A rota de `de` até o mais próximo ALCANÇÁVEL dos `alvos` — largura primeiro, sobre o que se atravessa.
33
+ * The route from `de` to the nearest REACHABLE of the `targets` — breadth first, over what can be crossed.
34
34
  *
35
- * `null` quando não há alvo, quando nenhum é alcançável, quando a topologia não tem espaço (`hotspots`), ou
36
- * quando o orçamento estourou. Os quatro casos são o mesmo para quem chama: **não sei dizer por onde**.
35
+ * `null` when there is no target, when none is reachable, when the topology has no space (`hotspots`), or when the
36
+ * budget ran out. The four cases are one for the caller: **I cannot say which way**.
37
37
  *
38
- * ⚠️ «MAIS PRÓXIMO» AQUI É AO LONGO DO CAMINHO, e é a diferença inteira. Um alvo a três células em linha reta
39
- * do outro lado de uma parede está mais LONGE do que um a oito células por um corredor aberto — e é o segundo
40
- * que a criança consegue alcançar.
38
+ * ⚠️ "NEAREST" HERE IS ALONG THE PATH, and that is the whole difference. A target three cells away in a straight line
39
+ * on the other side of a wall is FARTHER than one eight cells down an open corridor — and it is the second one the
40
+ * child can reach.
41
41
  */
42
- export declare function rotaAte(ctx: RouteCtx, de: Spot, alvos: readonly Spot[]): Rota | null;
42
+ export declare function routeTo(ctx: RouteCtx, de: Spot, targets: readonly Spot[]): Route | null;