KeinMitleid

Old DOOM WAD Reader

Nov 24th, 2013
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1. #include <cctype>
  2. #include <cmath>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <fstream>
  6. #include <iostream>
  7.  
  8. #define COLORMAP    0
  9. #define FLATS       1
  10. #define PLAYPAL     2
  11.  
  12. using namespace std;
  13.  
  14. struct lump
  15. {
  16.     int dirPos[3];
  17.     int pos[3];
  18.     int size[3];
  19. };
  20.  
  21. uint64_t fetchInteger(ifstream &file, int position, int length)
  22. {
  23.     int startingPointer = file.tellg();
  24.     file.seekg(position);
  25.  
  26.     uint64_t integer = 0;
  27.     for (int token = 0; token < length; ++token)
  28.         integer += (int)file.get() * pow(256, token);
  29.  
  30.     file.seekg(startingPointer);
  31.     return integer;
  32. }
  33.  
  34. char* fetchString(ifstream &file, int position, int length)
  35. {
  36.     int startingPointer = file.tellg();
  37.     file.seekg(position);
  38.  
  39.     char* string = "";
  40.     for (int token = 0; token < length; ++token)
  41.         string += file.get();
  42.  
  43.     file.seekg(startingPointer);
  44.     return string;
  45. }
  46.  
  47. void flat(ifstream& wad, lump& lump, char tgaName[9])
  48. {
  49.     int filePointer2 = wad.tellg();
  50.     char tgaPath[] = ".\\tga\\";
  51.  
  52.     strcat(tgaPath, tgaName);
  53.     strcat(tgaPath, ".tga");
  54.  
  55.     ofstream tga(tgaPath, fstream::out | fstream::binary);
  56.     char header[] = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 64, 0, 24, 64};
  57.     tga.write(header, sizeof(header));
  58.  
  59.     filePointer2 -= 8;
  60.     wad.seekg(fetchInteger(wad, filePointer2, 4));
  61.     int filePointer3 = filePointer2;
  62.  
  63.     for (int byte = 0; byte < 4096; ++byte)
  64.     {
  65.         int filePointer5;
  66.         filePointer5 = wad.tellg();
  67.  
  68.         int filePointer4;
  69.         filePointer4 = lump.pos[PLAYPAL] + (wad.get() * 3);
  70.         wad.seekg(filePointer4);
  71.  
  72.         char pixelRed[2];
  73.         char pixelGreen[2];
  74.         char pixelBlue[2];
  75.  
  76.         wad.read(pixelRed, 1);
  77.         wad.read(pixelGreen, 1);
  78.         wad.read(pixelBlue, 1);
  79.  
  80.         tga.write(pixelBlue, 1);
  81.         tga.write(pixelGreen, 1);
  82.         tga.write(pixelRed, 1);
  83.  
  84.         wad.seekg(++filePointer5);
  85.     }
  86.  
  87.     wad.seekg(filePointer2);
  88. }
  89.  
  90. int main()
  91. {
  92.     lump lump;
  93.     ifstream wad("doom.wad", fstream::out | fstream::binary);
  94.     wad.seekg(fetchInteger(wad, 8, 4));
  95.  
  96.     while (wad.good())
  97.     {
  98.         char string[8];
  99.         wad.read(string, 8);
  100.  
  101.         int filePointer;
  102.         filePointer = wad.tellg();
  103.         filePointer -= 8;
  104.         wad.seekg(filePointer);
  105.  
  106.         if (!strncmp(string, "COLORMAP", 8))
  107.         {
  108.             int tempFilePointer = filePointer;
  109.             lump.dirPos[COLORMAP] = filePointer;
  110.             tempFilePointer -= 4;
  111.             lump.size[COLORMAP] = fetchInteger(wad, tempFilePointer, 4);
  112.             tempFilePointer -= 4;
  113.             lump.pos[COLORMAP] = fetchInteger(wad, tempFilePointer, 4);
  114.         }
  115.  
  116.         if (!strncmp(string, "F_START\0", 8))
  117.         {
  118.             int tempFilePointer = filePointer;
  119.             lump.dirPos[FLATS] = filePointer;
  120.             tempFilePointer -= 4;
  121.             lump.size[FLATS] = fetchInteger(wad, tempFilePointer, 4);
  122.             tempFilePointer -= 4;
  123.             lump.pos[FLATS] = fetchInteger(wad, tempFilePointer, 4);
  124.         }
  125.  
  126.         if (!strncmp(string, "PLAYPAL\0", 8))
  127.         {
  128.             int tempFilePointer = filePointer;
  129.             lump.dirPos[PLAYPAL] = filePointer;
  130.             tempFilePointer -= 4;
  131.             lump.size[PLAYPAL] = fetchInteger(wad, tempFilePointer, 4);
  132.             tempFilePointer -= 4;
  133.             lump.pos[PLAYPAL] = fetchInteger(wad, tempFilePointer, 4);
  134.         }
  135.  
  136.         wad.seekg(++filePointer);
  137.     }
  138.  
  139.     cout << "Pos:     Flat:" << endl;
  140.     cout << "----     -----" << endl << endl;
  141.     wad.clear();
  142.     wad.seekg(lump.dirPos[FLATS]);
  143.     while (wad.good())
  144.     {
  145.         char string[9];
  146.         wad.read(string, 8);
  147.  
  148.         int filePointer;
  149.         filePointer = wad.tellg();
  150.         filePointer -= 8;
  151.         wad.seekg(filePointer);
  152.  
  153.         if (((string[0] == 'F') && isdigit(string[1]) && (string[2] == '_') && (string[3] == 'S') &&
  154.              (string[4] == 'T') && (string[5] == 'A') && (string[6] == 'R') && (string[7] == 'T'))
  155.         ||
  156.             ((string[0] == 'F') && isdigit(string[1]) && (string[2] == '_') && (string[3] == 'E') &&
  157.              (string[4] == 'N') && (string[5] == 'D') && (string[6] == '\0') && (string[7] == '\0'))
  158.         ||
  159.             (!strncmp(string, "F_START\0", 8)))
  160.         {
  161.             wad.seekg(filePointer + 16);
  162.             continue;
  163.         }
  164.  
  165.         if (!strncmp(string, "F_END\0\0\0", 8))
  166.             break;
  167.  
  168.         cout << filePointer << " " << string << endl;
  169.         flat(wad, lump, string);
  170.  
  171.         filePointer += 16;
  172.         wad.seekg(filePointer);
  173.     }
  174.  
  175.     return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment