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)
fonte
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.Respostas:
Os problemas que você tem ao calcular o DPS a partir dessa fórmula são porque o que você chama
BaseDamage
nã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 10BaseDamage
, 1.000BaseDamage
ou 1.000.000BaseDamage
, você sempre estará nesse intervalo. Onde nesse intervalo depende de comoBaseDamage
a arma se compara àDefense
do alvo. Isso significa que o que realmente afeta a ordem de magnitude do dano real de um ataque é principalmente oSkillDmg
multiplicador.Olhando para essas propriedades matemáticas, eu realmente não chamaria essa propriedade de arma,
BaseDamage
mas simDefensePenetration
, 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
BaseDamage
outro fator multiplicativo:Se você gosta da mecânica de penetração de defesa que descobriu acidentalmente, é assim que ficaria
Penetration
como um status de arma separado:O bom dessa fórmula é que ela se adapta muito bem:
AttackFrequency * BaseDamage / 2
Editar: Aqui estão algumas tabelas com valores de exemplo:
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.
fonte
SkillDmg
? Presumi que fosse um fator multiplicativo. Portanto, um ataque básico tem1.0
e um ataque especial com dano duplo teria2.0
. Se você preferir que eles sejam inteiros, adicione-os emBaseDamage
vez de multiplicá-los.BaseDamage * BaseDamage
), você só multiplica por BaseDamage uma vez (o que significa que BaseDamage é reduzido na fórmula).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,
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.
fonte