mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-18 10:31:42 +00:00
Further work on PK3 support.
-PK3 files are now properly loaded as files. -PK3 lumps are still being treated the same way as WAD files. It means they're dependant on markers, if that makes any sense in the context of a ZIP file (it doesn't). I haven't worked out this part yet but I obviously intend to do so. -I don't know if the lumps' position address is correct, we'll figure out when I fix the thing from above.
This commit is contained in:
parent
afba4b2abd
commit
376d2a2da3
1 changed files with 61 additions and 15 deletions
76
src/w_wad.c
76
src/w_wad.c
|
@ -380,11 +380,13 @@ UINT16 W_LoadWadFile(const char *filename)
|
||||||
#endif
|
#endif
|
||||||
else if (!stricmp(&filename[strlen(filename) - 4], ".pk3"))
|
else if (!stricmp(&filename[strlen(filename) - 4], ".pk3"))
|
||||||
{
|
{
|
||||||
long centralDirPos;
|
unsigned long centralDirPos;
|
||||||
long handlePos;
|
unsigned long handlePos;
|
||||||
long size;
|
unsigned long size;
|
||||||
char *sigBuffer;
|
char *sigBuffer;
|
||||||
|
|
||||||
|
numlumps = 0;
|
||||||
|
|
||||||
//wadfile->restype = RET_PK3;
|
//wadfile->restype = RET_PK3;
|
||||||
CONS_Alert(CONS_NOTICE, "PK3 file detected.\n");
|
CONS_Alert(CONS_NOTICE, "PK3 file detected.\n");
|
||||||
|
|
||||||
|
@ -423,23 +425,63 @@ UINT16 W_LoadWadFile(const char *filename)
|
||||||
for (handlePos = centralDirPos; handlePos < size - 3; handlePos++)
|
for (handlePos = centralDirPos; handlePos < size - 3; handlePos++)
|
||||||
{
|
{
|
||||||
fread(sigBuffer, 1, 4, handle);
|
fread(sigBuffer, 1, 4, handle);
|
||||||
if (!memcmp(sigBuffer, "\x50\x4b\x01\x02", 4)) // Got a central dir file header.
|
if (!memcmp(sigBuffer, "\x50\x4b\x01\x02", 4)) // Found a central dir file header.
|
||||||
{
|
{
|
||||||
char *eName;
|
char *eName;
|
||||||
unsigned short int eNameLen = 0;
|
unsigned short int eNameLen = 8;
|
||||||
unsigned short int eXFieldLen = 0;
|
unsigned short int eXFieldLen = 0;
|
||||||
unsigned short int eCommentLen = 0;
|
unsigned short int eCommentLen = 0;
|
||||||
CONS_Printf("Entry at %ld:\n", handlePos);
|
unsigned int eSize = 0;
|
||||||
// We get the variable length fields.
|
unsigned int eCompSize = 0;
|
||||||
fseek(handle, 24, SEEK_CUR);
|
unsigned int eLocalHeaderOffset = 0;
|
||||||
fscanf(handle, "%hu %hu %hu", &eNameLen, &eXFieldLen, &eCommentLen);
|
|
||||||
CONS_Printf("Name length is %u.\n", eNameLen);
|
fseek(handle, 16, SEEK_CUR);
|
||||||
|
fread(&eSize, 1, 4, handle);
|
||||||
|
fread(&eCompSize, 1, 4, handle);
|
||||||
|
|
||||||
|
// We get the variable length fields.
|
||||||
|
fread(&eNameLen, 1, 2, handle);
|
||||||
|
fread(&eXFieldLen, 1, 2, handle);
|
||||||
|
fread(&eCommentLen, 1, 2, handle);
|
||||||
|
fseek(handle, 8, SEEK_CUR);
|
||||||
|
fread(&eLocalHeaderOffset, 1, 4, handle); // Get the offset.
|
||||||
|
|
||||||
// We jump straight to the name field now.
|
|
||||||
fseek(handle, 10, SEEK_CUR);
|
|
||||||
eName = malloc(sizeof(char)*(eNameLen + 1));
|
eName = malloc(sizeof(char)*(eNameLen + 1));
|
||||||
fgets(eName, eNameLen, handle);
|
fgets(eName, eNameLen + 1, handle);
|
||||||
CONS_Printf("%s\n", eName);
|
if (eSize == 0) // Is this entry a folder?
|
||||||
|
{
|
||||||
|
CONS_Printf("Folder %s at %ld:\n", eName, handlePos);
|
||||||
|
}
|
||||||
|
else // If not, then it is a normal file. Let's arrange its lumpinfo structure then!
|
||||||
|
{
|
||||||
|
CONS_Printf("File %s at %ld:\n", eName, handlePos);
|
||||||
|
|
||||||
|
if (numlumps == 0) // First lump? Let's allocate the first lumpinfo block.
|
||||||
|
lumpinfo = Z_Malloc(sizeof(*lumpinfo), PU_STATIC, NULL);
|
||||||
|
else // Otherwise, reallocate and increase by 1. Might not be optimal, though...
|
||||||
|
lumpinfo = (lumpinfo_t*) Z_Realloc(lumpinfo, (numlumps + 1)*sizeof(*lumpinfo), PU_STATIC, NULL);
|
||||||
|
|
||||||
|
lumpinfo[numlumps].position = eLocalHeaderOffset + 30 + eNameLen + eXFieldLen;
|
||||||
|
lumpinfo[numlumps].disksize = eCompSize;
|
||||||
|
|
||||||
|
strncpy(lumpinfo[numlumps].name, eName + eNameLen - 8, 8);
|
||||||
|
lumpinfo[numlumps].name[8] = '\0';
|
||||||
|
|
||||||
|
lumpinfo[numlumps].name2 = Z_Malloc((eNameLen+1)*sizeof(char), PU_STATIC, NULL);
|
||||||
|
strncpy(lumpinfo[numlumps].name2, eName, eNameLen);
|
||||||
|
lumpinfo[numlumps].name2[eNameLen] = '\0';
|
||||||
|
|
||||||
|
lumpinfo[numlumps].size = eSize;
|
||||||
|
|
||||||
|
lumpinfo[numlumps].compressed = 0;
|
||||||
|
|
||||||
|
lumpinfo[numlumps].compression = CM_NONE;
|
||||||
|
|
||||||
|
//CONS_Printf("The lump's current long name is %s\n", lumpinfo[numlumps].name2);
|
||||||
|
//CONS_Printf("The lump's current short name is %s\n", lumpinfo[numlumps].name);
|
||||||
|
numlumps++;
|
||||||
|
}
|
||||||
|
|
||||||
free(eName);
|
free(eName);
|
||||||
}
|
}
|
||||||
else if (!memcmp(sigBuffer, "\x50\x4b\x05\x06", 4)) // Found the central dir end signature, stop seeking.
|
else if (!memcmp(sigBuffer, "\x50\x4b\x05\x06", 4)) // Found the central dir end signature, stop seeking.
|
||||||
|
@ -457,8 +499,12 @@ UINT16 W_LoadWadFile(const char *filename)
|
||||||
free(sigBuffer);
|
free(sigBuffer);
|
||||||
return INT16_MAX;
|
return INT16_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we've reached this far, then it means our dynamically stored lumpinfo has to be ready.
|
||||||
|
// Now we finally build our... incorrectly called wadfile.
|
||||||
|
// TODO: Maybe we should give them more generalized names, like resourcefile or resfile or something.
|
||||||
|
// Mostly for clarity and better understanding when reading the code.
|
||||||
free(sigBuffer);
|
free(sigBuffer);
|
||||||
return INT16_MAX;
|
|
||||||
}
|
}
|
||||||
// assume wad file
|
// assume wad file
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue