Anatomie d'un combat-Phase 1 Toucher son adversaire

M

Myrdinn

Invité
Quelques précisions avant de commencer.

Ce post décrit les mécanismes du jeu de la routine générale de combat. Si vous ne voulez pas prendre un aspirine :lol: ou un knockback passer votre chemin.
La première partie est assez triviale, par contre pour les autres je pense qu'il y a quelques révelations ( au moins pour certain) Patience

sources JE tiens à remercier JARULF (même si il ne lira jamais ce poste personnellement) car sans ces travaux sur la structure des objets sous D2 et les traces qu'il a documentés il y longtemps sur les offsets je n'aurais jamais pu faire ce post :)

Les données de ce post viennent de trace (debug assembleur) de la routine de combat fait avec le patch 1.09B. Le patch 1.09D est quasi identique, il n'apporte que des bugs supplémentaires.

Les données que je donne sont basées sur des presemptions fortes, cependant pour certaines sous-fonction je n'ai pas tracé toutes les lignes (Ca ferait plusieurs milliers de ligne en assembleur et je ne suis pas une machine)

Bref tout debats contradictoires ou encouragements pour la suite sont les bienvenus.;)


Phase Pré-combat
Toutes les skills (j'inclus attaque normale dans le lot) ont la même
structure.(Pré-résolution,graphique associé, résolution une fois le graphisme terminé,Post-Résolution)

La résolution n'implique pas forcement la phase de combat dans son ensemble. Trait de foudre de la sorcière,,smite du paladin n'utilise pas la routine pour toucher ...

Maintenants venons en au vif du sujet, je vais faire un résumé de ce qui ce passe sequentiellement dans cette routine.
 
M

Myrdinn

Invité
1) Etat de la cible ?
Je passe les contrôles effectués par le jeu en amont.

Si la cible est un joueur et qu'elle est dans l'état run alors le toucher est automatique = 100 % c'est le seul cas qui n'est pas à 95% a ma connaissance.
Dans ce cas passer au point 3

2)Routine de calcul du ToHit%

On arrive ici si la cible est un monstre ou un joueur immobile/marche

Le jeu calcul

A) Le niveau du défenseur

B) La Def ou DR(Defense rating)

- LE DR de base Le DR de base=Dex/4+STAT_1F de l'objet personnage
Ou Stat_1F = DR de la cible (Somme des défense de l'ensemble des objets équipés (qui au moment de l'équipement/Enlèvement sont Ajouter/soustrait directement de l'objet personnage). ainsi que les auras et malediction voir N.B. à la fin du troisième POST)

- Missile ou Mélée? --> DR Final = DR + DR Vs(Melee ou missile suivant résultat)

- Si l'attaquant est un joueur seulement. A-T-il ITD ??
(Au passage un objet ITD ne sert à rien pour un merco la preuve est la) La cible est elle un joueur? (Au passage ITD ne sert à rien en Pvp :) )
La cible est elle un Monstre=Boss?
Oui => Rien
Non => DR= O
Bref Si joueur a ITD est que la cible est valide (Ni joueur Ni boss) Alors DR= 0

- L'attaquant a t il un STATE FRACTIONALTargetAC= STAT74. Bref en langage humain porte t il un objet avec l'attribut Diminue la defense de la cible xx% (Reduce-ac pour les modders). En réalité il faut lire. Réduit la défense à xx% de sa valeur initiale. Si l'attaquant à un objet réduit la défense de xx% alors DR=DR*xx/100

C'est la qu'interveient le bug Eth. En effet tout les Reduce-ac sont exprimé en propriété positive. Exemple si vous avez Reduce-ac 25 ce la signifie que la défense de l'adversaire est réduite à 25% de sa valeur initiale. LE problème de la rune eth est que la valeur est négative. Donc au final la cible à une défense négative, les chance de touchersont alors de 95% (A cause du cap)
N.B. Il existe une autre propriété qui est damage-ac qui elle diminue de façon permanente (jusqu'à la prochaine sauvegarde ou mort) la défense de la cible (Directement la Stat_1F). Reduce-AC s'applique uniquement pour le coup donné. Si vous lisez les posts suivant entre moi et Tiissa ne tenez pas compte de la discussion sur Eth elle est fausse.

- Applique le DR% (du personnage CF Stat1F au dessus) bref au final DR=DR*(1+DR%/100)

La defense finale est alors
DR=[(dex/4+stat1F)+DR VS(Melee/Missile))*NOT(ITD)]*(reduce-ac/100)*(1+DR%/100)

