Tracer les Dlls -- La structure du jeu

B

BoulaTheBoula

Invité
Provient du message de hohorga
Boula, ici on est pas pressé évites de tout compresser : on a du mal à comprendre ce que tu écrits :)

C'est quoi le nom de la DLL pour décoder le Boula ? :razz:

THC.dll :lol:
 
T

Tony

Invité
Bon tout d'abord les remerciements...

sisi sisi sisi

bravo Myrdinn ...
bravo Paul ...

:clap: :clap: :clap:

Bon tout d'abord, quand j'ai vu le pavé, et donc de quoi cela parlé, je me suis dit qu'il fallait attendre un moment ou j'aurai du temps pour lire avec attention ( car néophyte ) et surtout tout lire. Du coup je post un peu tardivement, mais j'ai voté 5 etoiles avant meme de lire avant hier ;) donc je considere que je me suis racheté ;)

De ce fait je tiens à remercier Paul pour les bases qu’il a pris soin de nous communiquer, qui effectivement sont à mon sens très importante pour la compréhension globale. En fait, c'est quasiment à mettre en préambule des posts de Myrdinn selon moi.

Et ensuite … tes 2 posts Myrdinn. Alors en faite, je suis un peu pénible comme garçon, car je suis quelqu’un qui fonctionne par l’exemple. En gros je ne suis pas un théoricien, mais plutôt un expérimentateur pour les hommes de sciences. J’ai donc beaucoup de mal à comprendre tes posts de façon précise. Si je puis me permettre, l’expression, je ne les comprends que de façon grossière, car je vois de ce dont tu parles, mais je ne peux rien coller comme image dessus. En fait, je comprends le fonctionnement, je comprends comment cela marche, mais je ne visualise pas du tout le fonctionnement en pratique, et donc du coup cela m’empêche de véritablement assimilé l’ensemble. Il me faudrait un exemple issu d’une dll réel et retranscrit tel quel avec en commentaire une comparaison point à point avec ta description. Je sais toutefois que tu ne l’as pas fait par peur de rebuter les débutants, et que tu projettes évidemment de le faire incessamment sous peu, mais je suis naturellement pressé pour toutes les choses qui m’intéresse. ;)

(dsl pour les fautes d’ortho///plus de tps pour corriger)
 
M

Myrdinn

Invité
Merci à toi Tony.
C'est vrai que c'est difficile à aborder sans exemple.
Mais je me répète, je ne pouvais pas commencer directement en assembleur sur un trace, déjà je rebuterais 95% de l'auditoire potentiel et le post partirais dans tous les sens.

Pour l'instant je me contente de décrire les bases même s'il est difficile de les comprendre d'un premier abord.
Si je puis me permettre, l’expression, je ne les comprends que de façon grossière, car je vois de ce dont tu parles, mais je ne peux rien coller comme image dessus
C'est pour l'instant mon but :D JE veux juste que vous compreniez un peu les bases. Ensuite l'exemple devrait être plus abordables et vous permettra de relire les bases plus facilement. Ca n'a rien d'évident, d'autant que je ne suis pas professeur ni formateur de métier :)

Un petit corrolaire qui m'a guidé dans ma décision. Admettons que je vous présente non pas un trace mais des mathématiques.
Si je commence directement par un exercice (Concret) personne ne va suivre , sauf ceux qui connaisse déjà.
Si je commence par le cours, vous ne verrez pas tout de suite ou je veux en venir et vous aurez peut être du mal a assimiler mais dès que l'on passera à l'exercice ca deviendra plus clair.
Puis en relisant le tout mon transfert de compétence sera peut etre un succès.

Encore une fois, plus vous etes nombreux à réagir, plus j'essayerais de m'adapter à vos besoin. Bien que je ne réponde pas tout de suite à ton attente, je suis content de vos remarques et j'en tient compte pour la suite.
 
D

Darkios

Invité
Félicitations pour Myrdinn :)

C'est excellent de commencer par la théorie avant les exemples et exercices.

Même si tu n'es pas professeur, tu as quand même la bonne méthode.
 
M

Mescalito

