Blog Metlivi

Como Manter Histórias de Jogos com Ramificações Testáveis

Quando uma história ramificada se expande, teste as decisões e mudanças de estado que fazem os caminhos se comportarem de forma diferente — não cada rota possível como um roteiro separado de ponta a ponta. Modele a narrativa como um grafo, defina as condições e os resultados em cada decisão e construa uma suíte enxuta que cubra transições críticas, pontos de reconvergência e falhas. Em seguida, use amostragem de rotas baseada em risco e playtests humanos para identificar problemas que checagens estruturadas não conseguem avaliar. Isso dá aos designers de narrativa e equipes de QA uma maneira reproduzível de encontrar defeitos sem alegar cobertura exaustiva de caminhos.

27 de setembro de 20267 min de leituraLeitura, artes e culturaPor Metlivi Editorial Team
Seção 1

Comece com um grafo que registre o comportamento

Represente cada passagem ou cena jogável como um nó e cada escolha como uma aresta direcionada. Faça anotações nas arestas com suas condições e efeitos: por exemplo, `has_key = true` habilita "Destrancar o portão", que define `gate_open = true`. Marque finais, loops e pontos de reconvergência explicitamente. Um ponto de reconvergência é onde rotas distintas se encontram novamente; é um local útil para verificar se a história pode continuar a partir de múltiplos históricos sem carregar estados indesejados.

O grafo deve refletir o que o jogo realmente avalia, e não apenas a estrutura da prosa. Registre quais variáveis uma escolha lê, quais ela escreve e quais nós posteriores dependem delas. Inclua valores padrão, regras de reinicialização e quaisquer efeitos de uso único. Se uma flag for definida em um ramo e nunca limpa, isso pode ser intencional; documentá-la torna a consequência visível para revisão e testes.

