<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://t4ctech.hyperion-roleplay.com/index.php?action=history&amp;feed=atom&amp;title=Fichiers_DDA</id>
	<title>Fichiers DDA - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://t4ctech.hyperion-roleplay.com/index.php?action=history&amp;feed=atom&amp;title=Fichiers_DDA"/>
	<link rel="alternate" type="text/html" href="https://t4ctech.hyperion-roleplay.com/index.php?title=Fichiers_DDA&amp;action=history"/>
	<updated>2026-07-10T05:45:58Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://t4ctech.hyperion-roleplay.com/index.php?title=Fichiers_DDA&amp;diff=21&amp;oldid=prev</id>
		<title>FunJp : Page créée avec « == Format des fichiers DDA == Les fichiers .DDA, .DID et .DPD sont les librairies graphique du jeu, elles contiennent l&#039;ensemble des sprites et images utilisés dans le je... »</title>
		<link rel="alternate" type="text/html" href="https://t4ctech.hyperion-roleplay.com/index.php?title=Fichiers_DDA&amp;diff=21&amp;oldid=prev"/>
		<updated>2016-02-25T18:53:41Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « == Format des fichiers DDA == Les fichiers .DDA, .DID et .DPD sont les librairies graphique du jeu, elles contiennent l&amp;#039;ensemble des sprites et images utilisés dans le je... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Format des fichiers DDA ==&lt;br /&gt;
