🎙️ Forbidden Fantasy

Localização Oppaiman

🛠️ Scripts de publicação

Tudo roda do Dropbox: qualquer PC sincronizado consegue publicar, sem configurar nada e sem depender da máquina do admin. Os arquivos ficam em Games\Localização Oppaiman Renpy Storage\Voice Acting\Locução\LocStudio\Scripts\. Na dúvida, rode o PublicarTudo abaixo: ele resolve o resto.

▶️
O principal · comece por aqui
PublicarTudo.bat — publicar cena nova ou alterada
É o "rode sempre": toda vez que alguém criar ou alterar uma cena, rode este e acabou. Ele faz o serviço inteiro sozinho, na ordem certa, e já inclui tudo que os outros scripts fazem.
1Prepara o PC. Confere o que falta e instala sozinho (Python, Node.js, wrangler, openpyxl). O token do Cloudflare vem do Dropbox, então não tem nada pra configurar.
2Pergunta o que publicar. Lista os updates e você escolhe: um só (3), vários soltos (1,3,5), um intervalo (1-13) ou tudo.
3Monta o player. Gera as cenas escolhidas com renders e falas e publica no /jogar. Os áudios (.opus) não entram no deploy: são sincronizados para o R2 (armazenamento) e o player os toca de lá. Isso mantém o deploy pequeno (o Cloudflare Pages tem limite de 20.000 arquivos). Só o que mudou sobe.
4Atualiza a dashboard. Recontagem de falas, palavras e personagens, planilhas de cada cena, a planilha geral e o bloco do changelog. Publica em locstudio.pages.dev.
5Oferece repetir. No fim pergunta se quer publicar outro update; S volta ao menu.
Escolher um update mexe só nele: os demais ficam exatamente como já estavam publicados. Se o /jogar falhar no meio, ele marca a pendência e se conserta sozinho no próximo run.
📁 Games\Localização Oppaiman Renpy Storage\Voice Acting\Locução\LocStudio\Scripts\PublicarTudo.bat
Já vêm no PublicarTudo — dispensáveis
Estes são etapas que o PublicarTudo já faz. Só rode solto se quiser uma etapa isolada (ex.: atualizar só a dashboard sem republicar o player). Se você usa o PublicarTudo, não precisa deles.
📊
Atualizar só a dashboard (Cenas, Personagens, Stats)
Use o PublicarDashboard.bat — ele recalcula falas, palavras e personagens, gera as planilhas e publica em locstudio.pages.dev. Só republica o que mudou. É o passo 4 do PublicarTudo, solto.
📁 Games\Localização Oppaiman Renpy Storage\Voice Acting\Locução\LocStudio\Scripts\Dashboard\PublicarDashboard.bat
📄
Gerar a planilha de uma cena avulsa
Use o GerarPlanilhaCena.bat — gera o .xlsx de uma cena/update sob demanda (não publica). A dashboard já gera as planilhas sozinha; esse é pra casos pontuais.
📁 Games\Localização Oppaiman Renpy Storage\Voice Acting\Locução\LocStudio\Scripts\Dashboard\GerarPlanilhaCena.bat
Ferramentas de áudio — rode quando precisar
Estas não fazem parte do PublicarTudo. Servem para trazer e conferir os áudios gravados antes de publicar. Atenção: o ImportarAudios é o único que mexe no Financeiro.
📥
Importar os áudios gravados (mexe no Financeiro)
Use o ImportarAudios.bat. Ele lista as pastas de período e você escolhe pelo número (ou cola um caminho). Lê a pasta inteira, mostra o relatório da build, copia pro voice só os .opus novos e pergunta se quer atualizar o Financeiro. O alcance de um período só muda por aqui.
📁 Games\Localização Oppaiman Renpy Storage\Voice Acting\Locução\LocStudio\Scripts\Audio\ImportarAudios.bat
🎧
Auditar os áudios de uma pasta (sem financeiro)
Use o AuditarAudios.bat — igual ao Importar no relatório e na cópia dos .opus novos pro voice, mas não toca no Financeiro. Bom pra pós-produção conferir e enviar sem risco de alterar alcance. Fica em LocStudio\Audios\AuditarAudios.bat.
📁 Games\Localização Oppaiman Renpy Storage\Voice Acting\Locução\LocStudio\Audios\AuditarAudios.bat
🔎
Conferir o que já está gravado
Use o ConferirAudios.bat — raio-x do voice: palavras gravadas, o que falta cena a cena e personagem a personagem (só as incompletas) e nomes fora do padrão. No fim pergunta se quer publicar a conferência na Revisão da Build (em /reports).
📁 Games\Localização Oppaiman Renpy Storage\Voice Acting\Locução\LocStudio\Scripts\Audio\ConferirAudios.bat

