Comment développer des formules de dommages RPG?

117

Je développe un RPG 2d classique (dans le même sens que le fantasme final) et je me demandais si quelqu'un avait des conseils sur la façon de faire des formules de dommages / des liens vers des ressources / exemples? Je vais expliquer ma configuration actuelle. J'espère que je n'exagère pas avec cette question, et je m'excuse si mes questions sont trop larges / larges

Les statistiques de mes personnages sont les suivantes:

enum Stat
{
    HP = 0,
    MP = 1,
    SP = 2,
    Strength = 3,
    Vitality = 4,
    Magic = 5,
    Spirit = 6,
    Skill = 7,
    Speed = 8, //Speed/Agility are the same thing
    Agility = 8,
    Evasion = 9,
    MgEvasion = 10,
    Accuracy = 11,
    Luck = 12,
};

La vitalité est fondamentalement la défense contre les attaques physiques et l'esprit est la défense contre les attaques magiques.

Toutes les statistiques ont des maximums fixes (9999 pour HP, 999 pour MP / SP et 255 pour les autres). Avec les capacités, les maximums peuvent être augmentés (99999 pour HP, 9999 pour HP / SP, 999 pour les autres) avec des valeurs typiques (au niveau 100) avant / après capacités + équipement + etc. seront de 8000/20 000 pour HP, 800 / 2000 pour SP / MP, 180/350 pour autres statistiques

En fin de partie, Enemy HP sera typiquement dans les millions inférieurs (avec un super boss ayant un maximum de ~ 12 millions).

Je me demandais comment les gens développent réellement des formules de dommages appropriées qui s’échelonnent correctement? Par exemple, sur la base de ces données, l’utilisation des formules de dommages pour Final Fantasy X semblait très prometteuse. Une référence complète ici http://www.gamefaqs.com/ps2/197344-final-fantasy-x/faqs/31381 mais à titre d'exemple rapide: Str = 127, commande 'Attaque' utilisée, ennemi Def = 34.