Les fichiers .DDA, .DID et .DPD sont les librairies graphique du jeu, elles contiennent l&amp;#039;ensemble des sprites et images utilisés dans le jeu.&lt;br /&gt;
&lt;br /&gt;
Chaque fichiers possèdes sa propre clé de cryptage sauf les fichiers .dda qui ne possède qu&amp;#039;un cryptage sur l&amp;#039;entête de chaque sprite.&lt;br /&gt;
&lt;br /&gt;
A l&amp;#039;intérieur, les éléments sont organisés à l&amp;#039;aide d&amp;#039;un système de noms de fichiers et répertoires. On notera aussi qu&amp;#039;il existe deux grands groupes: les palettes et les sprites(données graphiques).&lt;br /&gt;
=== Identification des fichiers ===&lt;br /&gt;
Fichier DPD =&amp;gt; Contenu de la palette ainsi que de son nom Fichier DID =&amp;gt; Contenu des répertoires, noms des images, offset de lecture des images, numéro du fichier dda Fichier DDA =&amp;gt; Contenu des graphiques.&lt;br /&gt;
=== Décodage des fichiers dpd, did et dda ===&lt;br /&gt;
Pour les fichiers .dpd et .did chacun d&amp;#039;entre eux possède sa propre clé de décryptage, quand aux fichiers .dda, seul l&amp;#039;entête des sprites et cryptée avec une clé particulière.&lt;br /&gt;
&lt;br /&gt;
Routine de décryptage des fichiers .dpd et .did :&lt;br /&gt;
En C :&lt;br /&gt;
&amp;lt;pre&amp;gt;  for(i = 0; i &amp;lt; taille; i++) donnees[i] ^= clef;&amp;lt;/pre&amp;gt;&lt;br /&gt;
En Delphi :&lt;br /&gt;
&amp;lt;pre&amp;gt;  For I := 0 To Taille Do Donnees[I] := Donnees[I] Xor Clef;&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Décodage du fichier .dpd ====&lt;br /&gt;
C&amp;#039;est un stream, il faut lire l&amp;#039;entête sur une longueur de 0x29 (41 déci) ensuite il faut prendre le reste du fichier et effectuer une décompression Zlib dessus. une fois la décompression Zlib faite, il faut faire un xor 0x66 sur chaques bytes des données.&lt;br /&gt;
&lt;br /&gt;
Pour connaître le nombre de palette il suffit de faire la taille des données décompressée Zlib / (64 + 768).&lt;br /&gt;
==== Décodage du fichier .did ====&lt;br /&gt;
C&amp;#039;est un stream, il faut lire l&amp;#039;entête sur une longueur de 0x29 (41 déci) ensuite il faut prendre le reste du fichier et effectuer une décompression Zlib dessus. une fois la décompression Zlib faite, il faut faire un xor 0x99 sur chaques bytes des données.&lt;br /&gt;
&lt;br /&gt;
Pour connaître le nombre de nom de sprite il suffit de faire la taille des données décompressée Zlib / (64 + 256 + 4 + 8).&lt;br /&gt;
==== Décodage du fichier x.dda ====&lt;br /&gt;
Il n&amp;#039;y as pas besoin de plus au niveau des chargement ! il suffit de charger ensuite les X fichiers dda en stream et travailler directement dedans ! grâce à l&amp;#039;indexation qui est utilisée, donc 4 + l&amp;#039;indexation donne le début de l&amp;#039;entête du sprite choisi !&lt;br /&gt;
=== Clef de décodage ===&lt;br /&gt;
Clef de décodage pour le fichier .did :&lt;br /&gt;
&amp;lt;pre&amp;gt;  ClefDid = $99;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Clef de décodage pour le fichier .dpd :&lt;br /&gt;
&amp;lt;pre&amp;gt;  ClefDpd = $66;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Clef de décodage pour l&amp;#039;entête d&amp;#039;un fichier x.dda&lt;br /&gt;
&amp;lt;pre&amp;gt;CleSignature = $9966;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Clef de décodage pour les entête de sprites de fichiers x.dda :&lt;br /&gt;
&amp;lt;pre&amp;gt;  ClefDda : Array [0..6] Of DWord = ($1458AAAA, $62421234, $F6C32355, $AAAAAAF3, $12344321, $DDCCBBAA, $AABBCCDD);&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Structure des fichiers ===&lt;br /&gt;
Pour plus de facilité, j&amp;#039;ai mis les structures en français car je fais une allergie à la communauté T4C américaine à l&amp;#039;heure où je rédige cette page.&lt;br /&gt;
==== Structure du fichier dpd ====&lt;br /&gt;
&amp;lt;pre&amp;gt;  PStructurePalette = ^StructurePalette;&lt;br /&gt;
  StructurePalette = Record&lt;br /&gt;
    Nom : Array [0..63] Of Char;&lt;br /&gt;
    Pixels : Array [0..255] Of Record&lt;br /&gt;
      Rouge : Byte;&lt;br /&gt;
      Vert : Byte;&lt;br /&gt;
      Bleu : Byte;&lt;br /&gt;
    End;&lt;br /&gt;
  End;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;  PStructureDpd = ^StructureDpd;&lt;br /&gt;
  StructureDpd = Record&lt;br /&gt;
    HashMd5 : Array [0..15] Of Byte;&lt;br /&gt;
    TailleDecompressee : LongInt;&lt;br /&gt;
    TailleCompressee : LongInt;&lt;br /&gt;
    HashMd52 : Array [0..16] Of Byte;&lt;br /&gt;
    Palettes : Array Of StructurePalette;&lt;br /&gt;
    CheckSum : Byte;&lt;br /&gt;
    NbEntree : LongInt;&lt;br /&gt;
  End;&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Structure du fichier did ====&lt;br /&gt;
&amp;lt;/pre&amp;gt;  PStructureNomsSprites = ^StructureNomsSprites;&lt;br /&gt;
  StructureNomsSprites = Record&lt;br /&gt;
    Nom : Array [0..63] Of Char;&lt;br /&gt;
    Chemin : Array [0..255] Of Char;&lt;br /&gt;
    Indexation : LongInt;&lt;br /&gt;
    NumDda : cardinal;&lt;br /&gt;
    padding: cardinal;&lt;br /&gt;
  End;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;  StructureDid = Record&lt;br /&gt;
    HashMd5 : Array [0..15] Of Byte;&lt;br /&gt;
    TailleDecompressee : LongInt;&lt;br /&gt;
    TailleCompressee : LongInt;&lt;br /&gt;
    HashMd52 : Array [0..16] Of Byte;&lt;br /&gt;
    NomsSprites : Array Of StructureNomsSprites;&lt;br /&gt;
    CheckSum : Byte;&lt;br /&gt;
    NbEntree : LongInt;&lt;br /&gt;
  End;&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Structure des fichiers dda ====&lt;br /&gt;
