home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / wad.c < prev    next >
C/C++ Source or Header  |  2000-06-17  |  4KB  |  159 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. // wad.c
  21.  
  22. #include "quakedef.h"
  23.  
  24. int     wad_numlumps;
  25. lumpinfo_t  *wad_lumps;
  26. byte    *wad_base;
  27.  
  28. void SwapPic (qpic_t *pic);
  29.  
  30. /*
  31. ==================
  32. W_CleanupName
  33.  
  34. Lowercases name and pads with spaces and a terminating 0 to the length of
  35. lumpinfo_t->name.
  36. Used so lumpname lookups can proceed rapidly by comparing 4 chars at a time
  37. Space padding is so names can be printed nicely in tables.
  38. Can safely be performed in place.
  39. ==================
  40. */
  41. void W_CleanupName (char *in, char *out)
  42. {
  43.   int   i;
  44.   int   c;
  45.   
  46.   for (i=0 ; i<16 ; i++ )
  47.   {
  48.     c = in[i];
  49.     if (!c)
  50.       break;
  51.       
  52.     if (c >= 'A' && c <= 'Z')
  53.       c += ('a' - 'A');
  54.     out[i] = c;
  55.   }
  56.   
  57.   for ( ; i< 16 ; i++ )
  58.     out[i] = 0;
  59. }
  60.  
  61.  
  62.  
  63. /*
  64. ====================
  65. W_LoadWadFile
  66. ====================
  67. */
  68. void W_LoadWadFile (char *filename)
  69. {
  70.   lumpinfo_t    *lump_p;
  71.   wadinfo_t   *header;
  72.   unsigned    i;
  73.   int       infotableofs;
  74.   
  75.   wad_base = COM_LoadHunkFile (filename);
  76.   if (!wad_base)
  77.     Sys_Error ("W_LoadWadFile: couldn't load %s", filename);
  78.  
  79.   header = (wadinfo_t *)wad_base;
  80.   
  81.   if (header->identification[0] != 'W'
  82.   || header->identification[1] != 'A'
  83.   || header->identification[2] != 'D'
  84.   || header->identification[3] != '2')
  85.     Sys_Error ("Wad file %s doesn't have WAD2 id\n",filename);
  86.     
  87.   wad_numlumps = LittleLong(header->numlumps);
  88.   infotableofs = LittleLong(header->infotableofs);
  89.   wad_lumps = (lumpinfo_t *)(wad_base + infotableofs);
  90.   
  91.   for (i=0, lump_p = wad_lumps ; i<wad_numlumps ; i++,lump_p++)
  92.   {
  93.     lump_p->filepos = LittleLong(lump_p->filepos);
  94.     lump_p->size = LittleLong(lump_p->size);
  95.     W_CleanupName (lump_p->name, lump_p->name);
  96.     if (lump_p->type == TYP_QPIC)
  97.       SwapPic ( (qpic_t *)(wad_base + lump_p->filepos));
  98.   }
  99. }
  100.  
  101.  
  102. /*
  103. =============
  104. W_GetLumpinfo
  105. =============
  106. */
  107. lumpinfo_t  *W_GetLumpinfo (char *name)
  108. {
  109.   int   i;
  110.   lumpinfo_t  *lump_p;
  111.   char  clean[16];
  112.   
  113.   W_CleanupName (name, clean);
  114.   
  115.   for (lump_p=wad_lumps, i=0 ; i<wad_numlumps ; i++,lump_p++)
  116.   {
  117.     if (!strcmp(clean, lump_p->name))
  118.       return lump_p;
  119.   }
  120.   
  121.   Sys_Error ("W_GetLumpinfo: %s not found", name);
  122.   return NULL;
  123. }
  124.  
  125. void *W_GetLumpName (char *name)
  126. {
  127.   lumpinfo_t  *lump;
  128.   
  129.   lump = W_GetLumpinfo (name);
  130.   
  131.   return (void *)(wad_base + lump->filepos);
  132. }
  133.  
  134. void *W_GetLumpNum (int num)
  135. {
  136.   lumpinfo_t  *lump;
  137.   
  138.   if (num < 0 || num > wad_numlumps)
  139.     Sys_Error ("W_GetLumpNum: bad number: %i", num);
  140.     
  141.   lump = wad_lumps + num;
  142.   
  143.   return (void *)(wad_base + lump->filepos);
  144. }
  145.  
  146. /*
  147. =============================================================================
  148.  
  149. automatic byte swapping
  150.  
  151. =============================================================================
  152. */
  153.  
  154. void SwapPic (qpic_t *pic)
  155. {
  156.   pic->width = LittleLong(pic->width);
  157.   pic->height = LittleLong(pic->height);  
  158. }
  159.