Autre Question sur les .d2p

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#1
Bonjour,

Je décode les fichiers d2p et j'ai quelques petites questions.
Je sais que ce sont des conteneurs, et pour l'instant je n'ai trouvé que des fichiers map .dlm et des images .jpg à l'intérieur (j'ai traduit PakProtocol2.as).

Par contre, d'après moi, le dictionnaire indexes ne sera rempli que lorsque tous les links (contenus dans le dictionnaire properties) auront été lus, donc on ne lira que les indexes du dernier fichier ouvert (celui qui ne contient pas de link dans les properties).
Cela voudrait dire que les autres d2p ne servent à rien, alors que je peux lire des fichiers dedans quand j'ignore le link.

Je comprends pas trop. Est-ce que quelqu'un pourrait m'aider svp ?

Voici le code de PakProtocol2.as (la fonction intéressante est load) :
Code:
package com.ankamagames.jerakine.resources.protocols.impl
{
   import com.ankamagames.jerakine.resources.protocols.AbstractProtocol;
   import com.ankamagames.jerakine.resources.protocols.IProtocol;
   import flash.utils.Dictionary;
   import com.ankamagames.jerakine.logger.Logger;
   import com.ankamagames.jerakine.logger.Log;
   import flash.utils.getQualifiedClassName;
   import com.ankamagames.jerakine.types.Uri;
   import com.ankamagames.jerakine.resources.IResourceObserver;
   import com.ankamagames.jerakine.newCache.ICache;
   import flash.filesystem.FileStream;
   import flash.utils.ByteArray;
   import com.ankamagames.jerakine.resources.ResourceErrorCode;
   import flash.filesystem.File;
   import flash.filesystem.FileMode;
   
   public class PakProtocol2 extends AbstractProtocol implements IProtocol
   {
      
      public function PakProtocol2()
      {
         super();
      }
      
      private static var _indexes:Dictionary = new Dictionary();
      
      private static var _properties:Dictionary = new Dictionary();
      
      protected static const _log:Logger = Log.getLogger(getQualifiedClassName(PakProtocol2));
      
      public function getFilesIndex(uri:Uri) : Dictionary
      {
         var fileStream:* = _indexes[uri.path];
         if(!fileStream)
         {
            fileStream = this.initStream(uri);
            if(!fileStream)
            {
               return null;
            }
         }
         return _indexes[uri.path];
      }
      
      public function load(uri:Uri, observer:IResourceObserver, dispatchProgress:Boolean, cache:ICache, forcedAdapter:Class, uniqueFile:Boolean) : void
      {
         var fileStream:FileStream = null;
         if(!_indexes[uri.path])
         {
            fileStream = this.initStream(uri);
            if(!fileStream)
            {
               if(observer)
               {
                  observer.onFailed(uri,"Unable to find container.",ResourceErrorCode.PAK_NOT_FOUND);
               }
               return;
            }
         }
         var index:Object = _indexes[uri.path][uri.subPath];
         if(!index)
         {
            if(observer)
            {
               observer.onFailed(uri,"Unable to find the file in the container.",ResourceErrorCode.FILE_NOT_FOUND_IN_PAK);
            }
            return;
         }
         fileStream = index.stream;
         var data:ByteArray = new ByteArray();
         fileStream.position = index.o;
         fileStream.readBytes(data,0,index.l);
         getAdapter(uri,forcedAdapter);
         try
         {
            _adapter.loadFromData(uri,data,observer,dispatchProgress);
         }
         catch(e:Object)
         {
            observer.onFailed(uri,"Can\'t load byte array from this adapter.",ResourceErrorCode.INCOMPATIBLE_ADAPTER);
            return;
         }
      }
      
      override protected function release() : void
      {
      }
      
      override public function cancel() : void
      {
         if(_adapter)
         {
            _adapter.free();
         }
      }
      
      private function initStream(uri:Uri) : FileStream
      {
         var fs:FileStream = null;
         var vMax:* = 0;
         var vMin:* = 0;
         var dataOffset:uint = 0;
         var dataCount:uint = 0;
         var indexOffset:uint = 0;
         var indexCount:uint = 0;
         var propertiesOffset:uint = 0;
         var propertiesCount:uint = 0;
         var propertyName:String = null;
         var propertyValue:String = null;
         var i:uint = 0;
         var filePath:String = null;
         var fileOffset:* = 0;
         var fileLength:* = 0;
         var idx:* = 0;
         var fileUri:Uri = uri;
         var file:File = fileUri.toFile();
         var indexes:Dictionary = new Dictionary();
         var properties:Dictionary = new Dictionary();
         _indexes[uri.path] = indexes;
         _properties[uri.path] = properties;
         while((file) && (file.exists))
         {
            fs = new FileStream();
            fs.open(file,FileMode.READ);
            vMax = fs.readUnsignedByte();
            vMin = fs.readUnsignedByte();
            if((!(vMax == 2)) || (!(vMin == 1)))
            {
               return null;
            }
            fs.position = file.size - 24;
            dataOffset = fs.readUnsignedInt();
            dataCount = fs.readUnsignedInt();
            indexOffset = fs.readUnsignedInt();
            indexCount = fs.readUnsignedInt();
            propertiesOffset = fs.readUnsignedInt();
            propertiesCount = fs.readUnsignedInt();
            fs.position = propertiesOffset;
            file = null;
            i = 0;
            while(i < propertiesCount)
            {
               propertyName = fs.readUTF();
               propertyValue = fs.readUTF();
               properties[propertyName] = propertyValue;
               if(propertyName == "link")
               {
                  idx = fileUri.path.lastIndexOf("/");
                  if(idx != -1)
                  {
                     fileUri = new Uri(fileUri.path.substr(0,idx) + "/" + propertyValue);
                  }
                  else
                  {
                     fileUri = new Uri(propertyValue);
                  }
                  file = fileUri.toFile();
               }
               i++;
            }
            fs.position = indexOffset;
            i = 0;
            while(i < indexCount)
            {
               filePath = fs.readUTF();
               fileOffset = fs.readInt();
               fileLength = fs.readInt();
               indexes[filePath] = {
                  "o":fileOffset + dataOffset,
                  "l":fileLength,
                  "stream":fs
               };
               i++;
            }
         }
         return fs;
      }
   }
}
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#2
UP ?
 

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#3
Je crois que j'ais rien compris a ta question tu peut étre plus claire?
 

