O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Fórmulas de Cálculo de Dano: Do Básico ao Avançado

Iniciado por mercia, 07/01/2018 às 20:39

Este tópico não é de minha autoria, o autor original é Basch, e este tópico foi postado originalmente na Mundo RPG Maker.
Estou repostando aqui porque acredito que tutoriais como esse não podem ser perdidos.


Sistema por: Basch                                           
Inspiração e base no tutorial de Fomar0153 (em inglês) apresentado em seu blog
Nível de dificuldade: Intermediário/Avançado

Introdução


Olá Mundo RPG Maker! Hoje eu vou lhes apresentar este tutorial que lida com os vários usos das fórmulas de dano das habilidades e dos itens do RPG Maker VX Ace.
A box de Fórmula de Cálculo de Dano é uma novidade no Ace. Antes, no VX, a fórmula para todas as habilidades era a mesma, e eram necessários scripts super complexos para fazer com que o maker pudesse criar uma habilidade que levasse em conta fatores diferentes das outras.
Muitos makers ainda não se deram conta da infinidade de usos da box de Fórmula de Cálculo de Dano. Com ela, toda e qualquer habilidade pode ter sua fórmula de dano customizada, o que implica em um jogo mais estratégico, em que o jogador terá que pensar e escolher a habilidade mais adequada para cada tipo de situação. Este tutorial vai cobrir muito do básico sobre as fórmulas de dano, como as variáveis por trás dos cálculos, o que o maker pode usar no cálculo do dano, como as operações matemáticas, atributos dos personagens e outras variáveis, além de mostrar técnicas mais avançadas no cálculo de dano, envolvendo comandos do próprio Ruby (sim, códigos Ruby podem ser utilizados na box, apesar de que com algumas limitações).
Enfim, chega de conversa e vamos ao Tutorial!


O Básico: A box de Fórmula de Cálculo de Dano e suas principais funções


Cada skill no Ace tem uma fórmula de Dano completamente customizável. Você pode atribuir um dano fixo a uma habilidade (simplesmente colocar um número na box do cálculo), ou utilizar variáveis. Essas variáveis podem estar em função do atacante, ou seja, quem está realizando a habilidade (tem o prefixo "a.") ou do receptor (tem o prefixo "b."). Você pode usar parâmetros como ataque, defesa, level e até uma variável do jogo (v[n], onde "n" é o número da variável.) para criar fórmulas impressionantes.
Pode-se usar operações matemáticas na box também, por exemplo, adição (+), subtração (-), multiplicação (*), divisão (/) e potenciação (**) (Lembre-se que a radiciação é uma forma de potência e a raiz quadrada de quatro é igual a 4**0.5 ).

Uma vantagem disso, por exemplo, é que vc pode criar skills que ignorem a defesa do receptor sem muito trabalho (é só não colocar o "b.def").

Uma habilidade com a fórmula "a.atk * 4" vai simplesmente causar como dano o quádruplo do ataque de quem está realizando a skill, e não descontará a defesa do oponente. Isto é extremamente útil para habilidades de bosses e afins.

Ou exemplo da maravilha que as fórmulas de dano podem fazer são as habilidades mágicas. Agora, no Ace, é muito mais fácil configurar habilidades mágicas, cujo dano se baseia somente no poder mágico do atacante e da defesa mágica do defensor. Uma habilidade com a fórmula "a.mat * 2 - b.mdf" causará como dano o dobro do ataque mágico do atacante, descontados da defesa mágica do defensor.

Habilidades em função do Level também são possíveis agora. Isso é útil para um jogo com poucas habilidades, em que o maker não quer que estas fiquem "fora de uso" depois que o jogador passar vários níveis. Por exemplo, a fórmula "a.level * 4 + 50 - b.def * 2" não será afetada pelo quanto o jogador tem de ataque ou te ataque mágico, mas sim de Level.

Algo importante a se lembrar é que variáveis de jogo podem ser utilizadas na fórmula de dano também. A fórmula "v[1] * 4 - (v[2] / 3)", por exemplo, depende inteiramente de variáveis, o que pode ser interessante para siquests ou qualquer minigame. Seria possível causar dano de acordo com o número de poções que o jogador possui, por exemplo, ou o número de pessoas na equipe, colocando esses valores em variáveis.

Estes são apenas alguns exemplos mais básicos do que esta box pode fazer. Experimente criar habilidades em função de atributos mais inusitados, como agilidade, level, HP estante, número de NPCs com quem o jogador tenha falado (em uma variável) etc.

O melhor mesmo é fazer testes e testes com variadas fórmulas de habilidades e ver qual é a melhor para o seu jogo!


O Avançado: Utilizando Ruby nas suas fórmulas de dano


Muitos comandos Ruby podem ser utilizados na caixas de fórmula de dano. Devo avisar que o meu conhecimento de Ruby é limitado, e que bons scripters com certeza podem encontar outros métodos para se colocar na box de Fórmula de Cálculo de Dano.

Enfim, aqui vamos nós:

1. Como fazer uma habilidade de cura afetar mais um jogador do que o outro, ou não afetar certo jogador:

Para isso, utilizaremos uma expressão do Ruby, uma forma compacta de se escrever condições, que é a seguinte: condition ? if_true : if_false.
Na box, escreva: b.id == x ? F1 : F2

Onde "x" será o id do herói que terá a fórmula de dano diferenciada, F1 será está fórmula e F2 a fórmula geral (para os outros jogadores).