Invité
Merci, on attend impatiemment la suite ;)

Provient du message de Myrdinn

Puis en relisant le tout mon transfert de compétence sera peut etre un succès.

Jolie formule :D
j'aurais surement des questions quand on arrivera à la pratique
 
H

hohorga

Invité
On va alors peut être rappeller à Tony ce qu'est une DLL.

Une DLL est "normalement" du code compilé qui est mis à disposition de tout le monde pour le réutiliser.

Je prend un exemple : tu écrits une série de fonctions mathématiques que tu veux donner librement à tout le monde. Tu vas donner le code source et les programmeurs qui en auront besoin vont l'intégrer à leur programme.

Or si un bug se trouve dans ton code source tous les programmeurs vont devoir recompiler leurs programmes, et comme il n'y a pas le même suivi de tous les développeurs il risque d'y avoir dans la nature de nombreuses applications buggés.

D'ou l'idée de regrouper dans un même fichier, dans une même librairie, des ensembles de routines traitant généralement d'un même sujet. De plus ces routines sont appellée selon un protocole standardisé.

Ainsi quand tu corriges tes bugs tu recompiles ta librairie et la met à disposition des utilisateurs : le développeur de l'application principale ne fait rien et le bug est corrigé.

Tu peux aussi ajouter de nouvelles fonctions à ta librairie.

L'avantage d'une dll est aussi que le développeur qui l'utilise n'a même pas besoin de savoir comment la librairie fonctionne en interne il doit juste savoir comment appeler chacune de ses fonctions. De plus le programme qui appelle ta librairie peut être développé en n'importe quel langage de developpement et vice versa.

--- Là ça devient plus compliqué accrochez vous ---

Imaginons que ta librairie mathématique soit une librairie de calcul rapide.

Tu écrits donc un code hyper optimisé en assembleur et fournis un ensemble d'appels à cette librairie aux autres développeurs qui ne connaissent peut être rien à l'assembleur.

Parmis ces fonctions il y a l'addition et la multiplication.

Le gars qui utilise ta librairie a ta doc et voit des fonctions du style en langage C ANSI :
float FastAdd(float A, float B, int *Error);
float FastMul(fload B, float B, int *Error);

Dans ta doc de la librairie tu as dit :
FastAdd et FastMul reçoivent 3 valeurs les deux premières sont les valeurs a traiter, la seconde est un pointeur vers une variable (variable = zone mémoire) qui contiendra un code d'erreur ou zéro. Ces deux fonctions retournent une valeur qui sera prise en compte si Error est égale à zéro.

Donc moi en tant que développeur qui n'ai pas de notions de mathétiques dans un contexte assembleur (va donc calculer des sinus et cosinus en assembleur si tu met à dispo de telles focntionnalités) je vais lire ta doc, dire à mon programme (je reste simple mais c'est au linker) "Voila il faut que tu fasse appelle à la librairie math rapide qui s'appelle supermath". ensuite je vais utiliser ta librairie :

Code:
#include supermath.h

float CalculBidon(float BidonA, float BidonB, int *erreur)
{
   float Resultat;
   Resultat=FastAdd(BidonA,BidonB,erreur);
   if (erreur==0)
   {
      return FastMul(Resultat,BidonA,erreur);
   }
   else
     return 0;
}
(bon le code n'est pas testé il est peut-être bourré d'erreurs)

N'essayes pas de le comprendre mais sachez que je fait une fonction qui attend deux valeurs et un pointeur vers un code d'erreur, je tente une addition rapide des deux valeurs si y'a pas d'erreur je tente une multiplication du résultat obtenu avec la première valeur et retourne le résultat. Ceci sachant que je retourne aussi via un pointeur le code d'erreur ou zéro.

Mais vous remarquerez que nulle part je ne présume du fonctionnement des fonctions d'additions et de multiplication : je sais qu'elles additionnent et multiplient mais pas comment.

Bon j'arrête j'ai raté un RER :o
 
T

Tony

Invité
C'est super embettant de repondre si simplement à un post qui a du te prendre bcp de temps hohorga, mais j'ai tout compris :) merci bcp bcp bcp :clap: :clap: :clap:

