online faq recherche accueil
 

Il y a 198 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

Le MF en direct Live

 
n°8730
Myrdinn
ollydebugger
Posté le 13-01-2006 à 22:29:32  profilanswer
 

Bonjour et bonne année à tous :)
Bien que je m'interesse à d'autres sujets en ce moment, je reviens toujours de temps en temps à Diablo2 pour entretenir mon habitude de debogage.
 
J'ai décidé de faire un sujet sur le MF.
Pourquoi ce sujet ? Parce que mon post Anatomie d'1 drop est assez vieux et obsolète.
L'autre raison est que c'est l'un des mécanismes les plus connus (ca nous aidera) et en même temps sur lequel il nous reste le plus de chose à découvrir.
 
Un sujet en LIVE
Je pourrais donner les résultats tout fait, mais ils sont déjà pour la plupart très connus.
J'essayerais dans ce post de vous montrer comment je fais pour débugger diablo2. Comment je raisonne, comment je progresse  et mes méthodes d'analyse.
J'avancerais le sujet petit à petit tant que ca interessera quelqu'un :) je vous ferais participer si possible.
 
 
Par ou commencer
 
Déjà quelque soit le logiciel à debugger on ne peut pas partir de zéro.
Il faut énormément de connaissance pour trouver quelque chose à quoi se raccrocher.
Pour le moment mieux vaut connaitre les MPQs (pour l'hypothèse de départ) et bien le jeu ca aide à trouver des repères pour les hypothèses futures.
 
Pour ne pas vous faire peur j'aborderais les éléments que vous ne pouvez pas deviner au fur et à mesure.
Ne vous inquiétez pas. Si vous ne connaissez pas ces éléments ca viendra assez vite. Pour le moment je suis la pour vous les transmettre.
 
Par ou commencer- connaitre l'environnement
Je sais 2 choses sur le MF qui sont assez remarquables pour être possible à trouver dans le code.
1) Le diminishing return commence à 110. 0x6E en hexa
2) L'itemStatCost du MagicFind est Item_MAgicBonus = 80 0x50 en Héxa.
 
Je ne reviendrais pas sur le fonctionnement de ollydbg (je le décrit déjà ici avec photo d'écran à l'appui)  
Si vous avez des questions ou blocage vous êtes les bienvenus.
 
Après avoir commencer une partie de D2
Dans ollydbg Vous avez fait File/Attach  
ensuite vous avez selectionner Diablo2.Exe
Dans View/Exécutable module vous avez double cliquer sur D2Game.dll
Vous avez maintenant ollydbg ouvert sur D2 Avec comme fenetre
En haut à gauche D2Game.dll
En haut à droite Les registres
En bas à gauche Les zones mémoires
En bas à droite la pile.
 
 
Première méthode Je cherche dans D2Game.dll les occurences de 6E notre 110 du diminishing return
 
On cherche toutes les occurences de 6E dans D2Game.dll
Pour cela on fait CTRL+B puis on tape 6E
Et la surprise il y en a plein.
Vous ne croyez quand même pas que ce serait si facile. :lol:
 
A la place on va faire CTRL+F pour choisir une instruction et on va essayer les registre courant.
je cherche d'abord CMP EAX,6E puis CMP EBX,6E puis CMP ECX,6E et pour finir CMP EDX,6E.
Vous n'en trouverez pas beaucoup de chaque mais assez pour vous repoussez.
En réalité c'est par la que je suis passé.  
 
Commente savoir lequel est le bon. Déjà on regarde les instructions autour
(niveau avancé) et on élimine les routines qui semblent le moins correspondent.
Après avoir Comparé avec 6E on s'attend à une formule de diminishing return.
Ensuite quand il reste 3-4 routines on peut tester.
On met un breakpoint sur chaque CMP Register,6E (en appuyant sur F2) et on va tuer du monstre. Au moment du drop vous vous  
 
arrêterez sur le bon.
J'ai dit 3-4 mais vous voyez que vous pouvez faire la manip même avec 20 occurences de CMP Register,6E sans trop d'éffort
 
Mais bon c'est trop compliqué
 
 
Méthode numéro 2.
La deuxième consiste à Trouver PUSH 50 Dans D2Game.dll.
En hypothèse j'espère que l'intérrogation du MF se fait en passant les paramètres sur la pile (le PUSH)
 
Vous devriez en trouver 6
 
La première

00960D1D    6A 50           PUSH 50
00960D1F    56              PUSH ESI
00960D20    E8 6B99FDFF     CALL <JMP.&D2Common.#10890>
00960D25    85C0            TEST EAX,EAX
00960D27    0F85 24010000   JNZ D2Game.00960E51


Ca pourrait coller on passe 50 en paramètre.
 
LA deuxième

0097B0FB    6A 50           PUSH 50
0097B0FD    53              PUSH EBX
0097B0FE    E8 8DF5FBFF     CALL <JMP.&D2Common.#10890>
0097B103    85C0            TEST EAX,EAX
0097B105  ^ 0F84 7AFFFFFF   JE D2Game.0097B085


Meme routine appelé (on la verra bientot :D )
OK Possible.
 
LA troisième

009FEB2E    CC              INT3
009FEB2F    CC              INT3
009FEB30    85F6            TEST ESI,ESI
009FEB32    74 33           JE SHORT D2Game.009FEB67
009FEB34    8B06            MOV EAX,DWORD PTR DS:[ESI]
009FEB36    85C0            TEST EAX,EAX
009FEB38    7C 2D           JL SHORT D2Game.009FEB67
009FEB3A    83F8 01         CMP EAX,1
009FEB3D    7F 28           JG SHORT D2Game.009FEB67
009FEB3F    57              PUSH EDI
009FEB40    6A 00           PUSH 0
009FEB42    6A 50           PUSH 50
009FEB44    56              PUSH ESI
009FEB45    E8 0CBCF3FF     CALL <JMP.&D2Common.#10537>
009FEB4A    8BCE            MOV ECX,ESI
009FEB4C    8BF8            MOV EDI,EAX
009FEB4E    E8 EDA1FAFF     CALL D2Game.009A8D40
009FEB53    85C0            TEST EAX,EAX
009FEB55    74 0C           JE SHORT D2Game.009FEB63
009FEB57    6A 00           PUSH 0
009FEB59    6A 50           PUSH 50
009FEB5B    50              PUSH EAX
009FEB5C    E8 F5BBF3FF     CALL <JMP.&D2Common.#10537>
009FEB61    03F8            ADD EDI,EAX
009FEB63    8BC7            MOV EAX,EDI
009FEB65    5F              POP EDI
009FEB66    C3              RETN
009FEB67    33C0            XOR EAX,EAX
009FEB69    C3              RETN
009FEB6A    CC              INT3
009FEB6B    CC              INT3


 
Elle est double et c'est une petite routine délimitée par les INT3 (c'est pourquoi je la met en entier)
 

