6 class WadException(Exception):
11 wadinfo_size = calcsize (wadinfo_t)
13 filelump_size = calcsize (filelump_t)
20 for (handle, pos, size, name) in self.lumps:
24 def AddFile(self, filename):
25 (base, ext) = os.path.splitext (filename)
26 fileHandle = open (filename, 'rb')
29 if ext.lower() == '.wad':
31 (id, numLumps, infoTable) = unpack (WadDesc.wadinfo_t, fileHandle.read(WadDesc.wadinfo_size))
33 if id != 'IWAD' and id != 'PWAD':
34 raise WadException("Wad file %s doesn't have IWAD or PWAD id" % filename)
36 fileHandle.seek (infoTable)
38 for i in range (0, numLumps):
39 lumpinfo.append (unpack (WadDesc.filelump_t, fileHandle.read(WadDesc.filelump_size)))
41 # single file, boring.
42 size = os.stat (filename).st_size
43 lumpinfo.append ((0, size, base.upper()[:8]))
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')))
49 def InitMultipleFiles (self, filenames):
53 def InitFile (self, filename):
57 return len (self.lumps)
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
67 def GetNumForName (self, name):
68 index = self.CheckNumForName (name)
70 raise WadException ("%s not found!" % name)
73 def LumpLength (self, lump):
74 (handle, pos, length, name) = self.lumps[lump]
77 def ReadLump (self, lump):
78 (handle, pos, length, name) = self.lumps[lump]
80 return handle.read (length)
82 def CacheLumpNum (self, lump, tag):
85 def CacheLumpName (self, name, tag):
86 return self.CacheLumpNum (self.GetNumForName (name), tag)