J'étais loin de m'imaginer qu'une DLL servait a cela et donc du coup je ne vois pas trop l'interet de Blizzard d'en inclure dans Diablo2 . Autant je comprends nettement l'interêt des dll dans un logiciel comme windows, autant dans diablo 2, je vois pas ...

Blizzard a fait cela volontairement pour favoriser le moding, donc si je comprends bien, n'est ce pas ?

(sinon pour les bouts de code, cela ne me derange pas du tout, puisque je fais du php et un peu de perl)
 
M

Myrdinn

Invité
Provient du message de Tony

Blizzard a fait cela volontairement pour favoriser le moding, donc si je comprends bien, n'est ce pas ?
Euh non (quoique certainement un peu vu le nombre d'info qu'il laisse trainé dans les Dlls). Justement pour ne pas avoir à réécrire sans cesse les choses qui ne bougent pas ou presque depuis les premiers patch (Lire le IlvL de tel objet, calcule lles %ED de la maitrise à partir des MPQs ...) Bref la plupart des fonctions générales(D2common.dll) n'ont pas bougés depuis les premiers patch ou depuis l'extension. Ensuite il fallait séparer le client (D'ou le D2client.dll) du serveur (D2game.dll) car suivant les cas elles sont chargées en mémoire sur le client et/ou serveur. Ensuite la partie graphisme n'a presque pas évoluée, bref pas la peine de déplacer ou réécrire la partie graphique, donc la d2GFX.dll reste inchangée. Si tu mets tout dans la même Dll alors il faut, a chaque fois que tu insère une nouvelle fonction que tu réécrives les table d'exportation et les appels internes. Bref beaucoup de bonne raison de séparé les fonctions dans plusieurs Dlls
 
P

Paul Siramy

Invité
Juste pour info :

La dll storm.dll qui est généralement utilisée pour accéder aux mpq contient beaucoup d'autres fonctions intéressantes. Ainsi on y trouve des fonctions s'occupant d'allouer et de libérer de la mémoire, d'ouvrir un fichier, etc... toutes ces choses que le programmeur à déjà a sa disposition sans avoir besoin de cette dll. Alors pourquoi faire un mini système d'exploitation dans cette dll ? Pour que le jeu soit indépendant de l'OS sur lequel il tourne. D2 sur PC appelle des fonctions dans storm.dll, et sur MAC le jeu utiliseras les MEMES fonctions, de la même manière, mais c'est dans la dll que les changements tenant compte de l'OS sont fait.

storm.dll sur PC est différent de storm.bin sur MAC, mais les fonctions (les "services" offerts) sont les mêmes. C'est du boulot à faire en amont (il faut bien préparer storm.dll), mais une fois que c'est fait c'est bon, le jeu n'a plus à se préocuper de savoir s'il marche sur PC ou MAC, le code source est le même (ou alors pratiquement le même), donc on a plus 2 versions à gérer mais une seule. Merci storm.dll, qui s'occupe des particularités de chaque OS et fourni une plateforme de dévelppement standard pour le reste du jeu.

Autre aspect intéressant des dll : différents programmes peuvent utiliser la même dll en même temps. Les vbrun.dll par exemple sont des bibliothèques offrant des services pour les applications visual basic. Tu ne l'as qu'une fois sur ton disque. Mais tu peut lancer 10 programmes fait en Visual Basic, ils feront appel à une et une seule dll. D'où uniformité et gain de place (surtout en mémoire, puisque les disques dur sont énormes de nos jours).
 
T

Tony

Invité
Merci Paul de cette précision. Je comprends effectivement mieux maintenant l'intérêt pour blizzard de ces dll. Il est vrai qu'elles prennent véritablement tous leurs sens lorsque l'on parle de multi-platformes...

Merci, par la même occasion de m'avoir rappelé cette tonitruante époque ancestrale ou notamment sous win 3.11, certain jeu ou certain programme nous demandaient, systématiquement la série des vbrun100, vbrun200 et vbrun300.dll . Il a fallut attendre win95 pour les voir d'office avec Windows :rolleyes:
 
M

Myrdinn

Invité
Si ca continue, je vais bientôt avoir du mal à suivre mon propre post :lol:
 
M

Myrdinn

Invité
Mais le temps de poster les images sur mon FTP, de relire et purger (car trop long à mon gout) j'ai décidé de le faire partie par partie sur aujourd'hui et demain. Avec de la chance le premier trace déjà écrit sera disponible ce week-end (si j'ai le temps de me connecter)
 
S

Simon33

Invité
[...]

Maintenant l'exemple
L'UNIT Dégat

+00 Flags
..........1) Annule les dégats physiques 0=non 1=oui (Pareil pour toute la suite)
..........2) Annule tous les dégats
..........4) Annule le vol de vie
..........8) Annule le vol de mana
.........10) Annule le vol de stamina
.........20) ????
.........40) Berserk Actif
Bref si la valeur est 5 les dégats physiques et vol de vie sont annulés dans la procédure de combat. Autre remarque seul
le premier byte est utilisé sur les 4

