Mais macros para automatização do Firecast - Teste de Loucura
0
0

Mais macros para automatização do Firecast - Teste de Loucura

Macro para penalidade de loucura

Vinícius Ladeira
4 min
0
0

Digite ou cole seu texto bem aqui.

Seguindo o projeto de documentar minha caminhada pela área da programação, iniciado nos dois textos anteriores [1] [2], eis mais um macro em LUA (ou uma série deles) feito por mim para automatizar ações na campanha de D&D que estou jogando com uns amigos. No caso de hoje, é o macro para testar a penalidade de loucura que o personagem receberá.

Contextualizando, a nossa campanha se passa num universo mágico afligido por presenças sobrenaturais. Conforme os personagens têm contato com essas manifestações, eles têm suas psiquê afetadas. No livro do mestre, já existem regras para esses cenários, inclusive com 3 tabelas de penalidades para os personagens. A primeira tabela é para efeitos de curta duração, a segunda para longa duração e a terceira para os permanentes. 

Com isso em mente, e com a experiência que eu consegui do macro de erro crítico que eu fiz, eu decidi fazer uma versão para automatizar também os testes de loucura. Eles funcionam de maneira um pouco diferente, pois é preciso rodar um d100 e consultar os intervalos apresentados em uma tabela para definir a penalidade que será aplicada. 

Para isso funcionar, eu fiz 3 macros diferentes, mas que se comportavam de maneira muito parecida: o "loucuracd" (curta duração), o "loucurald (longa duração) e o "loucurap" (permanente). O código deles segue abaixo: 

loucuracd

local resultado = rolar("1d100");
if (resultado <=20) then
enviar("O personagem se retrai em sua mente, ficando paralisado. O efeito termina se o personagem sofrer qualquer dano.");
elseif (resultado <= 30 and resultado >=21) then
enviar("O personagem fica incapacitado e passa seu turno gritando, rindo ou chorando.");
elseif (resultado <= 40 and resultado >=31) then
enviar("O personagem fica amedrontado e deve usar sua ação para se mover a cada rodada para fugir da fonte do medo.");
elseif (resultado <= 50 and resultado >=41) then
enviar("O personagem começa a balbuciar e fica incapaz de falar ou conjurar normalmente.");
elseif (resultado <= 60 and resultado >=51) then
enviar("O personagem deve usar sua ação a cada rodada para atacar a criatura mais próxima.");
elseif (resultado <= 70 and resultado >=61) then
enviar("O personagem experimenta alucinações vívidas e tem desvantagem em testes de habilidade.");
elseif (resultado <= 75 and resultado >=71) then
enviar("O personagem faz o que qualquer um mandar ele fazer que não seja obviamente suicida.");
elseif (resultado <= 80 and resultado >=76) then
enviar("O personagem experimenta uma vontade avassaladora de comer coisas estranhas como terra, limo ou restos.");
elseif (resultado <= 90 and resultado >=81) then
enviar("O personagem fica atordoado.");
else
enviar("O personagem cai inconsciente.");
end;

loucurald

local resultado = rolar("1d100");
if (resultado <=10) then
enviar("O personagem se sente obrigado a repetir uma atividade específica de novo e de novo, como lavar as mãos, tocar em coisas, rezar ou contar moedas.");
elseif (resultado <= 20 and resultado >=11) then
enviar("O personagem experimenta uma alucinação vívida e tem desvantagem em testes de habilidade.");
elseif (resultado <= 30 and resultado >=21) then
enviar("O personagem sofre de paranoia extrema. Ele tem desvantagem em testes de Sabedoria e Carisma.");
elseif (resultado <= 40 and resultado >=31) then
enviar("O personagem considera algo (geralmente a fonte de sua loucura) intensamente repulsivo, como se tivesse sido afetado pelo efeito de antipatia da magia antipatia/simpatia.");
elseif (resultado <= 45 and resultado >=41) then
enviar("O personagem experimenta uma alucinação poderosa. Escolha uma poção. O personagem imagina estar sob efeito dela.");
elseif (resultado <= 55 and resultado >=46) then
enviar("O personagem fica ligado a um talismã da sorte, como uma pessoa ou objeto e tem desvantagem nas jogadas de ataque, testes de habilidade e testes de resistência enquanto estiver a mais de 9 metros dele.");
elseif (resultado <= 65 and resultado >=56) then
enviar("O personagem fica cego (25%) ou surdo (75%).");
elseif (resultado <= 75 and resultado >=66) then
enviar("O personagem experimenta tremores e tiques incontroláveis, que impõem desvantagem em jogadas de ataque, testes de habilidade e testes de resistência que envolvam Força ou Destreza.");
elseif (resultado <= 85 and resultado >=76) then
enviar("O personagem sofre de amnesia parcial. Ele sabem quem ele é e mantem seus traços raciais e características de classe, mas não reconhece outras pessoas ou lembra de qualquer coisa que tenha acontecido antes da loucura afeta-lo.");
elseif (resultado <= 90 and resultado >=86) then
enviar("Sempre que o personagem sofrer dano, ele deve ser bem sucedido num teste de resistência de Sabedoria CD 15 ou será afetado como se tivesse fracassado no teste de resistência contra a magia confusão. O efeito de confusão dura por 1 minuto.");
elseif (resultado <= 95 and resultado >=91) then
enviar("O personagem perde a capacidade de falar.");
else
enviar("O personagem cai inconsciente. Nenhuma quantidade de empurrões ou dano conseguem acorda-lo.");
end;

loucurap

