VNLEWIKICrie histórias. Conecte mundos.
Português (Brasil)
Manual do VNLE

Regras de fluxo e ações de jogo

← Passo a passo e engines

Essas regras explicam a exportação para seus próprios scripts e integrações comunitárias. JSON contém dados, não código fonte para executar. O layout do editor, a seleção e o arranjo da tela interna não controlam o jogo.

Antes do primeiro passo

Confira format = vnle.story, containerVersion = 1, a versão compatível de execution.contractVersion e requiredCapabilities. O exemplo usa 1.1 com core.v1 e substory.call-return.v1. O JSON Schema valida a estrutura; a execução também exige verificar referências, tipos e comandos compatíveis. Nunca ignore silenciosamente um tipo de nó desconhecido.

Referência dos campos · JSON Schema

O que cada nó significa

kindComportamento
dialogueExiba o texto, aguarde Continue e siga continuation.
choiceSiga optionOrder, filtre por option.condition, aplique uma vez os effects da opção escolhida e siga continuation. Respeite whenEmpty.
branchAvalie condition e siga whenTrue ou whenFalse.
actionAvalie effects em ordem e siga continuation.
jumpResolva o ponto de entrada de destino sem adicionar um novo ponto de retorno.
callGuarde continuation e entre no ponto de entrada de destino.
returnRetome a continuação salva mais recentemente. Um Return sem Call anterior é um erro.
commandAvalie os argumentos, solicite a ação de jogo, aguarde o resultado e siga o caminho correspondente.
endEncerre toda a conversa atual, mesmo dentro de uma sub-história. Return retoma o fluxo que fez a chamada.

Condições e valores tipados

Um operando pode ser literal, com um valor tipado, ou variable, com variableRef. compare aceita eq, ne, lt, lte, gt e gte. all exige que todas as condições filhas sejam verdadeiras; any, pelo menos uma; not inverte a condição filha. Não confunda booleanos com as strings "true"/"false".

Os efeitos sobre variáveis são set, add e subtract. add/subtract usam inteiros de −2147483648 a 2147483647. Avalie os efeitos em ordem, mas não aplique uma atualização parcial se algum efeito for inválido. Não sobrescreva os valores salvos com o defaultValue inicial a cada conversa.

Jump · Vá ao armazém após a compra

Salto

Se a chave já foi comprada, pule diretamente para o ponto de entrada de Warehouse. target contém flowRef e entryRef; execution.entries[entryRef].nodeRef fornece o próximo nó. Jump não abre automaticamente uma cena ou um mapa da engine. Isso exige uma ação de jogo apropriada.

{
  "flowRef": "1f69a7b6-1bdc-4dff-b8ee-9b2819b35168",
  "id": "2e1710dc-c32f-418f-abca-e055d6fd28f3",
  "kind": "jump",
  "target": {
    "entryRef": "a4dd48dc-b0e2-47fc-b102-def52583a8fe",
    "flowRef": "2a0a259c-b76a-4de0-8cee-567713c2d320"
  }
}
Call Substory / Return · Mira explica o armazém

Chamar sub-história / Retornar

Sim, esse fluxo é descrito pelo JSON. Após a saudação, a história chama a explicação sobre o armazém trancado. O jogo empilha continuation e entra em target. Depois da explicação de Mira, chega a return, retira a continuação mais recente da pilha e executa Already have the key?. Chamadas aninhadas seguem a mesma regra.

{
  "continuation": {
    "kind": "node",
    "nodeRef": "95e9a55f-f6b1-4696-9c52-6ea3ea2ac7e5"
  },
  "flowRef": "1f69a7b6-1bdc-4dff-b8ee-9b2819b35168",
  "id": "85b3aadf-2b95-4150-bc44-c0c796337874",
  "kind": "call",
  "target": {
    "entryRef": "2bac8555-3cae-4a21-9b8c-b410ab207ebb",
    "flowRef": "ea13b52e-092a-44ff-b087-0ce65d040c9a"
  }
}
{
  "flowRef": "ea13b52e-092a-44ff-b087-0ce65d040c9a",
  "id": "f8b8673a-cb86-40ae-a4f6-d37a5c1563c3",
  "kind": "return"
}

Todos os nós envolvidos estão na exportação story.json. Call não significa carregar outro arquivo JSON ou script. maxCallDepth limita o aninhamento. Return com a pilha vazia é um erro. Já End encerra toda a conversa e limpa a pilha.

Comando · Abra uma loja ou dê uma chave

Comando

“Abrir loja” é um bom exemplo: o jogo abre sua própria loja e pausa a conversa. Só depois de fechar a loja informa um resultado combinado, como purchased ou cancelled. Defina esses nomes e argumentos como uma ação de jogo no projeto VNLE; open_shop não é um comando integrado do VNLE.

A exportação real do porto usa give_item: o comando referencia uma definição, fornece o ID do item e oferece dois resultados. O jogo adiciona a chave ao inventário ou recusa a entrega. O autor já definiu o caminho seguinte para ambos os resultados.