&amp;lt;pre&amp;gt;  PStructureSprites = ^StructureSprites;&lt;br /&gt;
  StructureSprites = Record&lt;br /&gt;
    Donnees : Array Of Byte; // Données du sprite&lt;br /&gt;
    Case Integer Of&lt;br /&gt;
      0 : (&lt;br /&gt;
        TypeSprite : Word; // Type du sprite 1 : Normal; 2 : Compresser; 3 : Vide; 9 : Double Compression&lt;br /&gt;
        Ombre : Word; // Ombre&lt;br /&gt;
        Largeur : Word; // Largeur du sprite&lt;br /&gt;
        Hauteur : Word; // Hauteur du sprite&lt;br /&gt;
        OffsetX : SmallInt;&lt;br /&gt;
        OffsetY : SmallInt;&lt;br /&gt;
        OffsetX2 : SmallInt;&lt;br /&gt;
        OffsetY2 : SmallInt;&lt;br /&gt;
        Transparence : Word; // Si 0 pas de transparence; Si &amp;gt; 0 le sprite a une transparence&lt;br /&gt;
        CouleurTrans : Word;&lt;br /&gt;
        NbBytes : DWord; // Nombre de bytes du sprite decompresser&lt;br /&gt;
        NbBytesC : DWord // Nombre de bytes du sprite compresser&lt;br /&gt;
      );&lt;br /&gt;
      1 : ( BloqueDWord : Array [0..6] Of DWord );&lt;br /&gt;
    End;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;  StructureDda = Array Of Record&lt;br /&gt;
    NbSprite : LongInt; // Crypter avec la CleSignature&lt;br /&gt;
    Sprites : TFastStream;&lt;br /&gt;
  End;&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Décompression des sprites ===&lt;br /&gt;
&lt;br /&gt;
Pour la décompression des sprite, une fois a l&amp;#039;offset d&amp;#039;indexation, il faut décrypté l&amp;#039;entête avec le groupe de 7 DWORD, ensuite il faut faire une décompression des données.&lt;br /&gt;
&lt;br /&gt;
Les sprites sont de 4 types différents:&lt;br /&gt;
&amp;lt;pre&amp;gt; 1 : Aucune compression &lt;br /&gt;
 2 : Compression RLE &lt;br /&gt;
 3 : Sprite Vide &lt;br /&gt;
 9 : Deux compressions Zlib &amp;lt;/pre&amp;gt;&lt;br /&gt;
En fonction de la dimension de l&amp;#039;image, nous effectuerons en premier une décompression Zlib.&lt;br /&gt;
&amp;lt;pre&amp;gt;If (Sprite^.Largeur &amp;gt; 180) Or (Sprite^.Hauteur &amp;gt; 180) Then DecompressionZlib;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite en fonction du type de sprite nous effectuerons les décompressions adéquates.&lt;br /&gt;
&lt;br /&gt;
Type 1: Il sufira juste de copier les données telle quelle.&lt;br /&gt;
&lt;br /&gt;
Type 2: Décompression RLE.&lt;br /&gt;
&lt;br /&gt;
Type 3: Pas de données à charger.&lt;br /&gt;
&lt;br /&gt;
Type 9: Les 4 premiers octet du buffer contiennent la taille des données décompressée de l&amp;#039;image. Ensuite il faut effectuer une décompression Zlib.&lt;br /&gt;
&lt;br /&gt;
NB : Vu le système utiliser nous avons sur nombreux sprites une double décompression zlib (oui, oui ...) ce qui augment la taille des données compressées et nous offre une perte considérable pour les fichiers DDA.&lt;br /&gt;
=== Phase de décompression des sprites ===&lt;br /&gt;
&amp;lt;pre&amp;gt;Procedure TFrmEditeurDda.DecompressionSprite(Sprite : PStructureSprites);&lt;br /&gt;
  Var&lt;br /&gt;
    DecompressDataZlib : PByte;&lt;br /&gt;
    Taille, TailleD : LongInt;&lt;br /&gt;
