Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cctype>
- #include <cmath>
- #include <cstdlib>
- #include <cstring>
- #include <fstream>
- #include <iostream>
- #define COLORMAP 0
- #define FLATS 1
- #define PLAYPAL 2
- using namespace std;
- struct lump
- {
- int dirPos[3];
- int pos[3];
- int size[3];
- };
- uint64_t fetchInteger(ifstream &file, int position, int length)
- {
- int startingPointer = file.tellg();
- file.seekg(position);
- uint64_t integer = 0;
- for (int token = 0; token < length; ++token)
- integer += (int)file.get() * pow(256, token);
- file.seekg(startingPointer);
- return integer;
- }
- char* fetchString(ifstream &file, int position, int length)
- {
- int startingPointer = file.tellg();
- file.seekg(position);
- char* string = "";
- for (int token = 0; token < length; ++token)
- string += file.get();
- file.seekg(startingPointer);
- return string;
- }
- void flat(ifstream& wad, lump& lump, char tgaName[9])
- {
- int filePointer2 = wad.tellg();
- char tgaPath[] = ".\\tga\\";
- strcat(tgaPath, tgaName);
- strcat(tgaPath, ".tga");
- ofstream tga(tgaPath, fstream::out | fstream::binary);
- char header[] = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 64, 0, 24, 64};
- tga.write(header, sizeof(header));
- filePointer2 -= 8;
- wad.seekg(fetchInteger(wad, filePointer2, 4));
- int filePointer3 = filePointer2;
- for (int byte = 0; byte < 4096; ++byte)
- {
- int filePointer5;
- filePointer5 = wad.tellg();
- int filePointer4;
- filePointer4 = lump.pos[PLAYPAL] + (wad.get() * 3);
- wad.seekg(filePointer4);
- char pixelRed[2];
- char pixelGreen[2];
- char pixelBlue[2];
- wad.read(pixelRed, 1);
- wad.read(pixelGreen, 1);
- wad.read(pixelBlue, 1);
- tga.write(pixelBlue, 1);
- tga.write(pixelGreen, 1);
- tga.write(pixelRed, 1);
- wad.seekg(++filePointer5);
- }
- wad.seekg(filePointer2);
- }
- int main()
- {
- lump lump;
- ifstream wad("doom.wad", fstream::out | fstream::binary);
- wad.seekg(fetchInteger(wad, 8, 4));
- while (wad.good())
- {
- char string[8];
- wad.read(string, 8);
- int filePointer;
- filePointer = wad.tellg();
- filePointer -= 8;
- wad.seekg(filePointer);
- if (!strncmp(string, "COLORMAP", 8))
- {
- int tempFilePointer = filePointer;
- lump.dirPos[COLORMAP] = filePointer;
- tempFilePointer -= 4;
- lump.size[COLORMAP] = fetchInteger(wad, tempFilePointer, 4);
- tempFilePointer -= 4;
- lump.pos[COLORMAP] = fetchInteger(wad, tempFilePointer, 4);
- }
- if (!strncmp(string, "F_START\0", 8))
- {
- int tempFilePointer = filePointer;
- lump.dirPos[FLATS] = filePointer;
- tempFilePointer -= 4;
- lump.size[FLATS] = fetchInteger(wad, tempFilePointer, 4);
- tempFilePointer -= 4;
- lump.pos[FLATS] = fetchInteger(wad, tempFilePointer, 4);
- }
- if (!strncmp(string, "PLAYPAL\0", 8))
- {
- int tempFilePointer = filePointer;
- lump.dirPos[PLAYPAL] = filePointer;
- tempFilePointer -= 4;
- lump.size[PLAYPAL] = fetchInteger(wad, tempFilePointer, 4);
- tempFilePointer -= 4;
- lump.pos[PLAYPAL] = fetchInteger(wad, tempFilePointer, 4);
- }
- wad.seekg(++filePointer);
- }
- cout << "Pos: Flat:" << endl;
- cout << "---- -----" << endl << endl;
- wad.clear();
- wad.seekg(lump.dirPos[FLATS]);
- while (wad.good())
- {
- char string[9];
- wad.read(string, 8);
- int filePointer;
- filePointer = wad.tellg();
- filePointer -= 8;
- wad.seekg(filePointer);
- if (((string[0] == 'F') && isdigit(string[1]) && (string[2] == '_') && (string[3] == 'S') &&
- (string[4] == 'T') && (string[5] == 'A') && (string[6] == 'R') && (string[7] == 'T'))
- ||
- ((string[0] == 'F') && isdigit(string[1]) && (string[2] == '_') && (string[3] == 'E') &&
- (string[4] == 'N') && (string[5] == 'D') && (string[6] == '\0') && (string[7] == '\0'))
- ||
- (!strncmp(string, "F_START\0", 8)))
- {
- wad.seekg(filePointer + 16);
- continue;
- }
- if (!strncmp(string, "F_END\0\0\0", 8))
- break;
- cout << filePointer << " " << string << endl;
- flat(wad, lump, string);
- filePointer += 16;
- wad.seekg(filePointer);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment