Como criar uma fórmula de dano em um RPG que mantém armas com diferentes velocidades de ataque equilibradas?

8

Estou fazendo um jogo de rpg para dispositivos móveis, um infinito onde existe um sistema de pilhagem como o Diablo 3. Armas têm ataque e velocidade, peças de armadura têm um valor de resistência (não porcentagem).

A fórmula que estou usando é:

float realDamage = SkillDmg * BaseDamage / ( BaseDamage + Defense )

Os resultados são bons, o dano aumenta se a defesa diminuir e não aumentar exponencialmente por causa da divisão entre ( BaseDamage + Defense).

Digamos que eu tenho uma espada com velocidade de ataque 1.0 que causa 50 de dano. Isso é 50 dps, e eu tenho uma adaga que eu quero que ataque mais rápido, mas é claro que cause menos dano, para manter os dps, a lógica diz que se a velocidade de ataque dos adagas for dobrada, o dano precisará ser reduzido pela metade (velocidade 2,0 com 25 dmg). Mas, usando a fórmula acima, você verá que o DPS real de dano real é menor que a espada.

Iv'e resolveu isso fazendo com que a adaga não causasse 25 de dano, mas um pouco mais. Fazendo alguns cálculos, posso fazer com que os dps reais sejam os mesmos para equilibrar as coisas. Nesse caso, o punhal a uma velocidade de 2,0 precisaria causar 32 de dano para ter o mesmo dano real que a espada.

No entanto, quero exibir o número DPS nas armas. Se eu apenas exibir o DPS dos punhais como velocidade de ataque de 32 dmg * 2, será 64 dps, comparado com a espada de 50 dps, alguém dirá claramente que o punhal é melhor, mas é claro que não.

Soluções possíveis? Alterar a fórmula de dano inicial? Se sim, qual? Vamos supor que eu não mude a fórmula, existe alguma solução? Eu realmente não gosto de ter que enganar a adaga para causar mais dano da metade para torná-la uniforme ...

Eu realmente gostaria de saber a fórmula de dano para o diablo 3. Eu sei que o DPS do diablo 3 armas é simplesmente dano base * velocidade de ataque.

Editar:

Lets assume defense = 50 and normal attack (skillDmg = baseDmg)

Sword 1.0 attack speed dealing 50 dmg -> real damage hit=  50 * 50 / ( 50 + 50 ) = **25 dmg** = 25 dps

Dagger 2.0 attack speed dealing 32 dmg -> real damage hit = 32 * 32 / ( 32 + 50 ) = **12.5 dmg** = 25 dps

Sword item, lets display the actual sword dps, 50 * 1.0 = **50 dps**
Dagger item, lets display the dagger dps, 32 * 2.0 = **64 dps** (SHOULD BE THE SAME)
marcg11
fonte
11
Na sua edição, você tem a fórmula que eu postei na minha resposta ( damage * damage / ( damage + defense)), apenas sem levar em consideração o dano de habilidade. O motivo da diferença no DPS é porque você está usando a mesma defesa. A razão pela qual você obtém resultados diferentes é porque, com essa fórmula, armas lentas mas fortes são melhores contra inimigos de alta definição, enquanto armas rápidas mas fracas são melhores contra inimigos de baixa definição (o que parece plausível). Você assumiu um inimigo de alta definição e equilibrou as duas armas contra ele, o que significa que você fez a adaga dominar. O cálculo do DPS mostra essa sobrecarga.
Philipp

Respostas:

20

Os problemas que você tem ao calcular o DPS a partir dessa fórmula são porque o que você chama BaseDamagenão parece ser esse.

Supondo que todos os números sejam positivos, BaseDamage / ( BaseDamage + Defense )sempre será resolvido para um número de ponto flutuante entre 1 e 0. Não importa se você tem 10 BaseDamage, 1.000 BaseDamageou 1.000.000 BaseDamage, você sempre estará nesse intervalo. Onde nesse intervalo depende de como BaseDamagea arma se compara à Defensedo alvo. Isso significa que o que realmente afeta a ordem de magnitude do dano real de um ataque é principalmente o SkillDmgmultiplicador.

Olhando para essas propriedades matemáticas, eu realmente não chamaria essa propriedade de arma, BaseDamagemas sim DefensePenetration, porque descreve a capacidade da arma de superar a defesa inimiga e ainda causar a maior parte de seu dano. Isso pode realmente ser uma mecânica interessante de se ter (ou não ... é algo que você precisa testar), mas não diz muito sobre o nível de poder de uma arma.

Então, como resolvemos esse problema?

Bem, não há solução certa para esse problema. Mas uma mudança que pode fazer o que você quer fazer (arma duas vezes mais poderosa = cerca de duas vezes mais dano) é adicionar o BaseDamageoutro fator multiplicativo:

float realDamage = SkillDmg * BaseDamage * BaseDamage / (BaseDamage + Defense) 

Se você gosta da mecânica de penetração de defesa que descobriu acidentalmente, é assim que ficaria Penetrationcomo um status de arma separado:

float realDamage = SkillDmg * BaseDamage * Penetration / (Penetration + Defense) 