00A0BED7    6A 50           PUSH 50
00A0BED9    50              PUSH EAX
00A0BEDA    E8 83E5F2FF     CALL <JMP.&D2Common.#10415>
00A0BEDF    8B4424 14       MOV EAX,DWORD PTR SS:[ESP+14]
00A0BEE3    56              PUSH ESI
00A0BEE4    50              PUSH EAX
00A0BEE5    E8 9EE6F2FF     CALL <JMP.&D2Common.#10795>


 
Ca colle encore.
 

00A1A5F6    6A 50           PUSH 50
00A1A5F8    6A 24           PUSH 24
00A1A5FA    57              PUSH EDI
00A1A5FB    E8 3EFEF1FF     CALL <JMP.&D2Common.#10590>
00A1A600    53              PUSH EBX


LA c'est pas terrible. Dans mes connaissance du MF je ne vois pas du tout de paramètres semblables à 24 ??
A voir si le reste ne donne rien
 
En réalité et vous le comprendrez vite par la suite. 1 seul des PUSH 50 a le bon format.
Mais je préfère vous laissez le découvrir.
 
Retour au jeu
Contrairement à la légende. je ne fais pas que lire le code.  
Je joue systématiquement au jeu pour confirmer mes hypothèses. OK ici c'est juste pour activer le breakpoint ;)
 
Bon 5 F2 (sur chaque PUSH 50) a faire c'est pas la mort
Retournons jouer (en appuyant sur F9) avec nos 5 Breakpoints.
 
Premier monstre que je tue Rien. En même temps pas de drop.
 
Vous me direz ce que ca donne, j'ai pas trop de chance, tous les monstres tués ne m'ont rien donner, sauf des carquois (qui je le sais n'active pas le MF)
Par contre j'ai soulevé un rocher dans la première map et la je m'arrete sur la routine que j'ai mise en entier.
Si c'est du MF Alors c'est que le MF fonctionne sur les rochers CQFD
 
OK Je met le breakpoint au début de la routine pour l'avoir en entier.
Je retourne jouer (F9)
Au passage le rocher m'a dropé des bottes (bref objet ou le MF à 1 sens)
 
OK UN zombie me donne enfin un arrêt après moult corps (qui ne m'ont pas donné d'objet à MF, j'ai eut des potions or ...)
 
Au premier coup d'oeil vous devriez avoir une confirmation que c'est probablement le MF associé au drop que nous calculons.
En regardant précisement la pile.
Moi je vois ceci


0012F4E0   009FF047  RETURN to D2Game.009FF047 from D2Game.009FEB30
0012F4E4   0012FA4C
0012F4E8   00000000
0012F4EC   0000008C
0012F4F0   065DE200
0012F4F4   00000000
0012F4F8   02CD5274  ASCII "boot2"
0012F4FC   00A024E1  RETURN to D2Game.00A024E1 from D2Game.009FEF60


Outre les 2 adresse des procédures appelantes (qui nous servirons plus tard je vois ASCII "boot2"
J'ai comme l'impression que je suis en train de dropper des bottes :D
Le format Boot2 vous est peut être inconnu. Nous verrons bien un jour ou l'autre ce qu'il signifie
 
 
Le code
 
OK Il est temps de commencer l'analyse de la routine
 

009FEB2E    CC              INT3
009FEB2F    CC              INT3
009FEB30    85F6            TEST ESI,ESI
009FEB32    74 33           JE SHORT D2Game.009FEB67


Ce que ous devez savoir avant de commencer
1) LEs unités
Ce qu'est une unité au sens D2. Et ce qu'est le PtUNIT (le pointeur vers l'unité) Si vous ne le savez pas aller lire Tracer les DLLS dans mes fixes.
Pour faire rapide. Une unité est un ensemble de données (une fiche signalétique ) qui concerne un élément du jeu (PErsonnage Jeu Missiles Coffres ...) Par exemple pour un personnage joeur on trouvera Sa classe, son équipement, ses skills, son état (en train de courir frapper ...) ...
Le pointeur indique le début de l'unité. Pt+XX indique la position relative XX dans la fiche.
 
2) un peu d'assembleur.
PAs de problème je suis la pour le traduire pour le moment. Ensuite si vous retenez les opérations archi communes, l'apprentissage sera facile.
 
3) un peu d'ollydbg.
 
Pour aller de ligne en ligne sans rentrer dans les sous appel. C'est la touche F8
 
L'analyse
1) L'instruction
On test ESI avec lui même associé avec la fonction EQUAL (Jump if Equal)
Retenez le c'est équivalent de ESI = 0 ou ESI Existe ? C'est un test très fréquent de validation
 
Si ESI n'existe pas (<=> vaut 0 <=> condition Vraie pour EQUAL) alors on sort de la routine (en fait on saute (JUMP) à la fin de la routine.
 
2) L'unité
 
Je fais bouton droit sur ESI dans la partie registres puis Follow in Dump
Et dans la zone mémoire je regarde la tête du pointeur.
moi j'obtient cela

$ ==>    >00 00 00 00 04 00 00 00 00 00 00 00 01 00 00 00  ..............
$+10     >07 00 00 00 00 FA 5D 01 00 00 00 00 00 62 35 02  ....ú].....b5
$+20     >C5 E4 9D 38 5E C2 25 54 7B 34 3E D1 00 5C 5D 01  Åä8^Â%T{4>Ñ.\]
$+30     >00 00 00 00 00 00 00 00 00 00 00 00 23 01 00 00  ............#..


Ca ressemble à un pointeur d'unité (Cf. mes autres topic)
Dans ce cas
 
PT+00 = 00 00 00 00 dans mon cas = 0 = Unit Type. 0 = Joueur
PT+04 = 04 00 00 00 = 4 = Unit Class = Barbare ca tombe bien c'est ce que je joues.
PT+08 = 0 On verra une autre fois c'est pas utilisable pour nous
PT+0C = 1 Unit ID. Je suis le premier joueur de la partie.
 
