diff options
-rw-r--r-- | src/heretic/Makefile.am | 3 | ||||
-rw-r--r-- | src/heretic/doomdata.h | 7 | ||||
-rw-r--r-- | src/heretic/doomdef.h | 29 | ||||
-rw-r--r-- | src/heretic/w_wad.c | 520 |
4 files changed, 5 insertions, 554 deletions
diff --git a/src/heretic/Makefile.am b/src/heretic/Makefile.am index a312909b..d240bae3 100644 --- a/src/heretic/Makefile.am +++ b/src/heretic/Makefile.am @@ -47,8 +47,7 @@ r_things.c \ sb_bar.c \ sounds.c sounds.h \ soundst.h \ -v_video.c \ -w_wad.c +v_video.c EXTRA_DIST= \ i_sound.c i_sound.h \ diff --git a/src/heretic/doomdata.h b/src/heretic/doomdata.h index f99067bd..ec93ac62 100644 --- a/src/heretic/doomdata.h +++ b/src/heretic/doomdata.h @@ -28,12 +28,7 @@ #ifndef __DOOMDATA__ #define __DOOMDATA__ -#ifndef __BYTEBOOL__ -#define __BYTEBOOL__ -typedef enum -{ false, true } boolean; -typedef unsigned char byte; -#endif +#include "doomtype.h" /* =============================================================================== diff --git a/src/heretic/doomdef.h b/src/heretic/doomdef.h index 21adbc2a..3cfafad4 100644 --- a/src/heretic/doomdef.h +++ b/src/heretic/doomdef.h @@ -49,6 +49,9 @@ // header generated by multigen utility #include "info.h" +// WAD file access +#include "w_wad.h" + extern byte *destview, *destscreen; // PC direct to screen pointers // @@ -780,32 +783,6 @@ long LongSwap(long); #include "z_zone.h" -//------- -//WADFILE -//------- -typedef struct -{ - char name[8]; - int handle, position, size; -} lumpinfo_t; - -extern lumpinfo_t *lumpinfo; -extern int numlumps; - -void W_InitMultipleFiles(char **filenames); - -int W_CheckNumForName(char *name); -int W_GetNumForName(char *name); - -int W_LumpLength(int lump); -void W_ReadLump(int lump, void *dest); - -void *W_CacheLumpNum(int lump, int tag); -void *W_CacheLumpName(char *name, int tag); - - - - //---------- //BASE LEVEL //---------- diff --git a/src/heretic/w_wad.c b/src/heretic/w_wad.c deleted file mode 100644 index 1c3977e3..00000000 --- a/src/heretic/w_wad.c +++ /dev/null @@ -1,520 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright(C) 1993-1996 Id Software, Inc. -// Copyright(C) 1993-2008 Raven Software -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -// 02111-1307, USA. -// -//----------------------------------------------------------------------------- -// W_wad.c - -#ifdef NeXT -#include <libc.h> -#include <ctype.h> - - -#else - -#include <malloc.h> -#include <fcntl.h> -#include <sys/stat.h> -#endif - -// next doesn't need a binary flag in open call -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -#include "doomdef.h" - -//=============== -// TYPES -//=============== - - -typedef struct -{ - char identification[4]; // should be IWAD - int numlumps; - int infotableofs; -} wadinfo_t; - - -typedef struct -{ - int filepos; - int size; - char name[8]; -} filelump_t; - - -//============= -// GLOBALS -//============= - -lumpinfo_t *lumpinfo; // location of each lump on disk -int numlumps; - -void **lumpcache; - - -//=================== - -#ifdef NeXT - -#define strcmpi strcasecmp - -void strupr(char *s) -{ - while (*s) - *s++ = toupper(*s); -} - -/* -================ -= -= filelength -= -================ -*/ - -int filelength(int handle) -{ - struct stat fileinfo; - - if (fstat(handle, &fileinfo) == -1) - I_Error("Error fstating"); - - return fileinfo.st_size; -} - -#endif - - -void ExtractFileBase(char *path, char *dest) -{ - char *src; - int length; - - src = path + strlen(path) - 1; - -// -// back up until a \ or the start -// - while (src != path && *(src - 1) != '\\' && *(src - 1) != '/') - src--; - -// -// copy up to eight characters -// - memset(dest, 0, 8); - length = 0; - while (*src && *src != '.') - { - if (++length == 9) - I_Error("Filename base of %s >8 chars", path); - *dest++ = toupper((int) *src++); - } -} - -/* -============================================================================ - - LUMP BASED ROUTINES - -============================================================================ -*/ - -/* -==================== -= -= W_AddFile -= -= All files are optional, but at least one file must be found -= Files with a .wad extension are wadlink files with multiple lumps -= Other files are single lumps with the base filename for the lump name -= -==================== -*/ - -void W_AddFile(char *filename) -{ - wadinfo_t header; - lumpinfo_t *lump_p; - unsigned i; - int handle, length; - int startlump; - filelump_t *fileinfo, singleinfo; - -// -// open the file and add to directory -// - if ((handle = open(filename, O_RDONLY | O_BINARY)) == -1) - return; - - startlump = numlumps; - - if (strcmpi(filename + strlen(filename) - 3, "wad")) - { - // single lump file - fileinfo = &singleinfo; - singleinfo.filepos = 0; - singleinfo.size = LONG(filelength(handle)); - ExtractFileBase(filename, singleinfo.name); - numlumps++; - } - else - { - // WAD file - read(handle, &header, sizeof(header)); - if (strncmp(header.identification, "IWAD", 4)) - { - if (strncmp(header.identification, "PWAD", 4)) - I_Error("Wad file %s doesn't have IWAD or PWAD id\n", - filename); - } - header.numlumps = LONG(header.numlumps); - header.infotableofs = LONG(header.infotableofs); - length = header.numlumps * sizeof(filelump_t); - fileinfo = alloca(length); - lseek(handle, header.infotableofs, SEEK_SET); - read(handle, fileinfo, length); - numlumps += header.numlumps; - } - -// -// Fill in lumpinfo -// - lumpinfo = realloc(lumpinfo, numlumps * sizeof(lumpinfo_t)); - if (!lumpinfo) - I_Error("Couldn't realloc lumpinfo"); - lump_p = &lumpinfo[startlump]; - - for (i = startlump; i < numlumps; i++, lump_p++, fileinfo++) - { - lump_p->handle = handle; - lump_p->position = LONG(fileinfo->filepos); - lump_p->size = LONG(fileinfo->size); - strncpy(lump_p->name, fileinfo->name, 8); - } -} - - - - - -/* -==================== -= -= W_InitMultipleFiles -= -= Pass a null terminated list of files to use. -= -= All files are optional, but at least one file must be found -= -= Files with a .wad extension are idlink files with multiple lumps -= -= Other files are single lumps with the base filename for the lump name -= -= Lump names can appear multiple times. The name searcher looks backwards, -= so a later file can override an earlier one. -= -==================== -*/ - -void W_InitMultipleFiles(char **filenames) -{ - int size; - -// -// open all the files, load headers, and count lumps -// - numlumps = 0; - lumpinfo = malloc(1); // will be realloced as lumps are added - - for (; *filenames; filenames++) - W_AddFile(*filenames); - - if (!numlumps) - I_Error("W_InitFiles: no files found"); - -// -// set up caching -// - size = numlumps * sizeof(*lumpcache); - lumpcache = malloc(size); - if (!lumpcache) - I_Error("Couldn't allocate lumpcache"); - memset(lumpcache, 0, size); -} - - - -/* -==================== -= -= W_InitFile -= -= Just initialize from a single file -= -==================== -*/ - -void W_InitFile(char *filename) -{ - char *names[2]; - - names[0] = filename; - names[1] = NULL; - W_InitMultipleFiles(names); -} - - - -/* -==================== -= -= W_NumLumps -= -==================== -*/ - -int W_NumLumps(void) -{ - return numlumps; -} - - - -/* -==================== -= -= W_CheckNumForName -= -= Returns -1 if name not found -= -==================== -*/ - -int W_CheckNumForName(char *name) -{ - char name8[9]; - int v1, v2; - lumpinfo_t *lump_p; - -// make the name into two integers for easy compares - - strncpy(name8, name, 8); - name8[8] = 0; // in case the name was a fill 8 chars - strupr(name8); // case insensitive - - v1 = *(int *) name8; - v2 = *(int *) &name8[4]; - - -// scan backwards so patch lump files take precedence - - lump_p = lumpinfo + numlumps; - - while (lump_p-- != lumpinfo) - if (*(int *) lump_p->name == v1 && *(int *) &lump_p->name[4] == v2) - return lump_p - lumpinfo; - - - return -1; -} - - -/* -==================== -= -= W_GetNumForName -= -= Calls W_CheckNumForName, but bombs out if not found -= -==================== -*/ - -int W_GetNumForName(char *name) -{ - int i; - - i = W_CheckNumForName(name); - if (i != -1) - return i; - - I_Error("W_GetNumForName: %s not found!", name); - return -1; -} - - -/* -==================== -= -= W_LumpLength -= -= Returns the buffer size needed to load the given lump -= -==================== -*/ - -int W_LumpLength(int lump) -{ - if (lump >= numlumps) - I_Error("W_LumpLength: %i >= numlumps", lump); - return lumpinfo[lump].size; -} - - -/* -==================== -= -= W_ReadLump -= -= Loads the lump into the given buffer, which must be >= W_LumpLength() -= -==================== -*/ - -void W_ReadLump(int lump, void *dest) -{ - int c; - lumpinfo_t *l; - - if (lump >= numlumps) - I_Error("W_ReadLump: %i >= numlumps", lump); - l = lumpinfo + lump; - - I_BeginRead(); - - lseek(l->handle, l->position, SEEK_SET); - c = read(l->handle, dest, l->size); - if (c < l->size) - I_Error("W_ReadLump: only read %i of %i on lump %i", c, l->size, - lump); - I_EndRead(); -} - - - -/* -==================== -= -= W_CacheLumpNum -= -==================== -*/ - -void *W_CacheLumpNum(int lump, int tag) -{ - byte *ptr; - - if ((unsigned) lump >= numlumps) - I_Error("W_CacheLumpNum: %i >= numlumps", lump); - - if (!lumpcache[lump]) - { // read the lump in -//printf ("cache miss on lump %i\n",lump); - ptr = Z_Malloc(W_LumpLength(lump), tag, &lumpcache[lump]); - W_ReadLump(lump, lumpcache[lump]); - } - else - { -//printf ("cache hit on lump %i\n",lump); - Z_ChangeTag(lumpcache[lump], tag); - } - - return lumpcache[lump]; -} - - -/* -==================== -= -= W_CacheLumpName -= -==================== -*/ - -void *W_CacheLumpName(char *name, int tag) -{ - return W_CacheLumpNum(W_GetNumForName(name), tag); -} - - -/* -==================== -= -= W_Profile -= -==================== -*/ - -// Ripped out for Heretic -/* -int info[2500][10]; -int profilecount; - -void W_Profile (void) -{ - int i; - memblock_t *block; - void *ptr; - char ch; - FILE *f; - int j; - char name[9]; - - - for (i=0 ; i<numlumps ; i++) - { - ptr = lumpcache[i]; - if (!ptr) - { - ch = ' '; - continue; - } - else - { - block = (memblock_t *) ( (byte *)ptr - sizeof(memblock_t)); - if (block->tag < PU_PURGELEVEL) - ch = 'S'; - else - ch = 'P'; - } - info[i][profilecount] = ch; - } - profilecount++; - - f = fopen ("waddump.txt","w"); - name[8] = 0; - for (i=0 ; i<numlumps ; i++) - { - memcpy (name,lumpinfo[i].name,8); - for (j=0 ; j<8 ; j++) - if (!name[j]) - break; - for ( ; j<8 ; j++) - name[j] = ' '; - fprintf (f,"%s ",name); - for (j=0 ; j<profilecount ; j++) - fprintf (f," %c",info[i][j]); - fprintf (f,"\n"); - } - fclose (f); -} -*/ |