English Flag

Como o dano funciona?

Primeiramente vou demonstrar todo o formalismo matemático e o método de análise de dados para a fórmula de dano do jogo, em seguida vou explicar detalhadamente como ela funciona.

Formalismo matemático da fórmula de dano

Foram propostos diversos modelos matemáticos para a fórmula de dano no jogo: lineares, polinomiais, exponenciais e combinações de modelos não lineares.

Um modelo que, a princípio, faz sentido com o jogo e conseguiu trazer resultados positivos foi:

\( \text{dano} = \text{constante de correção} \times \left( \text{Ataque + Ataque Especial} \right)\times (1-\text{defesa}) \times \text{dano base}\)

Ou, em uma linguagem matemática, o dano pode ser escrito como uma função \( f: \mathbb{R}^4\to \mathbb{R} \) que mapeia um vetor \(\mathbf{X}=(x_1, x_2, x_3, x_4)\), \( \mathbf{X} \in \mathbb{R}^4 \) e retorna um escalar:

\( f(\mathbf{X})=k(x_1+x_2)(1-x_3)x_4 \)

Isso significa que a fórmula de dano leva em conta quatro fatores para fazer o cálculo: o Ataque (\( x_1\)), o Ataque Especial (\( x_2\)), a Defesa do inimigo
(\( x_3\)) e o dano base que seu personagem causa com algum ataque (\( x_4\)). Para simplificar a leitura, vou chamar as variáveis \(x_1\) de \(x_{ATK}\), \(x_2\) de \(x_{SPA}\), \(x_3\) de \(x_{DEF}\) e \(x_4\) de \(x_{BASE}\)

Para testar a validade desse modelo seria necessário, primeiramente, coletar diversos dados do dano causado para cada conjunto de ataque, ataque especial, defesa e dano base para que, em seguida, fosse possível realizar um ajuste multivariado e fosse obtido o valor da constante de correção.

Essa forma de análise pode ser computacionalmente muito custosa, uma vez que estamos lidando com quatro variáveis independentes e um grande volume de dados. Para contornar esse problema, nós usualmente partimos de um modelo mais simples e vamos tornando-o cada vez mais complexo e próximo da realidade.

Inicialmente foi fixado o valor do dano base e da defesa, e variado apenas os valores de ataque e ataque especial, ou seja, os status foram mudados a cada teste, mas o monstro e a skill utilizados foram os mesmos, tornando a forma de análise muito mais simples e sendo possível utilizar um método de data fitting como mínimos quadrados.

Também foi interessante adotar uma forma de "ataque resultante", que seria a soma do ataque com o ataque especial. Chamei esse "ataque resultante" de \(x_{RES}\). Dessa forma forma: \(x_{RES} = x_{ATK} + x_{SPA}\).

