Files
escape-builder/TODOS.md
Claude Agent a4b0ff4154 Campanie multi-stil — PR1 (T1-T8 + TD1-TD6)
Adauga al 6-lea stil de joc: campanie multi-stil care leaga puzzle-urile
in camere de stiluri diferite (clasic/terminal/arcade/chat/point in rotatie),
conectate prin coridoare cu usa, litera si stele.

Contract de montare (verificat la gate T1):
- gameCampaign: un <iframe srcdoc> per camera; camerele cheama parent.*
  pe un nivel (merge si pe file://); template per stil cu sentinel __CFG__
  injectat prin replace-functie (D1) + json.replace(/</g,'<') (D6)
- roomReady/roomError + timeout 4s -> skip cu 0 stele + cod eroare;
  idx detinut de parinte, accepta nextRoom doar de la contentWindow activ (D5)
- parent.beep in mod campanie (un singur AudioContext, D2)
- resume prin safeStore try/catch (D3) + cheie djb2 peste CFG embedat (D11)

Builder:
- selector de stil per puzzle ("Auto (stil)") + optiunea Campanie multi-stil
- normalizePuzzle() la load + import (sursa unica pt forma puzzle, D8)
- blocare export+preview la 0 puzzle-uri; persist() guarded (D12)
- letter normalizat [A-Za-z0-9] + esc la SVG point (D13)

Design (DESIGN.md): tokens --c-*, intro poster, coridor "usa ca erou",
chrome unica sursa de progres, 5 usi CSS/SVG (normal/stuck/crescendo),
mod camera per motor, buget vertical mobil, baseline a11y.

Tooling: tests/smoke.mjs (Playwright, zero-dependente prin npx), TODOS.md,
sectiune ## Testing in CLAUDE.md. Demo-uri regenerate + exemplu-campanie.html.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 08:34:57 +00:00

3.6 KiB

TODOS — Escape Room Builder

Backlog post-PR1 și note tehnice pentru iterațiile viitoare. Referință plan complet: ~/.gstack/projects/romfast-escape-builder/ceo-plans/2026-06-12-campania-multi-stil.md


Post-PR1 (după ship-ul campaniei)

Muzică accelerată la timer (PR2 / T10)

  • Audio ambient în campanie: track calm → accelerare progresivă sub 1 minut.
  • Ownership: părintele deține AudioContext; camerele nu știu de muzică.
  • Fallback: zero pedeapsă dacă AudioContext lipsă (webview restricitve).
  • Edge: muzica se oprește la speechSynthesis.cancel() dacă vocea e activă simultan.
  • Legat de: T10 (PR2), timer countdown în bara chrome (§Design pct. 10).

Edge case-uri voce (SpeechSynthesis) — PR2

  • speechSynthesis.getVoices() poate fi gol sincron → ascultă voiceschanged.
  • Fără voce ro-* → fallback la vocea default (nu crash, nu tăcere).
  • Voce activă mid-cameră → speechSynthesis.cancel() la demontare cameră (pater deține).
  • parent.voiceSay(text) = no-op în jocurile simple (funcția nu există) → guard typeof parent.voiceSay === 'function'.
  • Referință: D10 din plan; E2 Etapa 2 pct. 3.

Unificarea finale() din terminal pe SNIP.finalJs (PR2 primul pas)

  • Astăzi terminalul are propria funcție finale() (escape-builder.html:863) care NU folosește SNIP.finalJs.
  • Migrarea pe SNIP.finalJs deblochează ramura _campaign uniformă pentru toate cele 5 motoare.
  • Prim pas al Etapei 2 (D7): migrarea gameClassic pe libJS+SNIP → regresie manuală pe classic.
  • Referință: planul §Etapa 2 pct. 1; D7.

Audit a11y motoare existente (post-PR1, sub harness Playwright)

  • Ținte tap ≥ 44px: dpad arcade, butoane tf/choice, butonul "Trimite" din chat.
  • Contrast ≥ 4.5:1: text terminal dim (#1f9c4a pe #04130a — verifică), hint text clasic.
  • @media (prefers-reduced-motion: reduce): dezactivează pop, flip, flipin, shake, confetti, bin — stările finale apar direct.
  • Focus & Enter: "Deschide ușa" (campanie) focusabil + Enter; dpad arcade accesibil cu keyboard.
  • aria-label pe progres: bara chrome din campanie (aria-label="Camera X din Y").
  • Referință: §Design pct. 13 (TD5, PR2); D19 din plan.

Iterația 2 — Adventure Mode v0

(decizie office-hours: fundația contractului de azi e infrastructura directă)

  • Contract de montare (nextRoom, roomReady, roomError) se refolosesc as-is.
  • Motoarele noi (orice stil) implementează aceleași 3 puncte + parent.beep.
  • gameCampaign se extinde cu ramificare: if (answer === 'left') nextRoom({dir: 'left'}).
  • Builder UI: adaugă câmpul "ramificare" per puzzle; drag & drop între camere.
  • Referință: design doc §NOT in scope "Adventure Mode v0".

Iterația 3 — Joc-în-URL + QR

(depinde de măsurarea dimensiunii JSON comprimate)

  • gameHTML(cfg) → URL data: sau LZW/gzip → QR code printabil.
  • Open Question 2 din design doc: câte puzzle-uri încap în 2KB (URL QR L)?
  • Alternative: GitHub Pages export automat; sau link scurt cu backend minimal.
  • Referință: design doc §NOT in scope "Joc-în-URL + QR".

Known improvements (oricând)

  • updateHud duplicat: arcade linia 1003 și point linia 1283 au funcții identice → consolidat în SNIP (T8 din plan, igienă PR1).
  • persist() fără try/catch: builder-ul poate crăpa pe storage plin → guard (D12, T8).
  • esc(L) la inserția innerHTML din point (:1274): un < în câmpul letter strică scena SVG (D13, T8).
  • Validare 0 puzzle-uri: export și preview blocate cu mesaj ghidant (T5).
  • Stil invalid la import JSON: avertisment în builder + rotație automată (T5, D8).