Essa estrutura também ajuda a localizar pontos de decisão fáceis de perder em um roteiro longo. Um artigo de 2024 de Alexey Tikhonov estuda a detecção de pontos de decisão de personagens em narrativas ramificadas e propõe um conjunto de dados baseado em grafos de jogos Choose Your Own Adventure. Sua tarefa diz respeito à identificação de pontos de decisão narrativa, não à validação de um método de QA; ele pode orientar como as equipes inventariam escolhas, mas não demonstra que a abordagem de teste aqui apresentada é eficaz. [Tikhonov, “Branching Narratives: Character Decision Points Detection”](https://aclanthology.org/2024.games-1.8/)

Seção 2

Teste transições de estado, não apenas visitas a cenas

Um teste que apenas confirma que um nó apareceu pode deixar passar uma escolha quebrada. Para cada escolha importante, verifique três coisas: se a escolha está disponível sob a condição pretendida, se selecioná-la aplica a alteração de estado esperada e se o próximo nó e o desfecho visível correspondem a esse estado. Essas checagens tratam a história como um sistema de transição de estados: dado um estado inicial e uma ação, verifique o estado resultante e o destino.

Por exemplo, um teste para a escolha "Mostrar o mapa" pode afirmar que o mapa é mostrado, `trust` permanece inalterado e a rota alcança a cena compartilhada do observatório. Um teste emparelhado começa com `has_map = false` e afirma que essa escolha está indisponível ou segue a alternativa especificada. O comportamento exato esperado depende da especificação narrativa; o ponto importante é afirmá-lo explicitamente em vez de deduzir a correção a partir do título de uma passagem.

Nos pontos de reconvergência, teste mais do que a simples chegada. Compare o estado que cada rota deve preservar, alterar ou descartar. Um guarda que foi persuadido em um ramo pode permanecer como aliado após o reencontro, enquanto um disfarce temporário deve expirar. Torne essas regras parte do estado esperado pós-reunião. Se as rotas devem convergir completamente, afirme o estado compartilhado; se devem manter diferenças significativas, afirme essas diferenças também.

Seção 3

Use um exemplo fictício para tornar a cobertura visível

Suponha que um mistério curto tenha uma decisão no arquivo. O jogador pode pedir ajuda, entrar furtivamente ou usar uma chave emprestada; cada rota chega ao mesmo corredor e, em seguida, uma escolha posterior determina se o jogador pega uma carta lacrada. A matriz fictícia a seguir rastreia um conjunto compacto de obrigações de teste. "Coberto" significa que um teste está planejado para a obrigação específica, não que a rota inteira ou todas as combinações foram testadas.

**A:** `trust = high`; pedir ajuda ao arquivista. Opção de ajuda aparece; `trust` permanece alto; rota chega ao corredor. Disponibilidade da escolha e transição

**B:** `trust = low`; pedir ajuda. Opção de ajuda fica oculta ou é recusada, conforme especificado. Condição negativa

**C:** `has_key = true`; destrancar porta lateral. Porta se abre; rota chega ao corredor; chave é consumida apenas se especificado. Efeito de estado e reconvergência

**D:** `has_key = false`; tentar porta lateral. Porta não pode ser aberta; nenhuma flag de sucesso é definida. Asserção negativa

**E:** Do corredor, pegar carta lacrada. `has_letter = true`; cena posterior de evidências oferece a fala específica da carta. Desfecho posterior

**F:** Do corredor, deixar a carta. `has_letter = false`; fala específica da carta fica ausente. Contraste de desfecho e asserção negativa

Isso é um auxílio à tomada de decisão, não uma porcentagem de cobertura ou uma suíte mínima universal. Torna as omissões visíveis: aqui, o bloqueio por baixa confiança e o desfecho de "carta ausente" merecem suas próprias checagens, pois uma visita pelo caminho feliz não os verificaria. Cada linha deve apontar para o nó ou transição relevante no grafo, para que uma condição alterada possa ser rastreada até os testes afetados.

Seção 4

Priorize a cobertura de ramificações quando as combinações aumentarem

Se uma história tiver muitas flags independentes, o número de combinações possíveis pode crescer rapidamente. Não reaja listando cada rota teórica como uma jogada completa obrigatória. Primeiro, identifique as arestas de alto risco: escolhas que bloqueiam finais, consomem itens, definem fatos persistentes de relacionamento ou mesclam históricos. Teste essas transições e seus desfechos posteriores importantes diretamente.

Em seguida, faça uma amostragem deliberada de combinações. Inclua condições de limite (o valor mínimo que altera uma escolha), ambos os lados de cada condição crítica, combinações representativas de flags que possam interagir e rotas que cheguem a um ponto de reconvergência por meio de históricos diferentes. Dê prioridade a alterações recentes e caminhos com pré-requisitos complexos. Quando duas variáveis puderem interagir, adicione um teste para esse par em vez de presumir que checagens isoladas de variável única provam que a combinação funciona.

Registre a unidade de cobertura e seus limites. Uma equipe pode monitorar se cada aresta de escolha crítica foi exercitada, se cada condição foi verificada tanto como verdadeira quanto falsa onde relevante, e se cada gatilho de final foi alcançado por pelo menos um teste planejado. Esses são relatórios úteis do que foi amostrado; nenhum deles prova que todos os históricos possíveis, combinações de estados ou problemas de redação foram explorados.

Pesquisas sobre playtesting de jogos podem oferecer uma ideia relacionada, porém delimitada. O artigo de 2021 de Gordillo e colegas no arXiv descreve agentes de aprendizado por reforço recompensados por ações inéditas para explorar a cobertura de estados em um cenário 3D complexo. Esse trabalho trata da exploração em um ambiente de jogo 3D, e não de escolhas narrativas ramificadas ou do método específico de testes de transição descrito aqui. Ele apoia o uso da exploração automatizada como um possível complemento, mas nem esse estudo nem o artigo de Tikhonov validam exatamente este método de teste narrativo. [Gordillo et al., “Improving Playtesting Coverage via Curiosity Driven Reinforcement Learning Agents”](https://arxiv.org/abs/2103.13798)

Seção 5

Adicione asserções negativas e playtests humanos

Asserções positivas confirmam que a escolha ou o desfecho esperado existe. Asserções negativas confirmam que algo proibido não acontece: uma opção bloqueada não aparece, uma pista consumida não é concedida duas vezes, uma carta ausente não dispara sua fala correspondente ou uma tentativa com falha não ativa uma flag de sucesso. Checagens negativas são especialmente úteis em torno de nós compartilhados, onde o estado residual de outra rota pode vazar para a cena atual.

Checagens automatizadas podem verificar a lógica da rota e alterações exatas de estado, mas não julgam com confiabilidade se uma transição parece coerente, se uma fala contradiz o que o jogador lembra ou se uma escolha é compreensível no contexto. Os playtests humanos devem, portanto, usar rotas selecionadas com um propósito: peça aos testadores para seguir um ramo menos comum, chegar a uma reconvergência com um histórico específico ou tentar alcançar um final sem uma chave importante. Observe tanto o estado resultante quanto a interpretação que o jogador faz dele.

Mantenha as notas de playtest vinculadas aos identificadores de nós e escolhas, além do estado inicial e das etapas percorridas. Isso torna um problema relatado reproduzível e ajuda a distinguir uma questão de redação de um defeito de lógica. Após uma correção, execute novamente os testes de transição afetados e pelo menos uma rota representativa pela reconvergência ou desfecho alterado.

Seção 6

Um ciclo prático de testes para uma história em mudança

A cada atualização da história, exporte ou revise o grafo, identifique nós, condições, efeitos e pontos de reconvergência alterados e atualize a matriz de cobertura. Execute primeiro os testes focados em transições de estado; prossiga com amostragens selecionadas de rotas e playtests humanos para seções recém-alteradas ou de alto impacto. Quando ocorrer uma falha, registre o estado inicial e a sequência de escolhas para que a equipe possa reproduzi-la, corrigir a regra ou passagem relevante e preservar o caso como uma verificação de regressão.

O objetivo é ter um registro testável do que foi verificado e por quê. Um grafo torna a estrutura inspecionável, os testes de transição tornam a lógica explícita, a amostragem de ramificações direciona o esforço para variações significativas, as asserções negativas capturam vazamentos de estado e os playtests humanos avaliam a interpretação. Juntos, eles fornecem uma cobertura útil à medida que os caminhos se multiplicam, mantendo uma delimitação clara em torno do que permanece não testado.

Leituras relacionadas

Continue explorando o tema