Begin&lt;br /&gt;
  Taille := Sprite^.NbBytesC;&lt;br /&gt;
  If (Sprite^.Largeur &amp;gt; 180) Or (Sprite^.Hauteur &amp;gt; 180) then // Compression Zlib en fonction des dimensions de l&amp;#039;image&lt;br /&gt;
    Begin&lt;br /&gt;
      DecompressBuf(@Sprite^.Donnees[0], Sprite^.NbBytesC, 0, Pointer(DecompressDataZlib), Taille);&lt;br /&gt;
      Setlength(Sprite^.Donnees, Taille);&lt;br /&gt;
      Move(DecompressDataZlib^, Sprite^.Donnees[0], Taille);&lt;br /&gt;
      FreeMem(DecompressDataZlib);&lt;br /&gt;
    End;&lt;br /&gt;
  If (Sprite^.TypeSprite = 2) Then DecompressionRLE(@Sprite^.Donnees[0], Taille, Sprite)&lt;br /&gt;
  Else If Sprite^.TypeSprite = 9 Then&lt;br /&gt;
    Begin&lt;br /&gt;
      DecompressBuf(@Sprite^.Donnees[4], Taille - 4, 0, Pointer(DecompressDataZlib), TailleD);&lt;br /&gt;
      // On saute les 4 premiers octets qui ne servent qu&amp;#039;à stocker la taille de l&amp;#039;image décompressée lors de la compression du sprite.&lt;br /&gt;
      Sprite^.NbBytes := TailleD;&lt;br /&gt;
      Setlength(Sprite^.Donnees, TailleD);&lt;br /&gt;
      Move(DecompressDataZlib^, Sprite^.Donnees[0], TailleD);&lt;br /&gt;
      FreeMem(DecompressDataZlib);&lt;br /&gt;
    End;&lt;br /&gt;
End;&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Compression / Décompression RLE pour les sprites ===&lt;br /&gt;
Compression RLE :&lt;br /&gt;
&amp;lt;pre&amp;gt;Procedure TFrmEditeurDda.CompressionRLE(Donnees : PByte; Sprite : PStructureSprites);&lt;br /&gt;
Var&lt;br /&gt;
  TailleCompressee : LongInt;&lt;br /&gt;
  X, Y, Cmpt : Word;&lt;br /&gt;
  DonneesTmp, Emplacement : Pbyte;&lt;br /&gt;
  Ombrage, PremierBloque : Boolean;&lt;br /&gt;
