Wad File [Résolu]

Signaler
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
-
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
-
Bonjour , voila j'ai un petit probleme pour lire 1 fichier WAD (  wad  )

donc suivant le modele décrit je me suis fait 2 structures :

struct Header
{
       char identification[4];
       int  numLumps;
       int  pInfoTableOfs;
}header;

struct Directory
{
       int filePos;
       int size;
       char name[8];
      
}directory;

et je lis comme cela le fichier : (je poste le "source" ) :

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define HERETIC "i:\\MyGames\\dos\\heretic\\heretic.wad"
#define DOOM "i:\\MyGames\\dos\\doom\\doom.wad"
#define DOOM2 "i:\\MyGames\\dos\\doom2\\doom2.wad"

struct Header
{
       char identification[4];
       int  numLumps;
       int  pInfoTableOfs;
}header;

struct Directory
{
       int filePos;
       int size;
       char name[8];
      
}directory;

FILE* ouvrirWad(char *fileName,FILE *file)
{
    return fopen(HERETIC,"r");
}

void lireHeader(FILE *file)
{
     fseek(file,0,SEEK_SET);
     fread(&header,sizeof(struct Header),1,file);
}

int main(int argc, char *argv[])
{
  int i,imax; 
  FILE *file;
 
  file = ouvrirWad(HERETIC,file);
 
  if (file==NULL)
  {
     printf("Fichier Introuvable ! ");
     getch();
     exit(EXIT_FAILURE);
  }
    
     
  // lire le header
  printf("\n* * * * * * * * * * * * * * * * * * * * * * *\n*");
 
  printf("\n*\tHEADER FILE WAD\n*");
 
  lireHeader(file);
  
  printf("\n*\tIdentification WAD:%s\n",header.identification);
  printf("*\tnombre de lumps : %d\n",header.numLumps);
  printf("*\tpointer vers directory : %d\n*\n*",header.pInfoTableOfs);
 
  printf("\n*\n* * * * * * * * * * * * * * * * * * * * * * *\n");
 
  // on se positionne sur le directory
 
  printf("\nPositionnement sur le dossier ...\n");
 
  fseek(file,header.pInfoTableOfs,SEEK_SET);
 
  printf("Position dans le fichier %d \n\n",ftell(file));
 
  printf("Lecture du directory: (pos : %d)\n\n",ftell(file));
 
  //lecture du directory
  fread(&directory,sizeof(struct Directory),1,file);

  // infos
  
  printf("pointer vers fichiers : %d\n",directory.filePos);  
  printf("taille en bytes du lump: %d\n",directory.size);  
  printf("nom du directory : %s\n",directory.name);
 
  system("PAUSE");   
 
  fclose(file);

  return EXIT_SUCCESS;
}

Bon ce code fonctionne , je trouve les bon renseignements dans le HEADER , je me positionne sur le directory , il s'appelle PLAYPAL (j'ai verifié avec 1 autre logiciel et c'est juste )

Mon probleme est le suivant : comment trouver les autres directory , je ne comprends pas , il n'y a plus aucuns renseignements sur ou trouver les autres ?

Si qq1 connais la solution

Merci

12 réponses

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

Vu la description sur Wiki; les "numlumps" directories sont les uns derrière les autres tout simplement ! Il faut faire une boucle qui fait "numlumps" fread(&directory).

Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Je l'ai lu avec ton programme (simplifié) et des explications trouvées ici : http://cres1.lancs.ac.uk/~esasb1/doom/uds/ch2.html

Ce qui donne :

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>





// --- Description du "header" d'un fichier WAD


struct HEADER
{
   char acIdentifier[4];


// !!! 0 terminateur absent
   long lLumpNumber;
   long lDirectoryOffset;
} Header;









// --- Description d'un "lump" dans le "directory" d'un fichier WAD

struct LUMP
{
   long lFilePos;
   long lSize;
   char acName[8]; // !!! 0 terminateur facultatif
} Lump;





int main()
{
   // --- Ouvrir le fichier WAD
   FILE *pFile = fopen("Heretic.WAD","r");
   if (pFile == NULL)
   {
      printf("*** Erreur à l'ouverture du fichier WAD ***\n");
      return EXIT_FAILURE;
   }
     
   // --- Lire le "header" du fichier WAD
   fread(&Header,sizeof(HEADER),1,pFile);
   printf("Identification WAD    : %4.4s\n",Header.acIdentifier);
   printf("Nombre de 'lumps'     : %ld\n"  ,Header.lLumpNumber);
   printf("Offset du 'directory' : %ld\n"  ,Header.lDirectoryOffset);
   getch(); // pause !
    
 




   // --- Lire le "directory" (= ensemble de "lumps")
   fseek(pFile,Header.lDirectoryOffset,SEEK_SET);
   for (int i=0 ; i<Header.lLumpNumber ; ++i)
   {
      printf("\nLump %d\n",i + 1);  
      fread(&Lump,sizeof(LUMP),1,pFile);
      printf("Position du fichier : %ld\n"       ,Lump.lFilePos);
      printf("Taille du 'lump'    : %ld octets\n",Lump.lSize);
      printf("Nom du 'lump'       : %-8.8s\n"    ,Lump.acName);
      //getch(); // pause !
   }
 




   // --- Fermer le fichier WAD et quitter
   fclose(pFile);
   return EXIT_SUCCESS;
}