local resultado = rolar("1d100");
if (resultado <=15) then
enviar("Estar bêbado me mantem são.");
elseif (resultado <= 25 and resultado >=16) then
enviar("Eu guardo tudo que encontro.");
elseif (resultado <= 30 and resultado >=26) then
enviar("Eu tento me parecer mais com alguém que conheço – adotando seu estilo de roupa, maneirismos e nome.");
elseif (resultado <= 35 and resultado >=31) then
enviar("Eu devo distorcer a verdade, exagerar ou mentir abertamente para ser interessante para outras pessoas.");
elseif (resultado <= 45 and resultado >=36) then
enviar("Alcançar meus objetivos é a única coisa que me importa, e eu vou ignorar todo o resto para perseguir isso.");
elseif (resultado <= 50 and resultado >=46) then
enviar("Eu acho difícil me importar com qualquer coisa que esteja ao meu redor.");
elseif (resultado <= 55 and resultado >=51) then
enviar("Eu não gosto da forma como as pessoas me julgam o tempo todo.");
elseif (resultado <= 70 and resultado >=56) then
enviar("Eu sou o mais esperto, sábio, forte, rápido e belo de todas as pessoas que conheço.");
elseif (resultado <= 80 and resultado >=71) then
enviar("Eu estou convencido que inimigos poderosos estão me caçando e seus agentes estão em todo canto. Eu tenho certeza que estão me observando o tempo todo.");
elseif (resultado <= 85 and resultado >=81) then
enviar("Só existe uma pessoa em quem posso confiar. E apenas eu posso ver esse amigo especial.");
elseif (resultado <= 95 and resultado >=86) then
enviar("Eu não consigo levar nada a sério. Quanto mais séria a situação, mais engraçada eu a considero.");
else
enviar("Eu descobri que eu realmente adoro matar pessoas.");
end;

Vamos dissecar o código de novo então… 

local resultado = rolar("1d100");
if (resultado <=20) then
enviar("O personagem se retrai em sua mente, ficando paralisado. O efeito termina se o personagem sofrer qualquer dano.");
elseif (resultado <= 30 and resultado >=21) then
enviar("O personagem fica incapacitado e passa seu turno gritando, rindo ou chorando.");

Na primeira linha de código, temos a função que rola um dado de 100 faces e condiciona seu valor na variável "resultado". Depois disso, começam as condicionais. Nessa tabela, temos uma penalidade para resultados entre 1 e 20, outra penalidade entre 20 e 30 e por aí vai. Com isso, o primeiro if imprime na tela uma mensagem com a penalidade se o resultado for menor que 20 e, a partir daí, eu precisei colocar duas condições dentro do if para funcionar esses intervalos. Então, eu precisei dizer que, se o resultado do dado for maior que 21 e menor 30, aí sim imprime a mensagem na tela. Veja o funcionamento do macro no vídeo abaixo: 

Todos os 3 macros funcionam da mesma forma, mudando apenas o intervalo dos resultados e as mensagens com as penalidades impressas na tela. Mas eu não estava satisfeito! Achava que esse sistema de 3 macros poderia gerar confusão durante o gameplay, além de ficar uma apresentação feia. Na busca por uma solução melhor, eu achei na documentação a função "invoke", que executa um macro dentro do macro que estiver executando. Aí, eu tive a ideia de criar mais um macro: o "loucura", que só tem como função definir qual das tabelas será usada e, com a resposta, ele executa o macro correspondente.Segue o código:

local indice, texto = choose("Qual o tipo de loucura?", {"Curta Duração", "Longa Duração", "Permanente"});
if indice == 1 then
enviar("Curta Duração");
invoke("loucuracd");
elseif indice == 2 then
enviar("Longa Duração");
invoke("loucurald");
else
enviar("Permanente");
invoke("loucurap");
end;

Mais uma vez, destrinchando o código: 

local indice, texto = choose("Qual o tipo de loucura?", {"Curta Duração", "Longa Duração", "Permanente"});

Aqui, a gente encontra a função "choose" que abre uma janela, na qual o usuário pode marcar uma opção entre as pré-definidas. Pelo que eu vi, essa função exige que se declare duas variáveis: a "indice" retorna a posição da opção dentro do array e a "texto" retorna o texto dessa opção. Além disso, o "choose" permite que se coloque um texto como enunciado da janela, onde adicionei a pergunta "Qual o tipo de loucura?". Essa janela tem um design padrão do software e você pode ver seu formato na imagem abaixo: 

Email image

Seguindo o código, temos: 

if indice == 1 then
enviar("Curta Duração");
invoke("loucuracd");

Esta é uma condicional que separa cada item do array e, dependendo da opção (1, 2 ou 3), ela imprime uma mensagem correspondente à tabela selecionada e já executa o macro correspondente. Veja o macro em execução no vídeo abaixo: 

Bom, algumas ponderações sobre minha experiência fazendo esse macro. Eu poderia ter feito tudo num só macro, mas queria experimentar com essa função de invocar outros macros, até para aprender coisas novas. Além disso, acho que assim o código fica um pouco mais organizado, uma vez que o Firecast não tem uma ferramenta de edição de macros muito confortável de se operar. E ainda tem algumas pequenas coisas que eu acho que numa refatoração poderia melhorar. Por exemplo, no macro "loucura", ao invés de usar "enviar("Curta Duração");" eu poderia substituir por "enviar(texto);" que eu teria o mesmo resultado, uma vez que essa variável já estava delimitada mesmo. Mas, na época, eu ainda não tinha esse conhecimento.

É isso, agradeço mais uma vez pela atenção e a todo mundo que deu feedback nos textos anteriores.Foram dicas muito importantes e, com certeza, foram muito úteis para mim. Com isso, me despeço e 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 prazerzão trocar ideias com vocês! Forte abraço!