Tutorial: Programando no Twine – Parte 4 – Usando Vetores

No último tutorial, exploramos algumas funções prontas que o Twine oferece para você usar à vontade.

Hoje, vamos entender o uso de vetores. Será uma postagem que ensinará esse assunto, mas relembrará outros.

Também já aproveito para dar algumas recomendações para vocês irem explorando desde já.

“Bora” conhecer mais. 😀

Dicas de Exploração para Mais Possibilidades no Twine

Para já irem explorando, vou deixar aqui alguns links para que você possa explorar e brincar mais com possibilidades no Twine:

  • Perguntas Mais Frequentes: é uma seção da documentação que trata de algumas perguntas curiosas, separando as gerais daquelas específicas da interface gráfica que estamos usando (no caso, SugarCube);
  • Documentação da SugarCube: como estamos mexendo com essa interface no Twine, vale a pena dar uma explorada e ver o que de específico nela podemos fazer. Só os arquivos ali são da versão antiga, não da 2.0;
  • Recursos: aqui também tem vários outros recursos a serem explorados, mas no final conta com um Tumblr chamado Twine Garden. Tem vários jogos construídos lá que você pode dar uma olhada;
  • Ferramentas: alguns recursos criados pela comunidade Twine que você pode usar à vontade;
  • Philome.la: site para publicar seus games narrativos.

Ainda vou explorar algumas macros e como simular repetição aqui no Twine, pois não há uma macro para isso. Tem que se adaptar. Aliás, passagens podemos transformá-las em pseudomacros. Será isso que faremos e aprenderemos na última parte desse tutorial.

  

Vetores em Twine

O conceito de vetor em Twine é o mesmo da programação. É uma variável que armazena diversos valores do mesmo tipo. No caso do Twine, ele aceita colocar tudo misturado.

A referência para pegar cada valor se dá por um índice também, mantendo o padrão em outras linguagens. O exemplo abaixo, que peguei da internet, ilustra esse comportamento:

vetores_exemplo

No exemplo, temos um vetor com 10 posições de armazenamento. Só tem números nele (ou nada, no caso da posição 8), mas poderia ser um vetor de palavras ou letras ou ainda valores lógicos (verdadeiro, falso). Vai de como você vai trabalhar isso na sua história/jogo. O primeiro índice sempre será zero.

No Twine, fica da seguinte forma:

Declaração: <<set $variavel_vetor = [ valor1, valor2, ...] >>
Acesso a valores: $variavel_vetor[indice] para um valor específico.
                  $variavel_vetor.join(separador) para todos os valores do vetor.

Fiz um exemplo aqui que seta três valores a um vetor. Depois, mostra todos os valores com um separador. Ele vai separar cada elemento do vetor daquela forma que solicitasse. No meu caso, um espaço em branco (” “), mas poderia ser vírgula ($vetor.join(“, “)) ou outro que quisesse. Teste e veja o que ocorre.

Veja o código e resultado final:

Tutorial_Twine_Prog_P4_10

 

Uso Prático de Vetores

Já deixo claro aqui que a programação poderia ser simplificada e mais elegante ao usar menos variáveis, ter uma estrutura de switch ou repetição. Optei pelo mais didático e essas estruturas de condição e repetição não tem em Twine conforme mencionei antes.

Batalhas por Turnos: sobre o problema, imagine que você está armazenando, em dois vetores, os dados de um inventário de um jogador. Dividirei em dois vetores de cinco posições: um que guarda o nome do item; outro que guarda o valor de dano que causa.

vetor_itens_dano

Veja também uma visão geral da nossa história como ficará para isso. Fiz uma abertura, setando variáveis de início, depois o cenário de batalha e, por último, o desfecho dela, seja você vencendo ou perdendo a luta. A passagem solta faz a avaliação do item escolhido pelo jogador para atacar. A história fica estruturada assim:

Tutorial_Twine_Prog_P4_03

Estou imaginando aqui que ele só tem itens de dano, pois poderia ter para defesa ou melhorar outros atributos, além de itens descartáveis para cura ou ajudar em outra enfermidade.

Na primeira passagem, start, setei os vetores ali com seus respectivos valores, além de outras variáveis importantes. Fiz também um link para a passagem “Batalha” onde a luta ocorrerá.

Tutorial_Twine_Prog_P4_04