+04 REsultat du coup
..........1) Touché
..........2) Dégats > Point de vie de la cible
..........4) Attaque "ne peut etre interrompue" Concentration par exemple
..........8) Knockback
.........10) Block (Annule 1)
.........20) Coup critique
.........40) Thorn
.........80) Dodge (Annule 1)
........100) Avoid (Annule 1)
........200) Evade (Annule 1)
........400) Iron Maiden
........800) Life Tap
.......1000) Annule attaque ne peut être interrompue (Annule 4)
.......2000) Coup critique
.......4000) Graphisme associé au coup reçu

+08 Dégats Physiques
+0c +Dégats physiques %
+10 Dégats de feu
+14 Dégat de brulure
+18 Durée de brulure
+1c Dégats de Foudre
+20 Dégats Magiques
+24 Dégats de Froid
+28 Dégats de poison
+2c Durée du poison
+30 Durée de chill
+34 Durée de Freeze
+38 Vol de vie
+3c Vol de mana
+40 Vol de stamina
+44 Durée de Stun
+48 Dégats Absorbés
+4c Dégats Totaux


[...]
  Je sais que ce point a été abordé dans les posts suivants (non sans quelques anicroches), mais je tenais à lancer mon petit caillou inutile dans la mare.

Voici un exemple de notation qui d'après moi est moins nébuleux pour un néophyte (bien que prenant plus de place à la rédaction) :
[...]

Maintenant l'exemple
L'UNIT Dégat

Dword en +00 : Flags
0x01 = 0b_0000_0001 ) Annule les dégats physiques : 0=non 1=oui (Pareil pour toute la suite)
0x02 = 0b_0000_0010 ) Annule tous les dégats
0x04 = 0b_0000_0100 ) Annule le vol de vie
0x08 = 0b_0000_1000 ) Annule le vol de mana
0x10 = 0b_0001_0000 ) Annule le vol de stamina
0x20 = 0b_0010_0000 ) ????
0x40 = 0b_0100_0000 ) Berserk Actif
Bref, si la valeur est 0x05 = 0b_0000_0101, les dégats physiques et vol de vie sont annulés dans la procédure de combat. Autre remarque : de par le codage 'little endian' utilisé, seul le premier (le LSB, le plus faible) des 4 bytes du dword est utilisé.

Dword en +04 : Résultat du coup
0x0001 = 0b_0000_0000_0000_0001 ) Touché
0x0002 = 0b_0000_0000_0000_0010 ) Dégats > Point de vie de la cible
0x0004 = 0b_0000_0000_0000_0100 ) Attaque "ne peut être interrompue" (Concentration par exemple)
0x0008 = 0b_0000_0000_0000_1000 ) Knockback
0x0010 = 0b_0000_0000_0001_0000 ) Block (Annule 0x0001)
0x0020 = 0b_0000_0000_0010_0000 ) Coup critique
0x0040 = 0b_0000_0000_0100_0000 ) Thorn
0x0080 = 0b_0000_0000_1000_0000 ) Dodge (Annule 0x0001)
0x0100 = 0b_0000_0001_0000_0000 ) Avoid (Annule 0x0001)
0x0200 = 0b_0000_0010_0000_0000 ) Evade (Annule 0x0001)
0x0400 = 0b_0000_0100_0000_0000 ) Iron Maiden
0x0800 = 0b_0000_1000_0000_0000 ) Life Tap
0x1000 = 0b_0001_0000_0000_0000 ) Annule attaque ne peut être interrompue (Annule 0x0004)
0x2000 = 0b_0010_0000_0000_0000 ) Coup critique
0x4000 = 0b_0100_0000_0000_0000 ) Graphisme associé au coup reçu
De même, seul le premier word (le LSW) est ici utilisé.

