Comment concevoir une formule de dégâts dans un RPG qui maintient les armes avec différentes vitesses d'attaque équilibrées?

8

Je fais un jeu de rpg mobile, infini où il y a un système de butin comme Diablo 3. Les armes ont une attaque et de la vitesse, les pièces d'armure ont une valeur de résistance (pas de pourcentage).

La formule que j'utilise est:

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

Les résultats sont bons, les dégâts augmentent si la défense diminue et ils ne augmentent pas de façon exponentielle en raison de la division entre ( BaseDamage + Defense).

Disons que j'ai une épée avec une vitesse d'attaque de 1.0 qui inflige 50 dégâts. C'est 50 dps, et j'ai un poignard que je veux qu'il attaque plus rapidement, mais bien sûr, inflige moins de dégâts, pour maintenir le dps, la logique dit que si la vitesse d'attaque des dagues est doublée, les dégâts doivent être réduits de moitié (2.0 vitesse avec 25 dmg). Mais en utilisant la formule ci-dessus, vous verrez que les dégâts réels réels DPS sont inférieurs à l'épée.

Iv'e a résolu cela en faisant en sorte que le poignard ne fasse pas 25 dégâts mais un peu plus, en faisant quelques calculs, je peux faire en sorte que les vrais dps soient les mêmes pour équilibrer les choses. Dans ce cas, le poignard à une vitesse de 2,0 devrait infliger 32 dégâts pour être les mêmes dégâts réels que l'épée.

Cependant, je veux afficher le numéro DPS sur les armes. Si j'affiche simplement les poignards DPS à 32 dmg * 2, la vitesse d'attaque sera de 64 dps, par rapport à l'épée de 50 dps, on dira clairement que le poignard est meilleur, mais bien sûr que non.

Solutions possibles? Changer la formule initiale des dommages? Si oui, lequel? Supposons que je ne change pas la formule, y a-t-il une solution? Je n'aime vraiment pas devoir tromper le poignard pour infliger plus de dégâts que la moitié pour le rendre encore ...

J'aimerais vraiment connaître la formule de dégâts de diablo 3. Je sais que diablo 3 armes DPS, c'est simplement les dégâts de base * la vitesse d'attaque.

Éditer:

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
la source
1
Dans votre modification, vous avez la formule que j'ai publiée dans ma réponse ( damage * damage / ( damage + defense)), juste sans tenir compte des dégâts de compétence. La raison de la différence de DPS est que vous utilisez la même défense. La raison pour laquelle vous obtenez des résultats différents est qu'avec cette formule, les armes lentes mais fortes sont meilleures contre les ennemis à haute définition tandis que les armes rapides mais faibles sont meilleures contre les ennemis à basse définition (ce qui semble plausible). Vous avez supposé un ennemi de haute définition et équilibré les deux armes contre lui, ce qui signifie que vous avez maîtrisé le poignard. Le calcul DPS montre cette surpuissance.
Philipp

Réponses:

20

Les problèmes que vous rencontrez avec le calcul du DPS à partir de cette formule sont dus au fait que ce que vous appelez BaseDamagene semble pas être le cas.

En supposant que tous les nombres sont positifs, cela BaseDamage / ( BaseDamage + Defense )se résoudra toujours en un nombre à virgule flottante compris entre 1 et 0. Peu importe si vous en avez 10 BaseDamage, 1 000 BaseDamageou 1 000 000 BaseDamage, vous serez toujours dans cette plage. Où dans cette gamme dépend de la façon dont BaseDamagel'arme se compare à celle Defensede la cible. Cela signifie que ce qui affecte réellement l'ordre de grandeur des dégâts réels d'une attaque est principalement le SkillDmgmultiplicateur.

En regardant ces propriétés mathématiques, je n'appellerais pas vraiment cette propriété d'arme, BaseDamagemais plutôt DefensePenetration, car elle décrit la capacité de l'arme à surmonter la défense ennemie et à faire la plupart de ses dégâts. Cela pourrait en fait être un mécanisme intéressant à avoir (ou pas ... c'est quelque chose que vous devez tester), mais cela ne dit pas grand-chose sur le niveau de puissance d'une arme.

Alors, comment pouvons-nous résoudre ce problème?

Eh bien, il n'y a pas de bonne solution à ce problème. Mais un changement qui pourrait faire ce que vous voulez faire (une arme deux fois plus puissante = environ deux fois plus de dégâts) consiste à ajouter le BaseDamagecomme un autre facteur multiplicatif:

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

Si vous aimez le mécanisme de pénétration de la défense que vous avez découvert accidentellement, voici à quoi il ressemblerait avec Penetrationune statistique d'arme distincte:

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

