Très très bien et surtout très intéressant.
Je pense que l'on est en train de découvrir une exclusivité sur D2
Bon je viens de faire 2 traces, je donne mes notes brutes (assez difficle à comprendre), je les simplifierais plus tard.
Trace 1 : Ice Bolt
Pour les 2 traces mon perso à 26 en FastCast soit 21 en Effective FastCast
Pour commencer une photo d'écran de mon débugger qui a une importance très élévée ici
[Fixed]
0097F180 8D0449 LEA EAX,DWORD PTR DS:[ECX+ECX*2]
0097F183 83C1 78 ADD ECX,78
0097F186 8D0480 LEA EAX,DWORD PTR DS:[EAX+EAX*4]
0097F189 C1E0 03 SHL EAX,3
0097F18C 99 CDQ
0097F18D F7F9 IDIV ECX
0097F18F 8BC8 MOV ECX,EAX[/fixed]
ECX=(FastCast*3*5*8)/(Fastcast+120)=FastCast*120/(Fastcast+120)
J'ai 26 en FC --> EAX=1A (Cf photo d'écran)
On voit également le Cof Utilisé ici SOSCSTF (Sorcière en SpellCasting avecun Staff)
ECX= EfeectiveFc = 15 pour moi
-------------------------------------------------------------------------------
2) Animation Speed
-------------------------------------------------------------------------------
[fixed]0097F191 8D41 64 LEA EAX,DWORD PTR DS:[ECX+64]
EAX=100+(FastCast*120)/(Fastcast+120)
Pour moi = 79 (121 en décimal)
0097F194 3D AF000000 CMP EAX,0AF
0097F199 7E 05 JLE SHORT D2Common.0097F1A0
0097F19B B8 AF000000 MOV EAX,0AF
Cappé à 175% (Donc EFC cappé à 75)
0097F1A0 8B53 0C MOV EDX,DWORD PTR DS:[EBX+C][/fixed]
EDX=EBX+C=AnimRate
EBX=COF File Name pour Moi SOSCSTF (Extrait ici)
[fixed]052C69B4 53 4F 53 43 53 54 46 00 SOSCSTF.
052C69BC 0E 00 00 00 00 01 00 00 ...... OE=14=Base+1 et 100=Animrate = 256
052C69C4 00 00 00 00 00 00 00 01 .......
052C69CC 00 00 00 00 00 00 00 00 ........[/fixed]
EDX=100 pour moi (256)
[fixed]0097F1A3 0FAFD0 IMUL EDX,EAX[/fixed]
AnimRate*(100+(FastCast*120)/(Fastcast+120))
EDX=7900(256*121)
[fixed]0097F1A6 B8 1F85EB51 MOV EAX,51EB851F
0097F1AB F7E2 MUL EDX
0097F1AD C1EA 05 SHR EDX,5
EDX=AnimRate*(100+(FastCast*120)/(Fastcast+120))/100
EDX=135 (Je noterais 1#35 à partir de maintenant car c'est exprimé en frame)
0097F1B0 85D2 TEST EDX,EDX
Animation Speed=0 ?
0097F1B2 7E 23 JLE SHORT D2Common.0097F1D7
Oui --> exit
0097F1B4 81FA FF7F0000 CMP EDX,7FFF
EDX Vs 32667
0097F1BA 8BC2 MOV EAX,EDX
EAX=Animation Speed
0097F1BC 7C 05 JL SHORT D2Common.0097F1C3
0097F1BE B8 FF7F0000 MOV EAX,7FFF
Cappé à 7FFF
0097F1C3 66:8945 4C MOV WORD PTR SS:[EBP+4C],AX
PtUnit[+4C]=Animation Speed = 135 stoqué en +4C dans les propriété de ma sorcière
0097F1C7 5F POP EDI
EDI=EDI Initial=EAX initial =0A pour moi
0097F1C8 0FBFC0 MOVSX EAX,AX
0097F1CB 8945 3C MOV DWORD PTR SS:[EBP+3C],EAX
PtUnit[+3C]=Animation Speed? = 00 Avant pour moi
0097F1CE 5E POP ESI
0097F1CF 5D POP EBP
0097F1D0 5B POP EBX
0097F1D1 83C4 10 ADD ESP,10
0097F1D4 C2 0C00 RETN 0C[/fixed]
Fin de la routine de calucl de la vitesse d'animation des sorts
Retour à la routine de gestion de l'animation des personnages (D2Common.10349)
[fixed] D2Common.10349)
0097E6B5 68 64090000 PUSH 964
0097E6BA 68 F45C9A00 PUSH D2Common.009A5CF4 ; ASCII "C:\projects\D2\head\Diablo2\Source\D2Common\UNITS\Units.cpp"
0097E6BF 56 PUSH ESI
0097E6C0 896E 30 MOV DWORD PTR DS:[ESI+30],EBP
ESI+30=0 (XOR EBP,EBP) line 97E51A
0097E6C3 E8 88090000 CALL D2Common.#10376
10376 (Animation Speed)
On revient ICI mais j'ai laissé le début pour ceux que ca intérresseraient
0097E6C8 8B56 50 MOV EDX,DWORD PTR DS:[ESI+50]
EDX=UnitPtr+50=CofName Ptr
0097E6CB 5F POP EDI
EDI=0A (FastCast) Cf au dessus
0097E6CC 8B42 08 MOV EAX,DWORD PTR DS:[EDX+8]
EAX=BAse Frame+1 Pour moi = 0E soit 15
0097E6CF C1E0 08 SHL EAX,8
EAX=256*(Base Frame+1)
0097E6D2 8946 48 MOV DWORD PTR DS:[ESI+48],EAX
ESI+48=BAseFrame+1
ESI+4C=Animation Speed
0097E6D5 5E POP ESI
0097E6D6 5D POP EBP
0097E6D7 B8 01000000 MOV EAX,1
0097E6DC 5B POP EBX
0097E6DD 83C4 1C ADD ESP,1C
0097E6E0 C2 0400 RETN 4[/fixed]
On arrive ici avec tout ce qu'il faut pour gérer l'animmation
La longueur de l'animation = Base+1 * 256 car c'est un nombre d'image exprimé en 1/256eme
La vitesse de l'animation = AnimRate*(100+(FastCast*120)/(Fastcast+120))/100
Ensuite le jeu incrémente à chaque tick un compteur avec la vitesse d'animation
Quand le compteur est supérieur à la durée de l'animation l'animation estv terminée
On peu également exprimée ceci avec une formule mathématique que vous connaissez déjà
FastCast Ticks= [256*(Base+1)/(Animation Speed* (100+EFC)/100)] -1
avec EffectiveFastCast
EFC=(Somme des FastCast*120)/(Somme des FastCast+120)
OK Rien de nouveau on obtient bien les palliers archi connu.
Trace 2 : Lignthning(Foudre)
Pour les 2 traces mon perso à 26 en FastCast soit 21 en Effective FastCast
Pour commencer une photo d'écran de mon débugger qui a une importance très élévée ici
[fixed]0097F180 8D0449 LEA EAX,DWORD PTR DS:[ECX+ECX*2]
0097F183 83C1 78 ADD ECX,78
0097F186 8D0480 LEA EAX,DWORD PTR DS:[EAX+EAX*4]
0097F189 C1E0 03 SHL EAX,3
0097F18C 99 CDQ
0097F18D F7F9 IDIV ECX
0097F18F 8BC8 MOV ECX,EAX
ECX=(FastCast*3*5*8)/(Fastcast+120)=FastCast*120/(Fastcast+120)
J'ai 26 en FC --> EAX=1A (Cf photo d'écran)
On voit également le Cof Utilisé ici SOGHSTF (Sorcière en GetHit-FastHitRecovery) avecun Staff)
ECX= EfeectiveFc = 15 pour moi
-------------------------------------------------------------------------------
2) Animation Speed
-------------------------------------------------------------------------------
0097F191 8D41 64 LEA EAX,DWORD PTR DS:[ECX+64]
EAX=100+(FastCast*120)/(Fastcast+120)
Pour moi = 79 (121 en décimal)
0097F194 3D AF000000 CMP EAX,0AF
0097F199 7E 05 JLE SHORT D2Common.0097F1A0
0097F19B B8 AF000000 MOV EAX,0AF
Cappé à 175% (Donc EFC cappé à 75)
0097F1A0 8B53 0C MOV EDX,DWORD PTR DS:[EBX+C][/fixed]
EDX=EBX+C=AnimRate
EBX=COF File Name pour Moi SOGHSTF :??: Le jeu utilise l'animation du GetHit (FastHitRecovery) pour l'attaque foudre
[fixed]052BA738 53 4F 47 48 53 54 46 00 SOGHSTF.
052BA740 08 00 00 00 00 01 00 00 ...... Base+1 = 8 AnimSpeed = 256
052BA748 00 00 00 00 00 00 00 00 ........
EDX=100 pour moi (256)
0097F1A3 0FAFD0 IMUL EDX,EAX
AnimRate*(100+(FastCast*120)/(Fastcast+120))
EDX=7900(256*121)
0097F1A6 B8 1F85EB51 MOV EAX,51EB851F
0097F1AB F7E2 MUL EDX
0097F1AD C1EA 05 SHR EDX,5
EDX=AnimRate*(100+(FastCast*120)/(Fastcast+120))/100
EDX=animation Speed = 135 (Je noterais 1#35 à partir de maintenant car c'est exprimé en frame) L'animation avance de 1 image et 35/256 eme par ticks
0097F1B0 85D2 TEST EDX,EDX
Animation Speed=0 ?
0097F1B2 7E 23 JLE SHORT D2Common.0097F1D7
Oui --> exit
0097F1B4 81FA FF7F0000 CMP EDX,7FFF
EDX Vs 32667
0097F1BA 8BC2 MOV EAX,EDX
EAX=Animation Speed
0097F1BC 7C 05 JL SHORT D2Common.0097F1C3
0097F1BE B8 FF7F0000 MOV EAX,7FFF
Cappé à 7FFF
0097F1C3 66:8945 4C MOV WORD PTR SS:[EBP+4C],AX
PtUnit[+4C]=Animation Speed = 135 stoqué en +4C dans les propriété de ma sorcière
0097F1C7 5F POP EDI
EDI=EDI Initial=EAX initial =0A pour moi = Etat du Joueur(Mod) ici OA correspond à SC pour Spell Casting (Cf PlrModes.txt)
0097F1C8 0FBFC0 MOVSX EAX,AX
0097F1CB 8945 3C MOV DWORD PTR SS:[EBP+3C],EAX
PtUnit[+3C]=Animation Speed = 135 L'animation speed est stoqué en 2 endroits dans les propriétés du joueur, 1 représente la vitesse l'autre un compteur
0097F1CE 5E POP ESI
0097F1CF 5D POP EBP
0097F1D0 5B POP EBX
0097F1D1 83C4 10 ADD ESP,10
0097F1D4 C2 0C00 RETN 0C[/fixed]
Bon on obtient exactement la même chose à l'exception du COF utilisé
Fin de la routine de calucl de la vitesse d'animation des sorts
Retour à la routine de gestion de l'animation des personnages (D2Common.10349)
Sauf qu'au lieu de terminer sur le 349 classqiue les sorts en question utilise le calcul de vitesse des attaques Kick de l'assassin
[fixed]Kick Special Animation Part
0097E622 56 PUSH ESI
0097E623 E8 7841FBFF CALL D2Common.#10682
0097E628 3BC5 CMP EAX,EBP
0097E62A 8946 30 MOV DWORD PTR DS:[ESI+30],EAX
0097E62D 74 67 JE SHORT D2Common.0097E696
0097E62F 56 PUSH ESI
0097E630 E8 6B42FBFF CALL D2Common.#10683
0097E635 56 PUSH ESI
0097E636 8946 34 MOV DWORD PTR DS:[ESI+34],EAX
0097E639 896E 38 MOV DWORD PTR DS:[ESI+38],EBP
0097E63C C746 3C 00010000 MOV DWORD PTR DS:[ESI+3C],100
0097E643 E8 7842FBFF CALL D2Common.#10684
Kick Animation Length[/fixed]
C'est cette partie que je doit tracer de nouveau
J'ai juste regarder le résultat et ici le base+1 = 19 :??:
En réalité j'ai regardé un peu on a 2 animations de GetHit de 8 Frames et un arrêt de 3 frames entre les 2, mais je préfère le confirmer plus tard
[fixed]0097E648 C1E0 08 SHL EAX,8
0097E64B 8946 48 MOV DWORD PTR DS:[ESI+48],EAX
0097E64E 8D5424 20 LEA EDX,DWORD PTR SS:[ESP+20]
0097E652 8D4424 24 LEA EAX,DWORD PTR SS:[ESP+24]
0097E656 52 PUSH EDX
0097E657 8D4C24 20 LEA ECX,DWORD PTR SS:[ESP+20]
0097E65B 50 PUSH EAX
0097E65C 8B46 38 MOV EAX,DWORD PTR DS:[ESI+38]
0097E65F 8D5424 20 LEA EDX,DWORD PTR SS:[ESP+20]
0097E663 51 PUSH ECX
0097E664 8B4E 30 MOV ECX,DWORD PTR DS:[ESI+30]
0097E667 52 PUSH EDX
0097E668 55 PUSH EBP
0097E669 50 PUSH EAX
0097E66A 51 PUSH ECX
0097E66B E8 7042FBFF CALL D2Common.#10685
0097E670 6A 01 PUSH 1
0097E672 8B5424 1C MOV EDX,DWORD PTR SS:[ESP+1C]
0097E676 8B4424 20 MOV EAX,DWORD PTR SS:[ESP+20]
0097E67A 8A4C24 24 MOV CL,BYTE PTR SS:[ESP+24]
0097E67E 8956 40 MOV DWORD PTR DS:[ESI+40],EDX
0097E681 C1E0 08 SHL EAX,8
0097E684 884E 4E MOV BYTE PTR DS:[ESI+4E],CL
0097E687 BA 00400000 MOV EDX,4000
0097E68C 8BCE MOV ECX,ESI
0097E68E 8946 44 MOV DWORD PTR DS:[ESI+44],EAX
0097E691 E8 CA300000 CALL D2Common.00981760
0097E696 68 61090000 PUSH 961
0097E69B 68 F45C9A00 PUSH D2Common.009A5CF4 ; ASCII "C:\projects\D2\head\Diablo2\Source\D2Common\UNITS\Units.cpp"
0097E6A0 56 PUSH ESI
0097E6A1 E8 AA090000 CALL D2Common.#10376
10376 (Animation Speed)
0097E6A6 5F POP EDI
0097E6A7 5E POP ESI
0097E6A8 5D POP EBP
0097E6A9 B8 01000000 MOV EAX,1
0097E6AE 5B POP EBX
0097E6AF 83C4 1C ADD ESP,1C
0097E6B2 C2 0400 RETN 4[/fixed]
Bon je ne commente pas la fin car ca n'a pas d'interêt pour le moment
C'est extremement brut mais je voulais vous informer au fure t àmesure de mon avancement
A suivre