# Contrato dos jogos do Let2Play

Cada jogo é uma pasta `site/public/jogos/<slug>/` com:

- `index.html` — o jogo inteiro, **autocontido**: HTML + CSS + JS inline (ou arquivos locais na mesma pasta).
  Nenhuma dependência externa (sem CDN, sem fontes do Google, sem imagens remotas). Arte desenhada em canvas/SVG/CSS.
- `meta.json` — metadados para o catálogo (formato abaixo).

## Regras técnicas
- Roda dentro de um `<iframe>` que pode ter qualquer tamanho (de 320×480 no celular em pé até 1920×1080 em tela cheia).
  O canvas ocupa 100% da janela (`100vw/100vh`), reescala em `resize` e respeita `devicePixelRatio` (máx. 2).
  Mantém a área de jogo legível: escala lógica fixa (ex.: mundo 800×600 desenhado com letterbox) ou layout que se adapta.
- `html,body{margin:0;height:100%;overflow:hidden;background:#10141a}` e `touch-action:none` no canvas.
- **Controles de teclado E de toque** (celular). Jogos de 2 jogadores no mesmo teclado: em toque, cada metade da tela é de um jogador
  ou há botões virtuais; sempre ofereça também modo 1 jogador contra a CPU.
- Teclas de jogo chamam `preventDefault()` (setas/espaço não podem rolar a página-mãe).
- Tela inicial (título + "Toque ou aperte ESPAÇO para jogar" + controles), jogo, tela de fim com pontuação, recorde e "Jogar de novo".
- Recorde salvo em `localStorage` com chave `pg:<slug>:recorde` (envolva em try/catch).
- Pausa automática quando `document.hidden`; botão de pausa (P / Esc) e botão de som ligado/desligado.
- Som: efeitos gerados com WebAudio (osciladores), só depois do primeiro toque/tecla. Nada de arquivos de áudio.
- Loop com `requestAnimationFrame` e delta-time limitado (`Math.min(dt, 1/30)`), 60 fps estáveis em celular médio.
- Textos em **português do Brasil**.
- Comunicação com o portal (opcional mas desejado), via `parent.postMessage`:
  - `{tipo:'polygames', evento:'inicio'}` quando a partida começa
  - `{tipo:'polygames', evento:'fim', pontos:<número>}` no fim da partida
- Visual: neon sobre fundo escuro combinando com o portal (ciano `#00d2ff`, verde `#4ae176`, rosa `#ff3366`, âmbar `#ffb800`,
  fundo `#10141a`), formas arredondadas, partículas, "juice" (tremida de tela, flashes, números subindo). Tem de parecer um jogo
  caprichado, não um protótipo.
- **Original**: nome, personagens e arte próprios. Não copie nem imite jogo existente (nome, personagem, fase, visual).
- `?demo=1` na URL: o jogo começa sozinho e a CPU/IA joga (ou a cena anima sozinha) por tempo indefinido — usado para tirar
  a captura da capa. Sem tela inicial nesse modo e sem som.

## meta.json
```json
{
  "slug": "trilho-turbo",
  "titulo": "Trilho Turbo",
  "subtitulo": "Corrida sem fim",            // 2-3 palavras, aparece embaixo do título no card
  "descricao": "2-3 frases de venda em PT-BR.",
  "como_jogar": "Parágrafo explicando objetivo e regras.",
  "controles": [["Setas / A D", "Trocar de pista"], ["Espaço / ↑", "Pular"], ["Toque", "Deslize para os lados"]],
  "categorias": ["acao", "corrida"],          // slugs de: acao, corrida, futebol, esportes, quebra-cabeca, 2-jogadores, arcade, retro, tiro, aventura, casual
  "tags": ["runner", "moedas", "infinito"],
  "selo": "NOVO",                              // texto curto do selo do card (NOVO, HOT, 2P, RETRÔ, PUZZLE…)
  "dois_jogadores": false,
  "mobile": true,
  "orientacao": "qualquer"                     // "retrato", "paisagem" ou "qualquer"
}
```

## Capa do card: SEMPRE imagem bonita (regra do dono, 08/11/2026)
**Todo jogo publicado precisa de uma capa que dê vontade de jogar.** Print do próprio jogo em `?demo=1`
serve para conferir o visual, **não** serve como capa final: card de jogo vende pela arte.

- Gere uma **keyart** por IA (pipeline do dono: skill `imagens-ia-camoufox`,
  `playwright-bot/chatgpt_image.py gen "<prompt>" saida.png`, ~1 min, grátis).
- O prompt tem de descrever **o personagem e o cenário REAIS do jogo** (não uma arte genérica nem uma foto
  realista de outro jogo): se o herói é um alien verde de capacete, a capa tem um alien verde de capacete.
  Peça 16:9, **sem texto e sem logo** (o portal escreve o título por cima).
- Guarde o PNG original em `site/seed/keyart/<slug>.png` (fora do docroot) e gere as variantes WebP
  `public/capas/<slug>{,-800,-480,-320}.webp` em 16:9, qualidade ~70 (base ≤ ~130 KB).
- Confira olhando a imagem: ela precisa combinar com o que o jogador encontra ao clicar em Jogar.

## Teste obrigatório antes de entregar
Abra o jogo com Playwright (Python em `~/suno-bot/venv/bin/python`, Chromium já instalado) em 1280×720 e em 390×844
(`has_touch=True`), sem nenhum erro no console (`page.on('pageerror')` e `console` tipo error), jogue uma partida pelo
teclado e uma pelo toque (`page.touchscreen.tap` / eventos de ponteiro), confira que a tela de fim aparece e que o recorde
é salvo. Tire um print de cada (salve em `/private/tmp/claude-501/pg-qa/<slug>-*.png`) e **olhe os prints**.