1. Physical Damage Calculation:
Step 1 ------------------------------------- [{(Stat^3 ÷ 32) + 32} x DmCon ÷16]
Step 2 ---------------------------------------- [{(127^3 ÷ 32) + 32} x 16 ÷ 16]
Step 3 -------------------------------------- [{(2048383 ÷ 32) + 32} x 16 ÷ 16]
Step 4 --------------------------------------------------- [{(64011) + 32} x 1]
Step 5 -------------------------------------------------------- [{(64043 x 1)}]
Step 6 ---------------------------------------------------- Base Damage = 64043
Step 7 ----------------------------------------- [{(Def - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------ [{(34 - 280.4)^2} ÷ 110] + 16
Step 9 ------------------------------------------------- [(-246)^2) ÷ 110] + 16
Step 10 ---------------------------------------------------- [60516 ÷ 110] + 16
Step 11 ------------------------------------------------------------ [550] + 16
Step 12 ---------------------------------------------------------- DefNum = 566
Step 13 ---------------------------------------------- [BaseDmg * DefNum ÷ 730]
Step 14 --------------------------------------------------- [64043 * 566 ÷ 730]
Step 15 ------------------------------------------------------ [36248338 ÷ 730]
Step 16 ------------------------------------------------- Base Damage 2 = 49655
Step 17 ------------ Base Damage 2 * {730 - (Def * 51 - Def^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ---------------------- 49655 * {730 - (34 * 51 - 34^2 ÷ 11) ÷ 10} ÷ 730
Step 19 ------------------------- 49655 * {730 - (1734 - 1156 ÷ 11) ÷ 10} ÷ 730
Step 20 ------------------------------- 49655 * {730 - (1734 - 105) ÷ 10} ÷ 730
Step 21 ------------------------------------- 49655 * {730 - (1629) ÷ 10} ÷ 730
Step 22 --------------------------------------------- 49655 * {730 - 162} ÷ 730
Step 23 ----------------------------------------------------- 49655 * 568 ÷ 730
Step 24 -------------------------------------------------- Final Damage = 38635

J'ai simplement modifié les diviseurs pour inclure l'évaluation de l'attaque des armes et l'évaluation de l'armure de l'armure.

Les dégâts magiques sont calculés comme suit: Mag = 255, Ultima est utilisé, MDef ennemi = 1

Step 1 ----------------------------------- [DmCon * ([Stat^2 ÷ 6] + DmCon) ÷ 4]
Step 2 ------------------------------------------ [70 * ([255^2 ÷ 6] + 70) ÷ 4]
Step 3 ------------------------------------------ [70 * ([65025 ÷ 6] + 70) ÷ 4]
Step 4 ------------------------------------------------ [70 * (10837 + 70) ÷ 4]
Step 5 ----------------------------------------------------- [70 * (10907) ÷ 4]
Step 6 ------------------------------------ Base Damage = 190872 [cut to 99999]
Step 7 ---------------------------------------- [{(MDef - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------- [{(1 - 280.4)^2} ÷ 110] + 16
Step 9 ---------------------------------------------- [{(-279.4)^2} ÷ 110] + 16
Step 10 -------------------------------------------------- [(78064) ÷ 110] + 16
Step 11 ------------------------------------------------------------ [709] + 16
Step 12 --------------------------------------------------------- MDefNum = 725
Step 13 --------------------------------------------- [BaseDmg * MDefNum ÷ 730]
Step 14 --------------------------------------------------- [99999 * 725 ÷ 730]
Step 15 ------------------------------------------------- Base Damage 2 = 99314
Step 16 ---------- Base Damage 2 * {730 - (MDef * 51 - MDef^2 ÷ 11) ÷ 10} ÷ 730
Step 17 ------------------------ 99314 * {730 - (1 * 51 - 1^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ------------------------------ 99314 * {730 - (51 - 1 ÷ 11) ÷ 10} ÷ 730
Step 19 --------------------------------------- 99314 * {730 - (49) ÷ 10} ÷ 730
Step 20 ----------------------------------------------------- 99314 * 725 ÷ 730
Step 21 -------------------------------------------------- Final Damage = 98633

Le problème est que les formules s’écroulent complètement dès que les statistiques dépassent 255. En particulier, les valeurs de Defence supérieures à 300 commencent à générer un comportement vraiment étrange. Les statistiques Haute résistance + Défense mènent à des valeurs négatives massives par exemple. Bien que je puisse peut-être modifier les formules pour fonctionner correctement dans mon cas d'utilisation, il serait probablement plus facile d'utiliser une formule complètement nouvelle. Comment les gens développent-ils réellement des formules de dommages? J'envisageais d'ouvrir Excel et d'essayer de construire la formule de cette manière (par exemple, en cartographiant Statistiques d'attaque et statistiques de défense), mais je me demandais s'il existait un moyen plus simple? Bien que je ne puisse pas expliquer ici les mécanismes de jeu complets de mon jeu, quelqu'un pourrait-il être en mesure de suggérer un bon point de départ pour la création d'une formule de calcul des dégâts?

Merci

utilisateur127817
la source
1
Je pense que vous avez bien défini le type de statistiques, HP, etc. que vous souhaitez. Cela fait partie de l'expérience du joueur et les calculs doivent correspondre à ces valeurs. Avec autant de stats cependant, le joueur devrait savoir intuitivement ce que les statistiques aura une incidence sur ses magiques, les attaques physiques, etc. La première grande question est ce que les statistiques correspondent à une attaque, et ce que les statistiques se défendre contre ces statistiques (Ex PhDef défend uniquement contre PhAtk).
Jonathan Connell
Le plus gros problème est l’équilibre. Ce serait probablement une bonne idée de créer un programme interactif (disons en C # ou quelque chose de rapide) où vous pouvez modifier les statistiques et voir quel type de résultats vous obtenez. Si vous pouviez changer les formules au moment de l'exécution, cela aiderait aussi :)
Jonathan Connell Le
4
Pensez à utiliser Excel pour cela. Cela semble bien adapté à la tâche et vous n’auriez pas à écrire une ligne de code.
Alex Schearer
2
La question la plus importante est: quelle formule donne le plus de plaisir aux joueurs ? (recherché dans la page "fun" et aucune des réponses ne l'indique: P) Si les statistiques ou les dégâts augmentent trop vite, les joueurs deviennent insensibles, s'ils s'ennuient lentement. Les joueurs ont besoin de se sentir heureux quand ils atteignent un niveau. Ils ont donc besoin de se sentir obligés de travailler. Cela aura également un effet notable sur leurs performances. (c'est mes 2 pence)
Annan
3
"(Def - 280.4) ^ 2" hein? Eh bien, je m'attendrais à ce que les choses deviennent bizarres, pas pour Def> 255 ou Def> 300, mais pour le Def> 280.4; attendu à d'autres points. BTW, vous pouvez simplement tracer ces choses avec Wolfram Alpha ou à peu près. Fixez suffisamment de variables pour n'en garder que deux et vous obtiendrez un beau tracé de surface.
Christian

Réponses:

140

Créer de telles formules nécessite une connaissance des fonctions mathématiques élémentaires , des éléments que vous avez appris dans les cours d'algèbre et de pré-calcul.

Une fois que vous avez maîtrisé ceux-ci, demandez-vous simplement (remplacez "valeur" par "dommage" ou "santé" ou "vitesse" ou autre) :

  • Voulez-vous que la valeur croisse à un rythme constant? Utilisez une fonction linéaire .
  • Voulez-vous que la valeur croisse lentement au début, mais rapidement plus tard? Utilisez une fonction polynomiale ou exponentielle .
  • Voulez-vous que la valeur croisse rapidement au début et ralentisse plus tard? Utilisez une fonction nième racine ou logarithmique .
  • Voulez-vous que la valeur croisse lentement au début / à la fin, mais rapidement au milieu? Ou voulez-vous qu'il se développe rapidement tout en ayant une limite supérieure? Utilisez une courbe sigmoïde , telle que atan ou la fonction logistique .
  • Voulez-vous que la valeur oscille? Utilisez un péché ou une autre vague.

Ensuite, ajustez-le (ajoutez / multipliez des éléments, changez la valeur de base, etc.) jusqu'à ce que vous sentiez le résultat souhaité. Une calculatrice graphique vous aidera à visualiser comment les modifications apportées aux paramètres affecteront la fonction.


À propos, les problèmes que vous rencontrez sont dus à des débordements d’entiers .

Utilisez des types de variable suffisamment volumineux pour contenir les nombres avec lesquels vous travaillez. Les tailles diffèrent d'une plate-forme à l'autre en C ++, mais l'utilisation du compilateur Visual Studio unsigned int32 bits est de 32 bits, alors que unsigned __int64 (spécifique à MS) est de 64 bits. Pensez aussi à utiliser un double.

En outre, essayez de réorganiser vos opérations de sorte que vous ne rencontriez pas un nombre aussi important en premier lieu (par exemple, plutôt que de le MDef * MDef / 110faire (int)((float)MDef / 110 * MDef)) .

BlueRaja - Danny Pflughoeft
la source
3
Si vous rencontrez des dépassements d’entier, la conversion en float - qui ne prend en charge que de manière fiable 24 bits de la partie entière - posera un autre ensemble de problèmes de précision.
@ Joe: J'ai annulé votre modification; J'ai spécifiquement choisi __int64plus uint64_tparce que stdint.hn'est pas disponible sur Visual Studio 2008 et inférieur, et je ne voulais pas confondre le pauvre garçon plus qu'il ne l'est déjà.
BlueRaja - Danny Pflughoeft le
1
@BlueRaja: Je ne vois aucune preuve que le demandeur utilise Visual Studio, et cela est présent dans toutes les autres chaînes d'outils standard (y compris Visual Studio 2010).
Vous avez également omis une variante importante, je pense: si vous souhaitez que les dommages aient une limite supérieure que vous pouvez approcher, mais jamais atteindre, vous pouvez utiliser une fonction sigmoïde.
Martin Sojka
1
user127817: Tout ce qui compte vraiment, c'est la croissance de la fonction. Pour le reste, testez-le jusqu'à ce qu'il soit équilibré. Si vous pensez que le personnage est trop puissant, diminuez ses dégâts. Si vous pensez que tuer un chef ou un ennemi prend trop de temps, réduisez la santé ou l'armure de cet ennemi. Etc.
BlueRaja - Danny Pflughoeft le
31

Les statistiques de mes personnages sont les suivantes:

Il y a votre vrai problème: vous avez défini vos statistiques avant de définir ce que ces statistiques réellement dire . Vous mettez la charrue avant les bœufs.

Regardez comment D & D (table) fonctionne. "Force" ne veut rien dire en soi; cela signifie seulement quelque chose parce qu'il y a une règle qui dit: "Ajoutez votre bonus de force à votre attaque de mêlée." Cette règle fait partie des règles de combat de D & D. Sans règles de combat, la "force" est généralement une quantité dénuée de sens.

La première question que vous devez vous poser est la suivante: quelle différence dois-je vouloir entre les personnages? Encore une fois, regardez D & D. Là, ils ont 6 statistiques de base. Ces statistiques définissent différentes dimensions du jeu pour les personnages. Un personnage avec une dextérité élevée aura différentes options d'un personnage avec une faible dextérité.

Mais la raison de cette différence, tout revient aux règles. Une dextérité élevée signifie des bonus aux attaques à distance; vous pouvez frapper plus souvent avec des attaques à distance. Donc, entre la force et la dextérité, vous avez deux dimensions du jeu: distance contre mêlée.

L'intelligence et la sagesse forment également une sorte d'appariement, mais celles-ci interagissent davantage avec des classes spécifiques. Int améliore les sorciers et autres lanceurs de sorts arcaniques (ou possible selon certaines règles), la sagesse est essentielle pour les clercs et les autres lanceurs de sorts divins. Parce que les sorts divins et arcaniques ont des listes de sorts différentes, ces deux statistiques sont impliquées dans différentes dimensions du jeu.

Vous devez définir les règles de base relatives aux statistiques avant de pouvoir définir les fonctions de progression de la croissance, etc. Vous n'avez pas besoin de détails. vous n'avez pas besoin de dire que "chaque point de force est ajouté au lancer aléatoire pour déterminer si une attaque de mêlée est touchée". Ce dont vous avez besoin, ce sont des méta-règles telles que "la dextérité améliore les attaquants à distance". Vous pouvez comprendre exactement comment cela les rend meilleurs plus tard.

Il y a différentes façons de faire progresser les personnages. Un truc commun de Final Fantasy à l'ancienne école consistait simplement à utiliser le niveau du personnage dans le calcul de leurs dégâts. Cela pourrait simplement consister à multiplier le niveau par la statistique appropriée ou à appliquer une fonction au niveau du personnage. Disons une progression quadratique, de sorte que le taux de dégâts d'un personnage augmente par niveau.

Cependant, si vous voulez que vos fonctions de combat fonctionnent, elles doivent prendre en compte la progression. Vos fonctions ont besoin de crochets pour progresser.

D & D a une drôle de progression. C'est une partie basée sur la classe; chaque fois que vous montez dans le niveau, vous obtenez de nouvelles fonctionnalités de classe et un bonus plat à toucher, en fonction de votre classe de personnage. Cependant, certaines caractéristiques de la classe se sont améliorées d'elles-mêmes. Les sorts dans D & D auraient une progression intégrée. Un sort peut faire 1d4 dégâts par 2 niveaux d’un lanceur de sorts au-dessus du premier. Ainsi, tous les autres niveaux d’assistant améliorent ce sort.

D & D a également beaucoup utilisé la progression par produit. Jusqu'à la 4ème édition, la progression basée sur les objets était principalement destinée aux personnages en combat, mais même dans les éditions plus anciennes, les lanceurs de sorts avaient des objets qui leur donnaient des améliorations ou d'autres ajustements (ou leur donnaient des sorts à plat).

Les objets sont donc une autre chose que vos fonctions de combat doivent prendre en compte. Est-ce que les objets tamponnent juste une ou plusieurs statistiques lorsqu'ils sont équipés, ou font-ils autre chose? D & D était un peu étrange, dans la mesure où les statistiques changeaient rarement; les armes ont simplement causé des dégâts à XdY, éventuellement avec un bonus basé sur l’une de vos statistiques. Et c'était ça. Donc, votre seul moyen de faire plus de dégâts au combat était de trouver une meilleure arme. Dans de nombreux RPG de jeux vidéo, ils prennent en compte le niveau en plus d'une arme.

Nicol Bolas
la source
6
" Il y a votre vrai problème: vous avez défini vos statistiques avant de définir leur signification. Vous mettez la charrue avant les boeufs. " Je suis fortement en désaccord; les chiffres en eux-mêmes ne sont qu'un moyen d'informer le joueur de son pouvoir, etc. cela fait partie de la conception du jeu. Si vous procédiez dans le sens inverse, vous pourriez vous retrouver avec un chef final avec 147hp ... qui le veut vraiment?
Jonathan Connell
8
Sarevok (à Baldurs Gate) ne disposait que de 135 HP ...
Martin Sojka Le
12
@ 3nixios: qu'importe si le chef final a 147Hp? Ce qui compte, c'est de savoir si le dernier patron est un défi, un intérêt et surtout une récompense en cas de défaite. Un patron avec beaucoup de HP n'est pas intéressant; c'est une perte de temps. Un patron qui peut déconner avec votre parti, qui a besoin de tactiques spéciales qui changent d’instant en instant, vous oblige à utiliser au maximum son potentiel, ce qui en fait un excellent patron final. Je prendrai l’intéressant patron de 147 CV par-dessus le bloc ennuyeux de HP tout jour.
Nicol Bolas
@ Nicolas Bolas Je suis tout à fait d'accord avec vous, j'essayais de comprendre pourquoi je pense que le point de départ doit être basé sur les statistiques. Les statistiques avec lesquelles un joueur commence sont l’indication principale et le mode de jeu avec lequel le joueur joue pendant la partie. Je conviens que les énormes barres HP pour les patrons ne sont pas nécessaires, cela donne au joueur une meilleure indication de ce qui constitue la meilleure configuration contre le patron, quelles statistiques statistiques sont plus efficaces. Bien entendu, le montant n’a aucune incidence sur la façon dont vous le calculez, car vous pouvez simplement diviser ou multiplier vos calculs finaux par une constante c et vous en servir.
Jonathan Connell
2
@ 3nixios: Mais cela fait partie de mon propos. La dextérité dans D & D existe pour permettre une différenciation entre les personnages spécialistes en mêlée et les spécialistes à distance. S'il n'y avait pas de concept d'attaques en mêlée et à distance (et dans de nombreux jeux FF par exemple, il n'y en avait pas), cette distinction n'aurait pas à exister. Vous pourriez vous en tirer avec 5 statistiques au lieu de 6. Définir une plage de Hp est une chose, mais définir quelles statistiques de base vous en avez une autre. Les statistiques exigent des règles avant que vous puissiez les comprendre, et vous devez savoir ce que vous voulez que les statistiques fassent avant de pouvoir dire qu'avoir ces statistiques est une bonne idée.
Nicol Bolas
22

Vos formules semblent assez compliquées. Je ne sais pas comment les développeurs de jeux de rôle professionnels gèrent cela, mais je recommanderais de mettre l'accent sur la simplicité. Essayez de trouver la formule la plus simple possible tout en intégrant la plage de statistiques que vous souhaitez utiliser. Par exemple, pourriez-vous demander aux statistiques de se modifier avant le calcul des dommages plutôt que de les modifier pendant le calcul? Une fois que vous avez une formule en tête, je vais essayer de la représenter graphiquement pour un large éventail de valeurs possibles afin de voir comment celle-ci se comportera à mesure que les joueurs évolueront. Évidemment, moins vous avez de variables, plus elles seront réalisables.

De plus, BlueRaja a fourni une explication importante de la raison pour laquelle vous pourriez voir des valeurs inattendues à des niveaux de statistiques plus élevés. L'utilisation de types non signés et la recherche de débordements seront importantes.

Mitch Lindgren
la source
10
+1 pour simple. N'importe qui peut faire des choses rigoureusement compliquées, mais cela ne fait pas un bon jeu.
aaaaaaaaaaaaa
8
@Randolf, à moins que vous n'utilisiez une Apple 2 ou quelque chose du genre, il est fort douteux que la suppression d'une multiplication ou d'une fracture ici et là puisse affecter les performances de manière mesurable.
Tetrad
8
@Randolf Une grosse bataille dans un RPG peut vouloir dire 10 calculs de dégâts par seconde, un processeur moderne peut effectuer plusieurs milliards d'opérations par seconde. Vous pouvez sans risque supposer que l’impact de ces calculs "visibles" sur la performance est négligeable. Dans ce cas, simple est destiné à ceux qui conçoivent et à ceux qui jouent le jeu, pas à nos ordinateurs.
aaaaaaaaaaaa
6
@Randolf Richardson: Je pense juste que vous pourriez peut-être rater un peu la cible dans ce cas. Pour un MMO, un bon protocole rapide sans gras est primordial et les tâches lourdes comme la physique doivent être conçues en fonction des performances. Mais le calcul des dégâts est un gameplay essentiel, il doit être conçu dans l’esprit du gameplay. Si vous tenez compte des problèmes de performances, vous risquez de compromettre la partie de gameplay. Si vous parlez de performance quand il le faut, vous risquez de donner l’impression que c’est un domaine important à optimiser, attirant ainsi l’attention des vrais pécheurs de la performance.
aaaaaaaaaaaaa
5
@Randolf: je n'implique rien; Je dis que l'optimisation de quelque chose qui n'est pas un goulot d'étranglement est une perte de temps.
Nicol Bolas
11

En fin de partie, Enemy HP sera typiquement dans les millions inférieurs (avec un super boss ayant un maximum de ~ 12 millions).

Cela me pose un problème. Vous devriez former vos patrons autour de ce que vous pensez que vos joueurs devraient pouvoir gérer. Vous construisez vos joueurs et votre formule de combat autour de ce que vous voulez que vos patrons soient.

Une fois que vous avez défini vos mécanismes de combat et vos rôles, vous pouvez alors décider de la manière dont vous souhaitez concevoir vos chefs, ce qui devrait constituer un bon équilibre entre les dommages que les joueurs peuvent infliger / absorber et ceux que le patron peut infliger / absorber.

Ken
la source
4
+1 de la santé de l'ennemi devrait être basé sur ce que le joueur peut raisonnablement gérer à ce moment-là, et non l'inverse.
BlueRaja - Danny Pflughoeft
7

Les chiffres que vous avez cités sont probablement dérivés d'une simple simulation d'une simulation, sur des milliers d'essais.

Vous devriez donc écrire une simulation pour créer un personnage de niveau 20 et voir comment il se bat lors de 200 batailles ou plus contre les types d’ennemis qu’il est censé combattre à ce stade. Recommencez pour un personnage de niveau 30 (probablement dans la prochaine section du monde).

Cela prendra du temps, mais écrire des simulations automatisées rendra cela beaucoup plus facile que de deviner et de le jouer manuellement.

bobobobo
la source
5

Je pense que vous faites l'erreur de vouloir créer une formule sans en avoir une conception adéquate.

Commencez d'abord par un dessin, puis réfléchissez à la représentation du dessin dans les formules. Plus votre conception est claire, plus il devrait être facile de trouver des formules simples et / ou précises.

Essayez d'implémenter des "types" d'ennemis, par exemple "armored" => une attaque de joueur si elle est de type physique est réduite de 50%. Ne faites pas un flot de bataille pour résumer, réfléchissez à ce qui est pertinent et à ce qui ne l’est pas.

Si votre conception indique que les "ennemis blindés" sont faibles contre la magie mais puissants contre les dégâts physiques, représentez-les dans le code. Mais rappelez-vous que vous avez effectué de nombreux tests, car les valeurs ne fonctionneront pas comme par magie la première fois que vous écrivez le code. Essayez de créer une conception, de mettre la logique dans le code, de toujours vérifier si ceci est la représentation technique de ce que vous aviez à l’esprit et si cela ne change pas les valeurs jusqu’à ce

daemonfire300
la source
J'englobais déjà ce genre de chose - le taux d'armure réduit les dégâts d'attaque physique à moins que l'attaque ne soit marquée comme étant une perforation d'armure ou utilise une formule de
calcul
5

Bien que ma conception n'ait pas quitté la phase de feuille de calcul, je suis parvenue à une conclusion concernant la conception des mathématiques pour RPG:

Gardez-les aussi simples que possible. Dans la conception sur laquelle je travaille, j'ai utilisé des formules très simplistes, adéquates pour des systèmes sans classe. C'est à dire. Les sorts de boule de feu ont 30 points de dégâts. Le forumal est:

BaseSpellDamage * Attribute (5 * 6)

Nous pouvons aussi ajouter des modificateurs comme ceci:

Result = (BaseSpellDamage * Attribute) (5*6)
Result = Result + (Result * 50%) (30 = 30 + (30 * 50%))

Donc, le résultat final serait de 45 dégâts. J'ai trouvé qu'il est très facile d'utiliser des multiplicateurs de pourcentage, et une solution très évolutive. Au lieu de venir avec des nombres impairs avec des mathématiques complexes pour comprendre le résultat souhaité.

Maintenant, nous pouvons calculer la résistance aux dégâts, cela ne fera que calculer la défense contre le type de dommage défini. Il existe deux approches et, honnêtement, je n'ai pas encore décidé laquelle conviendrait le mieux, mais elles sont toutes deux simples et viables:

DamageResult = Resistance * Damage ( 50% * 45)

Donc, le résultat final sera pris 22 dommages (je viens de couper le résultat partiel).

Autre formule:

DamageResult = Damage - Resistnace (45 - 22).

Le résultat final sera donc 23. Si la résistance est supérieure aux dégâts subis, le personnage ne subit aucun dommage. Bien sûr, c’est à vous de vous assurer que cette situation n’a pas sa place, sauf quand vous le souhaitez.

Bien que je dois admettre que la réduction d'échelle en pourcentage est un peu plus facile à équilibrer et à mettre à l'échelle. Mais cela dépend aussi de vos numéros de base. La mise à l’échelle en pourcentages fonctionnera mieux si vous commencez à partir de 100 ans et plus. Si vous opérez sur de petits nombres (tout en dessous de 100 pour être honnête), cela peut devenir gênant car vous commencerez à obtenir des résultats en virgule flottante, ce sera difficile à équilibrer et vous ne ferez rien d'intéressant avec eux.

La solution optimale dans ce cas est probablement d’utiliser les deux approches quand elles le souhaitent. Ou si vous êtes fan de gros numéros, commencez à 1000.

Et à la fin se termine. Je ne suis pas arrivé à cette conclusion complètement par moi-même. En fait, j'ai passé pas mal de temps à lire divers manuels RPG (Hero, DnD). DnD était particulièrement utile, car il fonctionne sur des principes similaires, mais au lieu d'attributs, il utilise des niveaux pour ses formules, elles peuvent parfois être plus complexes. Que ce que j'ai présenté ici.

Dans tous les cas, le meilleur conseil est: essayez de les garder aussi simples que possible. N'utilisez pas de mathématiques avancées, ni de longues équations, car elles sont sujettes aux erreurs, difficiles à repérer, lorsque vous devez traiter 87234 d'autres choses en même temps.

Łukasz Baran
la source
3

Comme d'autres l'ont mentionné, la formule de Final Fantasy X est assez complexe. Généralement pour cette série, plus le jeu est tardif, plus la formule est compliquée. Il est probablement plus facile de baser entièrement votre formule de dégâts sur un autre jeu. Mais en général, je pense qu’il est intéressant de discuter, à un niveau très général, du type de formules de dommages que vous pouvez trouver dans le monde et de la façon dont vous pouvez créer un jeu basé sur ces formules. La première chose que vous devez décider est combien de dégâts voulez-vous pouvoir faire à la fin de la partie et quel type de statistiques voulez-vous que le joueur puisse avoir? Une fois que vous avez cela, vous pouvez choisir un système de formule, puis optimiser les valeurs de la formule et de l'arme pour refléter ces plages dans le temps.

Purement stat

C’est une bonne idée si vous voulez que vos personnages fassent preuve de souplesse quant aux niveaux d’ennemis qu’ils peuvent combattre. Une formule comme celle-ci ne dépendra que des statistiques du joueur, de son équipement et des statistiques des ennemis. Ces formules sont généralement assez simples. Final Fantasy Legend II (voir http://www.shenafu.com/ffl2/weapon.php, par exemple, a des armes qui causent des dégâts basés sur la formule simple:

(Stat+StatBonus)*WeaponStrength - Defense*4

Une formule comme celle-ci est utile si vous souhaitez utiliser une méthode très simple pour estimer les dégâts, ou un point de départ rapide pour modifier les dégâts en fonction d'autres facteurs tels que les compétences et les faiblesses élémentaires.

Pour montrer la portée de ce type de formule, considérons la formule de dommage pour Inflation RPG, un jeu Android et IOS (Voir http://inflation-rpg.wikia.com/wiki/Calculations ). La formule dépend fortement des statistiques et de l'équipement. Chaque équipement a deux statistiques: un bonus sur les statistiques ATK et un multiplicateur. Certaines pièces d'équipement ont des multiplicateurs bas, mais des bonus élevés, d'autres ont des bonus faibles mais des multiplicateurs élevés. Pour un personnage n'ayant que 10 ATK, le Battle Axe avec son bonus de 5000 ATK mais un faible multiplicateur de 145% est un excellent choix. Les dégâts totaux sont (10+5000)*1.45 = 7264, mais l'Estoc, avec 0 bonus et un multiplicateur de 300% est un mauvais choix - les dégâts sont (10+0)*3 = 30. Plus tard dans le jeu, un personnage avec 5000 attaques préférera changer d’arme.

Statistiques et niveaux:

Final Fantasy V, VI et Final Fantasy XII en sont un bon exemple (voir http://www.gamefaqs.com/ps2/459841-final-fantasy-xii/faqs/45900 , par exemple). La formule pour les épées dans FFXII est la suivante:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+STR)/256]

et la formule des dommages pour les portées est:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+MAG)/256]

Ils sont très similaires, mais notez que la formule de l'épée ne dépend que de la force et du niveau, tandis que la formule du bâton dépend de la force, de la magie et du niveau. L’avantage de ce type de formule est qu’elle offre au joueur deux possibilités de croissance: l’établissement de ses statistiques ou l’augmentation de ses niveaux. L'inconvénient est que cela pénalise également les personnages dans les deux sens. En fin de compte, cela permet au joueur d’augmenter son niveau de dégâts (pour FFXII, cela équivaut à une augmentation de ~ 4% de ses dégâts par niveau autour du niveau 50 lorsque vous prenez en compte les gains de statistiques), ce qui vous permet de personnaliser la difficulté en fonction de la difficulté. niveau de confort.

Dommages fixes:

Les formules de dégâts fixes ne dépendent pas des statistiques ou du niveau du personnage, elles dépendent uniquement de la formule de dégâts interne de l'arme elle-même. Ils peuvent toujours varier sur une plage donnée, mais ils infligent les mêmes dommages quel que soit l'utilisateur (à l'exception de tout autre effet spécial ou trait de caractère). Ils sont mieux utilisés si l'arme doit causer des dégâts fixes et que la capacité à équiper l'arme dépend des statistiques et / ou du niveau. Diablo 2, par exemple, s’acquitte de cette tâche, comme le font de nombreux imitateurs qui possèdent des armes dépendantes du résultat final. Cela étant dit, les «dommages fixes» n'impliquent pas «non aléatoires» - et en fait, les dommages causés sont généralement aléatoires.

C’est une bonne méthodologie si vous voulez des armes faciles à transférer entre les personnages ou pour contrôler soigneusement les dégâts que les personnages peuvent causer à certains moments du jeu si vous savez à quel matériel ils ont accès (via des tables de dépôt, des coffres, etc.). , et voler des tables).

Vous rencontrerez un autre endroit avec certains types d’équipements ou d’articles de Final Fantasy. 1000 Aiguilles, par exemple, infligent toujours 1000 dégâts. Dans Final Fantasy Legend II, les arts martiaux infligent des dégâts selon la formule suivante:

Damage = WeaponStrength*(90-UsesLeft) - 4*Defense

Final Fantasy XII a également corrigé quelque peu les dégâts causés aux armes à feu, selon la formule suivante:

DMG = [ATK x RANDOM(1~1.125)]^2

Bien que les dégâts soient quelque peu aléatoires, ils ne varient que de 26,5% sur toute la plage. Vous êtes donc assuré de faire un certain niveau de dégâts en moyenne dans le temps. Ces types d'attaques sont utiles pour les personnages qui ont à la fois des statistiques faibles et des niveaux faibles dans les jeux qui prennent normalement en compte ces facteurs pour infliger des dégâts. De plus, ils ignorent la défense de la cible (bien que la formule puisse être facilement retravaillée pour s’intégrer à la défense si vous le souhaitez).

Foo Barrigno
la source
2

tous les jeux de la série finale de fantasy ont eu une limite de statistiques de 255 en raison du problème que vous rencontrez. au niveau 100, les statistiques seraient de 255.

vous parlez d'augmenter les statistiques avec les capacités et l'équipement et je me souviens de l'avoir vu dans les jeux, mais la façon dont cela est fait est dans la formule. une étape supplémentaire consiste à vérifier les modificateurs de capacité et d'équipement et à les appliquer après l'utilisation des statistiques.

dans votre cas, il s'agirait de l'étape 21: appliquer les modificateurs de capacité, étape 22: appliquer les modificateurs d'équipement, étape 23: dommage final.

si vous êtes intéressé google pour les formules de fantasy finale, ils sont là-bas. J'ai des copies des mécanismes de combat réels, y compris l'intelligence artificielle pour Final Fantasy 4, 6, 7 et 9. Certaines personnes les ont piratés par rapport aux jeux originaux alors qu'ils créaient des roms pour des émulateurs. Il n’est pas si difficile à trouver si vous regardez assez fort.

la chose la plus importante pour la création de formules est le test. configurez un script pour gérer votre esprit de combat des deux côtés et plusieurs centaines de batailles. varier les monstres et les statistiques et voir si cela fonctionne ou si le lv 40 tue tout, il est tout à fait possible qu'un patron est réellement impossible de tuer lol. Un conseil serait de désactiver toute animation car il est impressionnant de voir à quelle vitesse les IA peuvent se battre lorsque personne ne les regarde.

Skeith
la source
2

Je me demandais comment les gens élaboraient-ils réellement des formules de dommages adéquates, qui évoluaient correctement?

Les 2 premières choses sont:

  • décidez ce que vous entendez par "correctement" - quelle est votre idée de "dommages corrects"?
  • décidez ce que vous entendez par «échelle» - quelles valeurs vont changer et quel effet voulez-vous que ces changements produisent?

Une fois que vous savez cela, vous avez suffisamment d’informations pour utiliser les formules mathématiques mentionnées par BlueRaja dans sa réponse . Rappelez-vous qu’il n’existe pas de formule «appropriée» pour les dégâts - une formule qui correspond à votre conception pour le type d’expérience que vos joueurs souhaitent vivre.

Kylotan
la source
C'est un commentaire extrêmement inutile. Cela résume à «je ne sais pas» et à cause de cela, c'est une perte de temps pour tous. Marquage pour suppression.
Krythic
1

alternativement, si vous cherchez une formule très simple, procédez comme suit:

(Notez que ceci est mon idée pour une formule,)

Premièrement, pour une formule d'attaque simple, vous n'aurez besoin que de quelques statistiques. La statistique d'attaque du joueur (cela peut être la force ou la magie, selon le type de mouvement).

Ensuite, créez une variable, appelée MovePower. Cela dépendra du déménagement, et de meilleurs mouvements auraient un meilleur MovePower. Pour mes formules, les commandes générales "Attack" ont un MovePower de 5.

Ensuite, faites de la défense une statistique basée sur un pourcentage (et, bien sûr, il est impossible d’obtenir une défense à 100% sur les dégâts)

Puis, pendant la phase d’attaque, multipliez simplement la statistique d’attaque par la puissance de déplacement et supprimez les dégâts en fonction de la défense de vos ennemis! Facile!

Vous pouvez également choisir d’avoir d’autres modificateurs, comme par exemple si le coup va frapper (Précision), si le coup a un autre effet ajouté (Bio, infliger un poison,) et opter pour que le coup (Frappe à nouveau,) subisse des dégâts améliorés / dégradés. déplace qui change les statistiques, ect. Aie du plaisir avec ça!

AzelfDestin
la source
Une autre option permettant d’éviter l’armure en tant que problème de pourcentage (permettant ainsi à ses valeurs de se ressembler) consiste à calculer les dommages par rapport à l’armure en tant que comparaison qui devient un multiplicateur. Quelque chose comme Ln (atk / def) comme base. Cela permet aux statistiques d'armure défensive de s'échelonner au fil du temps de la même manière. Déterminez comment obtenir votre plage de dégâts de base souhaitée lorsque les statistiques de dégâts et d'armure sont identiques et extrapoler à partir de là. Cela fait que les attaques "d'évitement d'armure" nécessitent une astuce pour créer, mais cela fait partie de la créativité.
Aviose
1

En substance, vous devez comprendre deux choses.

  1. Comment préformer correctement le calcul avec de grands nombres.
  2. Comment vous voulez et prévoyez-vous que les dégâts d’attaque se comportent contre des adversaires plus faibles et plus forts.

1

Vous pouvez soit l'utilisateur, doublesoit une bibliothèque de grands nombres. Faire des calculs avec de grands nombres (comme dans les jeux en cliquant / inactifs repose souvent sur de telles bibliothèques de grands nombres). Dans votre cas, les nombres étant relativement petits, l’utilisation de la virgule flottante 64 bits donnera la souplesse nécessaire.

2

Comment voulez-vous que le jeu se comporte? quelques exemples:

  • Une approche consiste à ATKdécider si vous frappez ou non et à lancer un dé avec un indice de dégâts connu en fonction de l'arme: par exemple, longue épée 1d8, épée à deux mains 1d10, poignard 1d4. Cela ne s’étendra pas étonnamment bien si la puissance en chevaux peut continuer à pousser. Si vous utilisez ATKpour déterminer si les personnages réussissent ou non, vous pouvez effectuer un autre lancer après un succès réussi avec ATK* 80% pour déterminer les coups critiques.
  • Si vous souhaitez utiliser une formule de dégâts, celle-ci peut être aussi simple que (ATK - DEF) +/- 20%dans World's End (un jeu de stratégie RPG). Cela signifie que les attaques contre un adversaire fort DEFne peuvent causer aucun dommage. Pour instace ATK = 10, ENEMY DEF = 12, (ATK - DEF) = -2et cela signifie aussi que l' attaque élevée contre def légèrement plus bas, pourrait faire peu de dégâts, ce qui pourrait faire des batailles plus avec l' augmentation de HP. Par exemple, avec ATK = 1010, ENEMY DEF = 1005les dégâts seraient de 5. Les dégâts augmenteront aussi considérablement maintenant si on les ATKaugmente d'un petit pourcentage. Par exemple ATK = 1055, fera 900% plus de dégâts avec seulement une augmentation de 5% ATK.
  • Pour éviter cela, vous pouvez faire quelque chose comme ATK / DEF * WEAPON_DAMAGEceci: Ceci augmentera graduellement lorsque ATKou DEFsera augmenté et permettra à un attaquant faible d’endommager une créature avec une forte DEF.

tl; dr Vous devez traiter vos numéros de manière responsable et déterminer comment vous voulez que le jeu se comporte dans différentes situations. Quelques questions à vous poser:

  1. Combien d'attaques (tours) faut-il pour vaincre ce boss / sbire?
  2. Comment différentes compétences, buffs, debuffs devraient-ils affecter le xcombat? Devrait-il être sans espoir, gagner devrait-il être y%moins / plus probable?
Wolfwawn
la source