#!/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
