InícioDocs para devsBlueprint kind lever: interruptor de dois estados e Empty Object
Exemplos por kind 5 min de leitura

Blueprint kind lever: interruptor de dois estados e Empty Object

Alternância off/on completa e uso do mesmo kind em um controlador privado sem imagem.

Objetivo

Faça um interruptor comum alternar off → on → off. O JSON mantém a arte existente nos dois estados; ações de estado não escolhem outro sprite. Um Empty Object usa esse mesmo kind lever, e não um quinto kind chamado empty.

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. Posicione uma imagem Object, selecione e escolha Panels → Selection → Behavior → Lever. Defina Initial state como Deactivated.

  2. Abra Edit behavior. Conecte On interaction → Check state: Deactivated.

  3. Conecte True → Change state: Activated e False → Change state: Deactivated.

  4. Para um controlador sem imagem, use Library → Objects → Empty Object. Reutilize o grafo, mantenha aparências inherit e não direcione ações de imagem a Self.

  5. Para trocar a arte de uma alavanca visível, escolha uma imagem Object válida na aparência de cada estado ou acrescente Change sprite explícito. Essa variante exige IDs de imagens reais da campanha, além desta fixture independente.

JSON completo

Baixar lever-toggle.json

json
{
  "version": 2,
  "kind": "lever",
  "states": {
    "off": {
      "appearance": "inherit"
    },
    "on": {
      "appearance": "inherit"
    }
  },
  "graphs": {
    "interact": {
      "nodes": [
        {
          "id": "start",
          "type": "event",
          "x": 40,
          "y": 80,
          "event": "interact"
        },
        {
          "id": "isOff",
          "type": "condition",
          "x": 300,
          "y": 80,
          "state": "off"
        },
        {
          "id": "activate",
          "type": "state",
          "x": 560,
          "y": 40,
          "targetState": "on"
        },
        {
          "id": "deactivate",
          "type": "state",
          "x": 560,
          "y": 220,
          "targetState": "off"
        }
      ],
      "edges": [
        {
          "from": "start",
          "to": "isOff",
          "output": "next",
          "kind": "execution"
        },
        {
          "from": "isOff",
          "to": "activate",
          "output": "true",
          "kind": "execution"
        },
        {
          "from": "isOff",
          "to": "deactivate",
          "output": "false",
          "kind": "execution"
        }
      ]
    }
  }
}

Resultado esperado

Estado inicialRamoAção prevista
offtruestate → on
onfalsestate → off

Cada avaliação consulta o estado no início do evento. Change state não emite outro evento interact.

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/lever-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", "off")
print(result["trace"])
print(result["actions"])
assert result["actions"][0]["targetState"] == "on"

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.

Teste uma alavanca visível na camada Game como GM e jogador autorizado. Um clique seleciona; duplo clique executa a interação configurada. Teste também o Empty Object como GM: ele permanece privado na camada GM, sem marcador ou alvo de clique para jogadores. Jogadores ainda podem disparar grafos de presença de um Empty Object movendo tokens elegíveis; esta fixture define apenas interact.

Erros comuns

  • “A imagem não mudou”: inherit mantém a imagem nativa de propósito. Acrescente aparências por estado ou ações de sprite na variante visível.

  • “O Empty Object não aparece para jogadores”: esse é seu contrato de privacidade; ele serve como controlador de GM.

  • “A alavanca ainda alterna depois de apagar um nó”: diferencie ausência de blueprint/comportamento nativo de um caminho de interação configurado. Mantenha o grafo completo e conectado ao testar este exemplo.

Como usar a IA para adaptar este exemplo

text
Usando lever-toggle.json e o validador do Gravewright 0.3.1, acrescente um grafo presence:enter separado que ative uma alavanca visível somente com contagem de ocupação igual a 1. Preserve off/on e as ações explícitas de estado. Explique as permissões da alavanca visível e do Empty Object. Entregue JSON completo, comparação numérica com portas corretas, passos no editor e testes com dois tokens. Não invente kind empty nem acesso de jogador a marcadores privados.

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