#!/usr/bin/python # mkdrs - make DRS archives # By Bryce Schroeder, January 2004 from sys import stdout, argv from os import listdir, system, stat filesize = 0 def getFiles(path): numFils = 0 fileData = [] dir = listdir(path) for file in dir: fileData.append([file[-3:],file[:-4], stat(path+file).st_size]) numFils += 1 fileData.sort() return fileData, numFils def l4int(number): if number >= 16777216: b4 = number / 16777216 number -= b4*16777216 else: b4 = 0 if number >= 65536: b3 = number / 65536 number -= b3*65536 else: b3 = 0 if number >= 256: b2 = number / 256 number -= b2*256 else: b2 = 0 b1 = number return chr(b1)+chr(b2)+chr(b3)+chr(b4) try: newDrs = open(argv[2],'w') path = argv[1] files, nfiles = getFiles(argv[1]) except IOError: print "Invalid File" exit(1) except IndexError: print "Please Specify a Directory and File." exit(1) def countTypes(files, path, filesize): typens = [] # Depends on files being sorted by type, beware. names = {} ntypes = 0 for file in files: if names.has_key(file[0]): typens[names[file[0]]][1] += 1 typens[names[file[0]]][2] += file[2] typens[names[file[0]]][3].append([ file[1], stat(path+str(file[1])+'.'+file[0]).st_size ]) else: typens.append( [file[0], 1, file[2], [[ file[1], stat(path+str(file[1])+'.'+file[0]).st_size ]]] ) names[file[0]] = ntypes ntypes += 1 return ntypes, typens, filesize # So now we've got a file, newDrs, and a list of files, called files. # we're going to make tables now. ntables, typens, filesize = countTypes(files, path, filesize) sheader = 84 # Size of header stableheads = 12 * ntables # Size of the table headers stables = 12 * nfiles # size of the tables proper firstfile = sheader+stableheads+stables # position of the first file tablestarts = [] # starting positions of the tables i, running = 0,0 while i < ntables: tablestarts.append(sheader+stableheads+running) running += typens[i][1]*12 i += 1 # Thou may will to changeth this copyright = "Copyright (c) 2001 LucasArts Entertainment Company LLC\032\000\000\000\000\000" version = "1.00" type = "swbg\000\000\000\000\000\000\000\000" # Note that it is susposed to be swbg, not swgb as intuition would assume. Don't # ask me why. I belive this should be 'tribes' for AOK, but I'm not sure. print "Writing headers..." newDrs.write(copyright+version+type+l4int(ntables)+l4int(firstfile)) def type(ext): if ext == 'bin': return 'anib' elif ext == 'wav': return ' vaw' elif ext == 'slp': return ' pls' else: return ' '+ext[2]+ext[1]+ext[0] i = 0 print " tables..." while i < ntables: newDrs.write( type(typens[i][0]) + l4int(tablestarts[i]) + l4int(typens[i][1]) ) i += 1 #k, so we wrote the table header things, let's write the tables now and hope... print " Building database:" pos = firstfile for table in typens: print " Registering %d %s files..." % (table[1],table[0]) for file in table[3]: newDrs.write( l4int(int(file[0]))+l4int(pos)+l4int(file[1]) ) pos += file[1] print " @%X" % pos print "Writing Archive, Please don't abort..." for table in typens: print " Writing %s files..." % table[0] stdout.flush() for file in table[3]: tmp = open(path+str(file[0])+'.'+table[0], 'r') newDrs.write(tmp.read()) tmp.close() print "Your archive is done." #50314 sith, 50330 jedi , 50320 - victory # `easter egg': Play a sound when certain swgb datafile is recreated. try: system("mplayer %s/50320.wav 1> /dev/null 2> /dev/null" % path) except IOError: pass