Le PT+04 associé à divers personnage vous permettra de savoir les codes pour les Classes (ici 4= Barbare. Sinon les MPQ sont la pour vous le dire ;) ). Comme quoi on peut découvrir des choses et construire des listes.
C'est ce qu'il faut faire à la moindre occasion. (Et c'est encore meilleur quand on s'aperçoit après qu'un fichier TXT confirme notre hypthèse)
 
OK je pourrais vérifier la suite mais la structure du tueur (c'est à dire moi) mais ca suffira pour le moment.
Si je jouais avec un suivant (squelette ...) et qu'il était le tueur alors  
 
J'aurais  
PT+00 = 1 Unit Type = Monster
PT+04 = XX ou XX est l'ID du suivant dans Monstat.txt (Exemple 290 --> en hexa 0x122 pour le BloodGolem)
PT+0C L'ordre de summon depuis le début de la partie.
 
OK Si le tueur n'est pas une unité identifié on laisse tomber.  
Je dis le tueur mais c'est spéculatif. Comme c'est moi et que je suis le tueur du zombie j'en déduis que le pointeur est celui du tueur. Chose que je vérifie à l'aide de mon merco ou de mon nécro et sa horde.
 
Il faut faire des hypothèse pour avancer et les tester.  
Si elles sont mauvaises on le verra très rapidement.
 
Le pointeur aurait été un zombie j'aurais dit La cible et j'aurais vérifier avec d'autres monstres.
 
 
On continue

009FEB34    8B06            MOV EAX,DWORD PTR DS:[ESI]


Ce que ous devez savoir avant de commencer
Il faut bien comprendre le pointeur (le début de l'unité) et les déplacement du pointeur relatif au début de l'unité les  
 
Pt+XX
Il faut ensuite comprendre la structure de l'unité. Je la connais pour vous, nous verrons plus tard comment la construire ou la compléter.
 
L'analyse
 
EAX = PtUNIT +00
Dans EAX on copie l'information en position 0 de l'unité.
Je l'ai déjà dit en +00 on a l'information Unit Type
0 si l'unité est un joueur
1 si l'unité est un monstre
 
 

009FEB36    85C0            TEST EAX,EAX
009FEB38    7C 2D           JL SHORT D2Game.009FEB67
009FEB3A    83F8 01         CMP EAX,1
009FEB3D    7F 28           JG SHORT D2Game.009FEB67


Ce que ous devez savoir avant de commencer
Rien de plus
 
L'analyse
On a déjà vu TEST EAX couplé a EQUAL ?? Ici c'est ouplé à Jump if Less (saute si plus petit)
Quand on test EAX avec lui même on s'attend à 3 résultats
EAX est négatif. Active le Jump if LEss (JL)
EAX = 0 (n'existe pas) Active le JE
EAX est positif. Active le JG (Jump if Greater)
 
La deuxième instruction est COMPARE (CMP) EAX avec 1. De même on s'attend au résultat <, Nul ou >
Couplé avec JG on test si EAX > 1
 
Conclusion
Si l'unité type <0 ou si unittype>1 alors on saute à la fin de la routine (que nous verrons plus tard)
Bref pour continuer il faut que l'unité soit une Joueur ou un Monstre
 

009FEB3F    57              PUSH EDI
009FEB40    6A 00           PUSH 0
009FEB42    6A 50           PUSH 50
009FEB44    56              PUSH ESI
009FEB45    E8 0CBCF3FF     CALL <JMP.&D2Common.#10537>


Ce que ous devez savoir avant de commencer
Les Appels de procédure en assembleur.
On verra plus tard les différents Types.
Souvent les paramètres sont passés par la pile. C'est les PUSH Avant le CALL
Mais on a vu en commançant que ce n'est pas toujours le cas. Notre ESI :)
Le résultat d'une routine est généralement placé dans EAX.
 
L'analyse
LE PUSH EDI est une sauvegarde de EDI pour plus tard. c'est pas évident mais on le comprend plus loin.
Bref on fait appel à la sous routine 10537 (0,50,ESI)
Pas besoin d'être savant pour deviner :D
 
Les renseignement donnés sont  
0 Indevinable Ici
50 (on espère le itemstatcost ID Du MF)
ESI = Pointeur du Tueur chez qui on va mesurer le MF
 
J'ai débuggé la routine pour vous mais on l'abordera plus tard.C'est ce qu'il faudrait faire à chaque fois pour être sur.
Pour le moment ce serait trop complexe.
 
Regarder le résultat dans EAX (qui apparait en rouge) au retour de la routine). Théoriquement c'est votre MF ou celui de votre merco ou skelette...
 
Faites l'essai avec plusieurs personnages.
Dans tous les cas EAX = Le MF du tueur.
Cela doit vous suffire pour le moment comme preuve.  
 
P.S.
Concernant le 0 c'est pour indiquer le type de bonus que l'on cherche BASE. BASE + Equipement. Equipement SEul ...
 

009FEB4A    8BCE            MOV ECX,ESI
009FEB4C    8BF8            MOV EDI,EAX


 
Ce que ous devez savoir avant de commencer
Rien MOV A,B C'est Copier B dans A <=> A = B
 
L'analyse
OK à la première ligne quand vous arrivez avec le F8 C'est la que vous pouvez lire le résultat de la routine qui calcul le MF du tueur dans EAX.
 
OK ECX contient maintenant l'UNITE Tueuse
EDI = Son MF (c'est pourquoi on avait sauvegardé EDI (le PUSH EDI de tout à l'heure))
 

009FEB4E    E8 EDA1FAFF     CALL D2Game.009A8D40
009FEB53    85C0            TEST EAX,EAX
009FEB55    74 0C           JE SHORT D2Game.009FEB63


Ce que ous devez savoir avant de commencer
La fonction D2GaME.009 ... sinon il faudrait la tracer.
Sinon le TEST suivi de JE (jump if Equal)
Vous le connaissez par coeur
 
L'analyse
Théoriquement on devrait tracer la routine 9A8... pour la comprendre.
Nous ne le ferons pas, nous ferons F8 pour passer la ligne sans entrer dans la sous routine D2Game.009A8D40
Pourquoi?  
Cette routine est trop complexe si vous ne connaissez pas extrememnt bien les unités. Il faut maitriser la naissance des unités pour comprendre que le flag testé est Est ce que le tueur à un maitre Si oui EAX = PtUNIT du Maitre sinon EAX = 0
Désolé. Croyez moi sur parole.
 
Par contre vous pouvez faire le test empirique en plaçant le breakpoint a cet endroit et en rejouant.
Si c'est vous EAX vaudra 0
Si le tueur est l'un de vos suivant. EAX = le Pointeur sur votre personnage.
Ca doit vous suffire comme preuve.
D'ailleurs en général avant d'aller vois en détail (même si je l'ai fait ici) une sous routine,
faire des tests empiriques est parfois la solution suffisante. (bis repetitam)
 
OK Le TEST EAX C'est Est ce que le tueur à 1 maitre? Non (EQUAL 0 Alors Jump)
 

009FEB57    6A 00           PUSH 0
009FEB59    6A 50           PUSH 50
009FEB5B    50              PUSH EAX
009FEB5C    E8 F5BBF3FF     CALL <JMP.&D2Common.#10537>


Ce que ous devez savoir avant de commencer
Rien vous connaissez déjà cet appel et les arguments.
Au passage c'est une validation que le PUSH EDI de l'autre appel était un élément externe et bien une sauvegarde de EDI.
 
L'analyse
OK si le maitre existe alors EAX = MF du maitre
 

]009FEB61    03F8            ADD EDI,EAX
009FEB63    8BC7            MOV EAX,EDI
009FEB65    5F              POP EDI
009FEB66    C3              RETN


Ce que ous devez savoir avant de commencer
rien sauf ADD = Addition
<=> ici à EDI = EDI + EAX  
 
Analyse
EDI = MF du Suivant + MF du Maitre
 
C'est la fin du MF Normal
On sort de la routine avec EAX = MF  
Vous voyez quand on sort d'une routine le résultat est donné dans EAX. Encore une confirmation ici
 
 

009FEB67    33C0            XOR EAX,EAX
009FEB69    C3              RETN
009FEB6A    CC              INT3


Ce que ous devez savoir avant de commencer
XOR Registre avec lui même <=> Registre = 0
 
Analyse
C'est la fin en échec. LA ou mène tous les jump du début  
 
<=> MF = 0 (EAX) Si un des tests précédents à échouer.
 
On retourne dans tous les cas ici quand on éxécute la fonction RETN (Retour à la fonction appelante)
 

009FF03C    8BEB            MOV EBP,EBX
009FF03E    896C24 1C       MOV DWORD PTR SS:[ESP+1C],EBP
009FF042    E8 E9FAFFFF     CALL D2Game.009FEB30
Ici pour être exact
 
009FF047    8BD8            MOV EBX,EAX
009FF049    85DB            TEST EBX,EBX
009FF04B    74 11           JE SHORT D2Game.009FF05E


 
C'est la que nous continuerons la prochaine fois.
MAintenant que nous savons arrêter le jeu quand le MF est utilisé il sera facile de découvrir tous les mécanismes 1 à 1 pour n'importe quel type de drop ou génération d'objet
(d'ailleurs c'est l'occasion de tester avec les paris, les achats, les quêtes LE coffre de mephisto...) Attention en cas de résultat négatif, rien ne prouve que le MF ne soit pas calculé ailleurs :)
 
La prochaine fois nous verrons la routine (pas trop longue rassurez vous) qui appelle le calcul du MF du tueur.
C'est facile à deviner mais je le prouverais. C'est celle qui determine la qualité du drop et elle se résumera à bien plus que la séquence UNIQUE SET ... comme vous auriez pu le croire.
 
Remarques
 
Je pense que le niveau pous suivre est assez élevé. N'hésitez pas si vous vous sentez prêt à accrocher à me poser les questions même les plus basiques possibles, ce n'est pas moi qui vous le reprocherai.
 
Comment faire sans tous les Ce qu'il faut ... ???
Honnetement ce n'est pas ce que j'arriverais à vous apprendre tout de suite. La le niveau est beaucoup plus élevé. Mais on abordera cette partie petit à petit.
 
Avant de terminer sur de la publicité.
Reprenons quelques autres méthodes de recherche et pourquoi ne pas avoir commencer par elle.
 
On peut mettre des breakpoint dans le code mais également en mémoire.
 
Si je sais ou se trouve TreasureClassEX.bin en mémoire. Je peux mettre un breakpoint sur le TC de Méphisto.
OK Mais ca demande trop de connaissance préalable pour commencer par la.
 
De même si je sais ou se trouve mon unité joueur, je peux mettre un breakpoint sur l'une de mes propriété/valeurs (mon MF par exemple) De même c'est extrêmement complexe et en plus à cause des raffraichissement il faudrait utiliser une astuce que l'on verra plus tard.
 
Sinon ici j'ai été dirigiste (je veux le MF et rien d'autre) MAis quand j'ai commencé et qu'il n'y avait pas de CE qu'il faut savoir avant de commencer je cherchais des petites routines, je plaçais un Breakpoint, je jouais et si l'arret sur le routine me semblait spécifique je débugait :D
La première chose que j'ai trouvé c'est l'expérience (pour la petite histoire IIRC)
 
Pulicité
 
Cette routine de quelques lignes n'a l'air de rien mais elle permet de répondre à des questions auxquelles quasiment personne au monde ne saurait répondre de façon certaine.
 
Exemples ??
Si on met un breakpoint sur  

]009FEB30    85F6            TEST ESI,ESI


Le début :D
Alors on peut répondre aux question suivantes.
 
Si un monstre meurt tout seul du poison. Est ce que le MF s'applique ?
Simple Regarder si ESI Contient le tueur ou si ESI est un missile ou autre chose (le poison)  
 
Si je lance orage avec un objet et que je déséquippe l'objet. Est ce que mon MF s'applique ???
Idem ESI Contient Vous ou un missile d'orage ???
 
On peut également répondre à  
 
Si je transforme un objet +MF en golem d'acier. celui ci a-t-il du MF quand il tue les monstres ???
Facile. Je vous laisse deviner ou mettre le breakpoint.
 
Quand les monstres meurent avec le boss. Est ce que mon MF s'applique ???
 
Toutes ces questions on me les a posées. Avec un seul F2 et en lisant une valeur unique (Unité dans ESI), vous en saurez plus que beaucoup et adieu les rumeurs battlenetiques :)  
 
