InícioDocs para devsBlueprint kind door: abrir, fechar e preservar a trava
Exemplos por kind 5 min de leitura

Blueprint kind door: abrir, fechar e preservar a trava

Grafo v2 completo: abre a porta fechada, fecha a porta aberta e mantém uma porta trancada.

Objetivo

Crie uma alternância para uma porta nativa, mantendo explícito o tratamento da trava. O grafo começa em interact, consulta o estado atual e solicita uma única mudança compatível. Não depende de imagens, luzes ou áudio.

Estes JSONs descrevem o subdocumento Blueprint v2 armazenado pelo host. São fixtures para desenvolvimento: não são módulo instalável, projeto completo do Builder ou arquivo de campanha. Recrie os nós no editor ou use os arquivos em testes isolados de contribuição ao host. Este guia não presume um botão de importar JSON no editor de Objetos Inteligentes.

Baixe o pacote completo de exemplos ou o validador. Todos os exemplos usam dados sintéticos originais. O avaliador Python interno serve ao desenvolvimento do código-fonte; módulos de navegador devem usar o SDK público.

Monte no editor

  1. Desenhe uma Door no Map Builder, dê o nome Example Gate e escolha Closed como estado inicial.

  2. Dê duplo clique na porta para abrir Smart object. Selecione On interaction e conecte a Check state: Opened.

  3. Conecte True a Change state: Closed. Conecte False a um segundo Check state: Closed.

  4. Conecte o True da segunda condição a Change state: Opened. Deixe seu False desconectado: uma porta Locked chega a esse ramo e não recebe ação de estado.

  5. Mantenha Default appearance by state em Native appearance. Fechar mostra a imagem nativa; abrir usa a apresentação nativa de porta aberta.

JSON completo

Baixar door-toggle.json

json
{
  "version": 2,
  "kind": "door",
  "states": {
    "closed": {
      "appearance": "inherit"
    },
    "open": {
      "appearance": "inherit"
    },
    "locked": {
      "appearance": "inherit"
    }
  },
  "graphs": {
    "interact": {
      "nodes": [
        {
          "id": "start",
          "type": "event",
          "x": 40,
          "y": 80,
          "event": "interact"
        },
        {
          "id": "isOpen",
          "type": "condition",
          "x": 300,
          "y": 80,
          "state": "open"
        },
        {
          "id": "close",
          "type": "state",
          "x": 560,
          "y": 40,
          "targetState": "closed"
        },
        {
          "id": "isClosed",
          "type": "condition",
          "x": 560,
          "y": 220,
          "state": "closed"
        },
        {
          "id": "open",
          "type": "state",
          "x": 820,
          "y": 220,
          "targetState": "open"
        }
      ],
      "edges": [
        {
          "from": "start",
          "to": "isOpen",
          "output": "next",
          "kind": "execution"
        },
        {
          "from": "isOpen",
          "to": "close",
          "output": "true",
          "kind": "execution"
        },
        {
          "from": "isOpen",
          "to": "isClosed",
          "output": "false",
          "kind": "execution"
        },
        {
          "from": "isClosed",
          "to": "open",
          "output": "true",
          "kind": "execution"
        }
      ]
    }
  }
}

Resultado esperado

Estado inicialAções previstasEstado esperado na mesa
closedstate → openopen
openstate → closedclosed
lockednenhumalocked

Execute a fixture em uma instalação de desenvolvimento

Extraia o pacote de exemplos em data/blueprint-examples, dentro de um checkout descartável da versão documentada. Na raiz do checkout, execute:

sh
uv run --locked python data/blueprint-examples/check-examples.py --host .

O verificador configura banco em memória, bloqueia consultas ao banco e chama as funções reais clean_blueprint e evaluate_graph. Ele valida os quatro tipos de objeto, os dois tipos de conexão e os 44 tipos de nó, incluindo requestRoll e setQuestStatus. Confere as duas visibilidades de rolagem, os seis status de missão e a continuação da execução sem rolar dados nem alterar diários. Isso verifica o formato e as ações previstas. Use também Test behavior para conferir alvos reais, autorização e a cadeia completa no servidor.

Para inspecionar esta receita no shell Django de desenvolvimento, após extrair os arquivos:

sh
uv run --locked python manage.py shell --no-imports
python
import json
from pathlib import Path
from gravewright.maps.blueprints import clean_blueprint, evaluate_graph

raw = json.loads(Path("data/blueprint-examples/door-toggle.json").read_text(encoding="utf-8"))
blueprint = clean_blueprint(raw, asset_ids=set(), light_ids=set(), track_ids=set())
result = evaluate_graph(blueprint, "interact", "closed")
print(result["trace"])
print(result["actions"])
assert [action["targetState"] for action in result["actions"]] == ["open"]

Teste como GM e jogador

Use Simulate para inspecionar um evento local. Depois use Test behavior para ensaiar pelo servidor; as alterações desse ensaio são revertidas. Gere ou atualize a cena como GM e teste uma cena sintética com GM e jogador autorizado. Confira que streamer não consegue gravar. Ao editar novamente o projeto, use Update scene antes de esperar mudanças no comportamento da mesa.

Como GM, execute as três linhas acima e confira Automation. Como jogador, teste uma porta fechada comum e depois uma trancada: este exemplo não concede ações de trancar/destrancar. Desabilite a interação de jogadores e confira a recusa de cliques diretos; o GM continua podendo testar. Geometria oculta e objetos sem relação não devem ser expostos ao jogador.

Erros comuns

  • “Abriu uma vez e não fecha”: os dois ramos precisam de Change state; um evento não alterna automaticamente.

  • “O ramo trancado não fez nada”: esse é o resultado planejado. Não acrescente players: true apenas para suprimir uma falha de permissão.

  • “O estado mudou, mas a imagem personalizada ficou”: um Change sprite anterior é estado visual independente. Use Change sprite explícito se a imagem também deve mudar.

Como usar a IA para adaptar este exemplo

text
Com o código-fonte do Gravewright 0.3.1 na revisão 0e91fef, estenda door-toggle.json para mostrar uma mensagem original após abrir com sucesso. Preserve locked → nenhuma ação de estado. Confira em blueprints.py os campos dos nós, portas de execução e contrato de audience. Entregue documento v2 completo, passos no editor e testes GM/jogador com closed/open/locked. Não acrescente chamadas privadas no navegador, botão de importação ou eventos implícitos de mudança de estado.

Todos os kinds de Blueprint · Conexões execution/data · Exemplos dos 44 tipos de nó