O bom dessa fórmula é que ela se adapta muito bem:

  • Mesmo quando a defesa é patética em comparação com o valor do ataque, nunca há mais danos que ataques. Isso lhe dá um limite máximo de quanto dano um personagem pode causar, o que facilita muito o balanceamento.
  • Por outro lado, não importa quão alta seja a defesa, ela nunca pode mitigar completamente o dano (exceto por erros de arredondamento); portanto, sempre há espaço para melhorias para o defensor e nunca há um ataque completamente inútil.
  • Quando Defesa e Dano Base (e Penetração quando você quiser) são aproximadamente os mesmos, há cerca de metade do dano real que Dano Base. Isso é verdade, independentemente do tamanho dos valores. É também nisso que você pode basear sua estimativa de DPS. Simplesmente assuma que o inimigo tem tanta defesa quanto a arma tem ataque / penetração, o que significa que sua fórmula DPS se tornaAttackFrequency * BaseDamage / 2

Editar: Aqui estão algumas tabelas com valores de exemplo:

 Damage by Defense for single attack     

              Defense
          |     0 |   35  | 50   | 100
       ---+-------+------+-------+-------
       35 |    35 | 17.5  | 14.4 |  9.1
Attack 50 |    50 | 29.4  | 25.0 | 16.6
      100 |   100 | 74.0  | 66.7 | 50.0

 Dps assuming HitFrequency = 100 / Attack

              Defense
          |     0 |   35  | 50   | 100
       ---+-------+-------+------+-------
       35 |   100 | 50.0  | 41.1 | 25.9
Attack 50 |   100 | 58.8  | 50.0 | 33.3          
      100 |   100 | 74.0  | 66.7 | 50.0

Como você pode ver nesses números, as armas de alto dano e baixa velocidade ainda são nominalmente mais poderosas contra o mesmo inimigo do que as armas de baixo dano e alta velocidade, se tiverem o mesmo DPS de acordo com AttackFrequency * BaseDamage / 2. Mas o efeito é mais visível nos inimigos de alta definição do que nos inimigos de baixa definição. Ambos são igualmente bons em inimigos com 0 def. Isso significa que armas de ataque rápido são menos ruins para inimigos de baixa definição do que para inimigos de alta definição.

Isso pode ser equilibrado pelo fato de que as armas de alta velocidade dão ao jogador mais flexibilidade em relação à distribuição de danos e, assim, permitem que eles evitem desperdiçar DPS em overkills. Quando o jogador enfrenta um número muito grande de inimigos muito fracos que morrem com um único golpe, uma arma de 5 ataques por segundo pode matar 5 inimigos por segundo enquanto uma arma de 1 ataque por segundo pode matar apenas 1 inimigo por segundo. Outra vantagem possível aparece quando você adiciona aleatoriedade aos ataques. Devido ao lei de grandes números, muitos ataques fracos causarão uma saída de dano mais suave e confiável do que alguns fortes. Os jogadores geralmente se beneficiam da confiabilidade. Mas quando essas considerações são irrelevantes devido à mecânica do jogo e / ou ao design dos encontros, você terá que tornar suas armas mais rápidas um pouco mais poderosas do que deveriam para compensar.

Uma maneira de aumentar as armas de alta velocidade pode ser a introdução de efeitos que são desencadeados com uma chance de x% por golpe e não dependem de dano. Estes seriam muito mais poderosos com uma arma de ataque rápido, porque seriam acionados com muito mais frequência.

Philipp
fonte
Obrigado @Philipp, acho que vai resolver isso. O dano será muito alto no momento, mas eu vou ajustá-lo.
precisa saber é o seguinte
@ marcg11 Qual é exatamente o seu alcance SkillDmg? Presumi que fosse um fator multiplicativo. Portanto, um ataque básico tem 1.0e um ataque especial com dano duplo teria 2.0. Se você preferir que eles sejam inteiros, adicione-os em BaseDamagevez de multiplicá-los.
29417 Philipp Philipp
Percebi que a fórmula que você forneceu é exatamente a mesma que a minha, se eu estabelecer o skillDamage como um multiplicador. Portanto, ainda não posso metade do dano da adaga se dobrar a velocidade de ataque para manter o dano.
Marcg11
@ marcg11 Não, não é o mesmo. A principal diferença é que eu multiplico com BaseDamage ao quadrado ( BaseDamage * BaseDamage), você só multiplica por BaseDamage uma vez (o que significa que BaseDamage é reduzido na fórmula).
Philipp
Mas minha skillDmg nunca foi uma porcentagem, uma skill normal de ataqueDmg é a mesma que baseDmg, então é a mesma coisa.
precisa saber é o seguinte
0

Se você pretende que armas de "poder" igual resultem em um DPS igual, uma solução fácil seria atribuir o DPS diretamente e calcular o dano por golpe obtido, por exemplo,

float realDamage = (SkillDmg * DPS / ( DPS + Defense )) / AttackSpeed

Neste exemplo, sua espada teria 50 DPS e velocidade de ataque 1,0 e a adaga teria 50 DPS e velocidade de ataque 2,0. Se você deseja exibir dano por golpe, isso é simplesmente DPS dividido pela velocidade de ataque (ou seja, 50 para a espada e 25 para a adaga).

Observe que isso elimina o mecanismo "armas mais lentas são melhores contra alta defesa", que eu assumo é o que você deseja.

Ruther Rendommeleigh
fonte
Sim, é mais ou menos a idéia, mas em vez de DPS Eu estou usando um valor que é o mesmo para todas as armas de nível x
marcg11