Begin&lt;br /&gt;
  // On aloue la taille des données non compressée pour être sur d&amp;#039;avoir suffisament&lt;br /&gt;
  GetMem(DonneesTmp, Sprite^.Largeur * Sprite^.Hauteur * 4);&lt;br /&gt;
  Emplacement := DonneesTmp;&lt;br /&gt;
  X := 0;&lt;br /&gt;
  Y := 0;&lt;br /&gt;
  TailleCompressee := 0;&lt;br /&gt;
  While (Y &amp;lt; Sprite^.Hauteur) Do&lt;br /&gt;
    Begin&lt;br /&gt;
      PremierBloque := True;&lt;br /&gt;
      Repeat&lt;br /&gt;
        // Recherche des pixels transparente&lt;br /&gt;
        While (X &amp;lt; Sprite^.Largeur) And (Donnees^ = Sprite^.CouleurTrans) Do&lt;br /&gt;
          Begin&lt;br /&gt;
            Inc(Donnees);&lt;br /&gt;
            Inc(X);&lt;br /&gt;
          End;&lt;br /&gt;
        // Stockage de la position X&lt;br /&gt;
        If X &amp;lt; Sprite^.Largeur Then&lt;br /&gt;
          Begin&lt;br /&gt;
            If Not PremierBloque Then&lt;br /&gt;
              Begin&lt;br /&gt;
                Emplacement^ := 1;&lt;br /&gt;
                Inc(Emplacement);&lt;br /&gt;
                inc(TailleCompressee);&lt;br /&gt;
              End;&lt;br /&gt;
            Pword(Emplacement)^ := X;&lt;br /&gt;
            Inc(Emplacement, 2);&lt;br /&gt;
            Inc(TailleCompressee, 2);&lt;br /&gt;
            Ombrage := (Donnees^ = Sprite^.Ombre);&lt;br /&gt;
            Cmpt := 0;&lt;br /&gt;
            // Recherche de la longueur des pixels&lt;br /&gt;
            If Ombrage Then&lt;br /&gt;
              Begin&lt;br /&gt;
                While (X &amp;lt; Sprite^.Largeur) And (PByte(LongInt(Donnees)+ Cmpt)^ &amp;lt;&amp;gt; Sprite^.CouleurTrans) And (PByte(LongInt(Donnees)+ Cmpt)^ = Sprite^.Ombre) Do&lt;br /&gt;
                  Begin&lt;br /&gt;
                    Inc(X);&lt;br /&gt;
                    Inc(Cmpt);&lt;br /&gt;
                  End;&lt;br /&gt;
                End&lt;br /&gt;
            Else&lt;br /&gt;
              Begin&lt;br /&gt;
                While (X &amp;lt; Sprite^.Largeur) And (PByte(LongInt(Donnees)+ Cmpt)^ &amp;lt;&amp;gt; Sprite^.CouleurTrans) Do&lt;br /&gt;
                  Begin&lt;br /&gt;
                    Inc(X);&lt;br /&gt;
                    Inc(Cmpt);&lt;br /&gt;
                  End;&lt;br /&gt;
              End;&lt;br /&gt;
            PByte(Emplacement)^ := Cmpt Div 4;&lt;br /&gt;
            PByte(LongInt(Emplacement) + 1)^ := Cmpt Mod 4;&lt;br /&gt;
            Inc(Emplacement, 2);&lt;br /&gt;
            Inc(TailleCompressee, 2);&lt;br /&gt;
            // Placement du flag de l&amp;#039;ombre correctement&lt;br /&gt;
            If Ombrage Then&lt;br /&gt;
              Begin&lt;br /&gt;
                Emplacement^ := 1;&lt;br /&gt;
                Inc(Emplacement);&lt;br /&gt;
                Inc(TailleCompressee);&lt;br /&gt;
                Inc(Donnees, Cmpt);&lt;br /&gt;
              End&lt;br /&gt;
            Else&lt;br /&gt;
              Begin&lt;br /&gt;
                Emplacement^ := 0;&lt;br /&gt;
                Inc(Emplacement);&lt;br /&gt;
                Inc(TailleCompressee);&lt;br /&gt;
                Move(Donnees^, Emplacement^, Cmpt);&lt;br /&gt;
                Inc(Donnees, Cmpt);&lt;br /&gt;
                Inc(Emplacement, Cmpt);&lt;br /&gt;
                Inc(TailleCompressee, Cmpt);&lt;br /&gt;
              End;&lt;br /&gt;
          End;&lt;br /&gt;
        PremierBloque :=  False;&lt;br /&gt;
      Until (X = Sprite^.Largeur);&lt;br /&gt;
      // Fin de ligne&lt;br /&gt;
      X := 0;&lt;br /&gt;
      Inc(Y);&lt;br /&gt;
      If Y &amp;lt; Sprite^.Hauteur THen&lt;br /&gt;
        Begin&lt;br /&gt;
          PByte(Emplacement)^ := 2;&lt;br /&gt;
          Inc(Emplacement);&lt;br /&gt;
          Inc(TailleCompressee);&lt;br /&gt;
        End;&lt;br /&gt;
    End;&lt;br /&gt;
 PByte(Emplacement)^ := 0;&lt;br /&gt;
 Inc(TailleCompressee);&lt;br /&gt;
 // Fin, On deplace les données temporaire dans le sprite (ce sont les données compressée)&lt;br /&gt;
 Sprite^.NbBytesC := TailleCompressee;&lt;br /&gt;
 Getmem(Sprite^.Donnees,TailleCompressee);&lt;br /&gt;
 Move(DonneesTmp^, Sprite^.Donnees[0], TailleCompressee);&lt;br /&gt;
 FreeMem(DonneesTmp);&lt;br /&gt;