Si c'est une raison suffisante pour vous pour continuer alors il nous reste plusieurs millers de ligne à lire sur le MF :)
 
A suivre .. si vous le voulez bien
 
En attendant si quelqu'un veut bien répondre aux questions publicitaires ;)


Message édité par Myrdinn le 14-01-2006 à 11:44:06

---------------
Le savoir ne vaut que s'il est partagé :Lien vers les posts techniques Diablo2/LOD
n°8731
ToTo07
C is a sharp tool
Posté le 14-01-2006 à 10:59:58  profilanswer
 

tres bon post, ca va etre utile a ceux qui ne souffre jamais de migraines :D
 
BRAVO

n°8732
pralinor
Lightwave's 999ers
Posté le 14-01-2006 à 15:22:31  profilanswer
 

Ben, c'est excellent...
 
J'ai profité de l'occasion pour tester un peu OllyDbg. :D Et répondre à quelques questions publicitaires ! En guise de premier exercice OllyDébégien, c'est plutôt bon.
 
Alors :  
 
 
 
Le Mf d'un pet ?
 
Pour tester ça, j'ai utilisé un nécro (!) avec un petit squillou. Mon nécro dispose de 100 (64 en héxa) de MF.
 
Voici, ce que l'on obtient. ATTENTION : La capture est un BMP, c'est assez lourd, je la passerai en jpg au plus vite.
 
On peut constater que le tueur est un 6B (un petit squillou) disposant de 64 (100) en mf.  
 
===> Le Mf des pets est le MF du maître.
 
 
 