{
  "arguments": {
    "3cac6185-4404-4a2a-be5f-14afa0f97137": {
      "kind": "literal",
      "value": {
        "entityType": "item",
        "type": "reference",
        "value": "2d71e57e-9b58-4fdb-a33f-42b89bd8bf04"
      }
    }
  },
  "commandRef": "0723beb0-daba-4602-a665-4efc27511bc3",
  "flowRef": "1f69a7b6-1bdc-4dff-b8ee-9b2819b35168",
  "id": "500c28a1-ed85-4c36-9a38-bedacce1c6b7",
  "kind": "command",
  "outcomes": {
    "12bc86a9-b2eb-4eb4-836c-a9efd936bf1b": {
      "continuation": {
        "kind": "node",
        "nodeRef": "382640aa-5b50-4715-9148-b470bc2f7cd6"
      },
      "resultBindings": {}
    },
    "1c527580-69a6-4e99-8503-1b0de3fc8e78": {
      "continuation": {
        "kind": "node",
        "nodeRef": "221d6b0c-99e1-45a8-bc73-768c4ee679eb"
      },
      "resultBindings": {}
    }
  }
}
{
  "id": "0723beb0-daba-4602-a665-4efc27511bc3",
  "key": "give_item",
  "name": "Give item",
  "category": "custom",
  "inputs": [
    {
      "id": "3cac6185-4404-4a2a-be5f-14afa0f97137",
      "name": "Item",
      "valueType": {
        "entityType": "item",
        "kind": "reference"
      }
    }
  ],
  "outcomes": [
    {
      "id": "12bc86a9-b2eb-4eb4-836c-a9efd936bf1b",
      "name": "Received",
      "results": []
    },
    {
      "id": "1c527580-69a6-4e99-8503-1b0de3fc8e78",
      "name": "Declined",
      "results": []
    }
  ]
}
  1. Procure commandRef em execution.commands (assinatura) e em content.commandDefinitions (chave legível).
  2. Avalie os argumentos pelos IDs de entrada. Argumentos opcionais ausentes usam o defaultValue declarado.
  3. Solicite uma única vez a ação de jogo explicitamente suportada. Não permita Continue nem uma segunda execução enquanto aguarda.
  4. Valide o ID do resultado e seus valores tipados. outcome.resultBindings atribui os valores retornados às variáveis da história; depois, siga outcome.continuation.
  5. Uma falha técnica não equivale automaticamente ao resultado de cancelamento definido pelo autor. Mostre o erro e ofereça no jogo uma forma controlada de tentar novamente ou cancelar.

Neste projeto, recusar a entrega da chave devolve cinco moedas de ouro. A continuação exportada faz isso; não é um comportamento automático de todo Command. Inventário, diário de missões e mapas pertencem ao seu jogo. Os registros do catálogo JSON, por si só, não criam esses sistemas.

Placeholders · “Você tem 5 moedas de ouro restantes”

Texto e placeholders

{
  "continuation": {
    "kind": "node",
    "nodeRef": "2e1710dc-c32f-418f-abca-e055d6fd28f3"
  },
  "flowRef": "1f69a7b6-1bdc-4dff-b8ee-9b2819b35168",
  "id": "0d7f959e-8fba-4882-ae98-b66d8416d4d2",
  "kind": "dialogue",
  "speakerRef": "807b2957-7bab-4a28-83a4-1f3d1589bbc2",
  "text": {
    "bindings": {
      "1084cf8e-515e-4b33-92f8-b5c260e88a9e": {
        "kind": "variable",
        "variableRef": "a547610e-661f-4b8d-a25b-21d042f1a2d5"
      }
    },
    "textRef": "fcc775ff-558e-4a41-823d-183aaff03e4b"
  }
}

Concatene diretamente os segmentos kind: text. Para kind: placeholder, use placeholderRef para encontrar sua definição no registro de texto e sua vinculação em node.text.bindings. A vinculação fornece um valor literal ou de variável. Capture-o ao apresentar a fala e formate-o de acordo com o tipo. Consulte os tipos e formatos na referência dos campos.

PlaceholderDefinition · Mensagem

Progresso, limites e erros

Salve a posição, as variáveis da história, a pilha de retorno e as ações pendentes junto com o estado do jogo. O idioma é uma configuração separada. storyBuildId ajuda a associar o save à versão de execução; não tente adivinhar uma continuação para uma história incompatível.

maxAutomaticTransitions, maxConditionDepth, maxConditionTerms e maxCallDepth limitam fluxos automáticos ou muito aninhados. Referências ausentes, falta de respostas com whenEmpty: fault, comandos desconhecidos e tipos inválidos exigem erros claros. Redesenhar a interface nunca deve repetir compras ou alterações de variáveis.

Passe a integração para um desenvolvedor ou uma IA

Forneça a exportação real, a versão da engine, a plataforma de destino, estas regras de fluxo e a página da engine. Descreva a interface e as funções de inventário e loja existentes. Peça que sejam usados os campos reais do JSON e APIs documentadas da engine, e exija o teste dos casos abaixo.

  1. Dez moedas de ouro: recebe a chave e fica com cinco. Duas moedas: não recebe a chave e não perde dinheiro.
  2. Inventário recusa o item: devolva o dinheiro conforme a história; não informe um sucesso que não aconteceu.
  3. Call/Return retoma o nó previsto; End dentro de Call encerra a conversa.
  4. Trocar o idioma preserva o progresso; traduções ausentes e textos intencionalmente vazios são tratados corretamente.
  5. JSON, imagens e fontes distribuídos funcionam fora da pasta de desenvolvimento; uma imagem ausente não deixa o retrato anterior na tela.