Macro para penalidade de loucura
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 | |||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
loucurald | |||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
loucurap | |||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
Vamos dissecar o código de novo então… | |||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
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: | |||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
Mais uma vez, destrinchando o código: | |||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
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: | |||||||||||||||||||||||||||
Seguindo o código, temos: | |||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
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! |