Le MF du Terminagol (Golem d'acier)
 
Pour le test, j'ai utilisé un Terminagol fait à partir d'un objet ayant 155 en MF. Mon nécro dispose toujours de 100.
 
Résultat
 
Ici, FF en MF. Soit 255.  
 
===> Le MF des Terminagol est la somme du MF du maître + de l'objet à partir duquel il a été fabriqué.
 
 
 
 
Le Mf du pwazon.
 
Mon nécro 100 en mf utilise sa nova pour tuer.
 
Résultat
 
Donc, tueur = 2 (mon nécro). MF = 64.
 
===> Le MF du meutre par pwazon = Mf de celui qui a empoisonné.
 
 
Pour un boss tel Shrenk, ce n'est pas cette routine qui est utilisée lorsqu'il est responsable de la mort de ses acolytes. J'irai voir plus tard.
 
V'là pour le moment m'sieur.


Message édité par pralinor le 15-01-2006 à 20:21:02
n°8735
Myrdinn
ollydebugger
Posté le 14-01-2006 à 18:32:35  profilanswer
 

Excellent Pralinor :clap: et surtout merci pour ta participation ;)
 
Pour être plus précis. Le mf retourné par la fonction pour le skelette et celui de son maitre. Mais le skelette a bien 0 en MF.
Pour les 255 en MF du Golem c'est bien 155 et 155+100 au final.  
 
Si tu t'étais arrêté après la première fonction tu aurais vu 155  
Copié dans EDI Ensuite  
Puis 100 à la deuxième fonction  
Puis la somme des 2 au final transférée de EDI vers EAX. :)


---------------
Le savoir ne vaut que s'il est partagé :Lien vers les posts techniques Diablo2/LOD
n°8739
pralinor
Lightwave's 999ers
Posté le 14-01-2006 à 20:41:09  profilanswer
 

J'ai tout testé :D De A jusque Z, tout ce que tu as décrit a été testé et essayé au pas au pas plusieurs fois en feuilletant dans la doc en même temps :D
 
J'ai donc bien vu ce qui se passait, c'est juste que j'ai changé de Pc, et je n'ai pas encore reinstallé de logiciel de traitement d'image, je ne peux donc pas passer les bmp en jpg. Je n'ai donc que Paint pour travailler les images. Ca explique le manque de captures :D
 
Dès que j'aurais reinstallé Photoshop, je completerai mes captures, et je finirai le debugging de Shrenk.
 
sinon, merci à toi pour ce premier cours de OllyDbg !!! (J'ai hâte d'en prendre un deuxième !!!)

n°8740
Myrdinn
ollydebugger
Posté le 14-01-2006 à 20:52:39  profilanswer
 

C'est en cours. Et assez long à écrire. Ca viendra assez vite quand même.  
Celui la restait assez simple. Quelques lignes/ Peu d'intéraction extérieure.
Le prochain topic aborde le traitement des fichiers issus des MPQs :)au travers du calcul de la qualité du drop, ce sera un poil plus compliqué.


Message édité par Myrdinn le 14-01-2006 à 23:13:01

---------------
Le savoir ne vaut que s'il est partagé :Lien vers les posts techniques Diablo2/LOD
n°8741
Constance
[ms]Modo Maudit®
Profil : Modérateur
Posté le 14-01-2006 à 21:03:43  profilanswer
 

pralinor a écrit :

[...] j'ai changé de Pc, et je n'ai pas encore reinstallé de logiciel de traitement d'image, je ne peux donc pas passer les bmp en jpg.


De toute façon le JPEG (pour ça), c'est mal [:tamamanquitaime:2]
Allez hop, petit lien vite fait pendant cette parenthèse : http://psydk.org/PngOptimizer.php


---------------
« L'inconvénient des écrans plats par rapport aux CRT, c'est qu'on peut rien poser dessus :ack: »
n°8742
Bygirz
Back in the business
Posté le 14-01-2006 à 21:13:22  profilanswer
 

Bon là c'est clair je suis pas du tout au niveau...
 
Mais j'attend quand même avec impatience la mise à jour des infos d' "anatomie d'un drop" pour la détermination de la qualité.  :)


---------------
[:bygirz:6][:bygirz:7][:bygirz:8][:bygirz:9]
5 ans de solo, 2 ans d'arrêt, reprise HCL5
Liste de (non) drops HC solo avec  screens des persos // Testez le faucheur en HC // Présentation du Faucheur // WW-sin PvM
n°8748
Myrdinn
ollydebugger
Posté le 15-01-2006 à 15:03:56  profilanswer
 

Pas d'inquiétude Bygirz, il faut avoir de bonne base en info j'imagine. Chacun son domaine.  
Le but du topic n'étant pas tellement de remplacer Anatomie d'un drop mais de montrer la méthode, n'espère pas avoir le tout complet très rapidement ;) Mais avec un peu de chance nous répondrons à des questions inédites et même plus vite que vous ne le pensez.


