Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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.