La bonne chose à propos de cette formule est qu'elle évolue assez bien:

  • Même lorsque la défense est pathétique par rapport à la valeur d'attaque, il n'y a jamais plus de dégâts que d'attaque. Cela vous donne une limite supérieure sur les dégâts qu'un personnage peut infliger, ce qui rend l'équilibre beaucoup plus facile.
  • À l'autre extrême, quelle que soit la hauteur de la défense, elle ne peut jamais atténuer complètement les dégâts (sauf par des erreurs d'arrondi), il y a donc toujours place à amélioration pour le défenseur et il n'y a jamais d'attaque complètement inutile.
  • Lorsque Defense et BaseDamage (et Penetration quand vous le souhaitez) sont à peu près les mêmes, il y a environ la moitié autant de realDamage que de BaseDamage. Cela est vrai quelle que soit la taille des valeurs. C'est également sur cela que vous pouvez baser votre estimation DPS. Supposez simplement que l'ennemi a autant de défense que l'arme a une attaque / pénétration, ce qui signifie que votre formule DPS devientAttackFrequency * BaseDamage / 2

Edit: Voici quelques tableaux avec des exemples de valeurs:

 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

Comme vous pouvez le voir à partir de ces chiffres, les armes à haute vitesse et à faible dégâts sont toujours nominalement plus puissantes contre le même ennemi que les armes à grande vitesse et à faible dommage si elles ont le même DPS selon AttackFrequency * BaseDamage / 2. Mais l'effet est plus visible sur les ennemis haute définition que sur les ennemis basse définition. Les deux sont également bons sur les ennemis à 0 déf. Cela signifie que les armes à attaque rapide sont moins mauvaises sur les ennemis à basse définition que sur les ennemis à haute définition.

Cela pourrait être contrebalancé par le fait que les armes à grande vitesse donnent au joueur plus de flexibilité en ce qui concerne la répartition des dégâts et lui permettent ainsi d'éviter de gaspiller du DPS sur les compétences excessives. Lorsque le joueur fait face à un très grand nombre d'ennemis très faibles qui meurent tous d'un coup, une arme à 5 attaques par seconde peut tuer 5 ennemis par seconde tandis qu'une arme à 1 attaques par seconde ne peut tuer qu'un ennemi par seconde. Un autre avantage possible apparaît lorsque vous ajoutez un caractère aléatoire aux attaques. En raison de la loi des grands nombres, de nombreuses attaques faibles produiront des dégâts plus fluides et plus fiables que quelques attaques fortes. Les joueurs bénéficient généralement de la fiabilité. Mais lorsque de telles considérations ne sont pas pertinentes en raison de la mécanique de votre jeu et / ou de la conception des rencontres, vous devrez rendre vos armes plus rapides un peu plus puissantes qu'elles ne devraient l'être pour compenser.

Une façon de donner un coup de fouet aux armes à grande vitesse pourrait être l'introduction d'effets qui se déclenchent avec x% de chances par coup et ne dépendent pas des dégâts. Celles-ci seraient beaucoup plus puissantes avec une arme à attaque rapide car elles se déclencheraient beaucoup plus fréquemment.

Philipp
la source
Merci @Philipp, je pense que cela le résoudra. Les dégâts seront trop importants pour le moment mais je vais les modifier.
marcg11
@ marcg11 À quoi sert exactement votre gamme SkillDmg? J'ai supposé que c'était un facteur multiplicatif. Une attaque de base a donc une attaque 1.0spéciale à double dégâts 2.0. Si vous préférez que ce soient des entiers, vous pouvez les ajouter au BaseDamagelieu de les multiplier.
Philipp
J'ai réalisé que la formule que vous avez donnée est exactement la même que la mienne si j'établis skillDamage comme multiplicateur. Je ne peux donc toujours pas réduire de moitié les dégâts de la dague si je double la vitesse d'attaque pour maintenir les dégâts.
marcg11
@ marcg11 Non, ce n'est pas pareil. La principale différence est que je multiplie avec BaseDamage au carré ( BaseDamage * BaseDamage), vous multipliez seulement par BaseDamage une fois (ce qui signifie que BaseDamage est réduit dans la formule).
Philipp
Mais mon skillDmg n'a jamais été un pour cent, un skillDmg d'attaque normal est le même que le baseDmg, donc c'est la même chose.
marcg11
0

Si vous voulez que des armes de "puissance" égale donnent un DPS égal, une solution simple serait d'attribuer directement le DPS et de calculer les dégâts par coup à partir de cela, par exemple

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

Dans cet exemple, votre épée aurait 50 DPS et 1,0 vitesse d'attaque et le poignard aurait 50 DPS et 2,0 vitesse d'attaque. Si vous voulez afficher les dégâts par coup, c'est simplement le DPS divisé par la vitesse d'attaque (soit 50 pour l'épée et 25 pour la dague).

Notez que cela supprime le mécanisme "Les armes plus lentes sont meilleures vs haute défense", ce qui, je suppose, est ce que vous voulez.

Ruther Rendommeleigh
la source
Oui, c'est plus ou moins l'idée, mais au lieu du DPS, j'utilise une valeur qui est la même pour toutes les armes de niveau x
marcg11