End;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Décompression RLE :&lt;br /&gt;
&amp;lt;pre&amp;gt;Procedure TFrmEditeurDda.DecompressionRLE(Donnees : PByte; Const TailleC : LongInt; Sprite : PStructureSprites);&lt;br /&gt;
  Label EndLine;&lt;br /&gt;
  Var&lt;br /&gt;
    I : LongInt;&lt;br /&gt;
    X, Y, NbPix : Word;&lt;br /&gt;
    SpriteTmp : PByte;&lt;br /&gt;
Begin&lt;br /&gt;
  Y := 0;&lt;br /&gt;
  GetMem(SpriteTmp, Sprite^.Largeur * Sprite^.Hauteur);&lt;br /&gt;
  FillChar(SpriteTmp^, Sprite^.Largeur * Sprite^.Hauteur, Sprite^.CouleurTrans);&lt;br /&gt;
  If (Donnees &amp;lt;&amp;gt; Nil) And (TailleC &amp;lt;&amp;gt; Sprite^.Hauteur) Then&lt;br /&gt;
    While True Do&lt;br /&gt;
      Begin&lt;br /&gt;
        X := PWord(LongInt(Donnees))^;&lt;br /&gt;
        Inc(Donnees, 2);&lt;br /&gt;
        NbPix := Donnees^ * 4 + PByte(LongInt(Donnees) + 1)^;&lt;br /&gt;
        Inc(Donnees, 2);&lt;br /&gt;
        // Ombre&lt;br /&gt;
        If MnuAffichageOmbre.Checked And (Donnees^ = Sprite^.Ombre) Then&lt;br /&gt;
          Begin&lt;br /&gt;
            For I := 0 To NbPix - 1 Do Pbyte(LongInt(SpriteTmp) + I+x+(y*Sprite^.Largeur))^ := Sprite^.Ombre;&lt;br /&gt;
          End;&lt;br /&gt;
&lt;br /&gt;
        If Donnees^ &amp;lt;&amp;gt; 1 Then&lt;br /&gt;
          Begin&lt;br /&gt;
            For I := 0 To NbPix - 1 Do&lt;br /&gt;
              Begin&lt;br /&gt;
                Inc(Donnees);&lt;br /&gt;
                Pbyte(LongInt(SpriteTmp) + I+x+(y*Sprite^.Largeur))^:=Donnees^;&lt;br /&gt;
                If (I + X) = Sprite^.Largeur - 1 Then Break; // Secu&lt;br /&gt;
              End;&lt;br /&gt;
          End;&lt;br /&gt;
        Inc(Donnees);&lt;br /&gt;
        If Donnees^ = 0 Then break;&lt;br /&gt;
        If Donnees^ = 1 Then&lt;br /&gt;
          Begin&lt;br /&gt;
            Inc(Donnees);&lt;br /&gt;
            Goto EndLine;&lt;br /&gt;
           End;&lt;br /&gt;
        If Donnees^ = 2 Then&lt;br /&gt;
          Begin&lt;br /&gt;
            Inc(Y);&lt;br /&gt;
            Inc(Donnees);&lt;br /&gt;
          End;&lt;br /&gt;
        EndLine :&lt;br /&gt;
          If Y = Sprite^.Hauteur Then Break;&lt;br /&gt;
      End;&lt;br /&gt;
  SetLength(Sprite^.Donnees, Sprite^.Largeur * Sprite^.Hauteur);&lt;br /&gt;
  Move(SpriteTmp^, Sprite^.Donnees[0], Sprite^.Largeur * Sprite^.Hauteur);&lt;br /&gt;
  FreeMem(SpriteTmp);&lt;br /&gt;
