]> icculus.org git repositories - theoddone33/hheretic.git/blob - pyhexen/wad.py
more struct fixes
[theoddone33/hheretic.git] / pyhexen / wad.py
1
2 import os
3 import os.path
4 import struct
5
6 class WadException(Exception):
7         pass
8
9 class WadDesc:
10         wadinfo_t = '<4sii'
11         wadinfo_size = struct.calcsize (wadinfo_t)
12         filelump_t = '<ii8s'
13         filelump_size = struct.calcsize (filelump_t)
14
15 class WadReader:
16         def __init__(self):
17                 self.lumps = []
18
19         def __del__(self):
20                 for (handle, pos, size, name) in self.lumps:
21                         if not handle.closed:
22                                 handle.close()
23
24         def AddFile(self, filename):
25                 (base, ext) = os.path.splitext (filename)
26                 fileHandle = open (filename, 'rb')
27
28                 lumpinfo = []
29                 if ext.lower() == '.wad':
30                         # yay, a wad file.
31                         (id, numLumps, infoTable) = struct.unpack (WadDesc.wadinfo_t, fileHandle.read(WadDesc.wadinfo_size))
32
33                         if id != 'IWAD' and id != 'PWAD':
34                                 raise WadException("Wad file %s doesn't have IWAD or PWAD id" % filename)
35
36                         fileHandle.seek (infoTable)
37
38                         for i in range (0, numLumps):
39                                 lumpinfo.append (struct.unpack (WadDesc.filelump_t, fileHandle.read(WadDesc.filelump_size)))
40                 else:
41                         # single file, boring.
42                         size = os.stat (filename).st_size
43                         lumpinfo.append ((0, size, base.upper()[:8]))
44
45                 # Dump the info into our table of accumulated crap.
46                 for (pos, length, name) in lumpinfo:
47                         self.lumps.append ((fileHandle, pos, length, name.rstrip('\x00')))
48
49         def InitMultipleFiles (self, filenames):
50                 for f in filenames:
51                         self.AddFile (f)
52
53         def InitFile (self, filename):
54                 self.AddFile (f)
55
56         def NumLumps (self):
57                 return len (self.lumps)
58
59         def CheckNumForName (self, name):
60                 searchName = name.upper()[:8]
61                 for (x, y) in enumerate (reversed(self.lumps)):
62                         (handle, pos, length, name) = y
63                         if searchName == name:
64                                 return len(self.lumps) - x - 1
65                 return -1
66
67         def GetNumForName (self, name):
68                 index = self.CheckNumForName (name)
69                 if index == -1:
70                         raise WadException ("%s not found!" % name)
71                 return index
72
73         def LumpLength (self, lump):
74                 (handle, pos, length, name) = self.lumps[lump]
75                 return length
76
77         def ReadLump (self, lump):
78                 (handle, pos, length, name) = self.lumps[lump]
79                 handle.seek (pos)
80                 return handle.read (length)
81
82         def CacheLumpNum (self, lump, tag):
83                 pass
84
85         def CacheLumpName (self, name, tag):
86                 return self.CacheLumpNum (self.GetNumForName (name), tag)
87