Que contiennent les fichiers d2o, concrètement ?

Inscrit
14 Juin 2017
Messages
23
Reactions
0
#1
Salut à toutes et à tous !

Je suis actuellement en train de m'amuser à décompiler les fichiers d2o. (Si jamais ça intéresse, le taf actuel est dispo ici : https://github.com/telokis/dtojson)
En parsant, par exemple, le fichier RideFood.d2o, je génère un json comme celui-ci :

JavaScript:
{
    "indexes": {
        "1": 55,
        "2": 67,
        "3": 7,
        "4": 19,
        "5": 31,
        "6": 43,
        "7": 79,
        "9": 91
    },
    "classes": {
        "1": {
            "_class": "com.ankamagames.dofus.datacenter.mounts.RideFood",
            "_fields": [
                {
                    "name": "gid",
                    "type": "INT"
                },
                {
                    "name": "typeId",
                    "type": "INT"
                }
            ]
        }
    }
}
(Je précise que je suis 100% auteur du parseur, je me suis basé sur le fichier GameDataFileAccessor.as que j'ai extrait de l'invoker. J'ai déduit les mots "indexes", "classes" et "fields" du code)

J'ai deux questions auxquelles vous pourrez peut-être répondre :

- Que sont les index que je récupère ? Ma théorie est que ça indique les offsets auxquels sont les "vraies" données dans le fichier. Mais du coup à quoi correspond la clé du dictionnaire ? Un simple identifiant ?

- Pourquoi est-ce que la définition de la classe est stockée dans le fichier d2o alors qu'elle est présente dans le code source. (En l'occurrence la classe com.ankamagames.dofus.datacenter.mounts.RideFood contient justement un gid et un typeID. (Ils sont UINT au lieu de INT mais je pense que c'est une erreur bénigne de la part d'Ankama)

En me lançant là-dedans, je m'attendais "juste" à trouver les différentes données du jeu, je suis surpris de voir que ce n'est pas aussi direct qu'il me semblait.

J'espère que vous pourrez éclairer ma chandelle !

Merci d'avance.
 

nowis13

Contributeur
Inscrit
11 Janvier 2015
Messages
22
Reactions
1
#2
De tête, il me semble que dans la premiere partie du fichier (celle que tu lis) il y'a les "classes" qui contiennent des "fields".
C'est la structures des données qui vont suivre. Il faut la charger en mémoire et s'en servir pour parser le reste du fichier.

Que sont les index que je récupère ?
Les index ne sont pas indispensablement il me semble. Il doivent être utilisés quand on veut accéder à un objet sans charger tout le fichier en mémoire.

Pourquoi est-ce que la définition de la classe est stockée dans le fichier d2o alors qu'elle est présente dans le code source ?
Bonne question. Peut-être pour avoir un code pour lire/écrire les fichiers plutôt court, séparer le format et les versions du jeu.

Tu peux trouver une implementation/traduction en python du code client dans ce projet https://github.com/LuaxY/PyDofus
 

neross

Membre Actif
Inscrit
20 Decembre 2014
Messages
150
Reactions
0
#3
Les 'indexes' c'est le nombre de byte ou ce trouve les infos. Tu dois décaler de x bytes vers la droite pour trouver ou lire.
La variable '_class' c'est la class conteneur dans DofusInvoker.
Les '_fields' ce sont les variables a lire.

Pourquoi ce système seul les développeurs d'Ankama pourrons te dire pourquoi ils ont fais ça comme ça. :)
Les indexes sont pratique car il te suffis de lire les indexes décharger les bytes et aller read uniquement ceux qu'il te faut.
Apres les fields permettent de lire n'importe quel fichier d2o tout en assignant dynamiquement les variables. Du coup ça te fait 1 parser pour 100 object différent. :)
Pour le reste faut demander aux devs d'Ankama . ^^
 
Haut Bas