Eu também acoplei a defesa e o dano base à constante de correção \(k\), uma vez que, ao usar o mesmo ataque em um mesmo inimigo, o dano sempre permanece igual. Assim, temos que a nova constante de correção é: \(k' = k \cdot x_{DEF} \cdot x_{BASE}\).

Com isso o modelo proposto foi simplificado a uma função \( f: \mathbb{R}\to \mathbb{R} \):

\( f(x_{RES})=k'x_{RES} \)

no qual o valor de \(k'\) representa o acoplamento da constante de correção, defesa e dano base. Dessa forma, como as únicas variáveis agora são o "ataque resultante" e o valor do dano que podemos ver na tela, ficou muito simples fazer uma análise estatística do ataque resultante versus o dano causado ao inimigo. Assim foi possível obter o valor dessa constante e finalmente foi possível prever o dano utilizando qualquer combinação de ataque e ataque especial.

Porém, enquanto a análise era feita, a famosa tabela coreana foi publicada. Dessa forma foi possível desacoplar o valor do dano base da constante \(k'\) e reescrever a nossa fórmula de dano para que fosse possível utilizar informações acessíveis ao público.

A fórmula de dano pode ser refinada e agora, com o dano base desacoplado da defesa a nossa nova versão da fórmula de dano experimental fica:

\( f(x_{RES})=k''x_{RES}\cdot x_{BASE} \)

onde \(k'' = (1-x_{DEF})k\)

É coerente adotar um valor de defesa como um valor entre 0 e 1, ou entre 0% e 100%. Dessa forma é possível isolar o valor de \(x_{DEF}\) e pensá-lo como uma "constante de defesa" \(0\leq k_d \leq 1\), que muda apenas para inimigos diferentes: se o inimigo muda, a defesa muda.

Em alguns casos o valor de \(k''\) apresentou alterações, dependendo do inimigo. Ora, o nosso 'postulado base' é que a constante de correção \(k\) é fixa, então a mudança do valor de \(k''\) só depende da defesa do inimigo.

A partir disso, para uma mesma skill, foram coletados dados do dano causado para diversos conjuntos de ataque, ataque especial e inimigos distintos. Diversas skills foram utilizadas para gerar uma grande variação no valor de \(k''\).

Essa estratégia trouxe uma análise muito precisa para diversos valores de \(k''\) e permitiu que fosse encontrado o valor da constante \(k\) e, por consequência, a defesa de diversos tipos de inimigos.

É importante ressaltar que esse modelo matemático utilizado precisou ser adaptado e divido entre três tipos de "fontes de dano": Dano de Skills, Dano de Comandos Básicos e Dano de Pet. Para cada fonte de dano uma constante de correção é utilizada. Também foi necessário adotar dois tipos de defesa utilizados pelos inimigos: a defesa comum, que age contra comandos básicos e ataques de pet, e a defesa especial, que age contra skills. Vale ressaltar que o ataque especial pareceu funcionar apenas em dano de skills.

A fórmula de dano

Por fim, a análise estatística e dos dados forneceu resultados suficientes para obter a fórmula de dano:

\[ d_0 =\left\{ \begin{array}{ll} 0.007\times(\text{ataque} + \text{ataque especial})\times (1-\text{defesa especial})\times \text{dano base} & : \ \text{dano de skills} \\ 0.0168\times(\text{ataque})\times (1-\text{defesa})\times \text{dano base} & : \ \text{dano de ataques básicos} \\ 0.00477148\times(\text{ataque})\times (1-\text{defesa})\times \text{dano base} & : \ \text{dano de pets} \\ \end{array} \right. \]

Fatores adicionais

A partir dessa fórmula de dano foi possível realizar testes simples e individuais para introduzir cada tipo de adição ao dano, como os buffs de dano, resistência a contaminação, dano de ataque pelas costas, dano crítico, quebra de defesa entre muitos outros efeitos. O jogo aparenta usar uma forma muito simples para se lidar com diferentes tipos de adições ao dano, que se baseia em uma função não linear com o produto entre cada tipo diferente de adição de dano, ou seja, o famoso Multiplicador! Esses multiplicadores foram calculados como:

\[k_{\text{crit}}=\frac{(150 + \text{crit_dmg_%})}{100}\] \[k_{\text{buffs}}=\frac{(100 + \text{buffs_%})}{100}\] \[k_{\text{back}}=\frac{130 + \text{back_%} }{100}\]
\[k_{aerial}=1.5\] \[k_{\text{taint}}=\frac{(100 - \text{taint_%}+\text{resist_%})}{100}\] \[k_{\text{debuff_def}}=\frac{(100-\text{debuff_def_%})}{100}\]
\[k_{\text{lv}} =\left\{ \begin{array}{cl} 1 & : \ \text{char_lv}-\text{monst_lv} \leq5 \\ \frac{100+2(\text{char_lv}-\text{monst_lv}-5)}{100} & : \ \text{char_lv}-\text{monst_lv} \gt 5 \\ \end{array} \right.\] \[k_{enemy}=1\]

onde \(k_\text{crit}\) é a contribuição do dano crítico para o dano final (o que mostra que o dano crítico possui um valor base de 50% no jogo); \(k_{\text{buffs}}\) é a contribução de todos os buffs (club gc, chase point, anel da segunda marcha, buffs de skills etc) para o dano final; \(k_{\text{back}}\) é a contribuição do ataque pelas costas; \(k_{\text{aerial}}\) é a contribuição do dano causado a um inimigo que está no ar; \(k_{\text{taint}}\) é a contribução do debuff de contaminação e da resistência a contaminação; \(k_{\text{debuff_def}}\) é a contribuição dos debuffs de quebra/redução de defesa; \(k_{\text{lv}}\) é a contribuição do nível do seu personagem (não é o nível chase) e o nível do monstro; \(k_{\text{enemy}}\) é a contribuição do dano causado a inimigos com buffs de redução de dano, ou que possuem algum mecanismo que altera a forma como eles recebem dano.

Os buffs de redução de dano que os inimigos possuem também são contabilizados na fórmula de dano através de uma contribuição \(k_{enemy}\). Caso não haja esse buff, o valor de \(k_{enemy}=1\), caso contrário ele funciona da seguinte forma:

Buff Correção Observação
Aumentar Defesa \(k_{enemy}=0.8\) Se aplica a qualquer fonte de dano (comandos básicos, skill ou pet).
Redução de Dano \(k_{enemy}=0.7\) Se aplica a dano de comandos básicos e ataques de pet.
Redução de Dano Especial \(k_{enemy}=0.7\) Se aplica apenas a dano de skills.
Redução de Dano Crítico \(k_{\text{crit}}=\frac{(150 + \text{crit_dmg_%} - 150)}{100}\) Reduz seu dano crítico em 150%.
Redução de Dano Aéreo \(k_{aerial}=1\) Faz com que o dano aéreo fique idêntico ao dano no chão.
Aumento de Defesa Geral \(k_{enemy}=0.333\) Se aplica a qualquer fonte de dano (comandos básicos, skill ou pet).
Aumento de Defesa contra Habilidades Especiais \(k_{enemy}=0.1\) Se aplica apenas a dano de skills.
Aumento de Defesa contra comandos básicos/pet \(k_{enemy}=0.1\) Se aplica a dano de comandos básicos e ataques de pet.

No final de todo o cálculo de dano é somado o dano de lança infernal (Hell Spear - \(HS\)). É possível verificar pela fórmula, que a Lança Infernal não aproveita de NENHUM buff de dano, ataque pelas costas, dano crítico, etc. Por conta disso a lança infernal acaba se tornado uma propriedade ruim para a maioria absoluta dos conteúdos do jogo.

No entanto, a Lança Infernal altera temporariamente o valor \(k_{enemy}\), fazendo com que alguns inimigos recebam muito mais dano da lança infernal, porém isso funciona apenas para alguns inimigos muito específicos, como o Coração do Absoluto no Vazio 3: Pesadelo.

Ainda há o dano causado aos portais dentro de algumas dungeons, como no Caminho Abissal. Esses portais não seguem a fórmula de dano, eles sempre recebem um dano constante pré-definido.

A fórmula final

Unificando todas essas correções, a fórmula de dano do jogo pode ser escrita como:

\[ d_0 =\left\{ \begin{array}{ll} 0.007\times(\text{ataque} + \text{ataque especial})\times (1-\text{defesa especial})\times \text{dano base} & : \ \text{dano de skills} \\ 0.0168\times(\text{ataque})\times (1-\text{defesa})\times \text{dano base} & : \ \text{dano de ataques básicos} \\ 0.00477148\times(\text{ataque})\times (1-\text{defesa})\times \text{dano base} & : \ \text{dano de pets} \\ \end{array} \right. \]
\[ d_{\text{final}}=(d_0\frac{k_{\text{crit}} k_{\text{buffs}} k_{\text{back}} k_{\text{aerial}} k_{\text{taint}} k_{\text{lv}} k_{enemy}} {k_{\text{debuff_def}}}+\text{HS}) \]

Considerações Finais

Existem algumas conclusões importantes a serem tiradas desses valores:

  • Valores base "escondidos":

    Algumas propriedades possuem valores base escondidos no jogo. Quando você cria uma conta do zero, seu dano crítico base será 50% (\( \text{dano normal} \times 1.5 \)), mesmo que tenha 0% em status.

    Outra propriedade com valor base escondido é o ataque pelas costas. Seu valor base é 30% (\( \text{dano normal} \times 1.3 \)), mesmo que tenha 0% em status.

  • Equivalência de ataques:

    O Ataque e o Ataque Especial possuem o mesmo peso para skills. Ganhar 100 de Ataque ou 100 de Ataque Especial resultará exatamente no mesmo aumento de dano final para suas habilidades.

  • Saturação de status:

    Quanto mais você investe em um único status, menor é a percepção real de ganho. Por exemplo: adicionar 10% de dano crítico quando você tem 500% representa um ganho de \( \frac{10}{500 +150} \approx 1.5 \text{%} \) de dano final. Porém, adicionar os mesmos 10% quando você já tem 900% representa um ganho de apenas \( \frac{10}{900 + 150} \approx 0.95 \text{%} \) de dano final. Por conta disso, jogadores no endgame (1000%+ de dano crítico) sentem pouca diferença ao aumentar seus status.

  • Separação de buffs:

    Na maioria dos jogos os buffs de dano são multiplicados entre si, então diferentes buffs possuem contribuições próprias na composição do dano. Por exemplo: \[ \text{final_dmg} = \text{raw_dmg} \times (1 + \text{boss_dmg}) \times (1 + \text{skill_dmg}) \times (1 + \text{skill_tier_dmg}) \times \cdots. \]

    No Grand Chase, porém, isso não ocorre. Os diferentes buffs são somados (ao invés de multiplicados), fazendo com que 10% de dano de todas as habilidades seja literalmente idêntico a 10% de dano causado a chefes, independente da quantidade de buffs que você possui.

    A diferença entre os buffs está somente em onde são aplicados: dano causado a chefes só se aplica a chefes, dano de todas as habilidades só se aplica a habilidades e assim por diante.

  • Diluição de buffs:

    Como os buffs no jogo somam-se entre si antes de multiplicar o dano, um buff de 10% não aumenta seu dano final em 10%, por exemplo. Se você já possui 50% em buffs e recebe mais 10%, o ganho real percebido será de apenas \( \frac{10}{100 + 50} \approx 6.66\text{%} \) no dano final.

  • Porcentagem de dano:

    Na maioria dos jogos é comum a apresentação do valor de dano como 'essa habilidade causa \(309 \text{%}\) de dano físico', por exemplo. Note que na fórmula de dano, sempre temos uma constante de correção ( \(0.007\) para skills, \(0.0168\) para comandos básicos e \(0.000477148\) para pets). É possível escrever o dano base do jogo usando esse valor, por exemplo:

    A skill Asas do Paraíso causa \(364.864\) de dano base. Podemos reescrever como: \(364.864 \times 0.007 \times 100 = 255.4048 \text{%}\) de (Ataque + Ataque Especial).

Por fim, ao invés de precisar se preocupar em trabalhar com toda essa matemática, você pode simplesmente utilizar minha calculadora de dano!