C) Le niveau de l'attaquant

D) L'AR(Attack Rating) de l'attaquant

Si l'attaquant est un joueur

Les AR% s'additionne
- Si la cible est un demon on additionne AR% Vs Demon
- Si la cible est un undead on additionne AR% Vs Undead
- Si l'attaque est de mélée exclusivement alors on additionne l'AR% de la maitrise.

De toute façon la routine qui gère les attaque à distance n'est pas la même. Cependant cette partie est commune au deux. Même si les Arcs n'ont pas de Maitrise, que ce passe-t-il pour les haches à lancer par exemple ??? BUG de la maitrise ???

AR%Final=AR%(skill) + AR%(objets) + AR%(maitrise) + AR%(demon) + AR%(undead) suivant les cas applicables évidemment.

- AR=AR(skill?? si ca existait) + AR de l'objet personnage(Stat_13)
(Comme d'hab grace aux objets qu'il porte ajouter au Tohit Factor trouvé dans CharStats.txt (qui est un bonus/malus au touché pour chaque classe de personnage) + 4* Dextérité -28 :)
Bref AR= AR(skill) + Somme des AR(objet) + (4*dex-28) + Class Bonus Factor)

Résumé on a
AR Final=AR*(1+AR%/100)
avec
AR%= AR%(Skill) + AR%(Demon) +AR%(undead) + AR%(mastery) + AR%(Item) suivant les cas valides.
et AR=(4*DEX-28+Class Tohit Factor +AR(Item)+AR (Skill))

Si l'attaquant est un monstre

le calcul est différent c'est AR=AR*4(Donc vous tirerez vous même les conséquence sur les armes +% Vs Demon de vos mercenaires qui pour le jeu sont des monstres :) ) (EDIT merci Tiissa :) )

L'AR de base du monstre est dans le fichier Monstats.txt dans les colonnes AxTohit(Y) Ou x= Numéro de l'attaque et Y= niveau de difficulté (Rien Normal, (N)ightmare,(H)ell)

AR%=AR%(Objet) Donc ni Vs Demon ni Vs Undead ni AR% de la skill

La calcul final pour les monstres est

AR Final=AR(Monstat.txt)*4(1+AR%(objets)/100)

E) Application de la formule

ToHit% = 100*AR/(AR+DR) * 2*Alvl/(Alvl+Dlvl)

N.B. Cette formule fonctionne aussi pour ITD. DR=0 remplace la formule par *Alvl/(ALVL+DLVL)*100
Elle fonctionne également pour le Bug ETH Si DR<0 alors DR est ignoré et donc la formule est identique à ITD (L'effet aussi donc, Eth agit comme ITD)

N.B. Sur le *100 LE jeu ne gère que des entiers (Les pourcentages sont toujours multiplié par 100 pour pouvoir être donné sous forme d'entier)
Applique le cap 5% Minimum - 95%Maximum (Merci Kaizel indirectement ;) )

Tirage aléatoire avec la seed de l'attaquant pour voir si la cible est touché
Oui = 3
Non = EXIT
 
M

Myrdinn

Invité
3) Routine de calcul du block
(Uniquement par bouclier, la skill de l'assassin n'est pas du block)

A) Block du bouclier
la formule pour le bouclier est

ShieldBlocking = BlockFactor(A partir de charstats.txt) + block(à partir d'armor.txt) + blocking bonus (A partir des objets/Skills comme HolyShield par exemple) sans limite
L'affichage sur le bouclier est limité à 75% (oui c'est un bug mineur) mais le cap n'est appliqué que sur la formule finale

B) Block du Personnage

Block Final= (ShieldBlocking * (Dexterité - 15)) / (CLVL * 2)

Ensuite intervient le Cap à 75%

C) Facteur ETAT du défenseur

Si la cible est un joueur et que le ce joueur est dans l'état RUN / Walk in town (On s'en moque le joueur n'est pas attaqué en ville, mais c'est bon à savoir dans un MOD ou c'est possible)

alors le block est divisé par 3 (Le cap etant deja appliqué. Si on court Block Maximum=25%)

D) Résolution
Tirage aléatoire avec la seed du défenseur pour voir si la cible parre avec son bouclier

Oui = Phase 5
Non = Phase 4

4)Routine d'évasion

Le jeu regarde si la cible réussi une de ces skills
Avoid
Dodge
Evade
Block (Assassin skill)

5) Le jeu enregistre les résultats dans la structure du combat