Exemplo 1: b.id == 3 ? (a.mat * 4) : (a.mat * 2 + 20)
Quando o alvo desta habilidade for o personagem de id 3 na database, a fórmula será "a.mat * 4". Para todos os outros personagens, a fórmula será "a.mat * 2 + 20".

Exemplo 2: (b.id == 3 or b.id == 4 or b.id == 5) ? 0 : (a.mat * 3 + 10)
Quando os alvos desta habilidade forem os personagens de id 3, 4 ou 5, nada acontece. Para todos os outros, a fórmula será "a.mat * 2 + 20".

Nota: De acordo com o Membro Twinsen (créditos a ele) este último exemplo pode ser reduzido a: "(3..5).include?(b.id) ? 0 : (a.mat * 3 + 10)", causando o mesmo efeito.


2. Como fazer uma habilidade ser mais forte/mais fraca quando um certo personagem a usa:

Isto na verdade é uma extensão da técnica acima, só que vamos usar "a." ao invés de "b."

Exemplo: a.id == 5 ? (a.mat *3 + 20) : (a.mat * 2 + 20)

Quando o personagem 5 estiver usando esta habilidade, a fórmula será "a.mat * 3 + 20". Para todos os outros, a fórmula será "a.mat * 2 + 20".


3. Como fazer uma habilidade de cura mais forte quando um switch estiver on:

Reconhecemos um switch por "$game_switches[n]", onde n é o número do switch. Vamos então acrescentá-lo a mesma expressão de condução utilizada acima:

Exemplo: $game_switches[5] ? 500 : 300

Quando o switch 5 estiver ligado, a habilidade curará 500. Se estiver off, curará 300.


4. Como fazer uma habilidade ser mais forte quando uma certo tipo de arma estiver equipada:

Vamos utilizar o método "atype_equipped?(x)", que checa se a arma de tipo x está equipada.

Exemplo: a.atype_equipped?(9) ? (a.mat * 5) : (a.mat * 3 + 20)

Se a arma equipada for do tipo 9, isto é, for um cajado, a fórmula será "a.mat * 5". Para todos os outros tipos de arma, a fórmula será "a.mat * 3 + 20"


5. Como adicionar uma condição no personagem que usou a habilidade:

Vamos utilizar o método "add_state(x)", onde x é o id da condição a se adicionar.

Exemplo: a.atk * 3 + 15; a.add_state(5)
Esta habilidade, após causar "a.atk + 15" de dano, deixa o personagem que a utilizou com o status 5 (confuso).


6. Tenho uma personagem, por exemplo, uma princesa, que não luta, mas ao invés disso manda seus guardas atacarem. Com isso, suas habilidades não podem levar em conta o seu ataque, mas sim o do guarda. Como usar o ataque de outro personagem em uma habilidade?

Mais fácil do que parece, é só acessarmos a id daquele personagem através de "$game_actors[n]", onde n é o id do personagem.

Exemplo: $game_actors[7].atk + 20

Esta habilidade usará sempre o ataque do personagem 7, independente de quem usá-la.


7. Digamos que eu tenha um personagem que ataque usando duas moedas. Se saírem duas caras, o dano será F1. Se saírem duas coroas, o dano será F2. Se saírem resultados diferentes, o dano será F3.

Este aqui é bem mais complexo. Vamos precisar nomear duas variáveis locais (pode usar qualquer letra, menos "a" e "b", por que estas já são usadas pelo maker), e elas terão que ser aleatórias, o que implica no método rand(x), além de condições else e elsif, então a estrutura que estávamos usando antes terá que ser abandonada.

Vejamos como fica:

c = rand(2); d = rand(2); if c == 0 and d == 0; F1; elsif c == 1 and d == 1; F2; else F3; end

O método rand(2) vai chamar um número de 0 a 1 (que serão cara e coroa). Quando os dois valores forem 0 (cara), o dano será F1. Se os dois valores forem 1 (coroa), o dano será F2. Para outro resultado (0 e 1 ou 1 e 0), o dano será F3.


Considerações finais


Então, makers, eu criei este tutorial com a intenção de ajudá-los com esta função a princípio complicada no Ace mas que pode ser tornar muito útil quando dominada. E o melhor jeito de dominá-la é testando! Não se limite só ao que eu disse aqui: eu aprendi muitas destas coisas experimentando e errando!

Outras considerações antes do fim deste tutorial:

1. A box de Fórmula de Dano só aguenta 99 caracteres. Se sua fórmula ultrapassar isto, tente apagar alguns espaços desnecessários ("b.id==1", ao invés de "b.id == 1"), ou tentar reformular e compactar seus métodos.

2. Se sua fórmula tiver algum erro de interpretação de Ruby, o jogo não vai dar crash. Ao invés disso, a habilidade SEMPRE dará "Miss". Se isso acontecer com você, veja se vc esqueceu algum caractere, como um ";" ou algo parecido.

3. Meu conhecimento de Ruby é limitado, mas podem perguntar qualquer coisa neste tópico sobre alguma fórmula. Vou tentar resolver, e, mesmo que não consigo, um scripter de verdade pode ajudá-los.


Isso é tudo, makers. Espero que tenham gostado desse tutorial!

Ola!
Gostaria de saber como definir para o dano de uma habilidade ser o valor armazenado em uma variável, se por acaso isso é possível e qual formula de dano usar.

Obrigado!

$game_variables[x] # Mude X para o ID da variável que deseja utilizar.


Citação de: Revali online 12/01/2018 às 13:21
$game_variables[x] # Mude X para o ID da variável que deseja utilizar.


Muito obrigado !