---------------
Le savoir ne vaut que s'il est partagé :Lien vers les posts techniques Diablo2/LOD
n°8749
Acrerune
Tavernier trembleur (¯`·._.·»
Posté le 15-01-2006 à 16:48:05  profilanswer
 

Merci Myrdinn
 
j'ai beaucoup sauté pour aller à la conclusion... il y avait des questions que je ne me posais même pas!!
 
et maintenant celle du mf qui s'applique quand le boss meurt me tracasse... Dans le sanctuaire de didi, je n'ai pas remarqué des drops fantastiques un fois que j'ai tué le dernier boss (généralement le wizzir)donc je dirais empiriquement que mon MF ne s'applique pas...
 
Pour le bug (encore présent en solo) qui fait que tuer shenk c'est tuer Uber Diablo si celui ci est proche, le fait que didiclone droppe l'annih à tout coup n'a rien à voir avec du mf n'est ce pas? même pour les caractéristiques?


---------------
[:acrerune:4][:acrerune:5][:acrerune:6][:acrerune:7]  
 ¤  L’Oracle des runes  ¤   Wikirune  ¤   Le savoir ne vaut que s'il est partagé par tous  ¤   Mon weblog
"Sicarios, con la ayuda de otros zelotas [...] cometieron una serie de atrocidades, para forzar a la población a luchar."
n°8750
Myrdinn
ollydebugger
Posté le 15-01-2006 à 17:22:43  profilanswer
 

Pour la première question. A tester :D  
 
Pour didiclone et l'anni, le MF n'a pas d'action effectivement.


---------------
Le savoir ne vaut que s'il est partagé :Lien vers les posts techniques Diablo2/LOD
n°8752
pralinor
Lightwave's 999ers
Posté le 15-01-2006 à 22:52:55  profilanswer
 

Pour la première question, j'ai essayé sur Shrenk, on sort de la boucle tout de suite, et je n'ai pas vu que l'on entrait dans une autre boucle type 50. Je n'ai toutefois pas essayé plus que cela, mais à vue de nez, je dirais : c'est le boss qui tue, donc 0. Je vérifierai cela au plus vite, ca tracasse ;D
 
Je vais essayer de détailler un peu ce qui se passe pour un gogo de métal. (Les squelettes sont moins interessants : ils ont 0 en mf).
 
Donc, situation : J'ai un gogo de métal qui a 155 en mf (Hero Editor est mon ami). Il arrive devant une rogue corrompue (Ah, toutes ces âmes perdues...) et la tue (non mais!). Fort heureusement, elle porte un objet sur elle. Voici la situation (capture prise juste avant le drop). Et ici, nous trouverons ce qui se passe dans le code à ce moment-là... (Le suspens est totalement intolérable.
 
Je vais essayer de bien détailler, pour bien comprendre. Sur le même écran à la même position, j'ai entouré en rouge quelques données intéressantes :
1- Sur le bas, à droite, le ASCII "glov2", on peut donc s'attendre à des gants (On vérifiera).
2- Le pointeur ESI (du tueur), que j'ai dumpé (cf. ma flêche)
3- Le tueur : 2301, soit 123 en hexa => 191 en décimale. Le fichier MPQ monstat nous indique : gogo de métal. Nous vérifions bien ainsi ce que nous constatons à l'écran et ce que nous pensions obtenir théoriquement.
 
Je déroule un peu la fonction, pour voir. En fait, je déroule jusqu'au retour du MF du gogo (je vais bien détailler pour le mf du maître). Encore une fois, j'ai entouré en rouge la valeur qui nous intéresse (9B en hexa, soit 155 en décimal).  
 
Nous savons donc que : Le gogo est le tueur et qu'il dispose de 155 en mf.
 
Voici maintenant ce qui se passe lors de l'appel du mf du maître (j'intégre l'image pour mieux comprendre) :
http://www.pralinor.net/DiabloII/TestMF/Test%20MF%20-%20gogo%20appel%20mf%20maitre.jpg
 
Regardez bien : On appelle la fonction 10537 avec 2 paramètres :
1- 50 : C'est le calcul du mf (Cf explications de Myrdinn en début de post)
2- EAX.
 
Comparons avec le premier appel (celui du calcul du mf du gogo, il se trouve un peu au-dessus):
1- 50
2- ESI
 
Or nous savons que derrière ESI se cache le tueur. Que cache EAX ?
 
Regardez bien mes flêches. La flêche 1 nous montre les paramètres passés à la fonction 10537. La flêche 2 nous montre ce que vaut EAX. La flêche 3 nous montre ce vers quoi pointe EAX. Et enfin la flêche 4 nous dit qui est EAX : 02, soit le nécro. Nous voyons donc ici que nous appelons la fonction de calcul du mf, mais pour le nécro ! (Je renvoie aux explications de l'algo faites par Myrdinn).
 
Nous allons nous empresser de vérifier si c'est vrai !
 
http://www.pralinor.net/DiabloII/TestMF/Test%20MF%20-%20gogo%20retour%20mf%20maitre.jpg
 
Allons doucement dans la capture : Je me trouve juste derrière l'appel à la fonction 10537, juste à son retour, c'est entouré en rouge. Observez bien : comme l'a dit Myrdinn, le registre EAX nous sert à récupérer le retour d'une fonction. Dans le cas présent, donc, la valeur du mf du nécro. Observez mes flêches : on voit 64. J'ai utilisé la calculatrice Windows pour traduire l'héxa en décimal. On voit donc que 64 en héxa, c'est 100 en décimal. Regardez bien les paramètres que j'utilise pour la traduction de l'un à l'autre (c'est pour ceux qui ne savent pas faire ;D).
 
Dernière remarque : Le registre EDI, regardez-le, je l'ai souligné de 3 traits. Il contient 9B, soit le MF du gogo. Ca tombe bien, l'instruction qui va être exécuté est : ADD EDI, EAX (la première zone entourée en rouge, dans le code, c'est la ligne grisée): On va additionner les 2 MF !
 
Il nous reste maintenant à vérifier le mf total.
J'ai juste avancé de quelques pas. Observez que nous avons FF, et que j'ai traduit à l'aide de la calculatrice le FF en 255 (soit les 100 du nécro + les 155 du gogo).  
 
Conclusion : MF total = MF du maitre  + MF du pet.
 
Avec le pet = Merc ou gogo ou squel ou squel mage ou ours ou loup ou valk, etc. Sachant que presque tous les pets ont 0 en mf, à l'exception du merc (suivant son matos) et du gogo de métal fait avec un objet possédant du mf.
 
Pour finir, nous avions vu que nous allions avoir des glov2, vérifions. Nous avons obtenu des gants en cuir primitifs.
 
Sans lire le post de Myrdinn en détail, on peut savoir que :
 
1- La fonction 10537 avec 50 en paramètre nous rend le MF
2- La fonction 04608D40 nous rend le maître d'un pet
 
La simple trace de cette fonction nous l'apprend.
 
Je laisse Myrdinn corriger toute bêtise que j'aurais marquée !!!! :D
 
 
 
 
 
 
 

n°8755
Acrerune
Tavernier trembleur (¯`·._.·»
Posté le 16-01-2006 à 01:15:34  profilanswer
 

Mais c'est super intéressant et en plus je pense avoir à peu près compris... :welldone: Prali!


---------------
[:acrerune:4][:acrerune:5][:acrerune:6][:acrerune:7]  
 ¤  L’Oracle des runes  ¤   Wikirune  ¤   Le savoir ne vaut que s'il est partagé par tous  ¤   Mon weblog
"Sicarios, con la ayuda de otros zelotas [...] cometieron una serie de atrocidades, para forzar a la población a luchar."
n°8759
Ulmo
Posté le 16-01-2006 à 03:59:17  profilanswer
 

Bon j'ai finalement dégagé une bonne heure pour m'attaquer sérieusement à ce post. Et félicitations à pralinor qui fait les exercices mais aussi vivre le post.
 
Pour commencer ça me fait bien plaisir de te relire, surtout pour des posts de ce type :)
 
Tu n'as pas précisé quelle version tu regardes. Il me semble que c'est la 1.11b, je vais donc quitter ma 1.10 pour pouvoir continuer la discussion. Mais j'ai fait l'exercice en 1.10 pour voir si je suivait, et les fonctions m'ont l'air assez différentes (je veux dire pas découpées pareil).
 
