Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import sys
- import struct
- import re
- facedict = {}
- facedict['00'] = 'Lloyd'
- facedict['01'] = 'Elie'
- facedict['02'] = 'Tio'
- facedict['03'] = 'Randy'
- facedict['04'] = 'Lazy'
- facedict['05'] = 'Noel'
- facedict['06'] = 'Dudley'
- facedict['07'] = 'Yin'
- facedict['08'] = 'Estelle'
- facedict['09'] = 'Joshua'
- facedict['10'] = 'Sergei'
- facedict['11'] = 'KeA'
- facedict['12'] = 'Zeit'
- facedict['13'] = 'Cecil'
- facedict['14'] = 'Arios'
- facedict['15'] = 'Sizuku'
- facedict['16'] = 'Wald'
- facedict['17'] = 'Ilya'
- facedict['18'] = 'Rixia'
- facedict['19'] = 'Fran'
- facedict['20'] = 'Sonya'
- facedict['21'] = 'Grace'
- facedict['22'] = 'Ian'
- facedict['23'] = 'Jona'
- facedict['24'] = 'Joachim'
- facedict['25'] = 'McDowell'
- facedict['26'] = 'Earnest'
- facedict['27'] = 'Hartman'
- facedict['28'] = 'Dieter'
- facedict['29'] = 'Mariabell'
- facedict['30'] = 'Marconi'
- facedict['31'] = 'Garcia'
- facedict['32'] = 'Cao'
- facedict['33'] = 'Renne'
- facedict['34'] = 'Kirika'
- facedict['35'] = 'Lector'
- facedict['36'] = 'Harold'
- facedict['37'] = 'Sophia'
- facedict['38'] = 'Colin'
- facedict['39'] = 'Jorg'
- facedict['50'] = 'Lloyd (Fancy)'
- facedict['51'] = 'Lloyd (Fancy Glasses)'
- facedict['52'] = 'Lloyd (Casual)'
- facedict['53'] = 'Elie (Fancy)'
- facedict['54'] = 'Special'
- facedict['55'] = 'Tio (Casual)'
- facedict['56'] = 'Randy (Fancy)'
- facedict['57'] = 'Lazy (Fancy)'
- facedict['58'] = 'KeA (Fancy)'
- facedict['59'] = 'Cecil (Fancy)'
- facedict['60'] = 'Sizuku (Fancy)'
- facedict['61'] = 'Ilya (Dancer)'
- facedict['62'] = 'Rixia (Priestess)'
- facedict['63'] = 'Noel (Casual)'
- facedict['64'] = 'Fran (Casual)'
- facedict['65'] = 'McDowell (PJs)'
- facedict['66'] = 'Earnest (Suit)'
- facedict['67'] = 'Joachim (Blue Hair)'
- facedict['68'] = 'Joachim (White Hair)'
- codedict = {}
- codedict['\x01'] = 'Lloyd'
- codedict['\x02'] = 'Elie'
- codedict['\x03'] = 'Tio'
- codedict['\x04'] = 'Randy'
- codedict['\x09'] = 'Noel'
- codedict['\x0a'] = 'Dudley'
- codedict['\x07'] = 'Estelle'
- codedict['\x08'] = 'Joshua'
- codedict['\x53'] = 'KeA'
- codedict['\x1c'] = 'Zeit'
- def replacestr(origstr,replacestr,startpos,replacelen):
- #Returns a string with a replaced sub-string
- #origstr - the original string, replacestr = the string to replace
- #startpos - where the replacement string should go
- #replacelen - how many characters of the original string to replace
- return origstr[:startpos] + replacestr + origstr[startpos+replacelen:]
- def is_jis_char(s):
- try:
- s.decode('cp932')
- except UnicodeDecodeError:
- return False
- if len(s.decode('cp932')) == 1:
- return True
- return False
- def is_number(s):
- try:
- float(s)
- return True
- except ValueError:
- return False
- def get_data(filename):
- totalbytes = os.path.getsize(filename)
- infile = open(filename, 'rb')
- totalfiledata = infile.read(totalbytes)
- return totalfiledata
- def getpointers():
- pointers = []
- strpos = 0
- while strpos > -1:
- strpos = filedata.find('\x5e\x00\x00\xff\xff',strpos+1)
- if strpos > 0:
- pointers.append(strpos)
- strpos = 0
- while strpos > -1:
- strpos = filedata.find('\x55\xff\x00',strpos+1)
- if strpos > 0:
- pointers.append(strpos)
- strpos = 0
- while strpos > -1:
- strpos = filedata.find('\x55\x01\x01',strpos+1)
- if strpos > 0:
- pointers.append(strpos)
- strpos = 0
- while strpos > -1:
- strpos = filedata.find('\x55\xe7\x03',strpos+1)
- if strpos > 0:
- pointers.append(strpos)
- strpos = 0
- while strpos > -1:
- strpos = filedata.find('\x61',strpos+1)
- if strpos > 0 and is_jis_char(filedata[strpos+1:strpos+3]) and not is_jis_char(filedata[strpos-1:strpos+1]):
- pointers.append(strpos)
- strpos = 0
- while strpos > -1:
- strpos = filedata.find('\x5c',strpos+1)
- if strpos > 0:
- if filedata[strpos+2] == '\x00' or filedata[strpos+2] == '\x01':
- if filedata[strpos+1:strpos+3] != '\x00\x00':
- if ord(filedata[strpos+3]) == 35 and filedata[strpos-4:strpos] != '\x00\x00\x00\x00' :
- pointers.append(strpos)
- elif ord(filedata[strpos+3]) > 127 and ord(filedata[strpos+3]) < 255 and ord(filedata[strpos+4]) > 39:
- if filedata[strpos-4:strpos] != '\x00\x00\x00\x00':
- pointers.append(strpos)
- strpos = 0
- while strpos > -1:
- strpos = filedata.find('\x5d',strpos+1)
- if strpos > 0 and ord(filedata[strpos-1]) < 128:
- if ord(filedata[strpos+3]) > 127 and ord(filedata[strpos+3]) < 255 and ord(filedata[strpos+4]) > 39:
- if ord(filedata[strpos+2]) == 0 or ord(filedata[strpos+2]) == 1:
- pointers.append(strpos)
- if pointers == []:
- print "No dialogue in this file."
- quit()
- return pointers
- def findstrend(opcode, pointer):
- if opcode == '5e':
- strend = filedata.find('\x01\x00',pointer)
- elif opcode in ('55','5c','5d'):
- pos = pointer + 3
- while True:
- if filedata[pos:pos+2] == '\x02\x00':
- strend = pos
- break
- elif filedata[pos] == '\x1F':
- pos += 5
- elif is_jis_char(filedata[pos:pos+2]):
- pos += 2
- else:
- pos += 1
- elif opcode == '61':
- strend = filedata.find('\x00',pointer)
- else:
- print 'Unknown opcode.'
- return strend
- def filterspecialcodes(text):
- textpos = 0
- newtext = ""
- specialflag = False
- while textpos < len(text):
- if text[textpos] == '\x1F':
- newtext += '{ '
- for x in range(5):
- newtext+= text[textpos].encode('hex') + ' '
- textpos += 1
- newtext += '}'
- elif ord(text[textpos]) > 31 and ord(text[textpos]) < 128:
- if specialflag == True:
- specialflag = False
- newtext += ' }'
- newtext += text[textpos]
- textpos += 1
- elif is_jis_char(text[textpos:textpos+2]):
- if specialflag == True:
- specialflag = False
- newtext += ' }'
- newtext += text[textpos:textpos+2]
- textpos += 2
- else:
- if specialflag == False:
- specialflag = True
- newtext += '{'
- newtext += ' ' + text[textpos].encode('hex')
- textpos += 1
- if specialflag == True: newtext += ' }'
- return newtext
- def processmatch(match):
- if match is None:
- return -1
- return match.end()
- def myprogram(filename):
- print filename
- pointers = getpointers() #First grab the pointers. We'll need these later.
- namepointer = struct.unpack('<I',filedata[0x34:0x38])[0]
- names = filedata[namepointer:].split('\x00')
- output = filename + '\n'
- facere = re.compile('#\d{4}F')
- asciire = re.compile('[#01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ]*')
- asciistring = '#01234567890FSNKWP'
- for pointer in sorted(pointers):
- opcode = filedata[pointer].encode('hex')
- strend = findstrend(opcode, pointer)
- if opcode == '61':
- name = filedata[pointer+1:strend]
- text = ";;terminalcode\n"
- elif opcode in ('55','5e'):
- name = ""
- elif opcode == '5c':
- if filedata[pointer+2] == '\x00':
- if ord(filedata[pointer+1])-7 < len(names):
- name = names[ord(filedata[pointer+1])-7]
- else:
- name = ""
- elif filedata[pointer+2] == '\x01':
- Fpos = processmatch(facere.search(filedata[pointer:strend])) - 1
- if Fpos == -1:
- name = 'None found'
- else:
- name = facedict.get(filedata[pointer+Fpos-4:pointer+Fpos-2],'Unknown')
- if name == 'Special':
- if int(filedata[pointer+Fpos-2:pointer+Fpos]) < 12:
- name = 'Tio (Fancy)'
- else:
- name = 'Zeit'
- if name == 'Unknown':
- name = codedict.get(filedata[pointer+1],'Unknown')
- elif opcode == '5d':
- name = filedata[pointer+3:filedata.find('\x00',pointer+3)]
- if opcode == '5e':
- text = filedata[pointer+8:strend]
- elif opcode in ('55','5c'):
- text = filedata[pointer+3:strend]
- elif opcode == '5d':
- strend1 = filedata.find('\x00',pointer+3)
- text = filedata[strend1+1:strend]
- if opcode in ('55','5c','5d','5e'):
- text = filterspecialcodes(text)
- text = text.replace('{ 01 }',';linebreak\n;;;;')
- text = text.replace('{ 01',';linebreak\n;;;;{')
- text = text.replace('{ 02 03 }',';pagebreak\n;;;;')
- text = ';' + text
- textpos = 0
- newtext = ""
- flag = False
- while textpos < len(text):
- if text[textpos] == '#' and textpos + 1 != len(text):
- if text[textpos+1] in asciistring:
- flag = True
- if flag == True and text[textpos] not in asciistring:
- if text[textpos-1] in "FSNKWP":
- newtext = replacestr(newtext,"",newtext.rfind(';',0,-1),1)
- newtext += ";"
- flag = False
- newtext += text[textpos]
- textpos += 1
- text = newtext
- if opcode == '5e':
- text += ';linebreak\n'
- elif opcode in ('55','5c','5d'):
- text += ';terminalcode\n'
- output += hex(pointer) + ';' + opcode + ';' + name + ';' + text
- outfile = open(os.path.splitext(filename)[0] + '.data','wb')
- outfile.write(output) #write the output
- outfile.close
- if __name__ == '__main__':
- ##
- ## sys.argv.append('c0000')
- filedata = get_data(sys.argv[1] + '.orig')
- myprogram(sys.argv[1])
Add Comment
Please, Sign In to add comment