End;&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Informations concernant les entêtes des fichiers Dpd et Did ===&lt;br /&gt;
Maintenant en ce qui concerne le hash md5, celui-ci est coupé en deux partie, la première et de 16 char et la seconde de 17... No comment.&lt;br /&gt;
&lt;br /&gt;
Et bien ce n&amp;#039;est qu&amp;#039;un seul hash sur la totalité des données décompressée Zlib avec le cryptage Xor.&lt;br /&gt;
&lt;br /&gt;
Il s&amp;#039;agit d&amp;#039;une chaîne de 32 char dont le 33ème est le AZT.&lt;br /&gt;
=== Information concernant le checksum ===&lt;br /&gt;
En ce qui concerne le checksum, il faut faire le calcul du checksum en fonction des données non compréssée Zlib mais cryptée !&lt;br /&gt;
&lt;br /&gt;
La taille des données a calculer est la taille non compréssée -1.&lt;br /&gt;
&lt;br /&gt;
Voici l&amp;#039;algo :&lt;br /&gt;
&amp;lt;pre&amp;gt;Function Checksum : Byte; &lt;br /&gt;
  Var &lt;br /&gt;
    I : Integer; &lt;br /&gt;
Begin &lt;br /&gt;
  Result := 0; &lt;br /&gt;
  For I := 0 To Taille - 2 Do Result := Result + Buf[I]; &lt;br /&gt;
  Result := $100 - Result; &lt;br /&gt;
End; &amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Compléments sur les palettes ===&lt;br /&gt;
On parle peu souvent de la manière de proceder pour associer les palettes aux sprites, malheureusement il n&amp;#039;y a pas de technique simple et sure vu que les sprites n&amp;#039;ont aucun liens explicites avec les palettes...&lt;br /&gt;
&lt;br /&gt;
En règle générale, il suffira d&amp;#039;ajouter la lettre &amp;#039;P&amp;#039; a la fin du nom du sprite pour retrouver la palette correspondante si cela echouait vous n&amp;#039;auriez plus qu&amp;#039;a inventer une méthode plus ou moins bancale pour palier au problême et si jamais ca ne marchait toujours pas vous pourriez toujours utiliser la palette &amp;quot;bright1&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Un petit code d&amp;#039;exemple qui utilise une recherche par hashtable et qui resout 90% des associations&lt;br /&gt;
&amp;lt;pre&amp;gt;function TForm1.FindPalette(GraphName: string): PPalette;&lt;br /&gt;
var NameCpy:string;&lt;br /&gt;
begin&lt;br /&gt;
 Result:=PalHash.SearchByName(GraphName+&amp;#039;P&amp;#039;);&lt;br /&gt;
 if Result&amp;lt;&amp;gt;NIL then exit;&lt;br /&gt;
 Result:=PalHash.SearchByName(&amp;#039;P&amp;#039;+GraphName);&lt;br /&gt;
 if Result&amp;lt;&amp;gt;NIL then exit;&lt;br /&gt;
 Result:=PalHash.SearchByName(GraphName);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 if Result=Nil then&lt;br /&gt;
 begin&lt;br /&gt;
  NameCpy:=GraphName;&lt;br /&gt;
  while (Result=nil) and (length(NameCpy)&amp;gt;0) do&lt;br /&gt;
  begin&lt;br /&gt;
    NameCpy:=copy(NameCpy,1,LEngth(NameCpy)-1);&lt;br /&gt;
    Result:=PalHash.SearchByName(NameCpy+&amp;#039;P&amp;#039;);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
 if Result=NIL then&lt;br /&gt;
  Result:=PalHash.SearchByName(&amp;#039;Bright1&amp;#039;);&lt;br /&gt;
 end;&lt;br /&gt;
end;&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Comment créer votre propre éditeur DDA ? ==&lt;br /&gt;
Il est possible de programmer un éditeur de DDA qui travaille exclusivement sur le fichier DID, DPD et DDA.&lt;br /&gt;
&lt;br /&gt;
Exemples d&amp;#039;éditeurs de DDA :&lt;br /&gt;
* T4C Editeur DDA (auteur Mestoph)&lt;br /&gt;
* ...&lt;br /&gt;
--Mestoph 4 avril 2008 à 06:01 (MSD) (MAJ le 25 mars 2009)&lt;br /&gt;
&lt;br /&gt;
--Chaotikmind 19 mars 2009 à 18:02&lt;/div&gt;</summary>
		<author><name>FunJp</name></author>
	</entry>
</feed>