mirror of
https://github.com/ZDoom/wadext.git
synced 2024-11-24 21:01:21 +00:00
- added Build GRP extraction function.
Unlike for WADs this will just dump the content to a subdirectory without analyzing anything.
This commit is contained in:
parent
5eecfa5947
commit
132f038718
3 changed files with 102 additions and 19 deletions
|
@ -28,8 +28,7 @@ class CWADFile
|
||||||
uint64_t m_LumpStart;
|
uint64_t m_LumpStart;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CWADFile(const char * filename);
|
CWADFile(const char * filename, FILE* f);
|
||||||
CWADFile(const char * name, const char * memory);
|
|
||||||
~CWADFile(void);
|
~CWADFile(void);
|
||||||
|
|
||||||
const char * GetName() const
|
const char * GetName() const
|
||||||
|
|
61
wadext.cpp
61
wadext.cpp
|
@ -670,3 +670,64 @@ void ConvertTextureX()
|
||||||
if (ft2) GenerateTextureFile("textures.txt2", bt2, bpn, 0, false);
|
if (ft2) GenerateTextureFile("textures.txt2", bt2, bpn, 0, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
struct GrpInfo
|
||||||
|
{
|
||||||
|
uint32_t Magic[3];
|
||||||
|
uint32_t NumLumps;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GrpLump
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
char Name[12];
|
||||||
|
uint32_t Size;
|
||||||
|
};
|
||||||
|
char NameWithZero[13];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void GrpExtract(const char* filename, FILE* f)
|
||||||
|
{
|
||||||
|
TArray<GrpLump> fileinfo;
|
||||||
|
|
||||||
|
GrpInfo header;
|
||||||
|
|
||||||
|
if (1 != fread(&header, sizeof(header), 1, f)) return;
|
||||||
|
|
||||||
|
fileinfo.Resize(header.NumLumps);
|
||||||
|
if (header.NumLumps != fread(&fileinfo[0], sizeof(GrpLump), header.NumLumps, f)) return;
|
||||||
|
if (memcmp(header.Magic, "KenSilverman", 12))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto name = ExtractFileBase(filename, false);
|
||||||
|
mkdir(name.c_str());
|
||||||
|
chdir(name.c_str());
|
||||||
|
|
||||||
|
TArray<char> buffer;
|
||||||
|
for (uint32_t i = 0; i < header.NumLumps; i++)
|
||||||
|
{
|
||||||
|
buffer.Resize(fileinfo[i].Size);
|
||||||
|
fileinfo[i].NameWithZero[12] = '\0'; // Be sure filename is null-terminated
|
||||||
|
if (fileinfo[i].Size != fread(&buffer[0], 1, fileinfo[i].Size, f)) return;
|
||||||
|
FILE* fout = fopen(fileinfo[i].NameWithZero, "wb");
|
||||||
|
if (fout)
|
||||||
|
{
|
||||||
|
fwrite(&buffer[0], 1, fileinfo[i].Size, fout);
|
||||||
|
fclose(fout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
57
wadfile.cpp
57
wadfile.cpp
|
@ -30,7 +30,7 @@
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
CWADFile::CWADFile(const char * filename)
|
CWADFile::CWADFile(const char * filename, FILE* f)
|
||||||
{
|
{
|
||||||
char type[4];
|
char type[4];
|
||||||
int diroffset;
|
int diroffset;
|
||||||
|
@ -40,20 +40,6 @@ CWADFile::CWADFile(const char * filename)
|
||||||
m_LumpStart=0;
|
m_LumpStart=0;
|
||||||
|
|
||||||
m_Filename = strdup(filename);
|
m_Filename = strdup(filename);
|
||||||
m_File=NULL;
|
|
||||||
|
|
||||||
if (filename == NULL)
|
|
||||||
{
|
|
||||||
printf("No file name specified\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE *f = fopen(filename, "rb");
|
|
||||||
if (!f)
|
|
||||||
{
|
|
||||||
printf("%s: unable to open\n", filename);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_File = f;
|
m_File = f;
|
||||||
fread(&type, 1, 4, f);
|
fread(&type, 1, 4, f);
|
||||||
|
@ -172,6 +158,14 @@ const char * CWADFile::GetLumpName(int lump)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void GrpExtract(const char* filename, FILE* f);
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
@ -181,9 +175,38 @@ CWADFile *mainwad;
|
||||||
|
|
||||||
void OpenMainWad(char *filename)
|
void OpenMainWad(char *filename)
|
||||||
{
|
{
|
||||||
mainwad = new CWADFile(filename);
|
if (filename == NULL)
|
||||||
if (mainwad->NumLumps() == 0)
|
|
||||||
{
|
{
|
||||||
|
printf("No file name specified\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FILE *f = fopen(filename, "rb");
|
||||||
|
if (!f)
|
||||||
|
{
|
||||||
|
printf("%s: unable to open\n", filename);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char type[4];
|
||||||
|
fread(&type, 1, 4, f);
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
|
||||||
|
if (memcmp(type, "IWAD", 4) == 0 || memcmp(type, "PWAD", 4) == 0)
|
||||||
|
{
|
||||||
|
mainwad = new CWADFile(filename, f);
|
||||||
|
if (mainwad->NumLumps() == 0)
|
||||||
|
{
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (memcmp(type, "KenS", 4) == 0)
|
||||||
|
{
|
||||||
|
GrpExtract(filename, f);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
printf("%s: not a WAD file\n", filename);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue