@the-inclusionist/engine 6.36.1

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 (267) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +107 -0
  3. package/app/css/style.css +622 -0
  4. package/app/public/vendor/fonts/andika-400-ext.woff2 +0 -0
  5. package/app/public/vendor/fonts/andika-400.woff2 +0 -0
  6. package/app/public/vendor/fonts/andika-700-ext.woff2 +0 -0
  7. package/app/public/vendor/fonts/andika-700.woff2 +0 -0
  8. package/app/public/vendor/fonts/atkinson-400-ext.woff2 +0 -0
  9. package/app/public/vendor/fonts/atkinson-400.woff2 +0 -0
  10. package/app/public/vendor/fonts/atkinson-700-ext.woff2 +0 -0
  11. package/app/public/vendor/fonts/atkinson-700.woff2 +0 -0
  12. package/app/public/vendor/fonts/atkinson-mono-400-ext.woff2 +0 -0
  13. package/app/public/vendor/fonts/atkinson-mono-400.woff2 +0 -0
  14. package/app/public/vendor/fonts/comicneue-400.woff2 +0 -0
  15. package/app/public/vendor/fonts/comicneue-700.woff2 +0 -0
  16. package/app/public/vendor/fonts/greatvibes-400.woff2 +0 -0
  17. package/app/public/vendor/fonts/inter-400.woff2 +0 -0
  18. package/app/public/vendor/fonts/inter-700.woff2 +0 -0
  19. package/app/public/vendor/fonts/lato-400.woff2 +0 -0
  20. package/app/public/vendor/fonts/lato-700.woff2 +0 -0
  21. package/app/public/vendor/fonts/lexend-400-ext.woff2 +0 -0
  22. package/app/public/vendor/fonts/lexend-400.woff2 +0 -0
  23. package/app/public/vendor/fonts/lexend-700-ext.woff2 +0 -0
  24. package/app/public/vendor/fonts/lexend-700.woff2 +0 -0
  25. package/app/public/vendor/fonts/literata-400.woff2 +0 -0
  26. package/app/public/vendor/fonts/literata-700.woff2 +0 -0
  27. package/app/public/vendor/fonts/newsreader-400.woff2 +0 -0
  28. package/app/public/vendor/fonts/newsreader-700.woff2 +0 -0
  29. package/app/public/vendor/fonts/opensans-400.woff2 +0 -0
  30. package/app/public/vendor/fonts/opensans-700.woff2 +0 -0
  31. package/app/public/vendor/fonts/pinyon-400.woff2 +0 -0
  32. package/app/public/vendor/fonts/quattro-400.woff2 +0 -0
  33. package/app/public/vendor/fonts/quattro-700.woff2 +0 -0
  34. package/app/public/vendor/fonts/sourcesans-400.woff2 +0 -0
  35. package/app/public/vendor/fonts/sourcesans-700.woff2 +0 -0
  36. package/app/public/vendor/fonts/sourceserif-400.woff2 +0 -0
  37. package/app/public/vendor/fonts/sourceserif-700.woff2 +0 -0
  38. package/app/public/vendor/fonts/ufcook-700.woff2 +0 -0
  39. package/app/public/vendor/fonts/ufmag-400.woff2 +0 -0
  40. package/app/public/vendor/fonts.css +88 -0
  41. package/dist-pkg/boot/create-game.d.ts +159 -0
  42. package/dist-pkg/boot/create-game.js +266 -0
  43. package/dist-pkg/core/a11y-sr.d.ts +4 -0
  44. package/dist-pkg/core/a11y-sr.js +20 -0
  45. package/dist-pkg/core/actions.d.ts +100 -0
  46. package/dist-pkg/core/actions.js +149 -0
  47. package/dist-pkg/core/anel.d.ts +17 -0
  48. package/dist-pkg/core/anel.js +31 -0
  49. package/dist-pkg/core/collision.d.ts +21 -0
  50. package/dist-pkg/core/collision.js +62 -0
  51. package/dist-pkg/core/constants.d.ts +84 -0
  52. package/dist-pkg/core/constants.js +64 -0
  53. package/dist-pkg/core/contract.d.ts +227 -0
  54. package/dist-pkg/core/contract.js +184 -0
  55. package/dist-pkg/core/dom-query.d.ts +9 -0
  56. package/dist-pkg/core/dom-query.js +25 -0
  57. package/dist-pkg/core/entity.d.ts +150 -0
  58. package/dist-pkg/core/entity.js +38 -0
  59. package/dist-pkg/core/escape-html.d.ts +16 -0
  60. package/dist-pkg/core/escape-html.js +32 -0
  61. package/dist-pkg/core/i18n.d.ts +71 -0
  62. package/dist-pkg/core/i18n.js +236 -0
  63. package/dist-pkg/core/layers.d.ts +39 -0
  64. package/dist-pkg/core/layers.js +71 -0
  65. package/dist-pkg/core/letter-grid.d.ts +55 -0
  66. package/dist-pkg/core/letter-grid.js +116 -0
  67. package/dist-pkg/core/loop.d.ts +17 -0
  68. package/dist-pkg/core/loop.js +36 -0
  69. package/dist-pkg/core/password.d.ts +34 -0
  70. package/dist-pkg/core/password.js +205 -0
  71. package/dist-pkg/core/rng.d.ts +20 -0
  72. package/dist-pkg/core/rng.js +61 -0
  73. package/dist-pkg/core/rotulo-acessivel.d.ts +17 -0
  74. package/dist-pkg/core/rotulo-acessivel.js +41 -0
  75. package/dist-pkg/core/run-state.d.ts +115 -0
  76. package/dist-pkg/core/run-state.js +40 -0
  77. package/dist-pkg/core/scenes.d.ts +68 -0
  78. package/dist-pkg/core/scenes.js +64 -0
  79. package/dist-pkg/core/screens.d.ts +16 -0
  80. package/dist-pkg/core/screens.js +28 -0
  81. package/dist-pkg/core/state.d.ts +138 -0
  82. package/dist-pkg/core/state.js +290 -0
  83. package/dist-pkg/core/tiles.d.ts +12 -0
  84. package/dist-pkg/core/tiles.js +61 -0
  85. package/dist-pkg/core/world.d.ts +4 -0
  86. package/dist-pkg/core/world.js +58 -0
  87. package/dist-pkg/educational/activities-registry.d.ts +47 -0
  88. package/dist-pkg/educational/activities-registry.js +95 -0
  89. package/dist-pkg/i18n/en.d.ts +3 -0
  90. package/dist-pkg/i18n/en.js +560 -0
  91. package/dist-pkg/i18n/es.d.ts +3 -0
  92. package/dist-pkg/i18n/es.js +558 -0
  93. package/dist-pkg/i18n/pt.d.ts +3 -0
  94. package/dist-pkg/i18n/pt.js +618 -0
  95. package/dist-pkg/input/default-bindings.d.ts +24 -0
  96. package/dist-pkg/input/default-bindings.js +122 -0
  97. package/dist-pkg/input/devices.d.ts +15 -0
  98. package/dist-pkg/input/devices.js +31 -0
  99. package/dist-pkg/input/edges.d.ts +58 -0
  100. package/dist-pkg/input/edges.js +49 -0
  101. package/dist-pkg/input/gamepad.d.ts +203 -0
  102. package/dist-pkg/input/gamepad.js +531 -0
  103. package/dist-pkg/input/keyboard-runtime.d.ts +61 -0
  104. package/dist-pkg/input/keyboard-runtime.js +83 -0
  105. package/dist-pkg/input/keyboard.d.ts +45 -0
  106. package/dist-pkg/input/keyboard.js +80 -0
  107. package/dist-pkg/input/keydown.d.ts +270 -0
  108. package/dist-pkg/input/keydown.js +381 -0
  109. package/dist-pkg/input/latch.d.ts +30 -0
  110. package/dist-pkg/input/latch.js +63 -0
  111. package/dist-pkg/input/pointer-space.d.ts +40 -0
  112. package/dist-pkg/input/pointer-space.js +51 -0
  113. package/dist-pkg/input/state.d.ts +11 -0
  114. package/dist-pkg/input/state.js +12 -0
  115. package/dist-pkg/input/touch-bindings.d.ts +210 -0
  116. package/dist-pkg/input/touch-bindings.js +365 -0
  117. package/dist-pkg/input/touch.d.ts +173 -0
  118. package/dist-pkg/input/touch.js +314 -0
  119. package/dist-pkg/input/transports.d.ts +90 -0
  120. package/dist-pkg/input/transports.js +96 -0
  121. package/dist-pkg/input/vocabulary-migration.d.ts +58 -0
  122. package/dist-pkg/input/vocabulary-migration.js +125 -0
  123. package/dist-pkg/platform/audio-ambient.d.ts +27 -0
  124. package/dist-pkg/platform/audio-ambient.js +89 -0
  125. package/dist-pkg/platform/audio-earcons.d.ts +24 -0
  126. package/dist-pkg/platform/audio-earcons.js +62 -0
  127. package/dist-pkg/platform/audio-jingles.d.ts +17 -0
  128. package/dist-pkg/platform/audio-jingles.js +54 -0
  129. package/dist-pkg/platform/audio-mixer.d.ts +14 -0
  130. package/dist-pkg/platform/audio-mixer.js +62 -0
  131. package/dist-pkg/platform/audio-nav.d.ts +51 -0
  132. package/dist-pkg/platform/audio-nav.js +99 -0
  133. package/dist-pkg/platform/audio-sonar.d.ts +71 -0
  134. package/dist-pkg/platform/audio-sonar.js +173 -0
  135. package/dist-pkg/platform/audio.d.ts +32 -0
  136. package/dist-pkg/platform/audio.js +191 -0
  137. package/dist-pkg/platform/interruptible-speech.d.ts +19 -0
  138. package/dist-pkg/platform/interruptible-speech.js +79 -0
  139. package/dist-pkg/platform/speech.d.ts +2 -0
  140. package/dist-pkg/platform/speech.js +35 -0
  141. package/dist-pkg/platform/storage.d.ts +87 -0
  142. package/dist-pkg/platform/storage.js +148 -0
  143. package/dist-pkg/platform/tts.d.ts +33 -0
  144. package/dist-pkg/platform/tts.js +142 -0
  145. package/dist-pkg/render/camera.d.ts +58 -0
  146. package/dist-pkg/render/camera.js +105 -0
  147. package/dist-pkg/render/canvas.d.ts +13 -0
  148. package/dist-pkg/render/canvas.js +26 -0
  149. package/dist-pkg/render/cenario-data.d.ts +127 -0
  150. package/dist-pkg/render/cenario-data.js +145 -0
  151. package/dist-pkg/render/city-tex.d.ts +63 -0
  152. package/dist-pkg/render/city-tex.js +228 -0
  153. package/dist-pkg/render/city-tiles.d.ts +11 -0
  154. package/dist-pkg/render/city-tiles.js +140 -0
  155. package/dist-pkg/render/crt.d.ts +19 -0
  156. package/dist-pkg/render/crt.js +92 -0
  157. package/dist-pkg/render/cvd-matrices.d.ts +35 -0
  158. package/dist-pkg/render/cvd-matrices.js +91 -0
  159. package/dist-pkg/render/draw.d.ts +149 -0
  160. package/dist-pkg/render/draw.js +221 -0
  161. package/dist-pkg/render/fx.d.ts +63 -0
  162. package/dist-pkg/render/fx.js +123 -0
  163. package/dist-pkg/render/hc-role-data.d.ts +14 -0
  164. package/dist-pkg/render/hc-role-data.js +24 -0
  165. package/dist-pkg/render/high-contrast.d.ts +109 -0
  166. package/dist-pkg/render/high-contrast.js +254 -0
  167. package/dist-pkg/render/lq-filter.d.ts +37 -0
  168. package/dist-pkg/render/lq-filter.js +94 -0
  169. package/dist-pkg/render/minimap.d.ts +11 -0
  170. package/dist-pkg/render/minimap.js +94 -0
  171. package/dist-pkg/render/parallax.d.ts +85 -0
  172. package/dist-pkg/render/parallax.js +158 -0
  173. package/dist-pkg/render/player-anim.d.ts +71 -0
  174. package/dist-pkg/render/player-anim.js +152 -0
  175. package/dist-pkg/render/port.d.ts +143 -0
  176. package/dist-pkg/render/port.js +29 -0
  177. package/dist-pkg/render/recycling-tex.d.ts +48 -0
  178. package/dist-pkg/render/recycling-tex.js +164 -0
  179. package/dist-pkg/render/scene-city.d.ts +77 -0
  180. package/dist-pkg/render/scene-city.js +181 -0
  181. package/dist-pkg/render/scene-parallax.d.ts +72 -0
  182. package/dist-pkg/render/scene-parallax.js +426 -0
  183. package/dist-pkg/render/scene-sky.d.ts +126 -0
  184. package/dist-pkg/render/scene-sky.js +295 -0
  185. package/dist-pkg/render/screen-pipeline.d.ts +134 -0
  186. package/dist-pkg/render/screen-pipeline.js +177 -0
  187. package/dist-pkg/render/set-cenario.d.ts +54 -0
  188. package/dist-pkg/render/set-cenario.js +103 -0
  189. package/dist-pkg/render/sprite-fx.d.ts +3 -0
  190. package/dist-pkg/render/sprite-fx.js +40 -0
  191. package/dist-pkg/render/textures.d.ts +75 -0
  192. package/dist-pkg/render/textures.js +240 -0
  193. package/dist-pkg/render/title-scene.d.ts +46 -0
  194. package/dist-pkg/render/title-scene.js +75 -0
  195. package/dist-pkg/render/viewports.d.ts +52 -0
  196. package/dist-pkg/render/viewports.js +185 -0
  197. package/dist-pkg/render/viz-axes.d.ts +98 -0
  198. package/dist-pkg/render/viz-axes.js +184 -0
  199. package/dist-pkg/render/viz-modes.d.ts +61 -0
  200. package/dist-pkg/render/viz-modes.js +74 -0
  201. package/dist-pkg/render/viz-setters.d.ts +130 -0
  202. package/dist-pkg/render/viz-setters.js +244 -0
  203. package/dist-pkg/render/weather.d.ts +96 -0
  204. package/dist-pkg/render/weather.js +171 -0
  205. package/dist-pkg/render/wheelchair-sprites.d.ts +24 -0
  206. package/dist-pkg/render/wheelchair-sprites.js +63 -0
  207. package/dist-pkg/render/world-tex.d.ts +18 -0
  208. package/dist-pkg/render/world-tex.js +87 -0
  209. package/dist-pkg/ui/activities-menu.d.ts +258 -0
  210. package/dist-pkg/ui/activities-menu.js +648 -0
  211. package/dist-pkg/ui/caa-sets.d.ts +39 -0
  212. package/dist-pkg/ui/caa-sets.js +65 -0
  213. package/dist-pkg/ui/changed-mark.d.ts +15 -0
  214. package/dist-pkg/ui/changed-mark.js +96 -0
  215. package/dist-pkg/ui/debug-panel.d.ts +67 -0
  216. package/dist-pkg/ui/debug-panel.js +173 -0
  217. package/dist-pkg/ui/dom.d.ts +24 -0
  218. package/dist-pkg/ui/dom.js +47 -0
  219. package/dist-pkg/ui/focus-trap.d.ts +71 -0
  220. package/dist-pkg/ui/focus-trap.js +99 -0
  221. package/dist-pkg/ui/fonts.d.ts +41 -0
  222. package/dist-pkg/ui/fonts.js +59 -0
  223. package/dist-pkg/ui/hud.d.ts +137 -0
  224. package/dist-pkg/ui/hud.js +229 -0
  225. package/dist-pkg/ui/item-announcement.d.ts +19 -0
  226. package/dist-pkg/ui/item-announcement.js +36 -0
  227. package/dist-pkg/ui/layout.d.ts +6 -0
  228. package/dist-pkg/ui/layout.js +54 -0
  229. package/dist-pkg/ui/loop-crash.d.ts +19 -0
  230. package/dist-pkg/ui/loop-crash.js +60 -0
  231. package/dist-pkg/ui/map-hub.d.ts +56 -0
  232. package/dist-pkg/ui/map-hub.js +138 -0
  233. package/dist-pkg/ui/menu-nav.d.ts +141 -0
  234. package/dist-pkg/ui/menu-nav.js +390 -0
  235. package/dist-pkg/ui/pause-icons.d.ts +327 -0
  236. package/dist-pkg/ui/pause-icons.js +620 -0
  237. package/dist-pkg/ui/reach-notice.d.ts +34 -0
  238. package/dist-pkg/ui/reach-notice.js +71 -0
  239. package/dist-pkg/ui/settings-audio.d.ts +139 -0
  240. package/dist-pkg/ui/settings-audio.js +544 -0
  241. package/dist-pkg/ui/settings-caa.d.ts +45 -0
  242. package/dist-pkg/ui/settings-caa.js +137 -0
  243. package/dist-pkg/ui/settings-controls.d.ts +100 -0
  244. package/dist-pkg/ui/settings-controls.js +152 -0
  245. package/dist-pkg/ui/settings-empathy.d.ts +62 -0
  246. package/dist-pkg/ui/settings-empathy.js +137 -0
  247. package/dist-pkg/ui/settings-motion.d.ts +95 -0
  248. package/dist-pkg/ui/settings-motion.js +282 -0
  249. package/dist-pkg/ui/settings-motor.d.ts +77 -0
  250. package/dist-pkg/ui/settings-motor.js +215 -0
  251. package/dist-pkg/ui/settings-panel.d.ts +76 -0
  252. package/dist-pkg/ui/settings-panel.js +187 -0
  253. package/dist-pkg/ui/settings-typo.d.ts +74 -0
  254. package/dist-pkg/ui/settings-typo.js +150 -0
  255. package/dist-pkg/ui/settings-visual.d.ts +111 -0
  256. package/dist-pkg/ui/settings-visual.js +252 -0
  257. package/dist-pkg/ui/shell.d.ts +239 -0
  258. package/dist-pkg/ui/shell.js +430 -0
  259. package/dist-pkg/ui/title.d.ts +36 -0
  260. package/dist-pkg/ui/title.js +60 -0
  261. package/dist-pkg/ui/vlibras.d.ts +11 -0
  262. package/dist-pkg/ui/vlibras.js +87 -0
  263. package/dist-pkg/ui/webcam.d.ts +7 -0
  264. package/dist-pkg/ui/webcam.js +88 -0
  265. package/docs/CREDITS.md +64 -0
  266. package/docs/LICENSES.md +132 -0
  267. package/package.json +115 -0
