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

GameMaker

← Integre o conteúdo ao seu jogo

GameMaker · GML (struct_get / struct_exists)

Comece exibindo uma frase. Este pequeno exemplo lê diretamente a exportação real do porto; ele ainda não é um sistema completo de diálogos. Depois, conecte os dados à interface do seu jogo.

1 · Prepare os arquivos e a cena

Adicione story.json como Included File. Crie obj_dialogue e coloque uma instância na primeira sala. Cole o código no evento Create. Adicione um evento Draw GUI com draw_text_ext(24, 24, dialogue_text, -1, 700);. Este guia usa acesso a arquivos no desktop.

story.json · Entenda os arquivos exportados

2 · Exiba o primeiro texto

// obj_dialogue: Create event. story.json is an Included File.
dialogue_text = "Cannot read story.json";
var file = buffer_load(working_directory + "story.json");
if (file >= 0) {
    var raw = buffer_read(file, buffer_text);
    buffer_delete(file);
    try {
        story = json_parse(raw);
        var locale = "en";
        var id = "fd7b61a3-8233-4ba7-8f77-b88b119a91bf";
        var record = struct_get(story.content.texts, id);
        var message = record.sourceMessage;
        if (struct_exists(story.content.translations, locale)) {
            var translations = struct_get(story.content.translations, locale);
            if (struct_exists(translations, id)) message = struct_get(translations, id).message;
        }
        dialogue_text = "";
        for (var i = 0; i < array_length(message.segments); i++) {
            var segment = message.segments[i];
            if (segment.kind != "text") throw "Text-only example";
            dialogue_text += segment.text;
        }
    } catch (error) { dialogue_text = "Cannot read this story text"; }
}
// Put the following line in the same object's Draw GUI event, not Create:
// draw_text_ext(24, 24, dialogue_text, -1, 700);

Resultado esperado: “Welcome to the harbour. I am Mira.” Com locale = "de" ou o parâmetro de idioma de: “Willkommen im Hafen. Ich bin Mira.” Se o idioma não estiver disponível, será usado o texto original. Este exemplo aceita segmentos de texto e não descarta placeholders silenciosamente.

3 · De uma frase a uma conversa

O ID de texto fixo acima serve para o primeiro teste. No seu jogo, escolha flowRef/entryRef em story-index.json, leia execution.entries[entryRef].nodeRef e depois execution.nodes[nodeRef]. O diálogo atual fornece text.textRef e speakerRef. A continuação depende do tipo de nó.

Desenhe o nome e o diálogo em Draw GUI. Para as respostas, use instâncias de botão com o ID de cada opção. End: defina dialogue_open como false e use essa variável para controlar o desenho e a entrada. Não chame game_end().

  1. Continue e End: siga as conexões e feche a caixa de texto
  2. Escolhas: ID da resposta, ordem e continuação selecionada
  3. Condições e variáveis: dez ou duas moedas de ouro
  4. Idioma: mesmos IDs, conteúdo resolvido novamente
  5. Command: entregar um item ou abrir uma loja
  6. Call/Return: entrar em uma sub-história e voltar
Examine as respostas e a verificação de ouro nesta linguagem

Leia os dados de uma escolha

Insira este trecho onde story estiver disponível após o carregamento (no RPG Maker: const story = $gameTemp.vnleExample.story;). Ele exibe IDs para conferência. Substitua a saída pelos seus botões de resposta. O trecho cobre as duas respostas do porto e a verificação de ouro seguinte; não é um interpretador genérico.

// After story was loaded successfully.
var choice = struct_get(story.execution.nodes, "42edfff8-b8fe-46bf-ae0d-9e2347b6e726");
for (var i = 0; i < array_length(choice.optionOrder); i++) {
    var option_id = choice.optionOrder[i];
    var option = struct_get(choice.options, option_id);
    show_debug_message(option_id + " " + option.text.textRef);
    // Resolve text; keep option_id on your answer button instance.
}
var branch = struct_get(story.execution.nodes, "c1c3c372-0a73-4cd0-851d-ede59d5709bb");
var gold = 10; // Repeat with 2.
var next_step = gold >= branch.condition.right.value.value ? branch.whenTrue : branch.whenFalse;
show_debug_message(next_step.nodeRef);

Com 10 moedas de ouro, next aponta para Pay five gold; com 2, para Not enough gold. No jogo, execute a verificação somente quando o caminho escolhido chegar a esse nó. Cada resposta tem sua própria continuação.

4 · Mapeie suas próprias imagens

Este trecho complementar espera um objeto de diálogo atual chamado node e os elementos de interface indicados nos comentários. Em C++ e MonoGame, speakerRef já foi lido como SpeakerId ou speakerId. A chave do mapeamento é o ID real da personagem Mira; o nome e a localização da imagem pertencem ao seu jogo. Insira as linhas nos locais indicados.

// Import mira.png as sprite spr_mira. In Create:
portraits = {};
struct_set(portraits, "807b2957-7bab-4a28-83a4-1f3d1589bbc2", spr_mira);
// In Draw GUI, with node holding the current dialogue struct:
if (struct_exists(portraits, node.speakerRef)) {
    draw_sprite(struct_get(portraits, node.speakerRef), 0, 96, 180);
}

Resolva o nome do personagem por content.characters[speakerRef].nameTextRef, como faz com o texto do diálogo. Se faltar um mapeamento, o jogo deve ocultar o retrato anterior ou mostrar uma imagem substituta. As imagens não são selecionadas pelo idioma.

Use as referências de imagem da exportação completa

5 · Distribua os arquivos com o jogo

Inclua o arquivo para a plataforma de compilação escolhida. Leia as chaves de ID com struct_get; nomes com hífen não podem ser acessados pela notação de ponto. Para o navegador, adapte e teste separadamente o caminho de carregamento.

Confira o resultado

  1. As saudações em inglês e alemão devem aparecer corretamente; um idioma indisponível deve usar o inglês.
  2. Ao implementar o fluxo, teste as duas respostas, 10 e 2 moedas de ouro, a volta da sub-história e End.
  3. Execute o jogo compilado fora da pasta do projeto. JSON, fontes e retratos também devem estar disponíveis ali.

Documentação oficial

Referências de API e configuração usadas nesta abordagem: