-
Notifications
You must be signed in to change notification settings - Fork 0
Persistence
Arquivo na raiz do monorepo (gitignored). Contém um snapshot da sessão atual:
Estes vivem na raiz do monorepo (gitignored) e não trocam quando você muda de campanha — são bibliotecas que crescem ao longo do tempo:
| Arquivo | Conteúdo | Página |
|---|---|---|
.creatures.json |
Biblioteca de criaturas | Creature-Library |
.encounters.json |
Biblioteca de encontros | Encounter-Library |
.tables.json |
Tabelas aleatórias | Random-Tables |
.scene-music.json |
Trilha por cena (indexado por campanha) | Spotify |
Todos com escrita debounced (500ms), exceto .scene-music.json (volume baixo, escrita direta). Já clocks e partyResources ficam dentro do .session.json — são estado de sessão, não biblioteca.
Debounce de 500ms após qualquer mudança de estado. Múltiplas mudanças rápidas (ex.: slider de volume sendo arrastado) viram um único save.
No boot do servidor:
- Carrega
campaigndocampaigns/<defaultId>.json. - Tenta
loadPersisted(campaign.id). - Se
campaignIddo arquivo bate com a campanha atual: hidrataactiveSceneId,lighting,audio,tracker,notes. - Senão: ignora (campanha diferente, estado de outra sessão).
Mesma lógica em selectCampaign() — trocar de campanha tenta restaurar se já existir snapshot daquela.
-
rollHistory— efêmero (volátil entre sessões). -
lastRoll— efêmero. - Tokens Spotify — só em memória do server (restart = re-autenticar).
Independente da persistência: fs.watch() no diretório campaigns/. Quando o JSON da campanha ativa muda, server recarrega e re-broadcasta. O estado da sessão é preservado (cena ativa, tracker, notas — desde que ainda façam sentido).
Se a cena ativa não existe mais no JSON atualizado (você renomeou/removeu), server seleciona a primeira cena disponível automaticamente.
Pra zerar o estado sem mudar de campanha:
- Pare o servidor.
- Delete
.session.jsonna raiz. - Suba o servidor.
Ou via UI: trocar pra outra campanha e voltar (o snapshot da outra não bate, então a campanha original começa "limpa").
Sempre na raiz do monorepo, independente de onde o servidor é executado:
// server/src/persist.ts
const FILE = path.resolve(__dirname, '../../.session.json')__dirname em produção = server/dist/, então ../../ é a raiz. Em dev (tsx) = server/src/, mesmo resultado.
Setup
Conteúdo
Ferramentas
- Combat Tracker
- Creature Library
- Encounter Library
- Clocks
- Party Resources
- Random Tables
- Dice and Roll History
- GM Notes
- RPG Systems
Display
Arquitetura
{ "campaignId": "arkham-1923", "activeSceneId": "carta", "lighting": { "colorWash": "#7a0b0b", "intensity": 0.4, "alert": false, "vignette": true }, "audio": [ /* layers com estado playing/volume atual */ ], "tracker": { "combatants": [...], "turnIndex": 0, "round": 1, "active": false }, "clocks": [ /* anéis de progresso */ ], "partyResources": { "glory": 3, "ruin": 1 }, "notes": "Pista do livro de Armitage..." }