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>
3.8 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Ce este
Generator de jocuri escape room: un singur fișier HTML (escape-builder.html), fără backend, fără build, fără dependențe. Același set de puzzle-uri se exportă în 5 stiluri de joc diferite (clasic/quiz, terminal retro, arcade pixel, story chat, point-and-click).
Dezvoltare
Nu există build sau lint. Produsul (HTML files) e vanilla HTML/CSS/JS, zero-dependențe.
# Verificare: deschide direct în browser (merge de pe file://)
# sau servește local:
python3 -m http.server 8000
Testarea manuală: deschide escape-builder.html, schimbă "Stil joc" și verifică preview-ul live (iframe), apoi exportă și verifică jocul standalone. Testele automate → vezi ## Testing.
Arhitectură
Toată aplicația trăiește în escape-builder.html, organizată în secțiuni comentate (stare, editor, preview, template-urile jocului exportat):
- Stare: obiectul
state(titlu, poveste, culoare,style, listăpuzzles), persistat automat înlocalStoragesub cheiaescape-builder-v1. Export/import ca JSON. - Editor (stânga): formularele scriu direct în
stateviadata-g; orice modificare cheamăonChange()→ persist + refresh preview cu debounce 400ms. - Preview (dreapta):
refreshPreview()seteazăiframe.srcdoc = gameHTML(cleanState())— preview-ul este exact jocul exportat, jucabil. - Generare joc:
gameHTML(cfg)face dispatch pecfg.stylecătre cele 5 motoare:gameClassic,gameTerminal,gameArcade,gameChat,gamePoint. Fiecare motor returnează un string HTML complet, standalone (jocul exportat merge offline).
Cod partajat între motoare (injectat în HTML-ul generat):
libJS(cfg):CFG(config serializat),norm(normalizare răspuns: fără diacritice/majuscule, virgulă→punct),checkAnswer,starsFor(3/2/1 stele după încercări/indiciu),finalWord(literele puzzle-urilor formează cuvântul final),beep(WebAudio),confetti.SNIP.*: fragmente de template partajate —baseCss, modal de întrebare (modalCss/Html/Js, folosit de arcade și point) și ecranul final (finalCss/Html/Js).
Tipuri de puzzle: free (răspuns liber), tf (adevărat/fals), choice (variante pe linii separate în choices, cea corectă prefixată cu *).
Testing
Harness Playwright în tests/smoke.mjs. Instalare o singură dată:
npm install # instalează @playwright/test (devDependency)
npx playwright install chromium
Rulare:
npm run test:regresie # regresie — exemplu-*.html rezolvate până la final + edge cases
npm run test:campanie # campanie E2E — rulează după ce integrator anunță gata
npm test # suita completă (regresie + campanie)
# sau direct:
npx playwright test tests/smoke.mjs --grep "@regresie"
npx playwright test tests/smoke.mjs
Baseline curent (pre-campanie): 13/13 @regresie trec. Testele @campanie sunt marcate skip — se activează după implementarea gameCampaign.
Atenție la editare
- Motoarele de joc sunt template literals mari — backslash-urile din codul generat trebuie dublate (
\\u0300,\\n), iar codul generat foloseștevar/functionclasic intenționat. - O schimbare în
libJS/SNIPafectează toate cele 5 motoare; verifică fiecare stil în preview. exemplu-*.htmlsunt jocuri demo exportate din builder (câte unul per stil). Nu le edita manual — după modificări la motoare, regenerează-le prin exportul din builder.index.htmle doar pagina de landing care leagă builder-ul și demo-urile.package.json+node_modules/sunt doar dev tooling (Playwright). Produsul (fișierele HTML) rămâne zero-dependențe — merge offline de pefile://.