@@ -0,0 +1,58 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // core/world.ts — Mundo/nível — constrói o grid a partir do TEXTO-GLIFO (assets/levels/clarity.map.txt). Depende
3
+ // só de tiles.ts. O WORLD instanciado + tileAt/wcSolid/gate/rampas ficam no game.js até core/state.js existir.
4
+ import { parseLevel } from './tiles.js';
5
+ const STRUCTURAL_SOLID = new Set([2, 5, 6, 10]);
6
+ const CONVERTIBLE_SOLID = new Set([2, 6]);
7
+ const NEEDS_2H = new Set([1, 3, 4, 7, 8, 10, 11]);
8
+ function expandNarrowPassages(world) {
9
+ const H = world.length;
10
+ if (!H)
11
+ return;
12
+ const W = world[0].length;
13
+ const orig = world.map((r) => [...r]);
14
+ const isAir = (t) => NEEDS_2H.has(t);
15
+ const walk = Array.from({ length: H }, () => new Array(W).fill(false));
16
+ for (let ty = 0; ty < H - 1; ty++)
17
+ for (let tx = 0; tx < W; tx++)
18
+ if (isAir(orig[ty][tx]) && STRUCTURAL_SOLID.has(orig[ty + 1][tx]))
19
+ walk[ty][tx] = true;
20
+ let changed = true, guard = 0;
21
+ while (changed && guard++ < W + 4) {
22
+ changed = false;
23
+ for (let ty = 0; ty < H; ty++)
24
+ for (let tx = 0; tx < W; tx++) {
25
+ if (walk[ty][tx] || !isAir(orig[ty][tx]))
26
+ continue;
27
+ if ((tx > 0 && walk[ty][tx - 1]) || (tx < W - 1 && walk[ty][tx + 1])) {
28
+ walk[ty][tx] = true;
29
+ changed = true;
30
+ }
31
+ }
32
+ }
33
+ for (let ty = 1; ty < H; ty++)
34
+ for (let tx = 0; tx < W; tx++)
35
+ if (walk[ty][tx] && CONVERTIBLE_SOLID.has(orig[ty - 1][tx]))
36
+ world[ty - 1][tx] = (orig[ty][tx] === 3) ? 3 : 1;
37
+ }
38
+ function buildWorld(rawGrid) {
39
+ const W = Math.max(...rawGrid.map((r) => r.length)), H = rawGrid.length;
40
+ const world = [];
41
+ for (let cy = 0; cy < H; cy++) {
42
+ const src = rawGrid[cy], row = new Array(W);
43
+ for (let cx = 0; cx < W; cx++)
44
+ row[cx] = src[cx] ?? 0;
45
+ world.push(row);
46
+ } // vazio à direita → ar escuro (0)
47
+ expandNarrowPassages(world);
48
+ if (world[42]?.[53] !== undefined)
49
+ world[42][53] = 1; // playability fix
50
+ // E18: itens injetados (fiel à v3 ITEM_PLACEMENTS): 12=super-corrida, 13=ultra-pulo, 14=ventosa
51
+ for (const [x, y, to] of [[13, 8, 12], [55, 37, 13], [13, 26, 14]])
52
+ if (world[y]?.[x] !== undefined)
53
+ world[y][x] = to;
54
+ return world;
55
+ }
56
+ // Constrói o mundo a partir do texto-glifo (parseLevel -> buildWorld: expand + injeção de itens).
57
+ export function buildWorldFromText(text) { return buildWorld(parseLevel(text)); }
58
+ export { buildWorld };
@@ -0,0 +1,47 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ /** One entry of the activities catalog. `cat` drives menu placement + MODE; `d` is the minigame footer text. */
3
+ export interface ActivityDef {
4
+ /** Menu category: 'ludico' (free play), 'alf' (literacy), 'mat' (math, incl. fractions). */
5
+ cat: 'ludico' | 'alf' | 'mat';
6
+ /** Display name (menu button + spoken by TTS). Em pt-BR CRU; só é o texto final quando não há `nomeKey`. */
7
+ nome: string;
8
+ /** Chave i18n do nome. Presente em tudo que NÃO é alfabetização — ver a nota de fronteira no cabeçalho. */
9
+ nomeKey?: string;
10
+ /** Chave i18n da descrição de rodapé. Mesma regra do `nomeKey`. */
11
+ dKey?: string;
12
+ /** Optional example sub-label shown under the name (literacy activities). */
13
+ sub?: string;
14
+ /** Optional footer description shown/spoken on menu focus. */
15
+ d?: string;
16
+ /** Fraction denominators this activity trains (presence marks it as a fractions activity). */
17
+ dens?: number[];
18
+ /** True when the activity needs a "pick numbers" sub-menu (Tabuada/Divisão) before starting. */
19
+ pick?: true;
20
+ }
21
+ /** Fallback activity id when a stored/requested id is missing or unknown. */
22
+ export declare const DEFAULT_ACTIVITY_ID = "ludico";
23
+ /** True when `id` names a real catalog entry. */
24
+ export declare function isValidActivityId(id: string): boolean;
25
+ /** Same check, spelled as the game.js call sites read it (`ACTIVITIES[id]` truthiness). */
26
+ export declare function hasActivity(id: string): boolean;
27
+ /** The activity definition for `id`, or `undefined` if unknown (mirrors `ACTIVITIES[id]`). */
28
+ export declare function getActivity(id: string): ActivityDef | undefined;
29
+ /** All activity ids, in catalog order. */
30
+ export declare function listActivityIds(): string[];
31
+ /** All [id, def] entries, in catalog order (drives menu builders like buildTitleMenus). */
32
+ export declare function listActivities(): (readonly [string, ActivityDef])[];
33
+ /** A categoria de menu de uma atividade — 'ludico' para tudo que o catálogo não conhece. */
34
+ export type ActivityCat = ActivityDef['cat'];
35
+ /** O vocabulário do MOTOR: como a rodada se comporta. Três valores, e nenhum é um id de atividade. */
36
+ export type GameMode = 'ludico' | 'somasub' | 'silabas';
37
+ /** Categoria de `id`, caindo em 'ludico' para qualquer coisa fora do catálogo. */
38
+ export declare function activityCategory(id: string | null | undefined): ActivityCat;
39
+ /** O MODE do motor para uma categoria — o único ponto onde os dois vocabulários se encontram. */
40
+ export declare function modeForCategory(cat: ActivityCat): GameMode;
41
+ /**
42
+ * O MODE de uma atividade. É a derivação inteira, num nome só — e é ela que torna impossível, por
43
+ * construção, o desacordo que a issue #54 reproduziu no jogo publicado: ciclar o `#opt-mode` deixava o MODE
44
+ * em 'silabas' com a atividade ainda em 'ludico', as moedas nasciam como letras e o despacho do quiz
45
+ * continuava consultando a categoria antiga.
46
+ */
47
+ export declare function modeForActivity(id: string | null | undefined): GameMode;
@@ -0,0 +1,95 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // educational/activities-registry — the ACTIVITIES catalog: every playable activity's id → metadata
3
+ // (category, display name, sub-label, description, fraction denominators, "pick numbers" flag). This module
4
+ // owns only the CATALOG + id validation — it does NOT hold the current selection (that stays `activity` +
5
+ // `setActivityValue` in core/state.ts, per ADR/plano-modularizacao-mapa).
6
+ //
7
+ // ============================ POR QUE ISTO NÃO MORA EM `game/` (ADR-0032) ============================
8
+ // Isto é CURRÍCULO, não jogo. `alf1..alf5` são as hipóteses da psicogênese de Ferreiro; `mat1..mat6` e as
9
+ // frações são progressão de matemática. Nada disso descreve "The Inclusionist" — descreve o que uma criança
10
+ // precisa aprender, e vale igual em qualquer jogo que queira ensinar a mesma coisa. O ADR-0004 já separava
11
+ // `docs/educational/` como camada de currículo/pedagogia; esta pasta é a metade em CÓDIGO da mesma camada.
12
+ //
13
+ // O destino declarado é a PLATAFORMA EdSP: o catálogo é dela, e cada jogo puxa as atividades que lhe cabem.
14
+ // A EdSP não existe ainda, então o catálogo mora aqui — mas com a FORMA do destino (camada própria, DADOS,
15
+ // nada de `game/` entrando) em vez da forma do lugar onde estava. Ver ADR-0032.
16
+ //
17
+ // ============================ O QUE TRADUZ, E O QUE NÃO (a fronteira, medida) ============================
18
+ // A regra do pilar 3 é ESTREITA, e este arquivo a aplicava ao catálogo inteiro — a exceção comeu a regra, e
19
+ // o efeito era um menu de matemática em português dentro de um jogo em inglês.
20
+ //
21
+ // · ALFABETIZAÇÃO (`cat: 'alf'`) NÃO TRADUZ. A psicogênese de Ferreiro é sobre a escrita do PORTUGUÊS: a
22
+ // palavra, a sílaba, a soletração e a cela Braille são A MATÉRIA, não a moldura. `nome`/`sub`/`d` dessas
23
+ // cinco seguem em pt-BR, crus, fora dos dicionários.
24
+ // · TODO O RESTO TRADUZ. O CLAUDE.md é explícito: "Matemática NÃO é disciplina de idioma. `2 + 3`
25
+ // independe de língua". "Tabuada", "Divisão" e "Soma e subtração com meios" nomeiam operações que
26
+ // existem iguais em qualquer língua, e o lúdico ("Coletar 10 moedas") nem currículo é.
27
+ //
28
+ // MECANICAMENTE: quem traduz declara `nomeKey`/`dKey`; quem não traduz não declara. Este módulo continua sem
29
+ // importar NADA — guarda a CHAVE, e quem resolve é o ponto de exibição (`nomeDaAtividade` em
30
+ // ui/activities-menu), pelo mesmo motivo de `TOUCH_ACT_LABELS` e `PAD_GLYPH_SPOKEN`: uma `const` de módulo é
31
+ // avaliada uma vez no import, e texto já resolvido congelaria o idioma no boot.
32
+ //
33
+ // O gate é `tests/atividades-matematica-traduzem.node.test.js`, e ele vigia os DOIS lados: atividade
34
+ // traduzível sem chave reprova, e atividade de alfabetização COM chave reprova também.
35
+ const ACTIVITIES_DATA = [
36
+ ['ludico', { cat: 'ludico', nome: 'Coletar 10 moedas', nomeKey: 'act.ludico.nome' }],
37
+ ['alf1', { cat: 'alf', nome: 'Descobrindo palavras', sub: 'BABA • BOLA • BEBE', d: 'Elaborado para ajudar a superar as hipóteses pré-silábicas.' }],
38
+ ['alf2', { cat: 'alf', nome: 'Descobrindo sílabas', sub: 'BA • BE • BI', d: 'Feito para ajudar a superar a hipótese silábica sem valor sonoro (uma letra errada por sílaba) e com valor sonoro (vogal ou consoante correta por sílaba), deixando claro que cada som é uma sílaba e cada sílaba tem sua forma correta de escrever.' }],
39
+ ['alf3', { cat: 'alf', nome: 'Montando palavras', sub: 'BA+BA • BE+BE • BO+LA', d: 'Feito para superar a fase da hipótese silábico-alfabética, desafiando o aluno a encontrar as sílabas corretas para montar a palavra.' }],
40
+ ['alf4', { cat: 'alf', nome: 'Escrevendo palavras', sub: 'B-A-B-A • B-O-L-A • B-E-B-E', d: 'Atividade com o objetivo de treinar ortografia.' }],
41
+ ['alf5', { cat: 'alf', nome: 'Escrevendo em Braille', d: 'Escreva letra por letra; o jogo dita os pontos da cela Braille (12 letras).' }],
42
+ ['mat1', { cat: 'mat', nome: 'Quantidade', d: 'Conte as bolinhas e escolha o número certo (1 a 9).', nomeKey: 'act.mat1.nome', dKey: 'act.mat1.d' }],
43
+ ['mat2', { cat: 'mat', nome: 'Soma fácil', d: 'Somas com parcelas de 0 a 5.', nomeKey: 'act.mat2.nome', dKey: 'act.mat2.d' }],
44
+ ['mat3', { cat: 'mat', nome: 'Soma e Subtração 1', d: 'Contas que dá para fazer nos dedos (até 10).', nomeKey: 'act.mat3.nome', dKey: 'act.mat3.d' }],
45
+ ['mat4', { cat: 'mat', nome: 'Soma e Subtração 2', d: 'Guarde um número na cabeça e opere o outro nos dedos (até 20).', nomeKey: 'act.mat4.nome', dKey: 'act.mat4.d' }],
46
+ ['mat5', { cat: 'mat', nome: 'Tabuada', pick: true, d: 'Escolha os números e treine a multiplicação.', nomeKey: 'act.mat5.nome', dKey: 'act.mat5.d' }],
47
+ ['mat6', { cat: 'mat', nome: 'Divisão', pick: true, d: 'Escolha os números e treine a divisão.', nomeKey: 'act.mat6.nome', dKey: 'act.mat6.d' }],
48
+ ['fr2', { cat: 'mat', nome: 'Soma e subtração com meios', dens: [2], d: 'Some e subtraia meios.', nomeKey: 'act.fr2.nome', dKey: 'act.fr2.d' }],
49
+ ['fr3', { cat: 'mat', nome: 'Soma e subtração com terços', dens: [3], d: 'Some e subtraia terços.', nomeKey: 'act.fr3.nome', dKey: 'act.fr3.d' }],
50
+ ['fr42', { cat: 'mat', nome: 'Soma e subtração com quartos e meios', dens: [4, 2], d: 'Some e subtraia quartos e meios.', nomeKey: 'act.fr42.nome', dKey: 'act.fr42.d' }],
51
+ ['fr5', { cat: 'mat', nome: 'Soma e subtração com quintos', dens: [5], d: 'Some e subtraia quintos.', nomeKey: 'act.fr5.nome', dKey: 'act.fr5.d' }],
52
+ ['fr632', { cat: 'mat', nome: 'Soma e subtração com sextos, terços e meios', dens: [6, 3, 2], d: 'Some e subtraia sextos, terços e meios.', nomeKey: 'act.fr632.nome', dKey: 'act.fr632.d' }],
53
+ ['fr2a6', { cat: 'mat', nome: 'Soma e subtração com frações de meio a sextos', dens: [2, 3, 4, 5, 6], d: 'Some e subtraia frações de meios a sextos.', nomeKey: 'act.fr2a6.nome', dKey: 'act.fr2a6.d' }],
54
+ ];
55
+ /** Lookup by id — insertion order preserved (buildTitleMenus iterates it in this fixed order). */
56
+ const ACTIVITIES = new Map(ACTIVITIES_DATA);
57
+ /** Fallback activity id when a stored/requested id is missing or unknown. */
58
+ export const DEFAULT_ACTIVITY_ID = 'ludico';
59
+ /** True when `id` names a real catalog entry. */
60
+ export function isValidActivityId(id) {
61
+ return ACTIVITIES.has(id);
62
+ }
63
+ /** Same check, spelled as the game.js call sites read it (`ACTIVITIES[id]` truthiness). */
64
+ export function hasActivity(id) {
65
+ return isValidActivityId(id);
66
+ }
67
+ /** The activity definition for `id`, or `undefined` if unknown (mirrors `ACTIVITIES[id]`). */
68
+ export function getActivity(id) {
69
+ return ACTIVITIES.get(id);
70
+ }
71
+ /** All activity ids, in catalog order. */
72
+ export function listActivityIds() {
73
+ return [...ACTIVITIES.keys()];
74
+ }
75
+ /** All [id, def] entries, in catalog order (drives menu builders like buildTitleMenus). */
76
+ export function listActivities() {
77
+ return [...ACTIVITIES.entries()];
78
+ }
79
+ /** Categoria de `id`, caindo em 'ludico' para qualquer coisa fora do catálogo. */
80
+ export function activityCategory(id) {
81
+ return (getActivity(id ?? '') || {}).cat || 'ludico';
82
+ }
83
+ /** O MODE do motor para uma categoria — o único ponto onde os dois vocabulários se encontram. */
84
+ export function modeForCategory(cat) {
85
+ return cat === 'alf' ? 'silabas' : cat === 'mat' ? 'somasub' : 'ludico';
86
+ }
87
+ /**
88
+ * O MODE de uma atividade. É a derivação inteira, num nome só — e é ela que torna impossível, por
89
+ * construção, o desacordo que a issue #54 reproduziu no jogo publicado: ciclar o `#opt-mode` deixava o MODE
90
+ * em 'silabas' com a atividade ainda em 'ludico', as moedas nasciam como letras e o despacho do quiz
91
+ * continuava consultando a categoria antiga.
92
+ */
93
+ export function modeForActivity(id) {
94
+ return modeForCategory(activityCategory(id));
95
+ }
@@ -0,0 +1,3 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ declare const en: Record<string, string>;
3
+ export default en;