Dwords en :
+08 : Dégats Physiques
+0C : + Dégats physiques %
+10 : Dégats de feu
+14 : Dégat de brûlure
+18 : Durée de brûlure
+1C : Dégats de Foudre
+20 : Dégats Magiques
+24 : Dégats de Froid
+28 : Dégats de Poison
+2C : Durée du Poison
+30 : Durée de Chill
+34 : Durée de Freeze
+38 : Vol de vie
+3C : Vol de mana
+40 : Vol de stamina
+44 : Durée de Stun
+48 : Dégats Absorbés
+4C : Dégats Totaux

Par contre, ici, le dword représente directement la valeur dont il est question, valeur pouvant donc aller de ??? à ???.

[...]
Les ??? sont dus au fait que je ne sais pas si le programme utilise ces dword en arithmétique signée (de -(2^31) = - 2 147 483 648 à 2^31 - 1 = 2 147 483 648) ou non (de 0 à 2^32 - 1 = 4 294 967 295) ...
Quel est la réponse du Maître ?


@++


[edit]Yeepeekaï ! J'ai la 33ème réponse ![/edit]
 
M

Myrdinn

Invité
Provient du message de Simon33
Voici un exemple de notation qui d'après moi est moins nébuleux pour un néophyte (bien que prenant plus de place à la rédaction):Les ??? sont dus au fait que je ne sais pas si le programme utilise ces dword en arithmétique signée (de -(2^31) = - 2 147 483 648 à 2^31 - 1 = 2 147 483 648) ou non (de 0 à 2^32 - 1 = 4 294 967 295) ...
Quel est la réponse du Maître ?


@++


[edit]Yeepeekaï ! J'ai la 33ème réponse ![/edit]
Ok c'est peut être plus parlant surtout pour l'aspect booléen des flags. En tout cas c'est une bonne idée pour la première approche, si j'aborde les différents Unit du jeu je pense que cette notation deviendra lourde.
Bref je vais laisser les 2 pour l'instant. La tienne pour la clarté et la mienne pour le mode compact :D

La plupart du temps ils sont signés, mais il existe de nombreuses exceptions..
 
S

Small Bug

Invité
[quotemsg=1692889,0,1791]
Un byte est composé de 8 bits.
Un word est composé de 2 octets, donc 16 bits (on sert pas souvent)
Un dword est composé de 2 words, donc de 2 bytes, donc 32 bits.
[/quotemsg]

Hop, une petite faute de frappe s'est glissée, un dword vaut 4 bytes (ou octets) et non 2.

 
M

Myrdinn

Invité
Oups je corrige ;)


EDIT A non je ne peux pas corriger c'est dans le texte de Paul :lol:

 
M

Mescalito

Invité
:ouch:

J'suis impressionné de te voir encore à l'oeuvre Myrdinn.
Ce sujet a quasiment 3 ans !

Ah plein de souvenir ^^

Salutations et bonne continuation.
:hello:

PS : on a besoin d'un comme toi pour WoW :D mais je sais même pas si c'est possible d'aller aussi loin avec du code client/serveur
 
M

Myrdinn

Invité
Lut' MEescalito
Oui il a été remonté par SmallBug, mais j'ai des sujets techniques bien plus vieux ;)

Désolé je n'ai pas WOW, il y a probablement des tas de choses à apprendre du client et des communications, mais il faut trouver dans ce cas une autre personne que moi :)
 
Haut