Macros simples para automatização do Firecast - Erro Crítico
5
0

Macros simples para automatização do Firecast - Erro Crítico

Macro para penalidade de erro crítico

Vinícius Ladeira
4 min
5
0

Seguindo no processo de documentar minha recente caminhada pelo mundo da programação, vou descrever outro macro que eu fiz para a campanha de D&D que eu estou jogando e da qual falei mais um pouco no texto anterior que fiz aqui.. No texto de hoje eu vou comentar sobre o macro de Erro Crítico. Esse que, na verdade, foi o primeiro Macro em que eu comecei a trabalhar, mas como eu só consegui colocar ele para funcionar bem depois do de rolagem oculta, eu o considero o segundo que fiz. Ele foi muito útil para começar a aprender a sintaxe do Lua, para me localizar na documentação do software e também para eu começar a brincar na área de programação. 

Contextualizando: na campanha, somos 5 jogadores mais o mestre e, por alguma razão desconhecida do destino, somos bastante azarados nos dados… Com isso, uma alta incidência de erros críticos acontecia durante o gameplay e  o mestre precisava sempre criar uma penalidade diferente ali na hora, o que gerava aquela sensação de que o castigo não estava apropriado à situação. Depois de um tempo, encontramos uma planilha de penalidades baseadas num D8 e pareceu uma solução mais prática e "justa" para o nosso caso. Mas rolar o dado, abrir a planilha e colocar no jogo ainda  atrapalhava a nossa dinâmica de gameplay, causando alguns atrasos grandes entre a rolagem e a aplicação da penalidade. 

Com isso em mente, eu comecei a desenvolver um macro que, ao ser acionado, já rolava um D8 e retornava o resultado baseado nessa planilha. Eis o resultado:

local resultado = rolar("1d8");
if (resultado == 1) then
enviar("O personagem se desequilibra e, a sua escolha, perde o restante dos ataques ou a possibilidade de usar sua reação até seu próximo turno. Caso não tenha mais ataques, ele é obrigado a perder a reação. Caso não tenha mais reação, ele é obrigado a perder os demais ataques. Se não tiver nenhum dos dois, o efeito é meramente cosmético.");
elseif (resultado == 2) then
enviar("O personagem perde sua base de apoio e terá desvantagem na sua próxima rolagem de D20.");
elseif (resultado == 3) then
enviar("O personagem tropeça e gasta metade de seu movimento restante para evitar uma queda. Se não tiver mais movimento restante, ele cai e fica sob a condição derrubado até que se levante.");
elseif (resultado == 4) then
enviar("O personagem deixa sua arma cair a 1,5 metro de distância. Caso ainda tenha uma ação de usar um objeto, ele pode usá-la para evitar a queda da arma, caso esteja em seu turno. A arma que cairá será uma que esteja em suas mãos. Caso não esteja carregando uma arma, mas outro tipo de objeto (uma poção, uma tocha, um pergaminho...), este é o objeto que cairá.");
elseif (resultado == 5) then
enviar("O personagem abaixa sua guarda, dando vantagem ao próximo ataque feito contra si (até o seu próximo turno). Se ainda puder gastar uma ação bônus, ele pode usá-la para voltar a sua posição de defesa e não sofrer qualquer penalidade.");
elseif (resultado == 6) then
enviar("O personagem acerta a si mesmo ou a um companheiro a 1,5 metros de distância, a sua escolha, causando 1d4 de dano do tipo cortante, perfurante ou concussão, conforme determinado pelo mestre.");
elseif (resultado == 7) then
enviar("O personagem deixa cair, a sua escolha, um objeto que carrega, mas que não está nas suas mãos. Objetos vestidos como uma armadura não podem ser escolhidos, porém uma luva ou bota podem. O mestre tem a última palavra sobre se o objeto pode ou não ser escolhido. Caso ainda tenha uma ação de usar um objeto, ele pode usá-la para evitar a queda da arma, caso esteja em seu turno.");
else
enviar("O personagem fica desnorteado e o próximo ataque que ele sofrer, até o seu próximo turno, se o acertar, será um crítico.");
end;

Bom, vamos separar o código em partes para explicar o funcionamento dele. 

local resultado = rolar("1d8");

Na primeira linha, eu começo definindo que a variável "resultado" é o resultado de rolar 1 dado de 8 faces, usando a sintaxe do Firecast para isso. Cabe a observação de que esse é o meu primeiro código, então eu realmente não precisava ter delimitado o escopo da variável dessa maneira. Eu só segui o que estava no exemplo da documentação e funcionou... Essa questão de escopo eu só fui aprender na marra num macro que fiz mais pra frente.

if (resultado == 1) then
enviar("O personagem se desequilibra e, a sua escolha, perde o restante dos ataques ou a possibilidade de usar sua reação até seu próximo turno. Caso não tenha mais ataques, ele é obrigado a perder a reação. Caso não tenha mais reação, ele é obrigado a perder os demais ataques. Se não tiver nenhum dos dois, o efeito é meramente cosmético.");
elseif (resultado == 2) then
enviar("O personagem perde sua base de apoio e terá desvantagem na sua próxima rolagem de D20.");

Aqui, começamos a aplicar as condicionais, e também foi onde eu aprendi algo importante, uma vez que foi a primeira vez que eu me deparei com o elseif… Eu até conhecia o conceito de if e else, mas com uma terceira condicional foi a primeira vez que eu me deparei. Além disso, também aprendi o operador relacional "==", dessa vez, graças ao meu amigo e mentor Guilherme Bonatti, que corrigiu a primeira versão que eu fiz desse macro usando = no lugar de ==, o que gerou várias mensagens de erro. 

(Eu gostaria de fazer um parênteses para agradecer algumas pessoas: ao Bonatti pela paciência e disposição em me ajudar nesse início de caminhada. Suas dicas, suas revisões de código e principalmente sua paciência tem me incentivado bastante! Muito obrigado por isso, irmão! =D . E também à minha esposa, que tem aturado eu falando, testando, revisando, estudando e pensando em código quase 24h/dia nas últimas semanas. Obrigado por me apoiar nesses projetos e também nessas loucuras kkkk te amo <3) 

Enfim, voltando ao código... Depois de passar pelas condições, o macro imprime na tela o resultado da penalidade. Acho legal pontuar que há 7 condicionais if, ou elseif que correspondem de 1 ao 7 como resultado do dado, e um else, que corresponde ao oitavo número. Segue um vídeo demonstrativo do funcionamento do macro:

E bom, com isso, me despeço desse texto que ficou um pouco maior do que eu esperava. Quem quiser trocar ideia sobre o assunto pode me encontrar no instagram @vini_ladeira ou no github @vini-ladeira, também pode me mandar e-mail pelo melo_vinicius@hotmail.com ou comentar por aqui mesmo. Vai ser um prazer trocar ideias com vocês! Forte abraço!

Seguir meu Canal
Fazer um comentário