Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5131 | clevermous | 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 |
||
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 |
||
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 | }>>=>16> |