Lakh92

Membre Actif
Inscrit
24 Decembre 2009
Messages
118
Reactions
0
#4
Le dictionnaire contient en fait une paire pour chaque fichier. La clé de cette paire est le nom du fichier, sa valeur est un autre dictionnaire qui, lui, contient les indexes.
Donc tu peux gérer autant de fichier que tu veux.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#5
En effet, ce n'est pas ça le problème, j'arrive à lire les dictionnaires.
Seulement, je ne comprends pas comment c'est codé, parce que pour moi, on ne lit jamais le dictionnaire contenu dans un fichier qui contient un "link" dans ses properties.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#7
Merci alexander, mais j’ai l’impression que tu as mis le mauvais code : ça c’est pour transformer les fichiers dlm en maps, pas pour lire les d2p et obtenir les dlm...
Ce code correspond plus ou moins à la class map.as...
 

Lakh92

Membre Actif
Inscrit
24 Decembre 2009
Messages
118
Reactions
0
#8
Labo a dit:
En effet, ce n'est pas ça le problème, j'arrive à lire les dictionnaires.
Seulement, je ne comprends pas comment c'est codé, parce que pour moi, on ne lit jamais le dictionnaire contenu dans un fichier qui contient un "link" dans ses properties.
Là tu m'as perdu. Quel processus tu ne comprends pas, avec un exemple concret ?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#9
Labo a dit:
Merci alexander, mais j’ai l’impression que tu as mis le mauvais code : ça c’est pour transformer les fichiers dlm en maps, pas pour lire les d2p et obtenir les dlm...
Ce code correspond plus ou moins à la class map.as...
en fait quand tu lis le d2p tu pars un index et d'une taille (d'apres mes souvenirs) , cherche pas a comprendre les data directement car c'est en fait des fichiers .zip , tu les decompresses (en memoire ou fichiers) et apres tu y verras plus claire
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#10
Moi je cherche à obtenir les dlm et je les ai, sauf que je comprends pas pourquoi on ne lit jamais les dlm contenus dans un fichier qui contient une propertie link.
Alexandre m'a dit qu'il s'était jamais occupé des link...
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#11
J'avais mal lu le code !!! La boucle while((file) && (file.exists)) englobe tout donc il y a pas de problème !
 
Haut Bas