📝 Changelog

Builds são as publicações, geradas sozinhas a cada PublicarEN. Sistema são as mudanças feitas nos scripts e no painel.

Nenhuma build registrada ainda. A próxima publicação (PublicarEN) aparece aqui.
02/09/2026 · O roteiro passou a mandar, e o relatório da cena mostra todas as falas
  • O que só existe no tl é lixo e não entra. A verdade é game/update, o roteiro que o jogo roda; o tl só diz como cada fala dele foi traduzida. Um bloco de tradução agora só vale se o comentário dele casar com uma fala do roteiro, casando na ordem. O que não casar não vai para a planilha, nem para a legenda, nem para o prompter, e sai listado no log da build.
  • Pelo comentário, não pelo id. O comentário é a cópia da fala original que o próprio Ren'Py escreve dentro do bloco. O id é um md5 com normalização interna deles: reproduzir isso seria manter um segundo Ren'Py, que quebra em silêncio quando eles mudarem.
  • Na ordem, uma de cada vez. A mesma fala se repete numa cena ("Sim.", "(...)"). Comparando por texto solto, todas achariam a primeira ocorrência e sobraria bloco legítimo marcado como lixo.
  • Cinco diferenças de forma tiveram que entrar no comparador, cada uma descoberta como falso positivo: o roteiro escapa a aspa simples (\'x\') e o comentário copia sem a barra; o Ren'Py dobra o % na tradução; existe linha escrita como julia"(texto)", sem espaço; a fala com nointeract é duplicata para quem dubla mas gera bloco de tradução do mesmo jeito; e espaço sobrando não conta. De 31 blocos suspeitos, sobraram 4.
  • O resultado: de 40.740 blocos em tl/english, 4 são lixo de verdade, todos na f22_threesomeparty2. A regra vive numa função só, Dashboard/roteiro_oficial.py, usada pelos três scripts que liam o tl.
  • O relatório da cena mostra TODAS as falas. Antes listava só as anotadas, e não dava para ver o que a revisão ainda não olhou. Agora abre com a cena inteira, na ordem, com o português embaixo do inglês e as colunas preenchidas onde existe nota. O cabeçalho conta as três coisas: linhas, anotadas e notas.
  • O Export XLSX segue a tela: sem filtro sai a cena toda, com as colunas vazias onde ninguém anotou; com filtro, só as falas daquele tipo.
  • Botão CSV ao lado do título da coluna Proofreader, na aba Direção: a revisão inteira, de todas as cenas, uma linha por nota, com separador ; e BOM UTF-8 para o Excel abrir com dois cliques. Fica ao lado do XLSX por cena, não no lugar dele.
  • Um .bat a menos: o ProofreaderTudo.bat foi apagado e o AplicarProofreader.bat faz o ciclo inteiro. Os dois tinham virado a mesma coisa. E o PublicarTudoEN.bat nasceu para a build sem Proofreader, chamando o próprio PublicarEN.bat com um argumento, para as filas não divergirem.
  • O lado do português não mudou. O player de lá já é imune por construção, porque o parse_cena.py parte do roteiro e usa o tl só como consulta. Quem contaria lixo é a dashboard, pelo contar_palavras.listar_cenas: hoje são os mesmos 4 blocos, então ficou como está.
02/09/2026 · O ciclo do Proofreader fechou: a correção entra no roteiro e a bolinha fica azul
  • Um clique faz tudo: o AplicarProofreader.bat baixa as correções do prompter, escreve no roteiro do jogo, refaz legenda, prompter, planilhas e painel, e publica. Sem menu e sem pergunta. É um .bat só de propósito: o ProofreaderTudo.bat, que fazia o ciclo em separado, foi apagado. A janela fica aberta no fim, porque rodada com dois cliques ela sumia antes de alguém ler o resultado.
  • A bolinha PR agora tem duas cores. Verde: a correção existe só no KV e se perde se ninguém rodar o script. Azul: já está escrita em game/tl, o roteiro diz aquilo. Quem carimba é o script, ao gravar, e a página lê o carimbo na hora, sem depender de publicação.
  • Correção em português tem destino: a fala do tl/portuguese, que é o arquivo que o jogo lê. O roteiro original em game/update nunca é tocado, porque o id da fala nasce dele e mexer ali trocaria o nome do .opus e o mapeamento inteiro da locução.
  • Comentário não se mexe. Ele é a cópia da fala original que o Ren'Py guarda, e o gerar_en_js casa a cena do player com a tradução por ele. Reescrever custou uma fala inteira: ela perdeu o par, apareceu em português no prompter e ficou sem id, então nenhuma nota conseguia mais se prender a ela.
  • Só a correção mais nova de cada fala vale, por idioma. Uma nota velha pendurada por conflito estava sendo aplicada depois da nova e a desfazia, rolando um everyone!! de volta para everyone!. As anteriores saem marcadas como substituídas e não voltam mais.
  • Nota antiga nunca é aplicada sozinha. As escritas antes do modal só têm um comentário livre, sem o par antes/depois, e o script chegou a quase escrever "A partir desta fala está tudo em Português" dentro das aspas de uma fala. Agora elas aparecem no relatório com um aviso pedindo que o autor refaça a correção pelo botão Proofreader.
  • Trava de cena: a constante CENAS_LIBERADAS prende o script a uma cena enquanto algo está sendo provado. Foi assim com a f21_donnaclasses14; hoje está vazia, valendo para qualquer cena com nota.
  • Ensaio: AplicarProofreader.bat ensaio faz o ciclo inteiro escrevendo numa cópia em Proofreader/Alterações e publicando a partir dela, sem tocar no jogo. Cada arquivo do jogo alterado guarda cópia em Proofreader/_backups.
  • Aviso sobre o PublicarEN: ele não refaz o prompter nem a legenda do player, então não substitui o ciclo do Proofreader. E os dois nunca devem rodar ao mesmo tempo: dividem a pasta de build e o mesmo projeto do Cloudflare.
01/09/2026 · Proofreader ganhou modal próprio, marca na fala e caminho até o .rpy
  • Modal só do Proofreader: as duas falas (português e inglês) aparecem em destaque, em leitura, com um editar dentro da própria caixa. Editar abre o campo com salvar e cancelar ali mesmo; Enter salva, Esc cancela. O Send só liga quando existe alteração salva.
  • Cada salvar vira uma linha no histórico, comparada com a etapa anterior, da mais nova para a mais velha. A diferença é marcada por palavra: riscar a frase inteira dizia que tudo estava errado quando mudou uma palavra.
  • A fala corrigida passa a ser a que aparece no prompter, com uma bolinha verde PR no fim da linha alterada, uma por idioma. Quem lê em voz alta lê o texto que vale; a bolinha avisa que ele ainda não está no roteiro.
  • A nota guarda o par antes/depois de cada idioma (correcao_pt, correcao_en), e não um comentário livre. Idioma intocado não vem, e é assim que o relatório sabe o que mudou.
  • Login antes de anotar. Usuário e senha em USUARIOS, no topo do gerar_prompter.py, e a nota passa a sair assinada no campo autor. Controle inicial: a senha está legível no fonte, porque a conferência é no navegador.
  • Verde claro em tudo que é Proofreader — botão, bolinha, modal inteiro, etiqueta no relatório e a coluna no painel. AsRec e Take ficam no roxo.
  • Dois scripts novos em En Voice Acting\Scripts: o BaixarProofreader entrega a planilha do que ainda não foi baixado (uma linha por nota, com cena e id), e o AplicarProofreader escreve a correção no .rpy.
  • Conflito pula e lista. Se o arquivo mudou depois da nota, o script não escreve: mostra o que a direção viu, o que o arquivo tem hoje e a correção proposta. Aplicar por cima jogaria fora o trabalho do tradutor sem ninguém ver.
  • O script não copia cena do jogo por conta própria. Quem decide o que entra em revisão é gente, pondo o .rpy em Proofreader\Alterações. Hoje só a f21_donnaclasses14 está lá.
  • Doc completa em docs\PROOFREADER.md, com cópia em Proofreader\LEIA-ME.md.
26/08/2026 · Relatório de direção: o recado da diretora, preso à fala
  • Três botões em cada fala do prompterAsRec, Take e Proofreader. Clicar abre um modal com a fala em cima, o campo de escrita, os botões e, abaixo de tudo, o histórico do que já existe naquela fala. Vale nas 318 cenas.
  • Fala que ninguém dubla recebe só Proofreader. AsRec e Take falam de gravação, e em Simon, narrador e rótulo de menu não há gravação nenhuma; o texto continua podendo ser corrigido. Na f04_01_mansion11 isso dá 35 falas com os três botões e 85 com um só.
  • A página /relatorio/<cena> é rota viva, não arquivo: só existe URL para a cena que TEM ação. Cena sem nota responde 404. Quem decide se a página existe está no KV, e o KV muda depois da build, então não há um .html de relatório por cena no deploy.
  • Um bloco por FALA, nunca uma linha por nota: a fala aparece uma vez e todas as ações dela ficam dentro do bloco, cada uma com um Delete que apaga do KV na hora. Apagar a última nota da cena devolve a URL ao 404.
  • Filtros de marcação múltipla (All, AsRec, Take, Proofreader) com contagem. Marcar acumula, dá para ver Take e Proofreader juntos. O recorte fica na URL (?acao=take,proofreader), então o link já abre filtrado.
  • Export XLSX do que está filtrado, com uma linha por fala e uma coluna por ação. Duas notas do mesmo tipo na mesma fala vão na mesma célula, separadas por quebra de linha. O escritor de planilha é feito à mão dentro da página (zip STORE, inlineStr e um styles.xml só para ligar o wrapText), porque o Pages não carrega CDN.
  • A linha em português aparece embaixo da inglesa, menor e apagada. Ela sai do cena_<cena>.js, o mesmo arquivo de onde o cena_em_ingles() parte antes de trocar o texto: mesma lista, mesmo índice, sem tradução nova e sem casamento por texto.
  • Toda fala passou a ter id, inclusive as do Simon. O id é o nome do bloco translate do Ren'Py e existe para toda fala; o mapeamento da locução só lista quem tem .opus, e por isso as 85 falas do Simon da f04_01_mansion11 chegavam sem id. Agora o gerador lê o .rpy inglês e preenche o que estava vazio, sem nunca sobrescrever o que veio do mapeamento.
  • Sobram 226 falas de 42.240 sem id, todas do Simon, concentradas em poucas cenas (f21_02_university14 com 61, f21_gabbyangeladevilla1 com 57). Elas continuam em PORTUGUÊS no prompter: o jogo não traduziu essas linhas, então não existe bloco translate para elas. Ganham id sozinhas quando a tradução entrar.
  • Quando a fala muda de id, a nota antiga não se perde. O id é o md5 da linha de origem em português, então mexer só na tradução inglesa NÃO troca o id; mexer no português troca. O relatório mostra a versão anterior dentro do bloco da fala de hoje, com o id velho, o texto velho e as palavras que saíram e entraram.
  • Nenhum comparador novo foi escrito para isso. A cadeia sai do que o português já tinha: o histórico append-only historico_falas_en.json e o _parear() do ConferirAudios.py, o mesmo que alimenta os cards "Provável troca de id" da Revisão da Build. Copiar o comparador criaria um segundo critério de renomeação. Órfão que o _parear não casa não é grudado em ninguém.
  • O histórico inglês passou a guardar a fala que ninguém dubla. Ele só registrava fala com áudio, então a nota do Simon ficaria sem memória de id — e id que some antes de passar por ali é irrecuperável. O perfil_en() ganhou historico_sem_voz e essas falas entram só no histórico: não passam pelo vmap, então não viram áudio faltando nem palavra a gravar. O português não sente: o perfil_pt tem historico=None.
  • Cena nova já nasce com tudo. Não existe nada por cena no código: a página inteira sai da constante PAGINA do gerador e a rota do relatório é dinâmica. Gerar (gerar_prompter.py <cena> ou --todas) e publicar entrega botões, modal, histórico e cadeia de ids no mesmo passo.
  • Onde cada peça mora: botões e modal na constante PAGINA do VoiceTeste\gerar_prompter.py; endpoint em extras\functions\api\en-direcao.js; página em extras\functions\relatorio\[cena].js; cadeia em _prompter\cadeias\<cena>.json; a nota no KV EN_VOICE_ACTING, chave direcao:<cena>:<ts>:<rnd>. O en-direcao.js NÃO pode morar em _build\en-api: o gerar_painel_en.py apaga aquela pasta a cada run.
  • Doc completa na seção 9.6 do En Voice Acting\docs\README.md.
🗣 Glossário de pronúncia
Personagens secundários
Nível: Personagem: Filtrar por:

🔊 Gemidos

O gemido que o jogo toca sozinho junto da animação, sem passar pelo roteiro: ele casa o nome do arquivo com o nome do render. Um arquivo por animação, em loop, em audio/voicefx.

Tudo nasce em inglês e precisa ser regravado em pt-BR. Regravar é devolver um arquivo com o mesmo nome: o jogo troca a voz sozinho.

O som de cena (beijo, sucção, corpo, em audio/foleyfx) não entra nesta conta: é som de corpo, não muda de idioma.

Estado:

💬 Comentários de QA

Feedbacks deixados no player pelo estúdio. Eles se dividem em dois tipos:

  • Ajustes — há um problema no áudio que precisa ser refeito. Depois de regravar e o novo áudio ser aprovado, marque o report como ✓ Resolver.
  • Aprendizado — feedbacks que não exigem regravação, mas trazem uma orientação pra não repetir nas próximas gravações. Depois de absorver o aprendizado, marque como 🎓 Aprendizado.
Carregando…

🛠️ Revisão da Build

Aqui fica só o que a build enxerga e ninguém mais: arquivo no lugar errado. Dois tipos:

  • QA precisa ouvir — o áudio foi gravado, o texto mudou depois e o id virou outro. Quando a mudança trocou palavra, o take fala a versão antiga: alguém precisa ouvir e decidir entre renomear e regravar.
  • Fora do padrão — arquivo na pasta com nome que não bate com o roteiro (padrão único: <bloco_id>.opus).

Mudança só de pontuação, caixa ou tag não aparece como pendência. O take diz exatamente a mesma coisa, então não há o que ouvir: a build renomeia sozinha na origem (LocStudio\Audios\Periodo …) e só avisa o que fez. Depois disso é rodar o AuditarAudios.bat, que é quem leva o nome novo para o voice.

O que se descobre jogando não entra aqui: falta de gravação e áudio falando a versão antiga do texto são trabalho da QA, que ouve a cena e reporta em Comentários de QA. O quanto cada personagem já gravou é a aba Cenas.

Aqui não se marca à mão: quem resolve é a build. Arrume o áudio na pasta e rode de novo, o item some das pendências e vai para o histórico sozinho.

Atrizes cadastradas

Produtividade por dia (entregas e mudanças de status)

📦 Palavras entregues por dia
✅ Mudanças de status por dia

Entrega por personagem (palavras totais e % gravado)

Base (maior total) Palavras do personagem Gravadas

Elenco por update (clique num update pra ver os personagens)

Base (maior update) Palavras Gravadas

Participação por personagem (top 25 — clique pra ver as palavras em cada update)

Base (maior personagem) Palavras Gravadas

💰 Financeiro

Meta de 20.000 palavras por semana em todos os períodos, para um total de 160.000 palavras até o fim da Season 3. A coluna Alcance mostra as palavras já gravadas na semana (atualiza sozinha quando uma cena é marcada como gravada na aba Cenas). Clique numa semana para ver as cenas enviadas.

PeríodoMetaAlcanceA pagarNota fiscalAções