Tohit Vrai ou faux
Block Vrai ou faux
Avoid, dodge ... regroupé dans le même octet. Pareil de façon binaire Vrai ou faux pour chacun

Il faut noter que le Tohit est remis à zéro par le block ou l'une des évasions.

6) Evenements activés par le toucher

Le jeu regarde si la cible est dans l'état
STATE_THORNS
STATE_BARBS
STATE_IRONMAIDEN
STATE_LIFETAP
Intinterruptable Skill

Il enregistre ces evenements dans l'objet combat (Comme le point 5)

A suivre...

Voila les prochains post d'anatomie d'un combat seront
Structure des dégats
Résolution des dégats
Attaques spéciales

Et si la 1.10 n'est pas sortie avant je ferais dans chaque forum approprié un trace de toutes les aptitudes (1 post par arbre) pour expliquer leur rapport avec la strucutre du combat (Vous pourrez les lire si vous restez une année supplémentaire sur le forum :lol:)



PS sur les STATs et les STATEs
Détails techniques pour les modders

Les fonctions ordinales exportées 2917 et 2918 de D2common.dll permettent de lire les charactéristique (STAT) d'un objet (Joueur, Monstre, objet , ..., Sol (N'est ce pas Paul)) ...

En paramètres le jeu passe 2 valeurs
Le pointer sur l'objet
La caractéristique à lire (Que Blizzard a généreusement détaillé dans le fichier ItemStatCost.txt

Ces Valeurs sont updatées à chaque modification d'équipement, a chaque auras,malédictions activés sur l'objet , Quete (d'ou le bug de la quete d'ANYA ;) ) ... et sont remis à zero a chaque apparition du personnage (Demarrage, chargement de la sauvegarde, mort ...)

Certaines valeurs de base sont modifiés par les charactéristique particulières de l'objet (Monstats.txt pour les monstres, Charstats.txt pour les joueur ...)

Petite précision a ce sujet. Vue cette structure il est evident que les objets %coupMortel,%crushingblow s'additionne dans la STAT et ne sont pas apppliqué 1 par 1 comme on l'entend souvent dire.

Exemple Fonction 2917(Pointer sur objet Epee equipée dans la main gauche,Stat 0c=LEVEL) retourne le ILVL de l'objet (Très pratique pour l'étude des ILVL :D )

La fonction ordinale exportée 28F7 de D2common.dll permet de lire l'état (STATE) d'un objet (Joueur, Monstre, objet , ...

Avec la même structure sur les paramètres.
La encore blizzard nous à gentillement laissé le fichier States.txt
 
P

Priam

Invité
:gratz: Myrdinn :clap:

très instructif (comme toujours :p), même s'il va falloir que je le relise attentivement :razz:

Mais vivement les prochains posts d'anatomie :biggthum:

Et merci de nous faire partager le résultat de tes recherches ;)
 
K

kaizel

Invité
je te dis merci meme si je l'ai pas encore lu :)
on vera sa se soir car la il faut que je file ;)
 
T

tiissa

Invité
Merci pour ce fil qui s'avère prometteur. :)



Provient du message de Myrdinn
- L'attaquant a t il un STATE FRACTIONALTargetAC= STAT74. Bref en langage humain porte t il un objet avec l'attribut Diminue la defense de la cible xx% (Reduce-ac pour les modders)

- Applique le DR% (du personnage CF Stat13 au dessus) bref au final
DR=((04*dex-28+stat13)+DR VS(Melee/Missile))*NOT(ITD)/reduce-ac*DR%
Dans la version 1.09b y-a-t'il le bug 'eth' ? Sais-tu comment il se manifeste ?
 
M

Myrdinn

Invité
Provient du message de tiissa
Merci pour ce fil qui s'avère prometteur. :)




