O motor de missões do Cataclysm-DDA é inteiramente orientado por dados, o que permite a criação de narrativas complexas e interações com NPCs sem a necessidade de compilar o código-fonte em C++. Toda a lógica de missões e diálogos é gerenciada através de arquivos JSON localizados no diretório data/json/npcs/. Este guia detalha a arquitetura desses arquivos e o processo de implementação de novas linhas de enredo.
Arquitetura dos Arquivos de Missão
A base do sistema de missões reside na interação entre dois tipos principais de objetos JSON: as definições de missão e os tópicos de diálogo.
Definição de Missão (mission_definition)
Este objeto estabelece os parâmetros fundamentais da tarefa, incluindo identificadores, metadados de exibição e gatlihos de estado. Abaixo, um exemplo de estrutura reescrita para uma missão de reconhecimento:
{
"id": "MISSION_WASTELAND_RECON_ALPHA",
"type": "mission_definition",
"name": { "str": "Setor de Reconhecimento" },
"description": "Investigue as anomalias relatadas no bunker abandonado e recupere os discos de dados criptografados.",
"goal": "MGOAL_FIND_ITEM",
"difficulty": 3,
"value": 1500,
"start": { "assign_mission": "MISSION_WASTELAND_RECON_ALPHA" },
"end": { "u_spawn_item": "data_disk_encrypted" }
}
Tópicos de Diálogo (talk_topic)
Os tópicos de diálogo controlam o fluxo de conversação. Cada nó possui um identificador único que é referenciado por respostas anteriores, formando uma árvore de decisão. As respostas podem desencadear efeitos colaterais, como atribuir a missão ao jogador:
{
"id": "TALK_WASTELAND_RECON_OFFER",
"type": "talk_topic",
"dynamic_line": "Preciso de alguém para verificar o bunker ao norte. Os relatórios de radiação estão inconsistentes.",
"responses": [
{
"text": "Deixe comigo. O que exatamente devo procurar?",
"effect": { "assign_mission": "MISSION_WASTELAND_RECON_ALPHA" },
"topic": "TALK_WASTELAND_RECON_ACCEPTED"
},
{
"text": "A recompensa vale o risco? Preciso de mais detalhes.",
"topic": "TALK_WASTELAND_RECON_NEGOTIATE"
}
]
}
Fluxo de Implementação
1. Preparação do Ambiente
Antes de iniciar, certifique-se de que sua estrutura de diretórios esteja intacta. Crie um novo arquivo JSON dentro de data/json/npcs/ ou edite um existente. O uso de editores com validação de sintaxe JSON, como VS Code, é altamente recomendado para evitar erros de formatação que podem impedir o carregamento do jogo.
2. Construção da Árvore de Diálogo
Uma missão funcional requer, no mínimo, três nós de diálogo distintos:
- Oferta (OFFER): O ponto de entrada onde o NPC apersenta a tarefa.
- Consulta (INQUIRE): O diálogo acionado quando o jogador fala com o NPC enquanto a missão está ativa.
- Conclusão (COMPLETE): O nó que valida a entrega dos itens ou o cumprimento do objetivo.
3. Manipulação de Geração de Mapa
Para missões que exigem locais específicos no mundo, o parâmetro update_mapgen permite injetar estruturas ou terrenos dinamicamente durante a atribuição da missão:
"update_mapgen": {
"place_terrain": [ { "ter": "t_door_metal_c", "x": 14, "y": 18 } ],
"place_nested": [ { "chunks": [ "bunker_recon_chunk" ], "x": 12, "y": 12 } ]
}
4. Validação e Testes
Após salvar as alterações, inicie o jogo e utilize o menu de depuração (acessível via tecla de atalho configurada ou parâmetro de inicialização). A opção de "Missões" no menu de debug permite atribuir, concluir ou falhar missões instantaneamente, acelerando o ciclo de testes das ramificações de diálogo.
Lógica Avançada: Condições e Efeitos
O sistema suporta avaliação de estado complexa para restringir opções de diálogo ou executar múltiplas ações em sequência.
Avaliação de Condições
Utilize blocos lógicos para verificar o inventário do jogador ou o estado de variáveis globais antes de exibir uma resposta:
"condition": {
"and": [
{ "u_has_mission": "MISSION_WASTELAND_RECON_ALPHA" },
{ "u_has_item": "data_disk_encrypted", "count": 1 }
]
}
Execução de Efeitos em Cadeia
Os efeitos podem ser encadeados em arrays para processar a remoção de itens, alteração de variáveis de estado e finalização da missão em uma única interação:
"effect": [
{ "u_consume_item": "data_disk_encrypted" },
{ "u_add_var": "recon_alpha_status", "value": "completed" },
{ "u_spawn_item": "FMCNote", "count": 5 },
{ "finish_mission": "MISSION_WASTELAND_RECON_ALPHA", "success": true }
]
Empacotamento como Módulo (Mod)
Para distribuir as missões criadas, isole os arquivos JSON em uma pasta dedicada dentro do diretório data/mods/. Crie um arquivo modinfo.json na raiz dessa pasta para definir os metadados do módulo, incluindo identificador único, nome de exibição e dependências de outros mods, caso sua missão utilize itens ou locais externos. Isso garante que o conteúdo seja carregado de forma modular pelo gerenciador do jogo.