A seguir, criei a passagem avalia_item_dano. Eu a fiz separado para não poluir demais o código de Batalha, mas também para modularizar, pois essa avaliação pode ser útil em outros lugares do jogo que ocorrerão batalhas. Aprenda a perceber isso, pois vai facilitar e muito o seu trabalho. Poderia até modularizar o sistema inteiro de batalhas. Enfim… são bastantes possibilidades. 😀

Sobre ela, sua função é avaliar qual item o jogador escolheu para atacar o inimigo. Como saberei isso? Pela variável $item_usado. Conforme o valor dela, saberei que pegarei o dano respectivo no vetor. Ela mudará de valor conforme as interações do jogador em Batalha.

Tutorial_Twine_Prog_P4_05

A seguir, vou criar outra passagem que fará a Batalha propriamente dita.

Primeiro, fiz um sorteio do dano do inimigo entre 10 e 30 pelo uso da função random(). Descontei o dano do jogador. Só faço isso após o primeiro ataque do jogador, ou seja, quando $item_usado deixar de ser -1.

Também chamei, por <<display>>, a passagem que avalia qual item o jogador escolheu. Na primeira execução, $item_usado será -1 e não cairá em nenhumas das condições do display avalia_item_dano. Isso é necessário, pois quando está -1, a batalha ainda estava começando.

Depois, são avaliadas a energia do jogador e do inimigo. Caso elas estejas negativas ou iguais a zero, deixamos as variáveis de energia somente com 0. Fiz isso para não ter energia negativa.

Em seguida, vem um demonstrativo da energia do inimigo e do jogador (HUD).

Por último, faz-se uma avaliação. Enquanto os jogadores estiverem de pé (energia maior que zero), mostre as opções de ataque do jogador (as armas). Senão, revele o link para o fim da batalha.

Perceba que adicionei, a cada link de escolha da arma, a variável $item_usado com valores diferentes, chamando novamente a passagem Batalha. Dessa forma, na segunda vez que abrir Batalha, ele vai ver um dos valores (0 a 4) de $item_usado, descontando o dano do jogador no inimigo.

Isso vai virar uma repetição até que um dos lutadores morram.

Tutorial_Twine_Prog_P4_06

Para acabar, na última passagem, conforme a energia do jogador, exibe-se uma mensagem personalizada. Se ele morreu, é lamentado. Senão, parabenizado. Deixo claro aqui que deveria ser tratada a situação, caso os dois morressem. Pense e faça a modificação. É facinho. 😉

Tutorial_Twine_Prog_P4_07

Veja como fica a tela de luta no início e após uma rodada de batalha:

Tutorial_Twine_Prog_P4_08

Agora com a perda de um deles:

Tutorial_Twine_Prog_P4_09

Claro que poderíamos colocar imagens, elaborar mais o sistema de batalhas, mas já dá para ter uma ideia do uso de vetores e de como iniciar um sistema desse.

Também poderíamos definir quem ataca primeiro: por cara ou coroa, atributo de velocidade, sorteio de dado etc.

Os danos das armas poderiam ter um intervalo de valores também, não fixos. Aí para sortear, só usar a função random() aplicada no dano do inimigo.

Enfim… mas foi só para dar um gostinho mesmo dessa prática. Tem muitas melhorias que poderíamos fazer aqui. 😀

Tente como desafio implementar cada uma delas, modularizar mais o programa… Isso, como falei, ajuda e muito a reaproveitar passagens e código.

 

 

Vimos nesse tutorial o uso de vetores em nossos jogos/histórias. Também passei alguns sites para você explorar e ver mais particularidades do Twine.

Já temos formas de organizar e categorizar melhor itens de um mesmo tipo em vetores.

No próximo tutorial, vamos conhecer macros especiais para links. Inclusive terá essa postagem e mais outra sobre outras macros ainda. Só que o foco serão aquelas utilizadas para entrada de dados.

Cuidem-se e até mais. 😉

Fabiano Naspolini de Oliveira

Fabiano Naspolini de Oliveira

Fabiano Naspolini de Oliveira (Editor-Chefe) – Formado em Análise e Desenvolvimento de Sistemas, Pós-Graduado em Docência para Educação Profissional, MBA em Game Design e Mestrado em Tecnologias da Informação e Comunicação. Foi redator do portal Nintendo Blast, professor de cursos técnicos e Game Designer/Sócio-Fundador do estúdio Céu Games por 6 anos. Atualmente, é professor de jogos digitais e escritor.

Send this to a friend