Jean-François
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
Ok t'as solution est bonne . . . j'avais pas fait gaffe merci .

Mais j'ai 1 bleme , tt est bon au debut puis tt d'1 coup dans la section E1M2 je boucle sur REJECT ?

ma boucle

//lecture du directory

     fread(&directory,sizeof(struct Directory),1,file);

 

 

     // infos

     printf("pointer vers fichiers : %d\n",directory.filePos);  

     printf("taille en bytes du lump: %d\n",directory.size);  

     printf("nom du directory : %s\n",directory.name);

 i=0;
  iMax=header.numLumps;
 
  while(i<=iMax)
  {
     //lecture du directory
     fread(&directory,sizeof(struct Directory),1,file);
 
 
     // infos
     printf("pointer vers fichiers : %d\n",directory.filePos);  
     printf("taille en bytes du lump: %d\n",directory.size);  
     printf("nom du directory : %s\n",directory.name);
     i++;
    
     getch();
              
  }

comprends pas !
 
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Je ne connais pas du tout le détail de ces choses là mais sur Wiki, REJECT semble être une donnée tout à fait prévue et valable !

Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

D'autre part, l' dans la structure headernom dans la structure ne sont pas des chaînes de caractères au sens C (c'est à dire terminées par un zéro binaire) mais de simples tableaux de caractères (sauf pour le nom%s ne fonctionne pas ! il faut %4.4s pour l'identificateur et %-8.8s pour le nom.

Jean-François
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
Je ne connais pas du tout le détail de ces choses là mais sur Wiki,
REJECT semble être une donnée tout à fait prévue et valable !


ok ca je sais mais le prob c que je boucle dessus !



D'autre part, l' dans la structure headernom dans la structure directory
ne sont pas des chaînes de caractères au sens C (c'est à dire terminées
par un zéro binaire) mais de simples tableaux de caractères (sauf pour
le s'il est plus court que 8 caractères puisqu'il est sensé être comblé avec des 0). L'affichage avec un %s ne fonctionne pas ! il faut %4.4s pour l'identificateur%-8.8s pour le nom.

je vais regarder  ca ...
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

La boucle continue au dela de numLumps itérations ? ou il y en a beaucoup !

Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Je viens de télécharger un fichier HERETIC.WAD (j'imagine que ça ne doit pas manquer de versions différentes) et je vois :

Identification WAD             : PWAD
Nombre de lumps                : 3090
Pointeur vers le 1er directory : 15670376



Lump 1
Pointeur vers fichier   : 0
Taille en bytes du lump : 0
Nom du directory        : MAP01



Lump 2
Pointeur vers fichier   : 32
Taille en bytes du lump : 1750
Nom du directory        : THINGS



Lump 3
Pointeur vers fichier   : 1784
Taille en bytes du lump : 6020
Nom du directory        : LINEDEFS



Lump 4
Pointeur vers fichier   : 7804
Taille en bytes du lump : 18690
Nom du directory        : SIDEDEFS



Lump 5
Pointeur vers fichier   : 26496
Taille en bytes du lump : 1792
Nom du directory        : VERTEXES



Lump 6
Pointeur vers fichier   : 28288
Taille en bytes du lump : 8904
Nom du directory        : SEGS



Lump 7
Pointeur vers fichier   : 37192
Taille en bytes du lump : 1044
Nom du directory        : SSECTORS



Lump 8
Pointeur vers fichier   : 38236
Taille en bytes du lump : 7280
Nom du directory        : NODES



Lump 9
Pointeur vers fichier   : 45516
Taille en bytes du lump : 2288
Nom du directory        : SECTORS



Lump 10
Pointeur vers fichier   : 47804
Taille en bytes du lump : 968
Nom du directory        : REJECT



Lump 11
Pointeur vers fichier   : 48772
Taille en bytes du lump : 6242
Nom du directory        : BLOCKMAP



Lump 12
Pointeur vers fichier   : 55016
Taille en bytes du lump : 9841
Nom du directory        : DSMNPAIN



Lump 13
Pointeur vers fichier   : 64860
Taille en bytes du lump : 28
Nom du directory        : DSDMPAIN



Lump 14
Pointeur vers fichier   : 64888
Taille en bytes du lump : 10752
Nom du directory        : PLAYPAL



Lump 15
Pointeur vers fichier   : 75640
Taille en bytes du lump : 8704
Nom du directory        : COLORMAP



Lump 16
Pointeur vers fichier   : 84344
Taille en bytes du lump : 4000
Nom du directory        : ENDOOM

...



Lump 3090
Pointeur vers fichier   : 88344
Taille en bytes du lump : 4010
Nom du directory        : ENDOOM






Jean-François
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
sur moi c aussi un PWAD mais j'ai que "2415 lumps"

tu l'as lu comment ton WAD ?
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
a mon avis g 1 probleme avec mon wad (qui est pourtant le WAD officiel d'heretic) parce que avec ton code aussi je boucle sur REJECT ... a partir du numlump 38 jusque 2415 c le meme !

bizarre
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Et là je ne plus être d'une grande aide ! on entre dans le spécifique de ce genre de format !

Jean-François
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
mais merci deja beaucoup