Dans la version 1.09b y-a-t'il le bug 'eth' ? Sais-tu comment il se manifeste ?
Oui d'ailleurs c'est le debut de la résolution des dégats (Donc 3eme Post) :lol:
Bon allez une avant première (Pas sur le bug qui est connu depuis longtemps)
Le skill Damage-ac pour les Modders (Celui apporté par la rune Eth mais ce n'est pas la seule source possible) Réduit la DR du defenseur dans la phase de résolution (La STAT-1F si tu as bien suivi). Le problème est que c'est irréversible (Enfin jusqu'à la prochaine sauvegarde), on ne recupère pas sa DR à la fin du combat. C'est normal car l'armure est endommagé et le combat n'est jamais fini puisque d'autres monstres peuvent être impliqués dans ce combat. :lol: donc l'attribut fonctionne comme il devrait fonctionner.

Pour un monstre c'est sans importance car il disparait assez vite du jeu. Sauf que blizzard a oublier que ca pouvait servir en PVP :( Et la c'est plus ennuyeux. ) Bref le futur patch, comme pour ITD devrait exclure les joueurs de l'effet de Damage-AC, je ne vois pas comment faire autrement (Faire durer la baisse d'AC pendant x frames??? Ridicule pourquoi l'armure se reparerait toute seule???.)

EDIT désolé confondu Stat1F=DR et Stat13=AR :(
 
T

tiissa

Invité
Provient du message de Myrdinn

Oui d'ailleurs c'est le debut de la résolution des dégats (Donc 3eme Post) :lol:

C'est normal car l'armure est endommagé et le combat n'est jamais fini puisque d'autres monstres peuvent être impliqués dans ce combat. :lol:
Et si on va réparer en ville ? C'est remis à jour ?


tiissa, questionneur pressé :D
 
R

Replica

Invité
:eek: pfiou...chapeau bas l'artiste :clap:

serieux c vraiment génial d'avoir fait ça j'attend la suite avec impatience !

par contre g un peu de mal a saisir certains trucs :D paske c trop compliqué pour moi :D mais dans l'ensemble reçu 4.99/5 :)
 
M

Myrdinn

Invité
LE DR n'a rien a voir avec la durabilité malheureusement pour le jeu

Sinon ce serait une bonne idée :D

Non le DR etant calculé a l'équipement/désequipement des objets. Iln'est remis à zero qu'a l'ouverture du jeu.

P.S. Les mercis c'est bien, les votes également :rolleyes:
 
T

tiissa

Invité
Provient du message de Myrdinn
LE DR n'a rien a voir avec la durabilité malheureusement pour le jeu

Sinon ce serait une bonne idée :D

Non le DR etant calculé a l'équipement/désequipement des objets. Iln'est remis à zero qu'a l'ouverture du jeu.
Et si on déséquipe/rééquipe un objet je suppose que ce n'est pas tout recalculé si ?
Même question si un objet se casse puis qu'on le répare. :D

tiissa, questionneur frénétique :razz:
 
M

Myrdinn

Invité
Recapitulons
A l'origine DR=0 (Je parle de Stat1F pas de la première formule)
Au moment ou l'on equipe desequipe un objet on ajoute ou soustrait son DR OK

Prenons un exemple je n'ai qu'une armure DR=98

Je commence la partie (ou je reprend une sauvegarde, ou je viens de mourrir) j'initialize (0) l'ensemble de mes stat de mon perso
DR=0
Le jeu calcule l'ensemble des apport en scannant l'equipement 1 a 1 Donc DR=80 (Stat-1F Toujours)

Ensuite le jeu commence

Si je me prend du Damage ac et que j'obtient -50%
J'ai DR=40

J'enlève l'armure j'ai DR=-40
Je la remet j'ai DR=+40

Sauf si DR<0 => DR=0 Alors en ce mettant à poil et en recuperant son equipement peut etre que ca marche :)
Mais en PVP c'est pas évident :lol:

Clair :D
 
T

tiissa

Invité
Provient du message de Myrdinn
Prenons un exemple je n'ai qu'une armure DR=98
[...]
Donc DR=80 (Stat-13 Toujours)
Clair :D
Oui :D (en gros faudra que tu vérifies ça plus tard ;))
 
J

Joe Jinis

Invité
Provient du message de Myrdinn
Si vous ne voulez pas prendre un aspirine :lol: ou un knockback passer votre chemin.

Zut alors!
Moi qui me disais que j'allais venir poster expres pour dire a tout le monde de préparer sa collection d'aspirines ainsi que Votre bouclier pour le knockback. :evil:
mais je fus zu! :bluecry:
Ben bravo quand meme ;)
 
M

Myrdinn

Invité
Provient du message de Joe Jinis


Zut alors!
Moi qui me disais que j'allais venir poster expres pour dire a tout le monde de préparer sa collection d'aspirines ainsi que Votre bouclier pour le knockback. :evil:
mais je fus zu! :bluecry:
Ben bravo quand meme ;)

Je n'en suis pas à mon premier post, je prends des précautions :lol:

Sinon bon anniversaire :drink1: meme si je te l'ai deja dit chez les paladin
 
J

Joe Jinis

Invité
Héhé! ^^
Enfin bon je vais plutot lire les commentaires que les gens feront sur les parties croustillantes car le pvp m'interesse po trop.
remerchi :-þ
 
Haut