Pour info, les breakpoints sur mémoire n'avait pas marché quand j'avais travaillé sur Diablo 1. Mais de toute façon j'avais d'autres problèmes (pas de mode fenêtré, et le changement d'écran plantait souvent). De plus je soupçonne que serait rapidement tombé sur le problème suivant :

Citation :

De même si je sais ou se trouve mon unité joueur, je peux mettre un breakpoint sur l'une de mes propriété/valeurs (mon MF par exemple) De même c'est extrêmement complexe et en plus à cause des raffraichissement il faudrait utiliser une astuce que l'on verra plus tard.


 
Pour les units, comment connaitre leur structure ? Est-ce que la lecture attentive de la routine de création est une bonne piste (en général c'est vraiment ardu) ? As tu d'autres méthodes que de faire des listes petit à petit ?
Et comment tu sais que c'est une unit de joueur, d'item (les 4 lettres de code doivent aider) ou de missile ? (Bon la structure de certaines units est sur PK, mais tu sais peut-être d'autres choses).
 
Et bon, j'imagine que ma connaissance de la structure des fichiers *.bin me sera utile par la suite. Chic j'ai bien fait de travailler là.

n°8762
Myrdinn
ollydebugger
Posté le 16-01-2006 à 09:00:40  profilanswer
 

Pour commencer un grand :clap: et :gratz: à Pralinor.
Rien à redire tu connais mieux la routine que moi désormais :lol:
Tu verras dans le deuxième topic que l'on peur bricoler la cette routine en live pour en apprendre plus sur nos amis les suivants.
 
La valkyrie ayant de l'équipement aléatoire je l'ai déjà vue avoir du MF ;)
 
@Ulmo
Tu peux tenter l'expérience en 1.10, même si la structure diffère, je t'aiderais volontier. Sinon désolé de te forcer la main vers la 1.11 :D (mais bon avec les bacth et astuces de Myrghinoc c'est l'affaire de 1 minute de passer de l'un à l'autre)
 
Pour les structures, je commence à expliquer comment on commence à construire les listes du type PtUnit. Mais si tu pars de rien il faut faire des tas de listes fastidieuses, sans références point d'analyse.
 
 
A chaque fois que nous les rencontrons, il faut noter les variations possibles, et truquer les résultats pour les comprendre. Ici nous n'avions pas besoin de savoir ce qu'était le +00 et le +04 c'est pas important pour la fonction. Nous aurions du deviner que c'était des Pointeur sur une structure relative au tueur. Ensuite en jouant plusieurs persos on aurait vu que
LEs necro ont toujours
00 02
LEs barbares
00 04
Les suivants
01 xx ? On aurait construit un fichier a 2 colonnes Suivant -- ID
et 1 jour ou l'autre on aurait vu que xx était equivalent à l'index ID de monstats.txt
 
Mais j'ai découvert les PtUnit grace aux assertions error de Blizzard. Je garde cela pour une autre fois si tu me le permet.


Message édité par Myrdinn le 16-01-2006 à 09:01:39

---------------
Le savoir ne vaut que s'il est partagé :Lien vers les posts techniques Diablo2/LOD
n°8763
Alien14
Shinji Ikari
Posté le 16-01-2006 à 17:17:12  profilanswer
 

:hmm: quelqu'un à un dragonale ?


---------------
Ça vous a jamais semblé bizarre que, partout où y a des monstres qui sèment le bazar, c’est toujours là qu’on trouve plein de trésors ? (cf :Site de D3)
[:alien14][:alien14:1][:alien14:2][:alien14:3]
n°8765
pralinor
Lightwave's 999ers
Posté le 16-01-2006 à 22:03:39  profilanswer
 

Hé hé hé hé hé.... Myrdinn :D Fort jutement, hier, quand j'ai compris à quoi servait le 50, je me suis dit : Modifie ça, mon garçon et tu sauras ce que tu veux savoir:D
 
Il y a un vieux truc que je veux vérifier : La vie des squelettes. L'affichage est buggé, et il y a un moment, j'ai réétabli des formules que je pense exactes, mais qui méritent d'être vérifiées sur le terrain... Ce que l'on va faire de ce pas.
 
Pour ça, nous allons utiliser un nécro diposant de 24 en squel, 25 en maitrise, 14 en resistance. Au passage, la resistance aux sorts, s'applique à quoi ?  Qui le sait ? La magie et la resistance aux coups ? A la fin de ce post, finies les rumeurs et les ont dit, ou je le sais :D
 
Alors que voit-on sur l'écran Blizzou ? Ca. 444 HP donc, en normal. Le tableau correctif que j'ai établi, affirme quant à lui que les squelettes en question n'auront pas, taratata 444 HP, mais 2556 HP. Alors qui a raison ? Blizzou ou Pralinor ?
 
Pour vérifier nous retraçons la même fonction, mais cette fois, nous nous arrêtons sur le PUSH 50 que l'on va modifier. Pour ce faire, on fait ctrl + E, et on modifie. Suffit de suivre la capture en dessous :D.
http://www.pralinor.net/DiabloII/TestMF/Test%20skillou%20-%20changement%20valeur.jpg
 
Bon, par quoi remplacer ??? On va jetter un coup d'oeil au fichier MPQ itemstatcost et remplacer le 50 du MF par le 7 du MAxHP.
 
On déroule la fonction par un F8 et voici en sortie :  
http://www.pralinor.net/DiabloII/TestMF/Test%20skillou%20-%20retour%20vie.jpg
 
Tout d'abord observez que le PUSH 50 est devenu PUSH 7 (en rouge en plus) ! Au retour, nous obtenons 9FC00 (que l'on traduira par 9FC). Et que fait 9FC en décimal ??? 2556... (Hé hé hé hé). Au passage, on vérifie que ce qui pouvait se dégager suite à reflexion sur les MPQ peut se vérifier dans la théorie, ce qui est plus que rassurant :D
 
Je propose de tester avec le ToHit. Ceci permettra d'éviter une grosse erreur  :hello:  
 
Dans le fichier MPQ, le tohit porte le 19. toutefois, on n'omettra pas de se rappeler que c'est du décimal, qu'il faut transformer en héxa, hein. au passage, je ne remettrai plus de traduction decimal/hexa. J'ai remis les paramètres à employer dans la capture, je considère maintenant cela comme un acquis.
 
Au retour, nous avons 6AD en tohit. 1709... c'est au passage TRES loin des 740 annoncés sur l'écran...  
 
Autre remarque : Regardez bien ma capture, sur la gauche j'ai entouré quelque chose en rouge... Quand vous modifiez une valeur, vous perdez le point d'arrêt, alors attention de bien le remettre pour pouvoir continuer à tracer !
 
Bon, jusque là, nous avons un moyen de récupérer les infos de tout pets, et de tout perso. Mais n'y aurait-il pas moyen de faire mieux que de modifier le PUSH ???
 
Fort heureusement, oui. J'ai tracé un peu la fonction 10 537, celle qui permet de récuperer ces "fameuses infos". Et regardez sur quoi on tombe :  
http://www.pralinor.net/DiabloII/TestMF/Test%20skillou%20-%20tableau%20skillou.jpg
 
Déjà, là, on voit un superbe tableau qui nous plait. Par exemple, la valeur 7 (maxhp) est liée à 9FC (2556) (<= au passage si quelqu'un a du mal à comprendre pourquoi on lit FC 09 et je parle de 9FC...). Essayons de faire un traduction littérale à l'aide à notre fichier MPQ :
 

6  -- 6  -- HP      -- 2556
7  -- 7  -- MAXHP   -- 2556
C  -- 12 -- Niveau  -- 90 (Hé oui, ce ne sont pas des lopettes...)
13 -- 19 -- Tohit   -- 1704
14 -- 20 -- Toblock -- 3 (Les 3% de parade des squels que l'on confirme)
15 -- 21 -- Dom min -- 1  
16 -- 22 -- Dom max -- 2
19 -- 25 -- ED      -- 154 (Le pourcentage d'ED affiché dans l'écran de Blizzou, sur le forum des nécros, vous pourrez trouver le mode de calcul des dommages expliqué par moi-même)
1F -- 31 -- AC      -- 1280 (encore loin des soi-disant 740 de l'écran...)  
27 -- 39 -- Res feu -- 62  (Les 62 dus à la compétence res aux sorts)  
29 -- 41 -- Res Froi-- 62
2B -- 43 -- Res foud-- 62
2D -- 45 -- Res pwaz-- 62


, etc.
 
Toutes les caracs non données sont à 0. Donc : Force : 0, Dexté : 0, Vita : 0, Energie : 0, Mana : 0, etc. Du coup, vous pouvez maintenant faire passer à l'état de rumeurs à 2 centimes d'euro bien des choses !!!!!!!!
 
Maintenant question, peut-on trouver un tableau identique pour par exemple un perso ???
 
Réponse en image :
http://www.pralinor.net/DiabloII/TestMF/Test%20skillou%20-%20tableau%20necro.jpg
 
Je ne donne pas de traduction des valeurs. Tout le monde aura compris. Juste un détail : Ne soyez pas surpris par les caracs astronomiques de ce nécro, c'est un cas de test :D
Quelques petites remarques : pas de 4 et 5, qui correspondent respectivement aux points de stats et compétences non dépensés, etc.
 
Nous avons maintenant une méthode RAPIDE pour trouver l'ensemble des caractéristiques physiques de toute créature (joueur, pet, merc). Il suffit de lire, et de traduire.
 
Voilà, suite au prochain épisode... (Le temps que Myrdinn explique où j'ai merdé :D)

n°8766
Myrdinn
ollydebugger
Posté le 16-01-2006 à 22:38:52  profilanswer
 

Bien mais dangereux.
Je n'aime pas trop changer la Dll en live :lol:
Je préfère modifier les résultats. LE 50 sur la pile juste après son PUSH, comme je l'ai expliqué dans le deuxième sujet) c'est moins dangereux. Ca c'est pour le coté puriste.
 
Ensuite Bravo tu as découvert un autre morceau des PtUnit. L'unité Perso contient une structure référençant les statistiques. Comme la taille est variable, ces caractéristiques sont stoqués dans une autre liste, le PtUnit ne fait que contenir le Pointeur vers cette liste.  
 
Nous le reverrons par la suite, le PtSTAT (pointeur vers la structure des stats) et un poil plus compliqué.
En 1.10 et avant les valeurs n'étaient pas dans l'ordre et groupées seulement par listes de 16 (En 1.11,il peut coller plusieurs listes de 16 à la suite et en plus elles sont triées :D )
Méfiance quand on a beaucoup de caractéristique différentes ells sont par forcément toutes au même endroit, du coup tu peux trouver plusieurs listes comme celle ci en cherchant.)  
 
Ca répond un peu à Ulmo sur le comment on construit les PtUnit: par l'observation et les modifications ;)
 
Sur Ce je retourne travailler la troisième partie :D


Message édité par Myrdinn le 17-01-2006 à 07:51:15

---------------
Le savoir ne vaut que s'il est partagé :Lien vers les posts techniques Diablo2/LOD
n°8767
Ulmo
Posté le 16-01-2006 à 23:54:34  profilanswer
 

Citation :

Au retour, nous obtenons 9FC00 (que l'on traduira par 9FC).

Tu le sais ou pas encore, mais la vie (et aussi la mana/stamina) ne sont affichées qu'après division pas 256 (100 en hexa). C'est ce que Myrdinn appelle l'extra-précision, c'est comme si il y avait des chiffres après la virgule. C'est due à la valeur 8 dans la colonne "ValShift" de ItemStatCost.txt (8 digits après la vigule, c'est bien des 256èmes).
Idem pour les degats de skills.txt ou missiles.txt (colonne HitShift) ou pour la mana des skills.
 
En tout cas, félicitation. J'apprend encore plein de choses.
En tout  

n°8771
pralinor
Lightwave's 999ers
Posté le 17-01-2006 à 19:01:03  profilanswer
 

Bon, comme Myrdinn s'avance un peu dans l'autre post, je vais arrêter pour l'instant ma recherche sur la structre des persos.
 
Sinon : J'aime vivre dangeureusement... :D En fait ce sont de vieux reflexes qui me restent du temps de mes premières lectures d'assembleur, sur un Z80  :o Je vois cette fichue pile, mais je ne peux pas m'empêcher de changer ce fichu PUSH. Ca finira par me passer :D
 
Bon, sinon. Je suis reparti voir un peu le MF. J'ai répondu au MF des suivants en général. Mais maintenant.
 
Quel MF est utilisé par une hydre ?
Si je suis un palouf et que j'utilise épine et qu'un monstre est tué par épine, quel MF ?
Je suis un nécro, j'utilise vierge, et les monstres se tuent avec vierge. Le MF ?
Je suis un nécro, j'utilise le gogo de feu, qui tue AVEC son aura feu sacré, le MF ?
 
 
D'abord, grandement désolé, je ne joue que des nécros. Ca limite mes connaissances en terme de sorts bizarres. J'ai fait ici une sélection de sorts qui peuvent effectivement porter à question. Par exemple dans le cas de vierge, le nécro n'intervient pas... Or emploie du sort, bien sûr.
 
A noter : Pas de capture d'écran, ici, ça ne sert à rien, tout le monde aura compris comment on peut vérifier les résultats. Ce qui est intéressant ici, c'est de voir que l'on peut obtenir des réponses précises à des questions précises.
 
Quel MF est utilisé par une hydre ?
L'hydre est un pet... Comme un gogo, un valk, etc. Donc : L'hydre ayant 0 : le MF de la soso.
 
Si je suis un palouf et que j'utilise épine et qu'un monstre est tué par épine, quel MF ?
Bien malin qui peut y répondre. Le mf du palouf.
 
Je suis un nécro, j'utilise vierge, et les monstres se tuent avec vierge. Le MF ?
Bonne question aussi :D Le MF du nécro.
 
Je suis un nécro, j'utilise le gogo de feu, qui tue AVEC son aura feu sacré, le MF ?
En somme toutes les auras sont les mêmes : Lorsqu'on tue avec une aura, c'est comme si l'on tuait soi-même. Donc, le gogo tue. Donc Mf = MF gogo + MF nécro, avec MF gogo = 0.
 
Reste à se poser quelques autres questions : Je suis un xxx, je porte un objet me donnant le sort golem quand je suis touché, le MF. ON aura alors fait le tour complet de la question.  :sol:


Aller à :
Ajouter une réponse