Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: cp1252 -*-
- import os, sys, struct
- # NOTA > # NO SCRIPT = * NO JOGO
- #-------------------------------
- table = {
- '\x01\xFF': '*\n', '\x2D\xFF': '<begin>', '\x02\xFF': '<press>\n',
- '\x21\xFF': '<show>', '\xFF\xFF': '<end>\n', '\x03\xFF': '<center>', '\x16\xFF': '<space>\n',
- '\x23\xFF': '<wait>', '\x0F\xFF': '<blink>',
- '\x16\x01': '<BACK>', '\x17\x01': '<TRICK>', '\x18\x01': '<GHOST>',
- '\x19\x01': '<TIME>', '\x14\x01': '<DPAD>', '\x1A\x01': '<MENU>',
- '\x0A\x00': 'A', '\x0B\x00': 'B', '\x0C\x00': 'C', '\x0D\x00': 'D',
- '\x0E\x00': 'E', '\x0F\x00': 'F', '\x10\x00': 'G', '\x11\x00': 'H', '\x12\x00': 'I', '\x13\x00': 'J',
- '\x14\x00': 'K', '\x15\x00': 'L', '\x16\x00': 'M', '\x17\x00': 'N', '\x18\x00': 'O', '\x19\x00': 'P',
- '\x1A\x00': 'Q', '\x1B\x00': 'R', '\x1C\x00': 'S', '\x1D\x00': 'T', '\x1E\x00': 'U', '\x1F\x00': 'V',
- '\x20\x00': 'W', '\x21\x00': 'X', '\x22\x00': 'Y', '\x23\x00': 'Z',
- '\x24\x00': 'a', '\x25\x00': 'b', '\x26\x00': 'c', '\x27\x00': 'd', '\x28\x00': 'e',
- '\x29\x00': 'f', '\x2A\x00': 'g', '\x2B\x00': 'h', '\x2C\x00': 'i', '\x2D\x00': 'j', '\x2E\x00': 'k',
- '\x2F\x00': 'l', '\x30\x00': 'm', '\x31\x00': 'n', '\x32\x00': 'o', '\x33\x00': 'p', '\x34\x00': 'q',
- '\x35\x00': 'r', '\x36\x00': 's', '\x37\x00': 't', '\x38\x00': 'u', '\x39\x00': 'v', '\x3A\x00': 'w',
- '\x3b\x00': 'x', '\x3c\x00': 'y', '\x3d\x00': 'z',
- '\x5E\x00': 'ç', '\x67\x00': 'ñ',
- '\x5A\x00': 'á', '\x5B\x00': 'â', '\x5C\x00': 'ã', '\x5E\x00': 'ç',
- '\x60\x00': 'é', '\x61\x00': 'ê', '\x64\x00': 'í', '\x67\x00': 'ñ',
- '\x69\x00': 'ó', '\x6A\x00': 'ô', '\x6B\x00': 'õ', '\x6F\x00': 'ú',
- '\xEF\x00': ',', '\xE5\x00': '(', '\xE6\x00': ')', '\xF4\x00': '-',
- '\x3E\x00': '!', '\x3F\x00': '?', '\xEA\x00': '"', '\xE1\x00': '.',
- '\xFF\x00': ' ', '\xF3\x00': "'", '\xF2\x00': '#',
- '\x00\x00': '0', '\x01\x00': '1', '\x02\x00': '2', '\x03\x00': '3', '\x04\x00': '4',
- '\x05\x00': '5', '\x06\x00': '6', '\x07\x00': '7', '\x08\x00': '8', '\x09\x00': '9',
- }
- table2 = {
- '*': '\x01\xFF', 'press': '\x02\xFF', 'show': '\x21\xFF', 'end': '\xFF\xFF',
- 'center': '\x03\xFF', 'space': '\x16\xFF', 'wait': '\x23\xFF', 'blink': '\x0F\xFF',
- 'black': '\x05\xFF\x0F\x00', 'blue': '\x05\xFF\x09\x00',
- 'red': '\x05\xFF\x06\x00',
- 'BACK': '\x16\x01', 'TRICK': '\x17\x01', 'GHOST': '\x18\x01', 'TIME': '\x19\x01',
- 'DPAD': '\x14\x01', 'MENU': '\x1A\x01',
- 'A': '\x0A\x00', 'B': '\x0B\x00', 'C': '\x0C\x00', 'D': '\x0D\x00',
- 'E': '\x0E\x00', 'F': '\x0F\x00', 'G': '\x10\x00', 'H': '\x11\x00',
- 'I': '\x12\x00', 'J': '\x13\x00', 'K': '\x14\x00', 'L': '\x15\x00',
- 'M': '\x16\x00', 'N': '\x17\x00', 'O': '\x18\x00', 'P': '\x19\x00',
- 'Q': '\x1A\x00', 'R': '\x1B\x00', 'S': '\x1C\x00', 'T': '\x1D\x00',
- 'U': '\x1E\x00', 'V': '\x1F\x00', 'W': '\x20\x00', 'X': '\x21\x00',
- 'Y': '\x22\x00', 'Z': '\x23\x00',
- 'a': '\x24\x00', 'b': '\x25\x00', 'c': '\x26\x00', 'd': '\x27\x00',
- 'e': '\x28\x00', 'f': '\x29\x00', 'g': '\x2A\x00', 'h': '\x2B\x00',
- 'i': '\x2C\x00', 'j': '\x2D\x00', 'k': '\x2E\x00', 'l': '\x2F\x00',
- 'm': '\x30\x00', 'n': '\x31\x00', 'o': '\x32\x00', 'p': '\x33\x00',
- 'q': '\x34\x00', 'r': '\x35\x00', 's': '\x36\x00', 't': '\x37\x00',
- 'u': '\x38\x00', 'v': '\x39\x00', 'w': '\x3A\x00', 'x': '\x3B\x00',
- 'y': '\x3C\x00', 'z': '\x3D\x00',
- 'ç': '\x5E\x00', 'ñ': '\x67\x00', 'à': '\x59\x00', 'á': '\x5A\x00',
- 'â': '\x5B\x00', 'ã': '\x5C\x00', 'é': '\x60\x00', 'ê': '\x61\x00',
- 'í': '\x64\x00', 'ó': '\x69\x00', 'ô': '\x6A\x00', 'õ': '\x6B\x00',
- 'ú': '\x6F\x00',
- 'Í': '\x4B\x00', 'Ñ': '\x4E\x00', 'Ó': '\x50\x00', 'Ô': '\x51\x00',
- 'Õ': '\x52\x00', 'Ú': '\x56\x00',
- ',': '\xEF\x00', '(': '\xE5\x00', ')': '\xE6\x00', '-': '\xF4\x00',
- '!': '\x3E\x00', '?': '\x3F\x00', '"': '\xEA\x00', '.': '\xE1\x00',
- ' ': '\xFF\x00', "'": '\xF3\x00', '#': '\xF2\x00',
- '0': '\x00\x00', '1': '\x01\x00', '2': '\x02\x00', '3': '\x03\x00', '4': '\x04\x00',
- '5': '\x05\x00', '6': '\x06\x00', '7': '\x07\x00', '8': '\x08\x00', '9': '\x09\x00',
- }
- def extractMSG():
- dir = "msg/"
- outdir = "en/"
- for name in os.listdir(dir):
- try: os.mkdir(outdir)
- except: pass
- file = open(dir+name, "rb"); output = open(outdir+name+'.txt', "w")
- text_offset = []; pointer_offset = []; block_name = []
- file.read(8)
- text_block_size = struct.unpack("<L", file.read(4))[0]
- file.read(4)
- pointers_block_size = struct.unpack("<L", file.read(4))[0]
- file.read(32)
- file.read(text_block_size)
- file.read(4)
- file_num = struct.unpack("<L", file.read(4))[0]
- for i in range(file_num):
- pointer_offset.append(struct.unpack("<L", file.read(4))[0])
- text_offset.append(struct.unpack("<L", file.read(4))[0])
- file.read(2)
- x = file.tell()
- if file_num == 1:
- block_name.append(file.read(pointers_block_size-12).replace('\x00', ''))
- else:
- for a in range(file_num-1):
- file.seek(x+pointer_offset[a]-2, 0)
- block_name.append(file.read(pointer_offset[a+1]-pointer_offset[a]).replace('\x00', ''))
- block_name.append(file.read(pointers_block_size-(file_num*8)-10-pointer_offset[a]).replace('\x00', ''))
- file.seek(52, 0)
- for i in range(file_num):
- file.read(2)
- b1 = file.read(2); b2 = file.read(2)
- if b1 and b2 in table:
- output.write("[%s][%s%s]\n\n" % (block_name[i], table[b1], table[b2]))
- elif b1 in table and not b2 in table:
- output.write("[%s][%s{%s}]\n\n" % (block_name[i], table[b1], hex(ord(b2[0]))[2:]) )
- #elif b2 in table and not b1 in table:
- # output.write("[%s][{%s}%s]\n\n" % (block_name[i], hex(ord(b2[0]))[2:], table[b2]) )
- while True:
- byte = file.read(2)
- if byte in table:
- output.write(table[byte])
- else:
- if byte == '\xFE\xFF':
- output.write('\n\n-------------------------------\n\n')
- break
- elif byte == '\x05\xFF':
- byte2 = file.read(2)
- if byte2 == '\x09\x00':
- output.write('<blue>')
- elif byte2 == '\x06\x00':
- output.write('<red>')
- elif byte2 == '\x0F\x00':
- output.write('<black>')
- elif byte == '\x0D\xFF':
- byte2 = file.read(2)
- if byte2 in table:
- output.write('<sound_%s>' % table[byte2])
- else:
- if byte2[1] == '\x00':
- output.write('<sound_{%s}>' % hex(ord(byte2[0]))[2:] )
- else:
- output.write('<sound_{%s}{%s}>' % (hex(ord(byte2[0]))[2:], hex(ord(byte2[1]))[2:]) )
- elif byte == '\x08\xFF':
- byte2 = file.read(2)
- if byte2 in table:
- output.write('<face_%s>\n' % table[byte2])
- else:
- if byte2[1] == '\x00':
- output.write('<face_{%s}>\n' % hex(ord(byte2[0]))[2:] )
- else:
- output.write('<face_{%s}{%s}>\n' % (hex(ord(byte2[0]))[2:], hex(ord(byte2[1]))[2:]) )
- elif byte == '\x10\xFF':
- byte2 = file.read(2); byte3 = file.read(2)
- if byte2 in table:
- output.write('<shake_%s%s>' % (table[byte2], table[byte3]) )
- else:
- output.write('<shake_%s%s>' % (hex(ord(byte2[0]))[2:], hex(ord(byte3[0]))[2:]) )
- elif byte == '\x19\xFF':
- byte2 = file.read(2)
- if byte2 in table:
- output.write('<change_%s>' % table[byte2])
- else:
- if byte2[1] == '\x00':
- output.write('<change_{%s}>' % hex(ord(byte2[0]))[2:] )
- else:
- output.write('<change_{%s}{%s}>' % (hex(ord(byte2[0]))[2:], hex(ord(byte2[1]))[2:]) )
- elif byte == '\x1B\xFF':
- byte2 = file.read(2)
- if byte2 in table:
- output.write('<fchat_%s>\n' % table[byte2])
- else:
- output.write('<fchat_{%s}\n' % hex(ord(byte2[0]))[2:] )
- elif byte == '\x24\xFF':
- byte2 = file.read(2)
- if byte2 in table:
- output.write('<NJ_%s>\n' % table[byte2])
- else:
- output.write('<NJ_%s>\n' % hex(ord(byte2[0]))[2:] )
- else:
- output.write('{%02X%02X}' % ( ord(byte[0]), ord(byte[1]) ) )
- print name; file.close; output.close
- def insertMSG():
- dir = "txt/"
- outdir = "br_msg/"
- for name in os.listdir(dir):
- try: os.mkdir(outdir)
- except: pass
- file = open(dir+name, "rb"); output = open(outdir+name[:-4], "wb")
- file_num = text_size = block_size = pointer1 = pointer2 = 0
- names = []; texts = []; ids = []
- txts = ''
- for line in file:
- line = line.strip()
- if line:
- if '----------' in line:
- file_num += 1
- texts.append(txts)
- txts = ''
- elif '[' and ']' in line:
- split = line.split('][')
- names.append(split[0][1:])
- if '{' and '}' in line:
- ids.append( (table2[split[1][0]], struct.pack('<H', int(split[1][2:4],16)) ) )
- else:
- ids.append( (table2[split[1][0]], table2[split[1][1]] ) )
- else:
- x = 0
- while x < len(line):
- if line[x] == '<':
- y = x
- while True:
- if line[y] != '>':
- y += 1
- else:
- break
- if line[x+1:y] in table2:
- txts += table2[line[x+1:y]]
- else:
- tag = line[x+1:y].split('_')
- if 'face' in tag[0]:
- if '{' and '}' in tag[1]:
- if tag[1].count('{') == 1:
- txts += '\x08\xFF' + struct.pack('<H', int(tag[1][1:3],16))
- else:
- txts += '\x08\xFF' + struct.pack('<H', int(tag[1][1],16)) + struct.pack('<H', int(tag[1][4],16))
- else:
- txts += '\x08\xFF' + table2[tag[1]]
- elif 'fchat' in tag[0]:
- txts += '\x1B\xFF' + table2[tag[1]]
- elif 'change' in tag[0]:
- if '{' and '}' in tag[1]:
- if tag[1].count('{') == 1:
- txts += '\x19\xFF' + struct.pack('<H', int(tag[1][1:3],16))
- else:
- txts += '\x19\xFF' + struct.pack('<H', int(tag[1][1],16)) + struct.pack('<H', int(tag[1][4],16))
- else:
- txts += '\x19\xFF' + table2[tag[1]]
- elif 'sound' in tag[0]:
- if '{' and '}' in tag[1]:
- if tag[1].count('{') == 1:
- txts += '\x0D\xFF' + struct.pack('<H', int(tag[1][1:3],16))
- else:
- txts += '\x0D\xFF' + struct.pack('<B', int(tag[1][1:3],16)) + struct.pack('<B', int(tag[1][5],16))
- else:
- txts += '\x0D\xFF' + table2[tag[1]]
- elif 'NJ' in tag[0]:
- if tag[1] in table2:
- txts += '\x24\xFF' + table2[tag[1]]
- else:
- txts += '\x24\xFF' + struct.pack('<H', int(tag[1],16) )
- elif 'shake' in tag[0]:
- txts += '\x10\xFF' + table2[tag[1][0]] + table2[tag[1][1]]
- x = y + 1
- elif line[x] == '{':
- z = x
- while True:
- if line[z] != '}':
- z += 1
- else:
- break
- txts += struct.pack('<B', int(line[x+1:z-2], 16)) + struct.pack('<B', int(line[x+3:z], 16))
- x = z + 1
- else:
- txts += table2[line[x]]
- x += 1
- output.write('1LMG' + '\x00'*8 + '\x04' + '\x00'*3 + '\x00'*4 + '\x00'*32)
- for i in range(file_num):
- output.write('\x2D\xFF' + ids[i][0] + ids[i][1] + texts[i] + '\xFE\xFF')
- text_size += 8 + len(texts[i])
- output.write('\x00'*(4 - text_size%4))
- text_size += 4 - text_size%4
- output.write('\x2A\x00\x00\x00'+struct.pack('<L', file_num))
- for x in range(file_num):
- output.write(struct.pack('<L', pointer1+2))
- pointer1 += len(names[x]) + 1
- output.write(struct.pack('<L', pointer2+52))
- pointer2 += len(texts[x]) + 8
- block_size = file_num*8 + pointer1 + 6 + (4 - (pointer1+2)%4)
- output.write('\x2A\x00')
- for a in range(len(names)):
- output.write(names[a]+'\x00')
- pad = 4 - (len(names[x])+1)%4
- output.write('\x00'*pad)
- output.seek(8,0)
- output.write(struct.pack('<L', text_size))
- output.seek(16,0)
- output.write(struct.pack('<L', block_size))
- print name; file.close; output.close
- if __name__ == '__main__':
- print "GHOST TRICK dumper/inserter v 0.2\nby alizor\nCrie uma pasta chamada 'msg' e coloque os arquivos dentro."
- print "Para inserir, crie uma pasta chamada 'txt'.\nNao se esqueca de recomprimi-los depois.\n"
- print "\t1 = Extrair textos\n\t2 = Inserir textos\n\t3 = Sair\n"
- choice = raw_input(">>> ")
- if int(choice) == 1: extractMSG()
- elif int(choice) == 2: insertMSG()
- else: sys.exit(1)
- sys.exit(1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement