mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-22 18:31:27 +00:00
make wad extraction a little more useful by writing the known image formats
as pcx. (palette is written as pcx too, to make it easy to view)
This commit is contained in:
parent
67f913289c
commit
ccfaeaf999
2 changed files with 155 additions and 5 deletions
|
@ -2130,7 +2130,7 @@ QF_DEPS(PAK,
|
|||
)
|
||||
QF_DEPS(WAD,
|
||||
[],
|
||||
[$(top_builddir)/libs/util/libQFutil.la],
|
||||
[$(top_builddir)/libs/image/libQFimage.la $(top_builddir)/libs/util/libQFutil.la],
|
||||
[$(WIN32_LIBS)],
|
||||
)
|
||||
QF_DEPS(WAV,
|
||||
|
|
158
tools/wad/wad.c
158
tools/wad/wad.c
|
@ -45,12 +45,21 @@ static __attribute__ ((unused)) const char rcsid[] =
|
|||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <QF/bspfile.h>
|
||||
#include <QF/cmd.h>
|
||||
#include <QF/cvar.h>
|
||||
#include <QF/dstring.h>
|
||||
#include <QF/pcx.h>
|
||||
#include <QF/qtypes.h>
|
||||
#include <QF/quakefs.h>
|
||||
#include <QF/wadfile.h>
|
||||
#include <QF/sys.h>
|
||||
#include <QF/zone.h>
|
||||
|
||||
#include "wad.h"
|
||||
|
||||
#define MEMSIZE (12 * 1024 * 1024)
|
||||
|
||||
const char *this_program;
|
||||
options_t options;
|
||||
|
||||
|
@ -148,20 +157,154 @@ decode_args (int argc, char **argv)
|
|||
return optind;
|
||||
}
|
||||
|
||||
static byte default_palette[] = {
|
||||
0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x2F, 0x2F, 0x2F,
|
||||
0x3F, 0x3F, 0x3F, 0x4B, 0x4B, 0x4B, 0x5B, 0x5B, 0x5B, 0x6B, 0x6B, 0x6B,
|
||||
0x7B, 0x7B, 0x7B, 0x8B, 0x8B, 0x8B, 0x9B, 0x9B, 0x9B, 0xAB, 0xAB, 0xAB,
|
||||
0xBB, 0xBB, 0xBB, 0xCB, 0xCB, 0xCB, 0xDB, 0xDB, 0xDB, 0xEB, 0xEB, 0xEB,
|
||||
0x0F, 0x0B, 0x07, 0x17, 0x0F, 0x0B, 0x1F, 0x17, 0x0B, 0x27, 0x1B, 0x0F,
|
||||
0x2F, 0x23, 0x13, 0x37, 0x2B, 0x17, 0x3F, 0x2F, 0x17, 0x4B, 0x37, 0x1B,
|
||||
0x53, 0x3B, 0x1B, 0x5B, 0x43, 0x1F, 0x63, 0x4B, 0x1F, 0x6B, 0x53, 0x1F,
|
||||
0x73, 0x57, 0x1F, 0x7B, 0x5F, 0x23, 0x83, 0x67, 0x23, 0x8F, 0x6F, 0x23,
|
||||
0x0B, 0x0B, 0x0F, 0x13, 0x13, 0x1B, 0x1B, 0x1B, 0x27, 0x27, 0x27, 0x33,
|
||||
0x2F, 0x2F, 0x3F, 0x37, 0x37, 0x4B, 0x3F, 0x3F, 0x57, 0x47, 0x47, 0x67,
|
||||
0x4F, 0x4F, 0x73, 0x5B, 0x5B, 0x7F, 0x63, 0x63, 0x8B, 0x6B, 0x6B, 0x97,
|
||||
0x73, 0x73, 0xA3, 0x7B, 0x7B, 0xAF, 0x83, 0x83, 0xBB, 0x8B, 0x8B, 0xCB,
|
||||
0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x0B, 0x0B, 0x00, 0x13, 0x13, 0x00,
|
||||
0x1B, 0x1B, 0x00, 0x23, 0x23, 0x00, 0x2B, 0x2B, 0x07, 0x2F, 0x2F, 0x07,
|
||||
0x37, 0x37, 0x07, 0x3F, 0x3F, 0x07, 0x47, 0x47, 0x07, 0x4B, 0x4B, 0x0B,
|
||||
0x53, 0x53, 0x0B, 0x5B, 0x5B, 0x0B, 0x63, 0x63, 0x0B, 0x6B, 0x6B, 0x0F,
|
||||
0x07, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x17, 0x00, 0x00, 0x1F, 0x00, 0x00,
|
||||
0x27, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x37, 0x00, 0x00, 0x3F, 0x00, 0x00,
|
||||
0x47, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x57, 0x00, 0x00, 0x5F, 0x00, 0x00,
|
||||
0x67, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x77, 0x00, 0x00, 0x7F, 0x00, 0x00,
|
||||
0x13, 0x13, 0x00, 0x1B, 0x1B, 0x00, 0x23, 0x23, 0x00, 0x2F, 0x2B, 0x00,
|
||||
0x37, 0x2F, 0x00, 0x43, 0x37, 0x00, 0x4B, 0x3B, 0x07, 0x57, 0x43, 0x07,
|
||||
0x5F, 0x47, 0x07, 0x6B, 0x4B, 0x0B, 0x77, 0x53, 0x0F, 0x83, 0x57, 0x13,
|
||||
0x8B, 0x5B, 0x13, 0x97, 0x5F, 0x1B, 0xA3, 0x63, 0x1F, 0xAF, 0x67, 0x23,
|
||||
0x23, 0x13, 0x07, 0x2F, 0x17, 0x0B, 0x3B, 0x1F, 0x0F, 0x4B, 0x23, 0x13,
|
||||
0x57, 0x2B, 0x17, 0x63, 0x2F, 0x1F, 0x73, 0x37, 0x23, 0x7F, 0x3B, 0x2B,
|
||||
0x8F, 0x43, 0x33, 0x9F, 0x4F, 0x33, 0xAF, 0x63, 0x2F, 0xBF, 0x77, 0x2F,
|
||||
0xCF, 0x8F, 0x2B, 0xDF, 0xAB, 0x27, 0xEF, 0xCB, 0x1F, 0xFF, 0xF3, 0x1B,
|
||||
0x0B, 0x07, 0x00, 0x1B, 0x13, 0x00, 0x2B, 0x23, 0x0F, 0x37, 0x2B, 0x13,
|
||||
0x47, 0x33, 0x1B, 0x53, 0x37, 0x23, 0x63, 0x3F, 0x2B, 0x6F, 0x47, 0x33,
|
||||
0x7F, 0x53, 0x3F, 0x8B, 0x5F, 0x47, 0x9B, 0x6B, 0x53, 0xA7, 0x7B, 0x5F,
|
||||
0xB7, 0x87, 0x6B, 0xC3, 0x93, 0x7B, 0xD3, 0xA3, 0x8B, 0xE3, 0xB3, 0x97,
|
||||
0xAB, 0x8B, 0xA3, 0x9F, 0x7F, 0x97, 0x93, 0x73, 0x87, 0x8B, 0x67, 0x7B,
|
||||
0x7F, 0x5B, 0x6F, 0x77, 0x53, 0x63, 0x6B, 0x4B, 0x57, 0x5F, 0x3F, 0x4B,
|
||||
0x57, 0x37, 0x43, 0x4B, 0x2F, 0x37, 0x43, 0x27, 0x2F, 0x37, 0x1F, 0x23,
|
||||
0x2B, 0x17, 0x1B, 0x23, 0x13, 0x13, 0x17, 0x0B, 0x0B, 0x0F, 0x07, 0x07,
|
||||
0xBB, 0x73, 0x9F, 0xAF, 0x6B, 0x8F, 0xA3, 0x5F, 0x83, 0x97, 0x57, 0x77,
|
||||
0x8B, 0x4F, 0x6B, 0x7F, 0x4B, 0x5F, 0x73, 0x43, 0x53, 0x6B, 0x3B, 0x4B,
|
||||
0x5F, 0x33, 0x3F, 0x53, 0x2B, 0x37, 0x47, 0x23, 0x2B, 0x3B, 0x1F, 0x23,
|
||||
0x2F, 0x17, 0x1B, 0x23, 0x13, 0x13, 0x17, 0x0B, 0x0B, 0x0F, 0x07, 0x07,
|
||||
0xDB, 0xC3, 0xBB, 0xCB, 0xB3, 0xA7, 0xBF, 0xA3, 0x9B, 0xAF, 0x97, 0x8B,
|
||||
0xA3, 0x87, 0x7B, 0x97, 0x7B, 0x6F, 0x87, 0x6F, 0x5F, 0x7B, 0x63, 0x53,
|
||||
0x6B, 0x57, 0x47, 0x5F, 0x4B, 0x3B, 0x53, 0x3F, 0x33, 0x43, 0x33, 0x27,
|
||||
0x37, 0x2B, 0x1F, 0x27, 0x1F, 0x17, 0x1B, 0x13, 0x0F, 0x0F, 0x0B, 0x07,
|
||||
0x6F, 0x83, 0x7B, 0x67, 0x7B, 0x6F, 0x5F, 0x73, 0x67, 0x57, 0x6B, 0x5F,
|
||||
0x4F, 0x63, 0x57, 0x47, 0x5B, 0x4F, 0x3F, 0x53, 0x47, 0x37, 0x4B, 0x3F,
|
||||
0x2F, 0x43, 0x37, 0x2B, 0x3B, 0x2F, 0x23, 0x33, 0x27, 0x1F, 0x2B, 0x1F,
|
||||
0x17, 0x23, 0x17, 0x0F, 0x1B, 0x13, 0x0B, 0x13, 0x0B, 0x07, 0x0B, 0x07,
|
||||
0xFF, 0xF3, 0x1B, 0xEF, 0xDF, 0x17, 0xDB, 0xCB, 0x13, 0xCB, 0xB7, 0x0F,
|
||||
0xBB, 0xA7, 0x0F, 0xAB, 0x97, 0x0B, 0x9B, 0x83, 0x07, 0x8B, 0x73, 0x07,
|
||||
0x7B, 0x63, 0x07, 0x6B, 0x53, 0x00, 0x5B, 0x47, 0x00, 0x4B, 0x37, 0x00,
|
||||
0x3B, 0x2B, 0x00, 0x2B, 0x1F, 0x00, 0x1B, 0x0F, 0x00, 0x0B, 0x07, 0x00,
|
||||
0x00, 0x00, 0xFF, 0x0B, 0x0B, 0xEF, 0x13, 0x13, 0xDF, 0x1B, 0x1B, 0xCF,
|
||||
0x23, 0x23, 0xBF, 0x2B, 0x2B, 0xAF, 0x2F, 0x2F, 0x9F, 0x2F, 0x2F, 0x8F,
|
||||
0x2F, 0x2F, 0x7F, 0x2F, 0x2F, 0x6F, 0x2F, 0x2F, 0x5F, 0x2B, 0x2B, 0x4F,
|
||||
0x23, 0x23, 0x3F, 0x1B, 0x1B, 0x2F, 0x13, 0x13, 0x1F, 0x0B, 0x0B, 0x0F,
|
||||
0x2B, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x4B, 0x07, 0x00, 0x5F, 0x07, 0x00,
|
||||
0x6F, 0x0F, 0x00, 0x7F, 0x17, 0x07, 0x93, 0x1F, 0x07, 0xA3, 0x27, 0x0B,
|
||||
0xB7, 0x33, 0x0F, 0xC3, 0x4B, 0x1B, 0xCF, 0x63, 0x2B, 0xDB, 0x7F, 0x3B,
|
||||
0xE3, 0x97, 0x4F, 0xE7, 0xAB, 0x5F, 0xEF, 0xBF, 0x77, 0xF7, 0xD3, 0x8B,
|
||||
0xA7, 0x7B, 0x3B, 0xB7, 0x9B, 0x37, 0xC7, 0xC3, 0x37, 0xE7, 0xE3, 0x57,
|
||||
0x7F, 0xBF, 0xFF, 0xAB, 0xE7, 0xFF, 0xD7, 0xFF, 0xFF, 0x67, 0x00, 0x00,
|
||||
0x8B, 0x00, 0x00, 0xB3, 0x00, 0x00, 0xD7, 0x00, 0x00, 0xFF, 0x00, 0x00,
|
||||
0xFF, 0xF3, 0x93, 0xFF, 0xF7, 0xC7, 0xFF, 0xFF, 0xFF, 0x9F, 0x5B, 0x53,
|
||||
};
|
||||
|
||||
static int
|
||||
wad_extract (wad_t *wad, lumpinfo_t *pf)
|
||||
{
|
||||
const char *name = pf->name;
|
||||
dstring_t name = {&dstring_default_mem, 0, 0, 0};
|
||||
size_t count;
|
||||
int len;
|
||||
int len, i;
|
||||
QFile *file;
|
||||
char buffer[16384];
|
||||
pcx_t *pcx;
|
||||
qpic_t *qpic;
|
||||
miptex_t *mip;
|
||||
|
||||
if (QFS_CreatePath (name) == -1)
|
||||
switch (pf->type) {
|
||||
case TYP_PALETTE:
|
||||
dsprintf (&name, "%s.pcx", pf->name);
|
||||
break;
|
||||
case TYP_QPIC:
|
||||
dsprintf (&name, "%s.pcx", pf->name);
|
||||
break;
|
||||
case TYP_MIPTEX:
|
||||
dsprintf (&name, "%s.pcx", pf->name);
|
||||
break;
|
||||
case TYP_SOUND:
|
||||
case TYP_QTEX:
|
||||
default:
|
||||
dsprintf (&name, "%s", pf->name);
|
||||
break;
|
||||
}
|
||||
|
||||
if (QFS_CreatePath (name.str) == -1)
|
||||
return -1;
|
||||
if (!(file = Qopen (name, "wb")))
|
||||
if (!(file = Qopen (name.str, "wb")))
|
||||
return -1;
|
||||
|
||||
Qseek (wad->handle, pf->filepos, SEEK_SET);
|
||||
|
||||
switch (pf->type) {
|
||||
case TYP_PALETTE:
|
||||
count = 768;
|
||||
memset (buffer, 0, count);
|
||||
if (count > pf->size)
|
||||
count = pf->size;
|
||||
for (i = 0; i < 256; i++)
|
||||
buffer[i + 768] = i;
|
||||
Qread (wad->handle, buffer, count);
|
||||
pcx = EncodePCX (buffer + 768, 16, 16, 16, buffer, false, &len);
|
||||
if (Qwrite (file, pcx, len) != len) {
|
||||
fprintf (stderr, "Error writing to %s\n", name.str);
|
||||
return -1;
|
||||
}
|
||||
Qclose (file);
|
||||
return 0;
|
||||
case TYP_QPIC:
|
||||
qpic = malloc (pf->size);
|
||||
Qread (wad->handle, qpic, pf->size);
|
||||
pcx = EncodePCX (qpic->data, qpic->width, qpic->height,
|
||||
qpic->width, default_palette, false, &len);
|
||||
if (Qwrite (file, pcx, len) != len) {
|
||||
fprintf (stderr, "Error writing to %s\n", name.str);
|
||||
return -1;
|
||||
}
|
||||
Qclose (file);
|
||||
return 0;
|
||||
case TYP_MIPTEX:
|
||||
mip = malloc (pf->size);
|
||||
Qread (wad->handle, mip, pf->size);
|
||||
pcx = EncodePCX ((byte *) mip + mip->offsets[0],
|
||||
mip->width, mip->height, mip->width,
|
||||
default_palette, false, &len);
|
||||
if (Qwrite (file, pcx, len) != len) {
|
||||
fprintf (stderr, "Error writing to %s\n", name.str);
|
||||
return -1;
|
||||
}
|
||||
Qclose (file);
|
||||
return 0;
|
||||
case TYP_SOUND:
|
||||
case TYP_QTEX:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
len = pf->size;
|
||||
while (len) {
|
||||
count = len;
|
||||
|
@ -182,6 +325,13 @@ main (int argc, char **argv)
|
|||
int i;//, j, rehash = 0;
|
||||
lumpinfo_t *pf;
|
||||
|
||||
Cvar_Init_Hash ();
|
||||
Cmd_Init_Hash ();
|
||||
Cvar_Init ();
|
||||
Sys_Init_Cvars ();
|
||||
Cmd_Init ();
|
||||
Memory_Init (malloc (MEMSIZE), MEMSIZE);
|
||||
|
||||
this_program = argv[0];
|
||||
|
||||
decode_args (argc, argv);
|
||||
|
|
Loading…
Reference in a new issue